Skip to content
Snippets Groups Projects
Select Git revision
  • 7bd81119ff5fb939f98055545297260d83983866
  • main default protected
  • renovate/djangorestframework-3.x
  • renovate/django-5.x
  • renovate/django-bootstrap5-25.x
  • renovate/django-debug-toolbar-6.x
  • renovate/jsonschema-4.x
  • koma/feature/preference-polling-form
8 results

views.py

Blame
  • Felix Blanke's avatar
    Felix Blanke authored and Benjamin Hättasch committed
    db9bc96c
    History
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    views.py 5.86 KiB
    import json
    
    from django.contrib import messages
    from django.db.models import Q
    from django.db.models.query import QuerySet
    from django.shortcuts import redirect
    from django.utils.translation import gettext_lazy as _
    from django.views.generic import FormView
    
    from AKModel.metaviews.admin import (
        AdminViewMixin,
        EventSlugMixin,
        IntermediateAdminView,
    )
    from AKModel.models import AK, Event
    from AKSolverInterface.forms import JSONExportControlForm, JSONScheduleImportForm
    from AKSolverInterface.serializers import ExportEventSerializer
    
    
    class AKJSONExportView(EventSlugMixin, AdminViewMixin, FormView):
        """
        View: Export all AK slots of this event in JSON format ordered by tracks
        """
    
        template_name = "admin/AKSolverInterface/ak_json_export.html"
        model = Event
        form_class = JSONExportControlForm
        title = _("AK JSON Export")
    
        def get_template_names(self):
            if self.request.method == "POST":
                return ["admin/AKSolverInterface/ak_json_export.html"]
            return ["admin/AKSolverInterface/ak_json_export_control.html"]
    
        def get_form_kwargs(self):
            form_kwargs = super().get_form_kwargs()
            form_kwargs["event"] = self.event
            return form_kwargs
    
        def form_valid(self, form):
            context = self.get_context_data()
            try:
                aks_without_slot = AK.objects.filter(event=self.event, akslot__isnull=True).all()
                if aks_without_slot.exists():
                    messages.warning(
                        self.request,
                        _(
                            "The following AKs have no slot assigned to them "
                            "and are therefore not exported: {aks_list}"
                        ).format(
                            aks_list=", ".join(aks_without_slot.values_list("name", flat=True))
                        )
                    )
    
                def _filter_slots_cb(queryset: QuerySet) -> QuerySet:
                    queryset = queryset.prefetch_related("ak")
                    if "export_tracks" in form.cleaned_data:
                        queryset = queryset.filter(
                            Q(ak__track__in=form.cleaned_data["export_tracks"])
                            | Q(ak__track__isnull=True)
                        )
                    if "export_categories" in form.cleaned_data:
                        queryset = queryset.filter(
                            Q(ak__category__in=form.cleaned_data["export_categories"])
                            | Q(ak__category__isnull=True)
                        )
                    if "export_types" in form.cleaned_data:
                        queryset = queryset.filter(
                            Q(ak__types__in=form.cleaned_data["export_types"])
                            | Q(ak__types__isnull=True)
                        )
    
                    queryset = queryset.distinct().all()
                    if not queryset.exists():
                        messages.warning(
                            self.request,
                            _("No AKSlots are exported"),
                        )
    
                    return queryset
    
                def _filter_rooms_cb(queryset: QuerySet) -> QuerySet:
                    queryset = queryset.all()
                    if not queryset.exists():
                        messages.warning(self.request, _("No Rooms are exported"))
                    return queryset
    
                def _filter_participants_cb(queryset: QuerySet) -> QuerySet:
                    queryset = queryset.all()
                    if not queryset.exists():
                        messages.warning(self.request, _("No real participants are exported"))
                    return queryset
    
                serialized_event = ExportEventSerializer(
                    context["event"],
                    filter_slots_cb=_filter_slots_cb,
                    filter_rooms_cb=_filter_rooms_cb,
                    filter_participants_cb=_filter_participants_cb,
                    export_scheduled_aks_as_fixed=form.cleaned_data["export_scheduled_aks_as_fixed"],
                )
                serialized_event_data = serialized_event.data
    
                if not serialized_event_data["timeslots"]["blocks"]:
                    messages.warning(self.request, _("No timeslots are exported"))
                context["json_data_oneline"] = json.dumps(serialized_event_data, ensure_ascii=False)
                context["json_data"] = json.dumps(serialized_event_data, indent=2, ensure_ascii=False)
                context["is_valid"] = True
            except ValueError as ex:
                messages.add_message(
                    self.request,
                    messages.ERROR,
                    _("Exporting AKs for the solver failed! Reason: ") + str(ex),
                )
    
            # if serialization failed in `get_context_data` we redirect to
            #   the status page and show a message instead
            if not context.get("is_valid", False):
                return redirect("admin:event_status", context["event"].slug)
            return self.render_to_response(context)
    
    
    class AKScheduleJSONImportView(EventSlugMixin, IntermediateAdminView):
        """
        View: Import an AK schedule from a json file that can be pasted into this view.
        """
    
        template_name = "admin/AKSolverInterface/import_json.html"
        form_class = JSONScheduleImportForm
        title = _("AK Schedule JSON Import")
    
        def form_valid(self, form):
            try:
                number_of_slots_changed = self.event.schedule_from_json(
                    form.cleaned_data["data"],
                    check_for_data_inconsistency=False, # TODO: Actually handle filtered export
                )
                messages.add_message(
                    self.request,
                    messages.SUCCESS,
                    _("Successfully imported {n} slot(s)").format(
                        n=number_of_slots_changed
                    ),
                )
            except ValueError as ex:
                messages.add_message(
                    self.request,
                    messages.ERROR,
                    _("Importing an AK schedule failed! Reason: ") + str(ex),
                )
    
            return redirect("admin:event_status", self.event.slug)