Esempio n. 1
0
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
Esempio n. 2
0
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
Esempio n. 3
0
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
Esempio n. 4
0
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)
Esempio n. 5
0
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)
Esempio n. 6
0
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
Esempio n. 7
0
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)
Esempio n. 8
0
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)
Esempio n. 9
0
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)
Esempio n. 10
0
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))))