class IReservation(Interface):
    """ A reservation of an allocation (may be pending or approved). """

    id = schema.Int(title=_(u'Id'), default=-1, required=False)

    day = schema.Date(title=_(u'Day'), required=False)

    start_time = schema.Time(title=_(u'Start'), required=False)

    end_time = schema.Time(title=_(u'End'), required=False)

    quota = schema.Int(title=_(u'Reservation Quota'),
                       required=False,
                       default=1)

    email = EmailField(title=_(u'Email'), required=True)

    description = schema.TextLine(
        title=_(u'Description'),
        description=_('Visible on the calendar'),
        required=False,
    )

    recurrence = schema.Text(
        title=_(u'Recurrence'),
        required=False,
    )
Example #2
0
class ISearchAndReserveForm(model.Schema):
    """ Search form for search & reserve view. """

    form.mode(timeframes='hidden')
    timeframes = schema.Text(title=_(u'Timeframes'),
                             default=u'',
                             required=False)

    recurrence_start = schema.Date(title=_(u"Start date"), required=True)

    recurrence_end = schema.Date(title=_(u"End date"), required=True)

    whole_day = schema.Bool(title=_(u"Whole day"),
                            required=False,
                            default=False)

    start_time = schema.Time(title=_(u"Start time"), required=False)

    end_time = schema.Time(title=_(u"End time"), required=False)

    form.widget(days=CheckBoxFieldWidget)
    days = schema.List(title=_(u"Days"),
                       value_type=schema.Choice(vocabulary=weekdays),
                       required=False)

    minspots = schema.Int(title=_(u"Spots"), required=False)

    available_only = schema.Bool(title=_(u"Available only"),
                                 required=False,
                                 default=True)
class ISelectionReservation(Interface):
    """ A reservation of a selected number of allocations. """

    # hidden
    ids = schema.TextLine(
        title=_(u'Ids'),
        required=False
    )

    start_time = schema.Time(
        title=_(u'Start'),
        required=False
    )

    end_time = schema.Time(
        title=_(u'End'),
        required=False
    )

    quota = schema.Int(
        title=_(u'Number of Reservations'),
        required=False,
        default=1
    )

    email = Email(
        title=_(u'Email'),
        required=True
    )
class IReservationEditTimeForm(IReservationTargetForm):

    start_time = schema.Time(
        title=_(u'Start'),
        required=True
    )

    end_time = schema.Time(
        title=_(u'End'),
        required=True
    )

    send_email = schema.Bool(
        title=_(u"Send Email"),
        description=_(
            u"Send an email to the reservee informing him of the change"
        ),
        default=True
    )

    reason = schema.Text(
        title=_(u'Reason'),
        description=_(
            u"Optional reason for the change. Sent to the reservee. "
            u"e.g. 'Your reservation has to be adjusted because the meeting "
            "room has been flooded.'"
        ),
        required=False
    )
class IReservation(Interface):
    """ A reservation of an allocation (may be pending or approved). """

    id = schema.Int(
        title=_(u'Id'),
        default=-1,
        required=False
    )

    day = schema.Date(
        title=_(u'Day'),
        required=False
    )

    start_time = schema.Time(
        title=_(u'Start'),
        required=False
    )

    end_time = schema.Time(
        title=_(u'End'),
        required=False
    )

    quota = schema.Int(
        title=_(u'Number of Reservations'),
        required=False,
        default=1
    )

    email = Email(
        title=_(u'Email'),
        required=True
    )
Example #6
0
class IDateAndTimeSchema(form.Schema):

    form.primary('datetime')
    zope_datetime = schema.Datetime(title=u'Zope Datetime')
    datetime = schema.Datetime(title=u'Datetime')
    date = schema.Date(title=u'Date')
    time = schema.Time(title=u'Time')
Example #7
0
class IRequestForm(interface.Interface):

    rf_title = schema.TextLine(title=u"Title of Event", required=True)

    rf_sponsor = schema.TextLine(title=u"Sponsoring Department/Faculty",
                                 required=False)

    # Event Date, Time and Location
    rf_esd = schema.Date(title=u"Event Start Date", required=True)
    rf_eed = schema.Date(title=u"Event End Date", required=True)
    rf_start_time = schema.Time(title=u"Start Time", required=False)
    rf_end_time = schema.Time(title=u"End Time", required=False)

    rf_number_of_attendees = schema.TextLine(title=u"Number of Attendees",
                                             required=False)
    rf_rooms_used = schema.TextLine(title=u"Rooms Used", required=False)

    # Contact Information
    rf_contact_phone = schema.TextLine(title=u"Contact Phone", required=False)
    rf_contact_fax = schema.TextLine(title=u"Contact Fax", required=False)
    rf_contact_email = schema.TextLine(title=u"Contact Email", required=False)
    rf_contact_street_address = schema.TextLine(
        title=u"Contact Street Address", required=False)
    rf_contact_city = schema.TextLine(title=u"Contact City", required=False)
    rf_contact_state = schema.TextLine(title=u"Contact State", required=False)
    rf_contact_zip = schema.TextLine(title=u"Contact Zip", required=False)

    # Payment Information
    # this is 1 to 1'd only for the sake of capturing the data we need
    # this is not enabled and should never be activated in this current manner

    # Chartfield
    # Type of Card
    # Card Number
    # Security Code

    # Additional Information
    rf_url_info = schema.URI(title=u"URL with more info", required=False)
    rf_vips_attending = schema.TextLine(title=u"VIPs in attendance",
                                        required=False)
    rf_vips_name = schema.TextLine(title=u"Name of VIPs", required=False)
    rf_special_instructions = schema.TextLine(title=u"Special Instructions",
                                              required=False)
Example #8
0
class IDXItemSchema(Schema):

    bool_field = schema.Bool(title=u'Bool Field', default=False)
    choice_field = schema.Choice(title=u'Choice Field', vocabulary=COLORS)
    date_field = schema.Date(title=u'Date Field')
    datetime_field = schema.Datetime(title=u'Datetime Field')
    decimal_field = schema.Decimal(title=u'Float Field')
    dottedname_field = schema.URI(title=u'DottedName Field')
    file_field = NamedFile(title=u'File Field')
    float_field = schema.Float(title=u'Float Field')
    image_field = NamedImage(title=u'Image Field')
    list_field = schema.List(title=u'List Field')
    richtext_field = RichText(title=u'Rich Text Field')
    text_field = schema.Text(title=u'Text Field')
    time_field = schema.Time(title=u'Time Field')
    timedelta_field = schema.Timedelta(title=u'Timedelta Field')
    uri_field = schema.URI(title=u'URI Field')
