From a22b855870f66074c2b81cb7d1f94d53006d5961 Mon Sep 17 00:00:00 2001 From: Felix Rindt Date: Mon, 26 Aug 2024 10:25:43 +0200 Subject: [PATCH] add structure --- ephios/plugins/complexsignup/serializers.py | 10 ++--- ephios/plugins/complexsignup/signals.py | 14 ++++++ ephios/plugins/complexsignup/signup.py | 44 +++++++++++++++++++ .../complexsignup/configuration_form.html | 12 +++++ .../templates/complexsignup/shift_state.html | 18 ++++++++ .../complexsignup/shift_state_block.html | 16 +++++++ 6 files changed, 108 insertions(+), 6 deletions(-) create mode 100644 ephios/plugins/complexsignup/templates/complexsignup/configuration_form.html create mode 100644 ephios/plugins/complexsignup/templates/complexsignup/shift_state.html create mode 100644 ephios/plugins/complexsignup/templates/complexsignup/shift_state_block.html diff --git a/ephios/plugins/complexsignup/serializers.py b/ephios/plugins/complexsignup/serializers.py index 64d580817..47e1cf5d0 100644 --- a/ephios/plugins/complexsignup/serializers.py +++ b/ephios/plugins/complexsignup/serializers.py @@ -66,23 +66,21 @@ def update(self, instance, validated_data): # Perform deletions. for object_id, obj in object_mapping.items(): - if self.should_delete(obj, data_mapping): + if self.should_delete(object_id, data_mapping): obj.delete() return ret - def should_delete(self, obj, data_mapping): + def should_delete(self, object_id, data_mapping): raise NotImplementedError() class DeleteFlagBulkUpdateListSerializer(BulkUpdateListSerializer): - def should_delete(self, obj, data_mapping): - object_id = getattr(obj, self.identification_field) + def should_delete(self, object_id, data_mapping): return object_id in data_mapping and data_mapping[object_id].get("deleted", False) class DeleteAbsentBulkUpdateListSerializer(BulkUpdateListSerializer): - def should_delete(self, obj, data_mapping): - object_id = getattr(obj, self.identification_field) + def should_delete(self, object_id, data_mapping): return object_id not in data_mapping diff --git a/ephios/plugins/complexsignup/signals.py b/ephios/plugins/complexsignup/signals.py index e69de29bb..3dced69e4 100644 --- a/ephios/plugins/complexsignup/signals.py +++ b/ephios/plugins/complexsignup/signals.py @@ -0,0 +1,14 @@ +from django.dispatch import receiver + +from ephios.core.signals import register_shift_structures +from ephios.plugins.complexsignup.signup import ComplexShiftStructure + + +@receiver( + register_shift_structures, + dispatch_uid="ephios.plugins.complexsignup.signals.register_complex_shift_structures", +) +def register_complex_shift_structures(sender, **kwargs): + return [ + ComplexShiftStructure, + ] diff --git a/ephios/plugins/complexsignup/signup.py b/ephios/plugins/complexsignup/signup.py index e69de29bb..f7e95a872 100644 --- a/ephios/plugins/complexsignup/signup.py +++ b/ephios/plugins/complexsignup/signup.py @@ -0,0 +1,44 @@ +from django import forms +from django.utils.translation import gettext_lazy as _ +from django_select2.forms import ModelSelect2Widget + +from ephios.core.signup.forms import SignupConfigurationForm +from ephios.core.signup.structure.base import BaseShiftStructure +from ephios.plugins.baseshiftstructures.structure.common import MinimumAgeMixin +from ephios.plugins.complexsignup.models import BuildingBlock + + +class ComplexConfigurationForm(SignupConfigurationForm): + building_block = forms.ModelChoiceField( + widget=ModelSelect2Widget( + model=BuildingBlock, + search_fields=["name"], + ), + queryset=BuildingBlock.objects.all(), + ) + + template_name = "complexsignup/configuration_form.html" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + +class ComplexShiftStructure( + MinimumAgeMixin, + BaseShiftStructure, +): + slug = "complex" + verbose_name = _("Preconfigured Structure") + description = _("Use preconfigured elements to build a custom structure.") + shift_state_template_name = "complexsignup/shift_state.html" + configuration_form_class = ComplexConfigurationForm + + def get_shift_state_context_data(self, request, **kwargs): + """ + Additionally to the context of the event detail view, provide context for rendering `shift_state_template_name`. + """ + kwargs = super().get_shift_state_context_data(request, **kwargs) + kwargs["main_block"] = BuildingBlock.objects.filter( + id=self.configuration.building_block + ).first() + return kwargs diff --git a/ephios/plugins/complexsignup/templates/complexsignup/configuration_form.html b/ephios/plugins/complexsignup/templates/complexsignup/configuration_form.html new file mode 100644 index 000000000..2f281e1f5 --- /dev/null +++ b/ephios/plugins/complexsignup/templates/complexsignup/configuration_form.html @@ -0,0 +1,12 @@ +{% load i18n %} +{% load crispy_forms_filters %} + +

+ + {% translate "Edit blocks" %} + +

+ +{{ form|crispy }} \ No newline at end of file diff --git a/ephios/plugins/complexsignup/templates/complexsignup/shift_state.html b/ephios/plugins/complexsignup/templates/complexsignup/shift_state.html new file mode 100644 index 000000000..64fd1e38c --- /dev/null +++ b/ephios/plugins/complexsignup/templates/complexsignup/shift_state.html @@ -0,0 +1,18 @@ +{% load i18n %} + +
+ {% include "complexsignup/shift_state_block.html" with current=main_block %} +
+ +{% with stats=shift.get_signup_stats %} + + {{ stats.confirmed_count }}{% if stats.max_count %}/{{ stats.max_count }}{% endif %} + {% translate "Total" context "participation count" %} + +{% endwith %} + +{% if disposition_url %} +
+ {% translate "Disposition" %} +
+{% endif %} \ No newline at end of file diff --git a/ephios/plugins/complexsignup/templates/complexsignup/shift_state_block.html b/ephios/plugins/complexsignup/templates/complexsignup/shift_state_block.html new file mode 100644 index 000000000..07efeeb29 --- /dev/null +++ b/ephios/plugins/complexsignup/templates/complexsignup/shift_state_block.html @@ -0,0 +1,16 @@ +
+
+
{{ current }}
+ {% if current.block_type == "composite" %} + {% for sub_block in current.sub_blocks.all %} + {% include "complexsignup/shift_state_block.html" with current=sub_block %} + {% endfor %} + {% else %} +
    + {% for pos in current.positions.all %} +
  • {{ pos }}
  • + {% endfor %} +
+ {% endif %} +
+
\ No newline at end of file