-
Jonathan Weth authoredJonathan Weth authored
views.py 8.06 KiB
import json
from django.contrib import messages
from django.db.models import Count, Q
from django.http import HttpRequest, HttpResponse
from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse, reverse_lazy
from django.utils.translation import gettext as _
from django.views import View
from django.views.generic.detail import DetailView, SingleObjectMixin
from django_tables2 import SingleTableView
from reversion.views import RevisionMixin
from rules.contrib.views import PermissionRequiredMixin
from aleksis.apps.kort.forms import CardForm, CardPrinterForm, PrinterSelectForm
from aleksis.apps.kort.models import Card, CardPrinter, PrintStatus
from aleksis.apps.kort.tables import CardPrinterTable, CardTable
from aleksis.core.mixins import AdvancedCreateView, AdvancedDeleteView, AdvancedEditView
from aleksis.core.util.celery_progress import render_progress_page
from aleksis.core.views import RenderPDFView
class TestPDFView(RenderPDFView):
template_name = "kort/pdf.html"
def get(self, request: HttpRequest, *args, **kwargs) -> HttpResponse:
context = self.get_context_data(**kwargs)
return render(request, self.template_name, context)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["title"] = "Test PDF"
return context
class PrinterSelectMixin:
def get_context_data(self, **kwargs):
print("Called and used?")
context = super().get_context_data(**kwargs)
context["printers"] = CardPrinter.objects.all()
context["printer_form"] = PrinterSelectForm()
return context
class CardListView(PermissionRequiredMixin, RevisionMixin, PrinterSelectMixin, SingleTableView):
"""List view for all cards."""
permission_required = "core.view_cards_rule"
template_name = "kort/card/list.html"
model = Card
table_class = CardTable
class CardCreateView(PermissionRequiredMixin, RevisionMixin, AdvancedCreateView):
"""View used to create a card."""
permission_required = "core.create_card_rule"
context_object_name = "application"
template_name = "kort/card/create.html"
form_class = CardForm
success_message = _("The card has been created successfully.")
success_url = reverse_lazy("cards")
class CardDeleteView(PermissionRequiredMixin, RevisionMixin, AdvancedDeleteView):
"""View used to delete a card."""
permission_required = "core.delete_card_rule"
success_url = reverse_lazy("cards")
template_name = "kort/card/delete.html"
model = Card
success_message = _("The card has been deleted successfully.")
class CardDeactivateView(PermissionRequiredMixin, RevisionMixin, SingleObjectMixin, View):
"""View used to deactivate a card."""
permission_required = "core.delete_card_rule"
model = Card
success_url = reverse_lazy("cards")
def get(self, request: HttpRequest, *args, **kwargs) -> HttpResponse:
self.object = self.get_object()
self.object.deactivate()
messages.success(request, _("The card has been deactivated successfully."))
return redirect(self.success_url)
class CardPrintView(PermissionRequiredMixin, RevisionMixin, SingleObjectMixin, View):
"""View used to create a print job for a card."""
permission_required = "core.delete_card_rule"
model = Card
success_url = reverse_lazy("cards")
def get(self, request: HttpRequest, *args, **kwargs) -> HttpResponse:
self.object = self.get_object()
printer = self.request.GET.get("printer")
printer = get_object_or_404(CardPrinter, pk=printer)
self.object.print_card(printer)
messages.success(
request,
_(
"The print job for the card {} on the printer {} has been created successfully."
).format(self.object.person, printer.name),
)
return redirect(self.success_url)
class CardDetailView(PermissionRequiredMixin, RevisionMixin, PrinterSelectMixin, DetailView):
permission_required = "core.view_card_rule"
model = Card
template_name = "kort/card/detail.html"
class CardGeneratePDFView(PermissionRequiredMixin, RevisionMixin, SingleObjectMixin, View):
permission_required = "views.view_card_rule"
model = Card
def get(self, request: HttpRequest, *args, **kwargs) -> HttpResponse:
self.object = self.get_object()
if not self.object.chip_number:
messages.error(request, _("The chip number is missing."))
return redirect("cards")
redirect_url = reverse("card", args=[self.object.pk])
result = self.object.generate_pdf()
if result is True:
return redirect(redirect_url)
return render_progress_page(
request,
result,
title=_("Progress: Generate card layout as PDF file"),
progress_title=_("Generating PDF file …"),
success_message=_("The PDF file with the card layout has been generated successfully."),
error_message=_("There was a problem while generating the PDF file."),
redirect_on_success_url=redirect_url,
button_title=_("Show card"),
button_url=redirect_url,
button_icon="credit_card",
)
class CardPrinterListView(PermissionRequiredMixin, RevisionMixin, SingleTableView):
"""List view for all card printers."""
permission_required = "core.view_cardprinters_rule"
template_name = "kort/printer/list.html"
model = CardPrinter
table_class = CardPrinterTable
def get_queryset(self):
return CardPrinter.objects.all().annotate(
jobs_count=Count(
"jobs", filter=~Q(jobs__status__in=[PrintStatus.FINISHED, PrintStatus.FAILED])
)
)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
CardPrinter.check_online_status_for_all()
return context
class CardPrinterCreateView(PermissionRequiredMixin, RevisionMixin, AdvancedCreateView):
"""View used to create a card printer."""
permission_required = "core.create_cardprinter_rule"
template_name = "kort/printer/create.html"
form_class = CardPrinterForm
model = CardPrinter
success_message = _("The card printer has been created successfully.")
def get_success_url(self):
return reverse("card_printer", args=[self.object.pk])
class CardPrinterEditView(PermissionRequiredMixin, RevisionMixin, AdvancedEditView):
"""View used to edit a card printer."""
permission_required = "core.edit_cardprinter_rule"
template_name = "kort/printer/edit.html"
form_class = CardPrinterForm
model = CardPrinter
success_message = _("The card printer has been changed successfully.")
def get_success_url(self):
return reverse("card_printer", args=[self.object.pk])
class CardPrinterDeleteView(PermissionRequiredMixin, RevisionMixin, AdvancedDeleteView):
"""View used to delete a card printer."""
permission_required = "core.delete_cardprinter_rule"
success_url = reverse_lazy("card_printers")
template_name = "kort/printer/delete.html"
model = CardPrinter
success_message = _("The card printer has been deleted successfully.")
class CardPrinterDetailView(PermissionRequiredMixin, RevisionMixin, DetailView):
permission_required = "core.view_cardprinter_rule"
model = CardPrinter
template_name = "kort/printer/detail.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
self.object.check_online_status()
return context
class CardPrinterConfigView(PermissionRequiredMixin, RevisionMixin, SingleObjectMixin, View):
permission_required = "core.view_cardprinter_rule"
model = CardPrinter
def get(self, request: HttpRequest, *args, **kwargs) -> HttpResponse:
self.object = self.get_object()
response = HttpResponse(
json.dumps(self.object.generate_config()), content_type="application/json"
)
response["Content-Disposition"] = f'attachment; filename="{self.object.config_filename}"'
return response