class ISchedule(model.Schema):

    title = schema.TextLine(
        title=(u'Semester'),
        description=(u'Ex: Fall Semester'),
        required=True,
    )

    testDate = schema.Time(
        title=u'This is a Timedelta field',
        required=False
    )

    # Data grid for Daytime Course requests
    form.widget(dayCourses=DataGridFieldFactory)
    dayCourses = schema.List(
        title=(u'Please submit your requests for daytime courses'),
        value_type=DictRow(
            title=(u'Courses'),
            schema=ICourses
        ),
        required=False,
    )
Example #10
0
 def test_all(self):
     mapping = [
         (schema.Object(schema=IResource),
          serialize_schema_field.DefaultSchemaFieldSerializer),
         (schema.Text(),
          serialize_schema_field.DefaultTextSchemaFieldSerializer),
         (schema.TextLine(),
          serialize_schema_field.DefaultTextLineSchemaFieldSerializer),
         (schema.Float(),
          serialize_schema_field.DefaultFloatSchemaFieldSerializer),
         (schema.Int(),
          serialize_schema_field.DefaultIntSchemaFieldSerializer),
         (schema.Bool(),
          serialize_schema_field.DefaultBoolSchemaFieldSerializer),
         (schema.List(),
          serialize_schema_field.DefaultCollectionSchemaFieldSerializer),
         (schema.Choice(values=('one', 'two')),
          serialize_schema_field.DefaultChoiceSchemaFieldSerializer),
         (schema.Object(schema=IResource),
          serialize_schema_field.DefaultObjectSchemaFieldSerializer),
         (RichText(),
          serialize_schema_field.DefaultRichTextSchemaFieldSerializer),
         (schema.Date(),
          serialize_schema_field.DefaultDateSchemaFieldSerializer),
         (schema.Time(),
          serialize_schema_field.DefaultTimeSchemaFieldSerializer),
         (schema.Dict(),
          serialize_schema_field.DefaultDictSchemaFieldSerializer),
         (schema.Datetime(),
          serialize_schema_field.DefaultDateTimeSchemaFieldSerializer),
     ]
     root = self.layer.new_root()
     site = root['plone']
     for field, klass in mapping:
         adapter = getMultiAdapter((field, site, self.request),
                                   interface=ISchemaFieldSerializeToJson)
         self.assertTrue(isinstance(adapter, klass))
Example #11
0
class IDXTestDocumentSchema(model.Schema):

    # zope.schema fields
    test_ascii_field = schema.ASCII(required=False)
    test_asciiline_field = schema.ASCIILine(required=False)
    test_bool_field = schema.Bool(required=False)
    test_bytes_field = schema.Bytes(required=False)
    test_bytesline_field = schema.BytesLine(required=False)
    test_choice_field = schema.Choice(values=[u"foo", u"bar"], required=False)
    test_choice_field_with_vocabulary = schema.Choice(
        vocabulary=SimpleVocabulary([
            SimpleTerm(u"value1", "token1", u"title1"),
            SimpleTerm(u"value2", "token2", u"title2"),
        ]),
        required=False,
    )
    test_date_field = schema.Date(required=False)
    test_datetime_field = schema.Datetime(required=False)
    test_datetime_tz_field = schema.Datetime(
        required=False,
        defaultFactory=lambda: timezone("Europe/Zurich").localize(
            datetime(2017, 10, 31, 10, 0)),
    )
    test_decimal_field = schema.Decimal(required=False)
    test_dict_field = schema.Dict(required=False)
    test_float_field = schema.Float(required=False)
    test_frozenset_field = schema.FrozenSet(required=False)
    test_int_field = schema.Int(required=False)
    test_list_field = schema.List(required=False)
    test_list_field_with_choice_with_vocabulary = schema.List(
        value_type=schema.Choice(vocabulary=SimpleVocabulary([
            SimpleTerm(u"value1", "token1", u"title1"),
            SimpleTerm(u"value2", "token2", u"title2"),
            SimpleTerm(u"value3", "token3", u"title3"),
        ])),
        required=False,
    )
    test_set_field = schema.Set(required=False)
    test_text_field = schema.Text(required=False)
    test_textline_field = schema.TextLine(required=False)
    test_time_field = schema.Time(required=False)
    test_timedelta_field = schema.Timedelta(required=False)
    test_tuple_field = schema.Tuple(required=False)
    test_nested_list_field = schema.List(required=False,
                                         value_type=schema.Tuple())
    test_nested_dict_field = schema.Dict(required=False,
                                         key_type=schema.ASCIILine(),
                                         value_type=schema.Tuple())
    test_list_choice_with_context_vocabulary_field = schema.List(
        title=u"Field",
        value_type=schema.Choice(
            vocabulary="plone.restapi.testing.context_vocabulary"),
        required=False,
    )

    # plone.app.textfield
    test_richtext_field = RichText(
        required=False, allowed_mime_types=["text/html", "text/plain"])

    # plone.namedfile fields
    test_namedfile_field = namedfile.NamedFile(required=False)
    test_namedimage_field = namedfile.NamedImage(required=False)
    test_namedblobfile_field = namedfile.NamedBlobFile(required=False)
    test_namedblobimage_field = namedfile.NamedBlobImage(required=False)

    # z3c.relationfield
    test_relationchoice_field = RelationChoice(
        required=False, source=CatalogSource(id=["doc1", "doc2"]))
    test_relationlist_field = RelationList(
        required=False,
        value_type=RelationChoice(vocabulary="plone.app.vocabularies.Catalog"),
    )

    # Test fields for validation
    test_required_field = schema.TextLine(required=True)
    test_readonly_field = schema.TextLine(required=False, readonly=True)
    test_maxlength_field = schema.TextLine(required=False, max_length=10)
    test_constraint_field = schema.TextLine(required=False,
                                            constraint=lambda x: u"00" in x)
    test_datetime_min_field = schema.Datetime(required=False,
                                              min=datetime(2000, 1, 1))
    test_time_min_field = schema.Time(required=False, min=time(1))
    test_timedelta_min_field = schema.Timedelta(required=False,
                                                min=timedelta(100))
    test_list_value_type_field = schema.List(required=False,
                                             value_type=schema.Int())
    test_dict_key_type_field = schema.Dict(required=False,
                                           key_type=schema.Int())

    read_permission(test_read_permission_field="cmf.ManagePortal")
    test_read_permission_field = schema.TextLine(required=False)
    write_permission(test_write_permission_field="cmf.ManagePortal")
    test_write_permission_field = schema.TextLine(required=False)

    read_permission(test_read_permission_field="cmf.ManagePortal")
    test_read_permission_field = schema.TextLine(required=False)

    test_invariant_field1 = schema.TextLine(required=False)
    test_invariant_field2 = schema.TextLine(required=False)

    test_missing_value_field = schema.TextLine(required=False,
                                               missing_value=u"missing",
                                               default=u"default")

    test_missing_value_required_field = schema.TextLine(
        required=True, missing_value=u"missing", default=u"some value")

    @invariant
    def validate_same_value(data):
        if data.test_invariant_field1 != data.test_invariant_field2:
            raise Invalid(u"Must have same values")

    # Test fields with default values
    test_default_value_field = schema.TextLine(required=True,
                                               default=u"Default")

    @provider(IContextAwareDefaultFactory)
    def default_factory(context):
        return u"DefaultFactory"

    test_default_factory_field = schema.TextLine(
        required=True, defaultFactory=default_factory)
