From 782650f735015214969c1ca9b32638baf69fa433 Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Mon, 1 Aug 2022 23:04:12 +0200
Subject: [PATCH] Add option to directly print newly issued cards

---
 aleksis/apps/kort/forms.py | 14 ++++++++++++++
 aleksis/apps/kort/views.py | 22 ++++++++++++++++++++++
 2 files changed, 36 insertions(+)

diff --git a/aleksis/apps/kort/forms.py b/aleksis/apps/kort/forms.py
index 39781a6..7abb651 100644
--- a/aleksis/apps/kort/forms.py
+++ b/aleksis/apps/kort/forms.py
@@ -9,6 +9,13 @@ from aleksis.apps.kort.models import Card, CardLayout, CardLayoutMediaFile, Card
 
 
 class CardForm(forms.ModelForm):
+    printer = forms.ModelChoiceField(
+        queryset=None,
+        label=_("Card Printer"),
+        help_text=_("Select a printer to directly print the newly issued card."),
+        required=False,
+    )
+
     class Meta:
         model = Card
         fields = ["person", "valid_until", "layout"]
@@ -28,6 +35,13 @@ class CardForm(forms.ModelForm):
         super().__init__(*args, **kwargs)
         self.fields["layout"].required = True
 
+        layouts = CardLayout.objects.all()
+        if layouts.count() == 1:
+            self.fields["layout"].initial = layouts.first()
+
+        printers = CardPrinter.objects.all()
+        self.fields["printer"].queryset = printers
+
 
 class CardPrinterForm(forms.ModelForm):
     layout = Layout(
diff --git a/aleksis/apps/kort/views.py b/aleksis/apps/kort/views.py
index 26d7a86..d618111 100644
--- a/aleksis/apps/kort/views.py
+++ b/aleksis/apps/kort/views.py
@@ -70,6 +70,28 @@ class CardCreateView(PermissionRequiredMixin, RevisionMixin, AdvancedCreateView)
     success_message = _("The card has been created successfully.")
     success_url = reverse_lazy("cards")
 
+    def form_valid(self, form: CardForm) -> HttpResponse:
+        response = super().form_valid(form)
+        if form.cleaned_data.get("printer"):
+            printer = form.cleaned_data["printer"]
+            try:
+                job = self.object.print_card(printer)
+                messages.success(
+                    self.request,
+                    _(
+                        "The print job #{} for the card {} on "
+                        "the printer {} has been created successfully."
+                    ).format(job.pk, self.object.person, printer.name),
+                )
+            except ValueError as e:
+                messages.error(
+                    self.request,
+                    _(
+                        "The print job couldn't be started because of the following error: {}"
+                    ).format(e),
+                )
+        return response
+
 
 class CardDeleteView(PermissionRequiredMixin, RevisionMixin, AdvancedDeleteView):
     """View used to delete a card."""
-- 
GitLab