Skip to content
Snippets Groups Projects
Select Git revision
  • 7b38a2dec6e315bfcd124ac22af1886b7d3a34f3
  • main default protected
  • feature/export-filtering
  • feature/clear-schedule-button
  • fix/responsive-cols-in-polls
  • feature/preference-polling-form
  • feature/json-export-via-rest-framework
  • feature/json-schedule-import-tests
  • fix/add-room-import-only-once
  • ak-import
  • renovate/django-simple-history-3.x
  • renovate/django-debug-toolbar-4.x
  • renovate/django-5.x
  • renovate/mysqlclient-2.x
14 results

forms.py

Blame
  • Forked from KIF / AKPlanning
    Source project has a limited visibility.
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    forms.py 6.68 KiB
    import csv
    import io
    
    from bootstrap_datepicker_plus.widgets import DateTimePickerInput
    from django import forms
    from django.forms.utils import ErrorList
    from django.utils.translation import gettext_lazy as _
    
    from AKModel.availability.forms import AvailabilitiesFormMixin
    from AKModel.models import Event, AKCategory, AKRequirement, Room
    
    
    class NewEventWizardStartForm(forms.ModelForm):
        class Meta:
            model = Event
            fields = ['name', 'slug', 'timezone', 'plan_hidden']
            widgets = {
                'plan_hidden': forms.HiddenInput(),
            }
    
        is_init = forms.BooleanField(initial=True, widget=forms.HiddenInput)
    
    
    class NewEventWizardSettingsForm(forms.ModelForm):
        class Meta:
            model = Event
            exclude = []
            widgets = {
                'name': forms.HiddenInput(),
                'slug': forms.HiddenInput(),
                'timezone': forms.HiddenInput(),
                'active': forms.HiddenInput(),
                'start': DateTimePickerInput(options={"format": "YYYY-MM-DD HH:mm"}),
                'end': DateTimePickerInput(options={"format": "YYYY-MM-DD HH:mm"}),
                'reso_deadline': DateTimePickerInput(options={"format": "YYYY-MM-DD HH:mm"}),
                'plan_hidden': forms.HiddenInput(),
            }
    
    
    class NewEventWizardPrepareImportForm(forms.Form):
        import_event = forms.ModelChoiceField(
            queryset=Event.objects.all(),
            label=_("Copy ak requirements and ak categories of existing event"),
            help_text=_("You can choose what to copy in the next step")
        )
    
    
    class NewEventWizardImportForm(forms.Form):
        import_categories = forms.ModelMultipleChoiceField(
            queryset=AKCategory.objects.all(),
            widget=forms.CheckboxSelectMultiple,
            label=_("Copy ak categories"),
            required=False,
        )
    
        import_requirements = forms.ModelMultipleChoiceField(
            queryset=AKRequirement.objects.all(),
            widget=forms.CheckboxSelectMultiple,
            label=_("Copy ak requirements"),
            required=False,
        )
    
        def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, initial=None, error_class=ErrorList,
                     label_suffix=None, empty_permitted=False, field_order=None, use_required_attribute=None,
                     renderer=None):
            super().__init__(data, files, auto_id, prefix, initial, error_class, label_suffix, empty_permitted, field_order,
                             use_required_attribute, renderer)
            self.fields["import_categories"].queryset = self.fields["import_categories"].queryset.filter(
                event=self.initial["import_event"])
            self.fields["import_requirements"].queryset = self.fields["import_requirements"].queryset.filter(
                event=self.initial["import_event"])
    
            from django.apps import apps
            if apps.is_installed("AKDashboard"):
                from AKDashboard.models import DashboardButton
    
                self.fields["import_buttons"] = forms.ModelMultipleChoiceField(
                    queryset=DashboardButton.objects.filter(event=self.initial["import_event"]),
                    widget=forms.CheckboxSelectMultiple,
                    label=_("Copy dashboard buttons"),
                    required=False,
                )
    
    
    class NewEventWizardActivateForm(forms.ModelForm):
        class Meta:
            fields = ["active"]
            model = Event
    
    
    class AdminIntermediateForm(forms.Form):
        pass
    
    
    class AdminIntermediateActionForm(AdminIntermediateForm):
        pks = forms.CharField(widget=forms.HiddenInput)
    
    
    class SlideExportForm(AdminIntermediateForm):
        num_next = forms.IntegerField(
            min_value=0,
            max_value=6,
            initial=3,
            label=_("# next AKs"),
            help_text=_("How many next AKs should be shown on a slide?"))
        presentation_mode = forms.TypedChoiceField(
            initial=False,
            label=_("Presentation only?"),
            widget=forms.RadioSelect,
            choices=((True, _('Yes')), (False, _('No'))),
            coerce=lambda x: x == "True",
            help_text=_("Restrict AKs to those that asked for chance to be presented?"))
        wish_notes = forms.TypedChoiceField(
            initial=False,
            label=_("Space for notes in wishes?"),
            widget=forms.RadioSelect,
            choices=((True, _('Yes')), (False, _('No'))),
            coerce=lambda x: x == "True",
            help_text=_("Create symbols indicating space to note down owners and timeslots for wishes, e.g., to be filled "
                        "out on a touch screen while presenting?"))
    
    
    class DefaultSlotEditorForm(AdminIntermediateForm):
        availabilities = forms.CharField(
            label=_('Default Slots'),
            help_text=_(
                'Click and drag to add default slots, double-click to delete. '
                'Or use the start and end inputs to add entries to the calendar view.'
            ),
            widget=forms.TextInput(attrs={'class': 'availabilities-editor-data'}),
            required=True,
        )
    
    
    class RoomBatchCreationForm(AdminIntermediateForm):
        rooms = forms.CharField(
            label=_('New rooms'),
            help_text=_('Enter room details in CSV format. Required colum is "name", optional colums are "location", '
                        '"capacity", and "url" for online/hybrid rooms. Delimiter: Semicolon'),
            widget=forms.Textarea,
            required=True,
        )
        create_default_availabilities = forms.BooleanField(
            label=_('Default availabilities?'),
            help_text=_('Create default availabilities for all rooms?'),
            required=False
        )
    
        def clean_rooms(self):
            rooms_raw_text = self.cleaned_data["rooms"]
            rooms_raw_dict = csv.DictReader(io.StringIO(rooms_raw_text), delimiter=";")
    
            if "name" not in rooms_raw_dict.fieldnames:
                raise forms.ValidationError(_("CSV must contain a name column"))
    
            return rooms_raw_dict
    
    
    class RoomForm(forms.ModelForm):
        class Meta:
            model = Room
            fields = ['name',
                      'location',
                      'capacity',
                      'event',
                      ]
    
    
    class RoomFormWithAvailabilities(AvailabilitiesFormMixin, RoomForm):
        class Meta:
            model = Room
            fields = ['name',
                      'location',
                      'capacity',
                      'properties',
                      'event',
                      ]
    
            widgets = {
                'properties': forms.CheckboxSelectMultiple,
            }
    
        def __init__(self, *args, **kwargs):
            # Init availability mixin
            kwargs['initial'] = dict()
            super().__init__(*args, **kwargs)
            self.initial = {**self.initial, **kwargs['initial']}
            # Filter possible values for m2m when event is specified
            if hasattr(self.instance, "event") and self.instance.event is not None:
                self.fields["properties"].queryset = AKRequirement.objects.filter(event=self.instance.event)