class IReserve(form.Schema):
    """ Reserve Folder for Events """

    frequency = schema.Choice(
        title=_(u"Frequência"),
        description=_(u"Informe a frequência com que os eventos ocorrem."),
        values=['semanal', 'quinzenal', 'mensal'],
        default=_(u"semanal"),
    )

    local = schema.TextLine(
        title=_(u"Local"),
        description=_(u"Informe o local onde os eventos deverão ocorrer."),
    )

    duration = schema.Time(
        title=_(u"Duração"),
        description=_(
            u"Informe a duração dos eventos. Ex.: 01:00 (uma hora)."),
    )

    contact = schema.TextLine(
        title=_(u"Contato"),
        description=
        _(u"Insira o email do usuário que vai receber notificações das reservas efetuadas."
          ),
        required=False,
    )

    form.widget(additional_items=DataGridFieldFactory)
    additional_items = schema.List(
        title=u"Itens da reserva corporativa",
        description=_(
            u"Informe os itens que podem conter na reserva corporativa."),
        required=False,
        value_type=DictRow(title=u"Itens", schema=ITableRowSchema))

    mult_horarios = schema.Bool(
        title=_(u"Permitir mais de um horário"),
        description=
        _(u"Selecione se essa reserva irá permitir que o usuário selecione mais de um horário por reserva."
          ),
        required=False,
    )

    recurrent = schema.Bool(
        title=_(u"Permitir agendamento recorrente"),
        description=
        _(u"Selecione se essa reserva irá permitir que o usuário um agendamento recorrente nessa reserva."
          ),
        required=False,
    )

    replic_semana = schema.Bool(
        title=_(u"Replicar na semana"),
        description=
        _(u"Selecione esta opção caso haja reservas disponíveis para todos os dias da semana, informando nos campos abaixo os horários de inicio e término.\
                        Caso não deseje esta opção desconsidere os dois próximos campos abaixo."
          ),
        required=False,
    )

    replic_start = schema.Time(
        title=_(u"Hora que começa (Replicar na semana)"),
        required=False,
    )

    replic_end = schema.Time(
        title=_(u"Hora que termina (Replicar na semana)"),
        required=False,
    )

    # Monday
    monday = schema.Bool(
        title=_(u"Segunda"),
        description=
        _(u"Selecione a opção caso haja reservas disponíveis nas segundas e indique os horários de início e término."
          ),
    )

    mon_start = schema.Time(
        title=_(u"Hora que começa"),
        required=False,
    )

    mon_end = schema.Time(
        title=_(u"Hora que termina"),
        required=False,
    )

    # Tuesday
    tuesday = schema.Bool(
        title=_(u"Terça"),
        description=
        _(u"Selecione a opção caso haja reservas disponíveis nas terças e indique os horários de início e término."
          ),
        default=False)

    tue_start = schema.Time(
        title=_(u"Hora que começa"),
        required=False,
    )

    tue_end = schema.Time(
        title=_(u"Hora que termina"),
        required=False,
    )

    # Wednesday
    wednesday = schema.Bool(
        title=_(u"Quarta"),
        description=
        _(u"Selecione a opção caso haja reservas disponíveis nas quartas e indique os horários de início e término."
          ),
        default=False)

    wed_start = schema.Time(
        title=_(u"Hora que começa"),
        required=False,
    )

    wed_end = schema.Time(
        title=_(u"Hora que termina"),
        required=False,
    )

    # Thursday
    thursday = schema.Bool(
        title=_(u"Quinta"),
        description=
        _(u"Selecione a opção caso haja reservas disponíveis nas quintas e indique os horários de início e término."
          ),
        default=False)

    thu_start = schema.Time(
        title=_(u"Hora que começa"),
        required=False,
    )

    thu_end = schema.Time(
        title=_(u"Hora que termina"),
        required=False,
    )

    # Friday
    friday = schema.Bool(
        title=_(u"Sexta"),
        description=
        _(u"Selecione a opção caso haja reservas disponíveis nas sextas e indique os horários de início e término."
          ),
        default=False)

    fri_start = schema.Time(
        title=_(u"Hora que começa"),
        required=False,
    )

    fri_end = schema.Time(
        title=_(u"Hora que termina"),
        required=False,
    )

    # Saturday
    saturday = schema.Bool(
        title=_(u"Sábado"),
        description=
        _(u"Selecione a opção caso haja reservas disponíveis nos sábados e indique os horários de início e término."
          ),
        default=False)

    sat_start = schema.Time(
        title=_(u"Hora que começa"),
        required=False,
    )

    sat_end = schema.Time(
        title=_(u"Hora que termina"),
        required=False,
    )

    # Sunday
    sunday = schema.Bool(
        title=_(u"Domingo"),
        description=
        _(u"Selecione a opção caso haja reservas disponíveis nos domingos e indique os horários de início e término."
          ),
        default=False)

    sun_start = schema.Time(
        title=_(u"Hora que começa"),
        required=False,
    )

    sun_end = schema.Time(
        title=_(u"Hora que termina"),
        required=False,
    )

    obj_contentcore = RelationChoice(
        title=_(u"Vincular com um formulario basico"),
        description=_(
            u"Selecione o objeto de formulario para ser exibido com a reserva"
        ),
        source=ObjPathSourceBinder(review_state='published'),
        required=False,
    )

    form.fieldset('Horarios',
                  fields=[
                      'monday', 'mon_start', 'mon_end', 'tuesday', 'tue_start',
                      'tue_end', 'wednesday', 'wed_start', 'wed_end',
                      'thursday', 'thu_start', 'thu_end', 'friday',
                      'fri_start', 'fri_end', 'saturday', 'sat_start',
                      'sat_end', 'sunday', 'sun_start', 'sun_end'
                  ])

    form.fieldset('Avançado',
                  fields=['additional_items', 'recurrent', 'obj_contentcore'])
Example #13
0
class IDXTestDocumentSchema(model.Schema):

    # zope.schema fields
    test_ascii_field = schema.ASCII(required=False)
    test_asciiline_field = schema.ASCIILine(required=False)
    test_bool_field = schema.Bool(required=False)
    test_bytes_field = schema.Bytes(required=False)
    test_bytesline_field = schema.BytesLine(required=False)
    test_choice_field = schema.Choice(values=[u'foo', u'bar'], required=False)
    test_date_field = schema.Date(required=False)
    test_datetime_field = schema.Datetime(required=False)
    test_datetime_tz_field = schema.Datetime(
        required=False,
        defaultFactory=lambda: timezone("Europe/Zurich").localize(
            datetime(2017, 10, 31, 10, 0)))
    test_decimal_field = schema.Decimal(required=False)
    test_dict_field = schema.Dict(required=False)
    test_float_field = schema.Float(required=False)
    test_frozenset_field = schema.FrozenSet(required=False)
    test_int_field = schema.Int(required=False)
    test_list_field = schema.List(required=False)
    test_set_field = schema.Set(required=False)
    test_text_field = schema.Text(required=False)
    test_textline_field = schema.TextLine(required=False)
    test_time_field = schema.Time(required=False)
    test_timedelta_field = schema.Timedelta(required=False)
    test_tuple_field = schema.Tuple(required=False)
    test_nested_list_field = schema.List(
        required=False, value_type=schema.Tuple())
    test_nested_dict_field = schema.Dict(
        required=False, key_type=schema.ASCIILine(), value_type=schema.Tuple())
    test_list_choice_with_context_vocabulary_field = schema.List(
        title=u'Field',
        value_type=schema.Choice(
            vocabulary='plone.restapi.testing.context_vocabulary'),
        required=False)

    # plone.app.textfield
    test_richtext_field = RichText(
        required=False, allowed_mime_types=['text/html', 'text/plain'])

    # plone.namedfile fields
    test_namedfile_field = namedfile.NamedFile(required=False)
    test_namedimage_field = namedfile.NamedImage(required=False)
    test_namedblobfile_field = namedfile.NamedBlobFile(required=False)
    test_namedblobimage_field = namedfile.NamedBlobImage(required=False)

    # z3c.relationfield
    test_relationchoice_field = RelationChoice(
        required=False, source=CatalogSource(id=['doc1', 'doc2']))
    test_relationlist_field = RelationList(
        required=False, value_type=RelationChoice(
            vocabulary="plone.app.vocabularies.Catalog"))

    # Test fields for validation
    test_required_field = schema.TextLine(required=True)
    test_readonly_field = schema.TextLine(required=False, readonly=True)
    test_maxlength_field = schema.TextLine(required=False, max_length=10)
    test_constraint_field = schema.TextLine(required=False,
                                            constraint=lambda x: u'00' in x)
    test_datetime_min_field = schema.Datetime(required=False,
                                              min=datetime(2000, 1, 1))
    test_time_min_field = schema.Time(required=False, min=time(1))
    test_timedelta_min_field = schema.Timedelta(required=False,
                                                min=timedelta(100))
    test_list_value_type_field = schema.List(required=False,
                                             value_type=schema.Int())
    test_dict_key_type_field = schema.Dict(required=False,
                                           key_type=schema.Int())

    read_permission(test_read_permission_field='cmf.ManagePortal')
    test_read_permission_field = schema.TextLine(required=False)
    write_permission(test_write_permission_field='cmf.ManagePortal')
    test_write_permission_field = schema.TextLine(required=False)

    read_permission(test_read_permission_field='cmf.ManagePortal')
    test_read_permission_field = schema.TextLine(required=False)

    test_invariant_field1 = schema.TextLine(required=False)
    test_invariant_field2 = schema.TextLine(required=False)

    @invariant
    def validate_same_value(data):
        if data.test_invariant_field1 != data.test_invariant_field2:
            raise Invalid(u'Must have same values')

    # Test fields with default values
    test_default_value_field = schema.TextLine(
        required=True, default=u'Default')

    @provider(IContextAwareDefaultFactory)
    def default_factory(context):
        return u'DefaultFactory'

    test_default_factory_field = schema.TextLine(
        required=True, defaultFactory=default_factory)
