class ScheduleSurveyForm(IndicoForm): start_dt = IndicoDateTimeField( _("Start"), [ UsedIf(lambda form, field: form.allow_reschedule_start), Optional(), DateTimeRange(earliest='now') ], default_time=time(0, 0), description=_("Moment when the survey will open for submissions")) end_dt = IndicoDateTimeField( _("End"), [Optional(), LinkedDateTime('start_dt')], default_time=time(23, 59), description=_("Moment when the survey will close")) resend_start_notification = BooleanField( _('Resend start notification'), widget=SwitchWidget(), description=_("Resend the survey start notification.")) def __init__(self, *args, **kwargs): survey = kwargs.pop('survey') self.allow_reschedule_start = kwargs.pop('allow_reschedule_start') self.timezone = survey.event_new.timezone super(IndicoForm, self).__init__(*args, **kwargs) if not survey.start_notification_sent or not self.allow_reschedule_start: del self.resend_start_notification
class CERNAccessForm(RequestFormBase): regforms = IndicoSelectMultipleCheckboxField(_('Registration forms'), [DataRequired(_('At least one registration form has to be selected'))], widget=JinjaWidget('regform_list_widget.html', 'cern_access')) regform_data_mode = IndicoEnumSelectField(_('Show during user registration'), enum=RegformDataMode, keep_enum=False, description=_("When enabled, users can request site access while " "registering and provide their additional personal data " "in the registration form. When set to required, the user " "cannot register without providing this data. In any case, " "site access is only granted after a manager explicitly " "enables it for the registrations.")) start_dt_override = IndicoDateTimeField(_('Start date override'), [Optional()], description=_("If set, CERN access will be granted starting at the " "specified date instead of the event's start date")) end_dt_override = IndicoDateTimeField(_('End date override'), [Optional(), LinkedDateTime('start_dt_override', not_equal=True)], description=_("If set, CERN access will be granted until the specified date " "instead of the event's end date")) def __init__(self, *args, **kwargs): super(CERNAccessForm, self).__init__(*args, **kwargs) regforms = get_regforms(self.event) self._regform_map = {unicode(rf.id): rf for rf in regforms} self.regforms.choices = [(unicode(rf.id), rf.title) for rf in regforms] self.start_dt_override.default_time = self.event.start_dt_local.time() self.end_dt_override.default_time = self.event.end_dt_local.time() def validate_start_dt_override(self, field): if bool(self.start_dt_override.data) != bool(self.end_dt_override.data): raise ValidationError(_('You need to specify both date overrides or neither of them.')) validate_end_dt_override = validate_start_dt_override
class CERNAccessForm(RequestFormBase): regforms = IndicoSelectMultipleCheckboxField( _('Registration forms'), widget=JinjaWidget('regform_list_widget.html', 'cern_access')) start_dt_override = IndicoDateTimeField( _('Start date override'), [Optional()], description=_("If set, CERN access will be granted starting at the " "specified date instead of the event's start date")) end_dt_override = IndicoDateTimeField( _('End date override'), [Optional(), LinkedDateTime('start_dt_override', not_equal=True)], description=_( "If set, CERN access will be granted until the specified date " "instead of the event's end date")) def __init__(self, *args, **kwargs): super(CERNAccessForm, self).__init__(*args, **kwargs) regforms = get_regforms(self.event) self._regform_map = {unicode(rf.id): rf for rf in regforms} self.regforms.choices = [(unicode(rf.id), rf.title) for rf in regforms] self.start_dt_override.default_time = self.event.start_dt_local.time() self.end_dt_override.default_time = self.event.end_dt_local.time() def validate_start_dt_override(self, field): if bool(self.start_dt_override.data) != bool( self.end_dt_override.data): raise ValidationError( _('You need to specify both date overrides or neither of them.' )) validate_end_dt_override = validate_start_dt_override
class PapersScheduleForm(IndicoForm): start_dt = IndicoDateTimeField(_("Start"), [Optional()], default_time=time(0, 0), description=_("The moment users can start submitting papers")) end_dt = IndicoDateTimeField(_("End"), [Optional(), LinkedDateTime('start_dt')], default_time=time(23, 59), description=_("The moment the submission process ends")) def __init__(self, *args, **kwargs): self.event = kwargs.pop('event') super(PapersScheduleForm, self).__init__(*args, **kwargs)
class AbstractsScheduleForm(IndicoForm): start_dt = IndicoDateTimeField( _("Start"), [Optional()], default_time=time(0, 0), description=_("The moment users can start submitting abstracts")) end_dt = IndicoDateTimeField( _("End"), [Optional(), LinkedDateTime('start_dt')], default_time=time(23, 59), description=_("The moment the submission process will end")) modification_end_dt = IndicoDateTimeField( _("Modification deadline"), [Optional(), LinkedDateTime('end_dt')], default_time=time(23, 59), description=_("Deadline until which the submitted abstracts can be " "modified")) def __init__(self, *args, **kwargs): self.event = kwargs.pop('event') super(AbstractsScheduleForm, self).__init__(*args, **kwargs)
class CERNAccessForm(RequestFormBase): regforms = IndicoSelectMultipleCheckboxField( _('Registration forms'), [DataRequired(_('At least one registration form has to be selected'))], widget=JinjaWidget('regform_list_widget.html', 'cern_access')) during_registration = BooleanField( _('Show during user registration'), widget=SwitchWidget(), description=_( "When enabled, users can request site access while registering " "and provide their additional personal data in the registration " "form. In any case, site access is only granted after a manager " "explicitly enables it for the registrants.")) during_registration_preselected = BooleanField( _('Preselect during user registration'), [HiddenUnless('during_registration')], widget=SwitchWidget(), description=_("Preselect the option to request site access during " "registration. Recommended if most registrants will " "need it.")) during_registration_required = BooleanField( _('Require during user registration'), [HiddenUnless('during_registration_preselected')], widget=SwitchWidget(), description=_("Require all users to provide data for site access. " "Registration without entering the data will not be " "possible.")) start_dt_override = IndicoDateTimeField( _('Start date override'), [Optional()], description=_("If set, CERN access will be granted starting at the " "specified date instead of the event's start date")) end_dt_override = IndicoDateTimeField( _('End date override'), [Optional(), LinkedDateTime('start_dt_override', not_equal=True)], description=_( "If set, CERN access will be granted until the specified date " "instead of the event's end date")) def __init__(self, *args, **kwargs): super(CERNAccessForm, self).__init__(*args, **kwargs) regforms = get_regforms(self.event) self._regform_map = {unicode(rf.id): rf for rf in regforms} self.regforms.choices = [(unicode(rf.id), rf.title) for rf in regforms] self.start_dt_override.default_time = self.event.start_dt_local.time() self.end_dt_override.default_time = self.event.end_dt_local.time() def validate_start_dt_override(self, field): if bool(self.start_dt_override.data) != bool( self.end_dt_override.data): raise ValidationError( _('You need to specify both date overrides or neither of them.' )) validate_end_dt_override = validate_start_dt_override
class RegistrationFormScheduleForm(IndicoForm): start_dt = IndicoDateTimeField( _("Start"), [Optional()], default_time=time(0, 0), description=_("Moment when registrations will be open")) end_dt = IndicoDateTimeField( _("End"), [Optional(), LinkedDateTime('start_dt')], default_time=time(23, 59), description=_("Moment when registrations will be closed")) modification_end_dt = IndicoDateTimeField( _("Modification deadline"), [Optional(), LinkedDateTime('end_dt')], default_time=time(23, 59), description=_("Deadline until which registration information can be " "modified (defaults to the end date if empty)")) def __init__(self, *args, **kwargs): regform = kwargs.pop('regform') self.timezone = regform.event.timezone super().__init__(*args, **kwargs)
class EventCreationForm(EventCreationFormBase): _field_order = ('category', 'title', 'start_dt', 'end_dt', 'timezone', 'location_data', 'protection_mode') _advanced_field_order = () start_dt = IndicoDateTimeField(_("Start"), [DataRequired()], default_time=time(8), allow_clear=False) end_dt = IndicoDateTimeField( _("End"), [DataRequired(), LinkedDateTime('start_dt', not_equal=True)], default_time=time(18), allow_clear=False)
class RegistrationFormScheduleForm(IndicoForm): start_dt = IndicoDateTimeField( _("Start"), [Optional()], default_time=time(0, 0), description=_("Moment when registrations will be open")) end_dt = IndicoDateTimeField( _("End"), [Optional(), LinkedDateTime('start_dt')], default_time=time(23, 59), description=_("Moment when registrations will be closed")) def __init__(self, *args, **kwargs): regform = kwargs.pop('regform') self.timezone = regform.event.tz super(IndicoForm, self).__init__(*args, **kwargs)
class EventDatesForm(IndicoForm): _main_fields = ('start_dt', 'end_dt', 'timezone', 'update_timetable') _override_date_fields = ('start_dt_override', 'end_dt_override') timezone = IndicoTimezoneSelectField(_('Timezone'), [DataRequired()]) start_dt = IndicoDateTimeField(_("Start"), [InputRequired()], allow_clear=False) end_dt = IndicoDateTimeField( _("End"), [InputRequired(), LinkedDateTime('start_dt', not_equal=True)], allow_clear=False) update_timetable = BooleanField( _('Update timetable'), widget=SwitchWidget(), description=_( "Move sessions/contributions/breaks in the timetable according " "to the new event start time.")) start_dt_override = IndicoDateTimeField( _("Start"), [Optional()], allow_clear=True, description=_( "Specifying this date overrides the start date displayed " "on the main conference page.")) end_dt_override = IndicoDateTimeField( _("End"), [Optional(), LinkedDateTime('start_dt_override', not_equal=True)], allow_clear=True, description=_("Specifying this date overrides the end date displayed " "on the main conference page.")) def __init__(self, *args, **kwargs): self.event = kwargs.pop('event') super(EventDatesForm, self).__init__(*args, **kwargs) # timetable synchronization self.check_timetable_boundaries = (self.event.type_ != EventType.lecture) if self.check_timetable_boundaries: self.toplevel_timetable_entries = get_top_level_entries(self.event) if not self.toplevel_timetable_entries: self.check_timetable_boundaries = False if not self.check_timetable_boundaries: del self.update_timetable # displayed dates self.has_displayed_dates = (self.event.type_ == EventType.conference) if self.has_displayed_dates: start_dt = self.start_dt.data or self.start_dt.object_data end_dt = self.end_dt.data or self.end_dt.object_data self.start_dt_override.default_time = start_dt.astimezone( timezone(self.timezone.data)).time() self.end_dt_override.default_time = end_dt.astimezone( timezone(self.timezone.data)).time() else: del self.start_dt_override del self.end_dt_override def validate_start_dt(self, field): if not self.check_timetable_boundaries or self.update_timetable.data or field.object_data == field.data: return if field.data > min(self.toplevel_timetable_entries, key=attrgetter('start_dt')).start_dt: raise ValidationError( _("To use this start date the timetable must be updated.")) def validate_end_dt(self, field): if not self.check_timetable_boundaries: return if self.update_timetable.data: # if we move timetable entries according to the start date # change, check that there's enough time at the end. start_dt_offset = self.start_dt.data - self.start_dt.object_data end_buffer = field.data - max(self.toplevel_timetable_entries, key=attrgetter('end_dt')).end_dt delta = max(timedelta(), start_dt_offset - end_buffer) if delta: delta_str = format_human_timedelta(delta, 'minutes', True) raise ValidationError( _("The event is too short to fit all timetable entries. " "It must be at least {} longer.").format(delta_str)) else: # if we do not update timetable entries, only check that # the event does not end before its last timetable entry; # a similar check for the start time is done above in that # field's validation method. max_end_dt = max(self.toplevel_timetable_entries, key=attrgetter('end_dt')).end_dt if field.data < max_end_dt: raise ValidationError( _("The event cannot end before its last timetable entry, which is at {}." ).format( to_unicode( format_datetime(max_end_dt, timezone=self.event.tzinfo))))