Skip to content
Snippets Groups Projects
Select Git revision
  • 868a51988dff52a51fb2f93cad3e0010bd450bce
  • master default
  • renovate/django-split-settings-1.x
  • renovate/djangorestframework-3.x
  • main
  • 520-improve-trackmanager
  • 520-fix-scheduling
  • 520-akowner
  • 520-status
  • 520-message-resolved
  • 520-improve-scheduling-2
  • renovate/django-bootstrap5-24.x
  • 520-improve-submission
  • 520-improve-scheduling
  • 520-improve-wall
  • 520-fix-event-wizard-datepicker
  • 520-upgrades
  • renovate/tzdata-2023.x
  • renovate/django-5.x
  • renovate/fontawesomefree-6.x
  • renovate/sphinx-rtd-theme-2.x
  • renovate/sphinxcontrib-apidoc-0.x
22 results

api.py

Blame
  • Forked from KIF / AKPlanning
    700 commits behind the upstream repository.
    Benjamin Hättasch's avatar
    Benjamin Hättasch authored and Nadja Geisler committed
    This also introduces some additional properties for human readable details of the violations to the model
    ec0d2a62
    History
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    api.py 4.85 KiB
    from django.contrib.auth.mixins import LoginRequiredMixin
    from django.http import JsonResponse
    from django.shortcuts import get_object_or_404
    from django.urls import reverse
    from django.utils import timezone
    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, ConstraintViolation
    from AKModel.views import EventSlugMixin
    
    
    class ResourceSerializer(serializers.ModelSerializer):
        class Meta:
            model = Room
            fields = ['id', 'title']
    
        title = serializers.SerializerMethodField('transform_title')
    
        def transform_title(self, obj):
            if obj.capacity > 0:
                return f"{obj.title} [{obj.capacity}]"
            return obj.title
    
    
    class ResourcesViewSet(EventSlugMixin, mixins.RetrieveModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet):
        permission_classes = (permissions.DjangoModelPermissionsOrAnonReadOnly,)
        serializer_class = ResourceSerializer
    
        def get_queryset(self):
            return Room.objects.filter(event=self.event)
    
    
    class EventsView(LoginRequiredMixin, EventSlugMixin, ListView):
        model = AKSlot
    
        def get_queryset(self):
            return super().get_queryset().filter(event=self.event, room__isnull=False)
    
        def render_to_response(self, context, **response_kwargs):
            return JsonResponse(
                [{
                    "slotID": slot.pk,
                    "title": f'{slot.ak.short_name}: \n{slot.ak.owners_list}',
                    "description": slot.ak.details,
                    "resourceId": slot.room.id,
                    "start": timezone.localtime(slot.start, self.event.timezone).strftime("%Y-%m-%d %H:%M:%S"),
                    "end": timezone.localtime(slot.end, self.event.timezone).strftime("%Y-%m-%d %H:%M:%S"),
                    "backgroundColor": slot.ak.category.color,
                    "borderColor": "#ff291d" if slot.fixed else slot.ak.category.color,
                    "constraint": 'roomAvailable',
                    "editable": not slot.fixed,
                    'url': str(reverse('admin:AKModel_akslot_change', args=[slot.pk])),
                } for slot in context["object_list"]],
                safe=False,
                **response_kwargs
            )
    
    
    class RoomAvailabilitiesView(LoginRequiredMixin, EventSlugMixin, ListView):
        model = Availability
        context_object_name = "availabilities"
    
        def get_queryset(self):
            return super().get_queryset().filter(event=self.event, room__isnull=False)
    
        def render_to_response(self, context, **response_kwargs):
            return JsonResponse(
                [{
                    "title": "",
                    "resourceId": a.room.id,
                    "start": timezone.localtime(a.start, self.event.timezone).strftime("%Y-%m-%d %H:%M:%S"),
                    "end": timezone.localtime(a.end, self.event.timezone).strftime("%Y-%m-%d %H:%M:%S"),
                    "display": 'background',
                    "groupId": 'roomAvailable',
                } for a in context["availabilities"]],
                safe=False,
                **response_kwargs
            )
    
    
    class EventSerializer(serializers.ModelSerializer):
        class Meta:
            model = AKSlot
            fields = ['id', 'start', 'end', 'roomId']
    
        start = serializers.DateTimeField()
        end = serializers.DateTimeField()
        roomId = serializers.IntegerField(source='room.pk')
    
        def update(self, instance, validated_data):
            start = timezone.make_aware(timezone.make_naive(validated_data.get('start')), instance.event.timezone)
            end = timezone.make_aware(timezone.make_naive(validated_data.get('end')), instance.event.timezone)
            instance.start = start
            instance.room = get_object_or_404(Room, pk=validated_data.get('room')["pk"])
            diff = end - start
            instance.duration = round(diff.days * 24 + (diff.seconds / 3600), 2)
            instance.save()
            return instance
    
    
    class EventsViewSet(EventSlugMixin, viewsets.ModelViewSet):
        permission_classes = (permissions.DjangoModelPermissions,)
        serializer_class = EventSerializer
    
        def get_object(self):
            return get_object_or_404(AKSlot, pk=self.kwargs["pk"])
    
        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)