Example #14
0
class IExample(model.Schema):
    """Dexterity-Schema with all field-types."""

    # The most used fields
    # textline, text, bool, richtext, email

    fieldset(
        "numberfields",
        label=u"Number fields",
        fields=("int_field", "float_field"),
    )

    fieldset(
        "datetimefields",
        label=u"Date and time fields",
        fields=(
            "datetime_field",
            "date_field",
            "time_field",
            "timedelta_field",
        ),
    )

    fieldset(
        "choicefields",
        label=u"Choice and Multiple Choice fields",
        fields=(
            "choice_field",
            "choice_field_radio",
            "choice_field_select",
            "choice_field_voc",
            "list_field",
            "list_field_checkbox",
            "list_field_select",
            "list_field_voc_unconstrained",
            "tuple_field",
            "set_field",
            "set_field_checkbox",
        ),
    )

    fieldset(
        "relationfields",
        label=u"Relation fields",
        fields=(
            "relationchoice_field",
            "relationlist_field",
            "relationchoice_field_constrained",
            "relationlist_field_constrained",
            "relationlist_field_search_mode",
            "relationchoice_field_select",
            "relationchoice_field_radio",
            "relationlist_field_select",
            "relationlist_field_checkbox",
            "relationchoice_field_ajax_select",
            "relationlist_field_ajax_select",
        ),
    )

    fieldset(
        "uuidrelationfields",
        label=u"Relation widgets with uuids",
        fields=(
            "uuid_choice_field",
            "uuid_list_field",
            "uuid_choice_field_constrained",
            "uuid_list_field_constrained",
            "uuid_list_field_search_mode",
            "uuid_choice_field_select",
            "uuid_choice_field_radio",
            "uuid_list_field_select",
            "uuid_list_field_checkbox",
            "uuid_choice_field_ajax_select",
            "uuid_list_field_ajax_select",
        ),
    )

    fieldset(
        "filefields",
        label=u"File fields",
        fields=("file_field", "image_field"),
    )

    fieldset(
        "otherfields",
        label=u"Other fields",
        fields=(
            "uri_field",
            "sourcetext_field",
            "ascii_field",
            "bytesline_field",
            "asciiline_field",
            "pythonidentifier_field",
            "dottedname_field",
            # 'dict_field',
            # "vocabularyterms_field",
            # "vocabularytermstranslation_field",
            # 'dict_field_with_choice',
        ),
    )

    fieldset(
        "datagrid",
        label=u"Datagrid field",
        fields=("datagrid_field", ),
    )

    primary("title")
    title = schema.TextLine(
        title=u"Primary Field (Textline)",
        description=u"zope.schema.TextLine",
        required=True,
    )

    description = schema.TextLine(
        title=u"Description (Textline)",
        description=u"zope.schema.TextLine",
        required=False,
    )

    text_field = schema.Text(
        title=u"Text Field",
        description=u"zope.schema.Text",
        required=False,
        missing_value=u"",
    )

    textline_field = schema.TextLine(
        title=u"Textline field",
        description=u"A simple input field (schema.TextLine)",
        required=False,
    )

    bool_field = schema.Bool(
        title=u"Boolean field",
        description=u"zope.schema.Bool",
        required=False,
    )

    choice_field = schema.Choice(
        title=u"Choice field",
        description=u"zope.schema.Choice",
        values=[u"One", u"Two", u"Three"],
        required=True,
    )

    directives.widget(choice_field_radio=RadioFieldWidget)
    choice_field_radio = schema.Choice(
        title=u"Choice field with radio boxes",
        description=u"zope.schema.Choice",
        values=[u"One", u"Two", u"Three"],
        required=False,
    )

    choice_field_voc = schema.Choice(
        title=u"Choicefield with values from named vocabulary",
        description=u"zope.schema.Choice",
        vocabulary="plone.app.vocabularies.PortalTypes",
        required=False,
    )

    directives.widget(choice_field_select=SelectFieldWidget)
    choice_field_select = schema.Choice(
        title=u"Choicefield with select2 widget",
        description=u"zope.schema.Choice",
        vocabulary="plone.app.vocabularies.PortalTypes",
        required=False,
    )

    list_field = schema.List(
        title=u"List field",
        description=u"zope.schema.List",
        value_type=schema.Choice(
            values=[u"Beginner", u"Advanced", u"Professional"], ),
        required=False,
        missing_value=[],
    )

    directives.widget(list_field_checkbox=CheckBoxFieldWidget)
    list_field_checkbox = schema.List(
        title=u"List field with checkboxes",
        description=u"zope.schema.List",
        value_type=schema.Choice(
            values=[u"Beginner", u"Advanced", u"Professional"], ),
        required=False,
        missing_value=[],
    )

    directives.widget(list_field_select=SelectFieldWidget)
    list_field_select = schema.List(
        title=u"List field with select widget",
        description=u"zope.schema.List",
        value_type=schema.Choice(
            values=[u"Beginner", u"Advanced", u"Professional"], ),
        required=False,
        missing_value=[],
    )

    list_field_voc_unconstrained = schema.List(
        title=
        u"List field with values from vocabulary but not constrained to them.",
        description=u"zope.schema.List",
        value_type=schema.TextLine(),
        required=False,
        missing_value=[],
    )
    directives.widget(
        "list_field_voc_unconstrained",
        AjaxSelectFieldWidget,
        vocabulary="plone.app.vocabularies.PortalTypes",
        pattern_options={
            "closeOnSelect":
            False,  # Select2 option to leave dropdown open for multiple selection
        },
    )

    tuple_field = schema.Tuple(
        title=u"Tuple field",
        description=u"zope.schema.Tuple",
        value_type=schema.Choice(
            values=[u"Beginner", u"Advanced", u"Professional"], ),
        required=False,
        missing_value=(),
    )

    set_field = schema.Set(
        title=u"Set field",
        description=u"zope.schema.Set",
        value_type=schema.Choice(
            values=[u"Beginner", u"Advanced", u"Professional"], ),
        required=False,
        missing_value={},
    )

    directives.widget(set_field_checkbox=CheckBoxFieldWidget)
    set_field_checkbox = schema.Set(
        title=u"Set field with checkboxes",
        description=u"zope.schema.Set",
        value_type=schema.Choice(
            values=[u"Beginner", u"Advanced", u"Professional"], ),
        required=False,
        missing_value={},
    )

    # File fields
    image_field = NamedBlobImage(
        title=u"Image field",
        description=
        u"A upload field for images (plone.namedfile.field.NamedBlobImage)",
        required=False,
    )

    file_field = NamedBlobFile(
        title=u"File field",
        description=
        u"A upload field for files (plone.namedfile.field.NamedBlobFile)",
        required=False,
    )

    # Date and Time fields
    datetime_field = schema.Datetime(
        title=u"Datetime field",
        description=u"Uses a date and time picker (zope.schema.Datetime)",
        required=False,
    )

    date_field = schema.Date(
        title=u"Date field",
        description=u"Uses a date picker (zope.schema.Date)",
        required=False,
    )

    time_field = schema.Time(
        title=u"Time field",
        description=u"zope.schema.Time",
        required=False,
    )

    timedelta_field = schema.Timedelta(
        title=u"Timedelta field",
        description=u"zope.schema.Timedelta",
        required=False,
    )

    # Relation Fields
    relationchoice_field = RelationChoice(
        title=u"Relationchoice field",
        description=u"z3c.relationfield.schema.RelationChoice",
        vocabulary="plone.app.vocabularies.Catalog",
        required=False,
    )

    relationlist_field = RelationList(
        title=u"Relationlist Field",
        description=u"z3c.relationfield.schema.RelationList",
        default=[],
        value_type=RelationChoice(vocabulary="plone.app.vocabularies.Catalog"),
        required=False,
        missing_value=[],
    )

    relationchoice_field_constrained = RelationChoice(
        title=u"Relationchoice field (only allows Documents)",
        description=u"z3c.relationfield.schema.RelationChoice",
        vocabulary="plone.app.vocabularies.Catalog",
        required=False,
    )
    directives.widget(
        "relationchoice_field_constrained",
        RelatedItemsFieldWidget,
        pattern_options={"selectableTypes": ["Document"]},
    )

    relationlist_field_constrained = RelationList(
        title=u"Relationlist Field (only allows Documents and Events)",
        description=u"z3c.relationfield.schema.RelationList",
        default=[],
        value_type=RelationChoice(vocabulary="plone.app.vocabularies.Catalog"),
        required=False,
        missing_value=[],
    )
    directives.widget(
        "relationlist_field_constrained",
        RelatedItemsFieldWidget,
        pattern_options={"selectableTypes": ["Document", "Event"]},
    )

    relationlist_field_search_mode = RelationList(
        title=
        u"Relationlist Field in Search Mode (constrained to published Documents and Events)",
        description=u"z3c.relationfield.schema.RelationList",
        default=[],
        value_type=RelationChoice(source=CatalogSource(
            portal_type=["Document", "Event"], review_state="published")),
        required=False,
        missing_value=[],
    )
    directives.widget(
        "relationlist_field_search_mode",
        RelatedItemsFieldWidget,
        pattern_options={
            "baseCriteria":
            [  # This is a optimization that limits the catalog-query
                {
                    "i": "portal_type",
                    "o": "plone.app.querystring.operation.selection.any",
                    "v": ["Document", "Event"],
                },
                {
                    "i": "review_state",
                    "o": "plone.app.querystring.operation.selection.any",
                    "v": "published",
                },
            ],
            "mode":
            "search",
        },
    )

    # From here on we use other widgets than the default RelatedItemsFieldWidget

    # This one also works in Volto!
    # All other options use the default ObjectWidget in Volto so far.
    relationchoice_field_select = RelationChoice(
        title=u"RelationChoice with Select Widget",
        vocabulary=StaticCatalogVocabulary({
            "portal_type": ["Document", "Event"],
            "review_state": "published",
        }),
        required=False,
    )
    directives.widget(
        "relationchoice_field_select",
        SelectFieldWidget,
    )

    relationchoice_field_radio = RelationChoice(
        title=
        u"RelationChoice with Radio Widget (and customized title-template)",
        vocabulary=StaticCatalogVocabulary(
            {
                "portal_type": ["Document", "Event"],
                "review_state": "published",
            },
            title_template="{brain.Title}",
        ),  # Set a custom vocabulary item title
        required=False,
    )
    directives.widget(
        "relationchoice_field_radio",
        RadioFieldWidget,
    )

    relationlist_field_select = RelationList(
        title=
        u"RelationList with select widget with items from a named vocabulary",
        value_type=RelationChoice(
            vocabulary="example.vocabularies.documents", ),
        required=False,
    )
    directives.widget(
        "relationlist_field_select",
        SelectFieldWidget,
        pattern_options={
            "closeOnSelect":
            False,  # Select2 option to leave dropdown open for multiple selection
        },
    )

    relationlist_field_checkbox = RelationList(
        title=u"RelationList with Checkboxes",
        value_type=RelationChoice(
            vocabulary="example.vocabularies.documents", ),
        required=False,
    )
    directives.widget(
        "relationlist_field_checkbox",
        CheckBoxFieldWidget,
    )

    relationchoice_field_ajax_select = RelationChoice(
        title=u"Relationchoice Field with AJAXSelect",
        description=u"z3c.relationfield.schema.RelationChoice",
        vocabulary=StaticCatalogVocabulary({
            "portal_type": ["Document", "Event"],
        }),
        required=False,
    )
    directives.widget(
        "relationchoice_field_ajax_select",
        AjaxSelectFieldWidget,
        vocabulary=StaticCatalogVocabulary({
            "portal_type": ["Document", "Event"],
        }),
        pattern_options={  # Options for Select2
            "minimumInputLength":
            2,  # - Don't query until at least two characters have been typed
            "ajax": {
                "quietMillis": 500
            },  # - Wait 500ms after typing to make query
        },
    )

    relationlist_field_ajax_select = RelationList(
        title=u"Relationlist Field with AJAXSelect",
        description=u"z3c.relationfield.schema.RelationList",
        value_type=RelationChoice(vocabulary=StaticCatalogVocabulary({
            "portal_type": ["Document", "Event"],
            "review_state":
            "published",
        })),
        required=False,
    )
    directives.widget(
        "relationlist_field_ajax_select",
        AjaxSelectFieldWidget,
        vocabulary=StaticCatalogVocabulary(
            {
                "portal_type": ["Document", "Event", "Folder"],
            },
            title_template="{brain.Type}: {brain.Title} at {path}",
        ),  # Custom item rendering
        pattern_options={  # Options for Select2
            "minimumInputLength":
            2,  # - Don't query until at least two characters have been typed
            "ajax": {
                "quietMillis": 500
            },  # - Wait 500ms after typing to make query
        },
    )

    # These look like relationsfields (see above) but only store the uuid(s) of the selected target
    # as a string in a the field instead of a RelationValue.
    # A good way to use these is in combination with a index that allows you to query these connenctions.
    uuid_choice_field = schema.Choice(
        title=u"Choice field with RelatedItems widget storing uuids",
        description=u"schema.Choice",
        vocabulary="plone.app.vocabularies.Catalog",
        required=False,
    )
    directives.widget("uuid_choice_field", RelatedItemsFieldWidget)

    uuid_list_field = schema.List(
        title=u"List Field with RelatedItems widget storing uuids",
        description=u"schema.List",
        default=[],
        value_type=schema.Choice(vocabulary="plone.app.vocabularies.Catalog"),
        required=False,
        missing_value=[],
    )
    directives.widget("uuid_list_field", RelatedItemsFieldWidget)

    uuid_choice_field_constrained = schema.Choice(
        title=
        u"Choice field with RelatedItems widget storing uuids (only allows Documents)",
        description=u"schema.Choice",
        vocabulary="plone.app.vocabularies.Catalog",
        required=False,
    )
    directives.widget(
        "uuid_choice_field_constrained",
        RelatedItemsFieldWidget,
        pattern_options={"selectableTypes": ["Document"]},
    )

    uuid_list_field_constrained = schema.List(
        title=
        u"List Field with RelatedItems widget storing uuids (only allows Documents and Events)",
        description=u"schema.List",
        default=[],
        value_type=schema.Choice(vocabulary="plone.app.vocabularies.Catalog"),
        required=False,
        missing_value=[],
    )
    directives.widget(
        "uuid_list_field_constrained",
        RelatedItemsFieldWidget,
        pattern_options={"selectableTypes": ["Document", "Folder"]},
    )

    uuid_list_field_search_mode = schema.List(
        title=
        u"List Field with RelatedItems widget in Search Mode storing uuids",
        description=u"schema.List",
        default=[],
        value_type=schema.Choice(source=CatalogSource(
            portal_type=["Document", "Event"], review_state="published")),
        required=False,
        missing_value=[],
    )
    directives.widget(
        "uuid_list_field_search_mode",
        RelatedItemsFieldWidget,
        pattern_options={
            "selectableTypes": ["Document", "Folder"],
            "basePath": "",  # Start the search at the portal root
            "mode": "search",
        },
    )

    # From here on we use other widgets than the default RelatedItemsFieldWidget

    uuid_choice_field_select = schema.Choice(
        title=u"UUID Choice with select widget storing uuids",
        vocabulary=StaticCatalogVocabulary({
            "portal_type": ["Document", "Event"],
            "review_state": "published",
        }),
        required=False,
    )
    directives.widget(
        "uuid_choice_field_select",
        SelectFieldWidget,
    )

    uuid_choice_field_radio = schema.Choice(
        title=u"RelationChoice with Radio widget storing uuids",
        vocabulary=StaticCatalogVocabulary(
            {
                "portal_type": ["Document", "Event"],
                "review_state": "published",
            },
            title_template="{brain.Title}",
        ),  # Set a custom vocabulary item title
        required=False,
    )
    directives.widget(
        "uuid_choice_field_radio",
        RadioFieldWidget,
    )

    uuid_list_field_select = schema.List(
        title=
        u"RelationList with select widget with items from a named vocabulary storing uuids",
        value_type=schema.Choice(
            vocabulary="example.vocabularies.documents", ),
        required=False,
    )
    directives.widget(
        "uuid_list_field_select",
        SelectFieldWidget,
        pattern_options={
            "closeOnSelect":
            False,  # Select2 option to leave dropdown open for multiple selection
        },
    )

    uuid_list_field_checkbox = schema.List(
        title=u"RelationList with Checkboxes storing uuids",
        value_type=schema.Choice(
            vocabulary="example.vocabularies.documents", ),
        required=False,
    )
    directives.widget(
        "uuid_list_field_checkbox",
        CheckBoxFieldWidget,
    )

    uuid_choice_field_ajax_select = schema.Choice(
        title=u"Relationchoice Field with AJAXSelect storing uuids",
        description=u"z3c.relationfield.schema.RelationChoice",
        vocabulary=StaticCatalogVocabulary({
            "portal_type": ["Document", "Event"],
        }),
        required=False,
    )
    directives.widget(
        "uuid_choice_field_ajax_select",
        AjaxSelectFieldWidget,
        vocabulary=StaticCatalogVocabulary({
            "portal_type": ["Document", "Event"],
        }),
        pattern_options={  # Options for Select2
            "minimumInputLength":
            2,  # - Don't query until at least two characters have been typed
            "ajax": {
                "quietMillis": 500
            },  # - Wait 500ms after typing to make query
        },
    )

    uuid_list_field_ajax_select = schema.List(
        title=u"Relationlist Field with AJAXSelect storing uuids",
        description=u"z3c.relationfield.schema.RelationList",
        value_type=schema.Choice(vocabulary=StaticCatalogVocabulary({
            "portal_type": ["Document", "Event"],
            "review_state":
            "published",
        })),
        required=False,
    )
    directives.widget(
        "uuid_list_field_ajax_select",
        AjaxSelectFieldWidget,
        vocabulary=StaticCatalogVocabulary(
            {
                "portal_type": ["Document", "Event"],
            },
            title_template="{brain.Type}: {brain.Title} at {path}",
        ),  # Custom item rendering
        pattern_options={  # Options for Select2
            "minimumInputLength":
            2,  # - Don't query until at least two characters have been typed
            "ajax": {
                "quietMillis": 500
            },  # - Wait 500ms after typing to make query
            "closeOnSelect":
            False,  # - Leave dropdown open for multiple selection
        },
    )

    # Number fields
    int_field = schema.Int(
        title=u"Integer Field (e.g. 12)",
        description=u"zope.schema.Int",
        required=False,
    )

    float_field = schema.Float(
        title=u"Float field, e.g. 12.7",
        description=u"zope.schema.Float",
        required=False,
    )

    # Text fields
    email_field = Email(
        title=u"Email field",
        description=
        u"A simple input field for a email (plone.schema.email.Email)",
        required=False,
    )

    uri_field = schema.URI(
        title=u"URI field",
        description=u"A simple input field for a URLs (zope.schema.URI)",
        required=False,
    )

    richtext_field = RichText(
        title=u"RichText field",
        description=
        u"This uses a richtext editor. (plone.app.textfield.RichText)",
        max_length=2000,
        required=False,
    )

    sourcetext_field = schema.SourceText(
        title=u"SourceText field",
        description=u"zope.schema.SourceText",
        required=False,
    )

    ascii_field = schema.ASCII(
        title=u"ASCII field",
        description=u"zope.schema.ASCII",
        required=False,
    )

    bytesline_field = schema.BytesLine(
        title=u"BytesLine field",
        description=u"zope.schema.BytesLine",
        required=False,
    )

    asciiline_field = schema.ASCIILine(
        title=u"ASCIILine field",
        description=u"zope.schema.ASCIILine",
        required=False,
    )

    pythonidentifier_field = schema.PythonIdentifier(
        title=u"PythonIdentifier field",
        description=u"zope.schema.PythonIdentifier",
        required=False,
    )

    dottedname_field = schema.DottedName(
        title=u"DottedName field",
        description=u"zope.schema.DottedName",
        required=False,
    )

    # dict_field = schema.Dict(
    #     title=u'Dict field',
    #     description=u"zope.schema.Dict",
    #     required=False,
    #     key_type=schema.TextLine(
    #         title=u'Key',
    #         required=False,
    #     ),
    #     value_type=schema.TextLine(
    #         title=u'Value',
    #         required=False,
    #     ),
    # )

    # vocabularyterms_field = Dict(  # we use the plone.schema field Dict not zope.schema field to use the attribute 'widget'
    #     title=u"Vocabulary terms field",
    #     description=u"plone.schema.Dict field with value_type schema.TextLine and frontend widget 'VocabularyTermsWidget'",
    #     required=False,
    #     key_type=schema.TextLine(
    #         title=u"Key",
    #         required=False,
    #     ),
    #     value_type=schema.TextLine(
    #         title=u"Value",
    #         required=False,
    #     ),
    #     widget="vocabularyterms",  # we use the widget attribute to apply the frontend widget VocabularyWidget
    # )

    # vocabularytermstranslation_field = Dict(  # we use the plone.schema field Dict not zope.schema field to use the attribute 'widget'
    #     title=u"Vocabulary terms field with translations",
    #     description=u"plone.schema.Dict field with value_type Dict and frontend widget 'VocabularyTermsWidget'",
    #     required=False,
    #     key_type=schema.TextLine(
    #         title=u"Key",
    #         required=False,
    #     ),
    #     value_type=Dict(  # we use the plone.schema field Dict not zope.schema field to use the attribute 'widget'
    #         title=u"Term translation",
    #         description=u"plone.schema.Dict field for translations of vocabulary term",
    #         required=True,
    #         key_type=schema.TextLine(
    #             title=u"Key",
    #             required=False,
    #         ),
    #         value_type=schema.TextLine(
    #             title=u"Value",
    #             required=False,
    #         ),
    #     ),
    #     widget="vocabularyterms",  # we use the widget attribute to apply the frontend widget VocabularyWidget
    # )

    # dict_field_with_choice = schema.Dict(
    #     title=u'Dict field with key and value as choice',
    #     description=u"zope.schema.Dict",
    #     required=False,
    #     key_type=schema.Choice(
    #         title=u'Key',
    #         values=[u'One', u'Two', u'Three'],
    #         required=False,
    #         ),
    #     value_type=schema.Set(
    #         title=u'Value',
    #         value_type=schema.Choice(
    #             values=[u'Beginner', u'Advanced', u'Professional'],
    #             ),
    #         required=False,
    #         missing_value={},
    #         ),
    #     )

    datagrid_field = schema.List(
        title=u"Datagrid field",
        description=u"schema.List",
        value_type=DictRow(title=u"Table", schema=IMyRowSchema),
        default=[],
        required=False,
    )
    directives.widget("datagrid_field", DataGridFieldFactory)
