Skip to content
Snippets Groups Projects
Verified Commit 6518b0f2 authored by Jonathan Weth's avatar Jonathan Weth :keyboard:
Browse files

Add API function for setting chip number

parent 5f08b53c
No related branches found
No related tags found
1 merge request!3Setup printer stuff
Pipeline #71497 passed with warnings
...@@ -2,8 +2,11 @@ from django.contrib import admin ...@@ -2,8 +2,11 @@ from django.contrib import admin
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.utils import timezone from django.utils import timezone
from celery.result import allow_join_result
from celery.states import SUCCESS
from oauth2_provider.contrib.rest_framework import TokenHasScope from oauth2_provider.contrib.rest_framework import TokenHasScope
from rest_framework import generics, permissions, serializers from rest_framework import generics, permissions, serializers
from rest_framework.exceptions import APIException, ValidationError
from rest_framework.permissions import BasePermission from rest_framework.permissions import BasePermission
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.views import APIView from rest_framework.views import APIView
...@@ -79,6 +82,12 @@ class CardPrintJobStatusSerializer(serializers.ModelSerializer): ...@@ -79,6 +82,12 @@ class CardPrintJobStatusSerializer(serializers.ModelSerializer):
fields = ("id", "status", "status_text") fields = ("id", "status", "status_text")
class CardChipNumberSerializer(serializers.ModelSerializer):
class Meta:
model = Card
fields = ("chip_number",)
class CardPrinterDetails(generics.RetrieveAPIView): class CardPrinterDetails(generics.RetrieveAPIView):
"""Show details about the card printer.""" """Show details about the card printer."""
...@@ -135,3 +144,39 @@ class CardPrintJobUpdateStatusView(generics.UpdateAPIView): ...@@ -135,3 +144,39 @@ class CardPrintJobUpdateStatusView(generics.UpdateAPIView):
required_scopes = ["card_printer"] required_scopes = ["card_printer"]
serializer_class = CardPrintJobStatusSerializer serializer_class = CardPrintJobStatusSerializer
queryset = CardPrintJob.objects.all() queryset = CardPrintJob.objects.all()
class CardPrintJobSetChipNumberView(generics.UpdateAPIView):
"""Update the status of the card printer."""
permission_classes = [permissions.IsAuthenticated, TokenHasScope, CorrectJobPrinterPermission]
required_scopes = ["card_printer"]
serializer_class = CardChipNumberSerializer
queryset = CardPrintJob.objects.all()
def update(self, request, *args, **kwargs):
instance = self.get_object()
card = instance.card
if card.chip_number:
raise ValidationError
serializer = self.get_serializer(card, data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
result = instance.card.generate_pdf()
with allow_join_result():
result.wait()
card.refresh_from_db()
if result.status == SUCCESS and card.pdf_file:
serializer = CardPrintJobSerializer(instance)
instance.refresh_from_db()
return Response(serializer.data)
else:
card.chip_number = None
card.save()
raise APIException("Error while generating PDF file")
...@@ -6,6 +6,7 @@ from django.conf import settings ...@@ -6,6 +6,7 @@ from django.conf import settings
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.core.validators import FileExtensionValidator from django.core.validators import FileExtensionValidator
from django.db import models from django.db import models
from django.db.models import Q
from django.template import Context, Template from django.template import Context, Template
from django.utils import timezone from django.utils import timezone
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
...@@ -148,6 +149,21 @@ class CardPrinter(ExtensibleModel): ...@@ -148,6 +149,21 @@ class CardPrinter(ExtensibleModel):
printer.check_online_status() printer.check_online_status()
def get_next_print_job(self) -> Optional["CardPrintJob"]: def get_next_print_job(self) -> Optional["CardPrintJob"]:
if not self.generate_number_on_server:
print(
self.jobs.filter(card__pdf_file=""),
self.jobs.filter(card__pdf_file="").exclude(card__chip_number=""),
)
self.jobs.filter(
(Q(card__pdf_file="") & ~Q(card__chip_number=""))
| Q(status=PrintStatus.IN_PROGRESS)
).update(status=PrintStatus.FAILED)
Card.objects.filter(
jobs__in=self.jobs.filter(status=PrintStatus.FAILED), chip_number=""
).update(chip_number="")
else:
self.jobs.filter(status=PrintStatus.IN_PROGRESS).update(status=PrintStatus.FAILED)
jobs = self.jobs.order_by("created").filter(status=PrintStatus.REGISTERED) jobs = self.jobs.order_by("created").filter(status=PrintStatus.REGISTERED)
if self.generate_number_on_server: if self.generate_number_on_server:
jobs = jobs.filter(card__pdf_file__isnull=False) jobs = jobs.filter(card__pdf_file__isnull=False)
...@@ -248,7 +264,9 @@ class CardPrintJob(TimeStampedModel, ExtensibleModel): ...@@ -248,7 +264,9 @@ class CardPrintJob(TimeStampedModel, ExtensibleModel):
printer = models.ForeignKey( printer = models.ForeignKey(
CardPrinter, on_delete=models.CASCADE, verbose_name=_("Printer"), related_name="jobs" CardPrinter, on_delete=models.CASCADE, verbose_name=_("Printer"), related_name="jobs"
) )
card = models.ForeignKey(Card, on_delete=models.CASCADE, verbose_name=_("Card")) card = models.ForeignKey(
Card, on_delete=models.CASCADE, verbose_name=_("Card"), related_name="jobs"
)
status = models.CharField( status = models.CharField(
max_length=255, max_length=255,
......
...@@ -45,4 +45,9 @@ urlpatterns = [ ...@@ -45,4 +45,9 @@ urlpatterns = [
api.CardPrintJobUpdateStatusView.as_view(), api.CardPrintJobUpdateStatusView.as_view(),
name="api_update_job_status", name="api_update_job_status",
), ),
path(
"api/v1/jobs/<int:pk>/chip_number/",
api.CardPrintJobSetChipNumberView.as_view(),
name="api_set_chip_number",
),
] ]
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment