diff --git a/AKModel/models.py b/AKModel/models.py index b371953669e9e5d594132dbe351d44d4c6f28d7d..a49e87f431c7b9395ee2c78ff3027bf786d1a156 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 0323983749ecd68105fab57b17ab30c37e50fc74..184ab59415a249bbc52e607b9a47f1aa5af29856 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 27b4252e94adc1ffa44e4d2481bc94987d7087f1..af73c791053ddab2e6922f8b69610914640d9ff6 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)