class IAllocation(IResourceAllocationDefaults):
    """ An reservable time-slot within a calendar. """

    id = schema.Int(
        title=_(u'Id'),
        default=-1,
        required=False,
    )

    group = schema.Text(title=_(u'Recurrence'), default=u'', required=False)

    timeframes = schema.Text(title=_(u'Timeframes'),
                             default=u'',
                             required=False)

    start_time = schema.Time(
        title=_(u'Start'),
        description=_(
            u'Allocations may start every 5 minutes if the allocation '
            u'is not partly available. If it is partly available the start '
            u'time may be every x minute where x equals the given raster.'))

    end_time = schema.Time(
        title=_(u'End'),
        description=_(
            u'Allocations may end every 5 minutes if the allocation '
            u'is not partly available. If it is partly available the start '
            u'time may be every x minute where x equals the given raster. '
            u'The minimum length of an allocation is also either 5 minutes '
            u'or whatever the value of the raster is.'))

    whole_day = schema.Bool(
        title=_(u'Whole Day'),
        description=_(u'The allocation spans the whole day.'),
        required=False,
        default=False)

    recurrence = schema.Text(
        title=_(u'Recurrence'),
        required=False,
    )

    day = schema.Date(title=_(u'Day'), )

    days = schema.List(title=_(u'Days'),
                       value_type=schema.Choice(vocabulary=days),
                       required=False)

    separately = schema.Bool(
        title=_(u'Separately reservable'),
        description=_(
            u'If checked parts of the recurrance may be reserved. '
            u'If not checked the recurrance must be reserved as a whole.'),
        required=False,
        default=False)

    @invariant
    def isValidRange(Allocation):
        start, end = utils.get_date_range(Allocation.day,
                                          Allocation.start_time,
                                          Allocation.end_time)

        if not Allocation.whole_day and abs((end - start).seconds // 60) < 5:
            raise Invalid(_(u'The allocation must be at least 5 minutes long'))

    @invariant
    def isValidOption(Allocation):
        if Allocation.recurrence:
            if Allocation.partly_available and not Allocation.separately:
                raise Invalid(
                    _(u'Partly available allocations can only be reserved '
                      u'separately'))