bornhack-website/src/backoffice/forms.py

86 lines
2.7 KiB
Python

from django import forms
from program.models import Event, Speaker
class AutoScheduleValidateForm(forms.Form):
schedule = forms.ChoiceField(
choices=(
(
"current",
"Validate Current Schedule (Load the AutoScheduler with the currently scheduled Events and validate)",
),
(
"similar",
"Validate Similar Schedule (Create and validate a new schedule based on the current schedule)",
),
("new", "Validate New Schedule (Create and validate a new schedule)"),
),
help_text="What to validate?",
)
class AutoScheduleApplyForm(forms.Form):
schedule = forms.ChoiceField(
choices=(
(
"similar",
"Apply Similar Schedule (Create and apply a new schedule similar to the current schedule)",
),
(
"new",
"Apply New Schedule (Create and apply a new schedule without considering the current schedule)",
),
),
help_text="Which schedule to apply?",
)
class EventScheduleForm(forms.Form):
""" The EventSlots are added in the view and help_text is not visible, just define the field """
slot = forms.ChoiceField()
class SpeakerForm(forms.ModelForm):
class Meta:
model = Speaker
fields = [
"name",
"email",
"biography",
"needs_oneday_ticket",
"event_conflicts",
]
def __init__(self, camp, matrix={}, *args, **kwargs):
"""
initialise the form and add availability fields to form
"""
super().__init__(*args, **kwargs)
# do we have a matrix to work with?
if not matrix:
return
# add speaker availability fields
for date in matrix.keys():
# do we need a column for this day?
if not matrix[date]:
# nothing on this day, skip it
continue
# loop over the daychunks for this day
for daychunk in matrix[date]:
if not matrix[date][daychunk]:
# no checkbox needed for this daychunk
continue
# add the field
self.fields[matrix[date][daychunk]["fieldname"]] = forms.BooleanField(
required=False
)
# add it to Meta.fields too
self.Meta.fields.append(matrix[date][daychunk]["fieldname"])
# only show events from this camp
self.fields["event_conflicts"].queryset = Event.objects.filter(
track__camp=camp, event_type__support_speaker_event_conflicts=True
)