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