From ec0d2a62ffeb7e09069097ad074d8c8e82a531bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=A4ttasch?= <benjamin.haettasch@fachschaft.informatik.tu-darmstadt.de> Date: Sun, 9 May 2021 19:51:34 +0200 Subject: [PATCH] Introduce API for constraint violations (protected and currently readonly) This also introduces some additional properties for human readable details of the violations to the model --- AKModel/models.py | 16 ++++++++++++++++ AKModel/urls.py | 4 +++- AKScheduling/api.py | 19 ++++++++++++++++++- 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/AKModel/models.py b/AKModel/models.py index b3719536..a49e87f4 100644 --- a/AKModel/models.py +++ b/AKModel/models.py @@ -480,5 +480,21 @@ class ConstraintViolation(models.Model): get_details.short_description = _('Details') + @property + def details(self): + return self.get_details() + + @property + def level_display(self): + return self.get_level_display() + + @property + def type_display(self): + return self.get_type_display() + + @property + def timestamp_display(self): + return self.timestamp.astimezone(self.event.timezone).strftime('%d.%m.%y %H:%M') + def __str__(self): return f"{self.get_level_display()}: {self.get_type_display()} [{self.get_details()}]" diff --git a/AKModel/urls.py b/AKModel/urls.py index 03239837..184ab594 100644 --- a/AKModel/urls.py +++ b/AKModel/urls.py @@ -17,10 +17,12 @@ api_router.register('akslot', views.AKSlotViewSet, basename='AKSlot') extra_paths = [] if apps.is_installed("AKScheduling"): - from AKScheduling.api import ResourcesViewSet, RoomAvailabilitiesView, EventsView, EventsViewSet + from AKScheduling.api import ResourcesViewSet, RoomAvailabilitiesView, EventsView, EventsViewSet, \ + ConstraintViolationsViewSet api_router.register('scheduling-resources', ResourcesViewSet, basename='scheduling-resources') api_router.register('scheduling-event', EventsViewSet, basename='scheduling-event') + api_router.register('scheduling-constraint-violations', ConstraintViolationsViewSet, basename='scheduling-constraint-violations') extra_paths = [ path('api/scheduling-events/', EventsView.as_view(), name='scheduling-events'), diff --git a/AKScheduling/api.py b/AKScheduling/api.py index 27b4252e..af73c791 100644 --- a/AKScheduling/api.py +++ b/AKScheduling/api.py @@ -7,7 +7,7 @@ from django.views.generic import ListView from rest_framework import viewsets, mixins, serializers, permissions from AKModel.availability.models import Availability -from AKModel.models import Room, AKSlot +from AKModel.models import Room, AKSlot, ConstraintViolation from AKModel.views import EventSlugMixin @@ -109,3 +109,20 @@ class EventsViewSet(EventSlugMixin, viewsets.ModelViewSet): def get_queryset(self): return AKSlot.objects.filter(event=self.event) + + +class ConstraintViolationSerializer(serializers.ModelSerializer): + class Meta: + model = ConstraintViolation + fields = ['pk', 'type_display', 'aks', 'ak_slots', 'ak_owner', 'room', 'requirement', 'category', 'comment', 'timestamp_display', 'manually_resolved', 'level_display', 'details'] + + +class ConstraintViolationsViewSet(EventSlugMixin, viewsets.ModelViewSet): + permission_classes = (permissions.DjangoModelPermissions,) + serializer_class = ConstraintViolationSerializer + + def get_object(self): + return get_object_or_404(ConstraintViolation, pk=self.kwargs["pk"]) + + def get_queryset(self): + return ConstraintViolation.objects.filter(event=self.event) -- GitLab