Example #1
0
def F(
    name=None,
    label=None,
    description=None,
    required=False,
    #modes=None, #!+inferred from localizable
    localizable=None,  #!+rename
    #property=None,
    #view_widget=None, edit_widget=None, add_widget=None,
    #search_widget=None,
    #listing_column=None,
    #listing_column_filter=None,
    value_type="text",
    render_type="text_line",
    vocabulary=None,
    # only passed down
    extended=None,
    derived=None,
):
    """
    A "configuration layer" for Fields, to decouple lower level details from 
    Form UI configuration. Intention is to offer a simpler, more 
    "user-oriented" and "xml-friendly" way to declare a field.
    
    New parameters introduced by the F layer type:
        required, value_type, render_type, vocabulary
    that, when coupled with some additional application-level settings, 
    replace the following Field init parameters:
        modes
        property (along with own parameters)
        view_widget, edit_widget, add_widget, search_widget
        listing_column, listing_column_filter
    
    Example:
    
        F(name="language", label="Language", description=None, 
            required=True,
            localizable=[ show("view edit add"), hide("listing"), ]
            value_type="language",
            render_type="single_select",
            vocabulary="language"
        )
    
    will be the "user-oriented" equivalent way to define the following Field:
    
        Field(name="language",
            label=_("Language"),
            modes="view edit add listing",,
            localizable=[
                show("view edit"), 
                hide("listing"), 
            ]
            property=schema.Choice(title=_("Language"),
                vocabulary="language"
            ),
            add_widget=widgets.LanguageLookupWidget,
        )
    
    """
    # integrity
    if render_type in RENDERTYPE_WITH_VOCABULARIES:
        assert vocabulary, \
            "Vocabulary may not be None for render_type=%r" % (render_type)
    if vocabulary is not None:
        assert render_type in RENDERTYPE_WITH_VOCABULARIES, \
            "render_type=%r may not have a vocabulary [%r]" % (
                render_type, vocabulary)
    if value_type is not None:
        assert value_type in VALUETYPE, "Unknown value_type=%r" % (value_type)
    assert (value_type, render_type) in WIDGETS, \
        "No widget set defined for (value_type=%r, render_type=%r)" % (
            value_type, render_type)

    # i18n attributes
    if label:
        naming.MSGIDS.add(label)
        label = _(label)  # !+unicode
    if description:
        naming.MSGIDS.add(description)
        description = _(description)  # !+unicode

    # modes
    if localizable is not None:
        # !+ ensure unique, normalized order
        modes = [mode for loc in localizable for mode in loc.modes]
    else:
        modes = []

    # Field.*_widgets
    widgets = WIDGETS[(value_type, render_type)]

    # listing column params
    listing_column, listing_column_filter = None, None
    if "listing" in modes:
        listing_column_factory = widgets[4]
        if listing_column_factory is not None:
            listing_column = listing_column_factory(name,
                                                    label,
                                                    vocabulary=vocabulary)
        listing_column_filter = widgets[5]

    # Field.property -- see zope.schema.Field, TextLine, Choice, ...
    render_property = None
    if render_type is not None and RENDERTYPE[render_type] is not None:
        RType = RENDERTYPE[render_type]
        render_property_kwargs = dict(title=label,
                                      description=description,
                                      required=required)
        if vocabulary is not None:
            #check if vocabulary exists
            try:
                reg_vocab = component.getUtility(
                    schema.interfaces.IVocabularyFactory, name=vocabulary)
            except component.interfaces.ComponentLookupError:
                raise Exception("Vocabulary named '%s' does not exist. "
                                "Check your configuration." % vocabulary)
            render_property_kwargs["vocabulary"] = vocabulary
        render_property_kwargs.update(VALUETYPE[value_type])
        render_property = RType(**render_property_kwargs)

    view_widget, edit_widget, add_widget, search_widget = widgets[0:4]

    # Field
    f = Field(
        name=name,
        label=label,
        description=description,
        #modes=None, #!+inferred from localizable
        localizable=localizable,
        property=render_property,
        listing_column=listing_column,
        listing_column_filter=listing_column_filter,
        view_widget=view_widget,
        edit_widget=edit_widget,
        add_widget=add_widget,
        search_widget=search_widget,
        extended=extended,
        derived=derived,
    )
    # !+DECL remember all declarative attrs *as-is*
    f._decl = (
        ("name", name),
        ("label", label),
        ("description", description),
        ("required", required),
        #("localizable", localizable),
        ("value_type", value_type),
        ("render_type", render_type),
        ("vocabulary", vocabulary),
        ("extended", extended),
        ("derived", derived),
    )
    return f
Example #2
0
def F(name=None, label=None, description=None, 
        required=False, 
        #modes=None, #!+inferred from localizable
        localizable=None, #!+rename
        #property=None,
        #view_widget=None, edit_widget=None, add_widget=None, 
        #search_widget=None,
        #listing_column=None, 
        #listing_column_filter=None,
        value_type="text",
        render_type="text_line",
        vocabulary=None,
        # only passed down
        extended=None,
        derived=None,
    ):
    """
    A "configuration layer" for Fields, to decouple lower level details from 
    Form UI configuration. Intention is to offer a simpler, more 
    "user-oriented" and "xml-friendly" way to declare a field.
    
    New parameters introduced by the F layer type:
        required, value_type, render_type, vocabulary
    that, when coupled with some additional application-level settings, 
    replace the following Field init parameters:
        modes
        property (along with own parameters)
        view_widget, edit_widget, add_widget, search_widget
        listing_column, listing_column_filter
    
    Example:
    
        F(name="language", label="Language", description=None, 
            required=True,
            localizable=[ show("view edit add"), hide("listing"), ]
            value_type="language",
            render_type="single_select",
            vocabulary="language"
        )
    
    will be the "user-oriented" equivalent way to define the following Field:
    
        Field(name="language",
            label=_("Language"),
            modes="view edit add listing",,
            localizable=[
                show("view edit"), 
                hide("listing"), 
            ]
            property=schema.Choice(title=_("Language"),
                vocabulary="language"
            ),
            add_widget=widgets.LanguageLookupWidget,
        )
    
    """
    # integrity
    if render_type in RENDERTYPE_WITH_VOCABULARIES:
        assert vocabulary, \
            "Vocabulary may not be None for render_type=%r" % (render_type)
    if vocabulary is not None:
        assert render_type in RENDERTYPE_WITH_VOCABULARIES, \
            "render_type=%r may not have a vocabulary [%r]" % (
                render_type, vocabulary)
    if value_type is not None:
        assert value_type in VALUETYPE, "Unknown value_type=%r" % (value_type)
    assert (value_type, render_type) in WIDGETS, \
        "No widget set defined for (value_type=%r, render_type=%r)" % (
            value_type, render_type)
    
    # i18n attributes
    if label:
        naming.MSGIDS.add(label);
        label = _(label) # !+unicode
    if description:
        naming.MSGIDS.add(description)
        description = _(description) # !+unicode
    
    # modes    
    if localizable is not None:
        # !+ ensure unique, normalized order
        modes = [ mode for loc in localizable for mode in loc.modes ]
    else:
        modes = []
    
    # Field.*_widgets
    widgets = WIDGETS[(value_type, render_type)]
    
    # listing column params
    listing_column, listing_column_filter = None, None
    if "listing" in modes:
        listing_column_factory = widgets[4]
        if listing_column_factory is not None:
            listing_column = listing_column_factory(name, label, vocabulary=vocabulary)
        listing_column_filter = widgets[5]
    
    # Field.property -- see zope.schema.Field, TextLine, Choice, ...
    render_property = None
    if render_type is not None and RENDERTYPE[render_type] is not None:
        RType = RENDERTYPE[render_type]
        render_property_kwargs = dict(
            title=label,
            description=description,
            required=required
        )
        if vocabulary is not None:
            #check if vocabulary exists
            try:
                reg_vocab = component.getUtility(
                    schema.interfaces.IVocabularyFactory, name=vocabulary)
            except component.interfaces.ComponentLookupError:
                raise Exception("Vocabulary named '%s' does not exist. "
                    "Check your configuration." % vocabulary)
            render_property_kwargs["vocabulary"] = vocabulary
        render_property_kwargs.update(VALUETYPE[value_type])
        render_property = RType(**render_property_kwargs)
    
    view_widget, edit_widget, add_widget, search_widget = widgets[0:4]
    
    # Field
    f = Field(name=name, 
            label=label, 
            description=description, 
            #modes=None, #!+inferred from localizable
            localizable=localizable,
            property=render_property,
            listing_column=listing_column, 
            listing_column_filter=listing_column_filter,
            view_widget=view_widget, 
            edit_widget=edit_widget, 
            add_widget=add_widget, 
            search_widget=search_widget,
            extended=extended,
            derived=derived,
        )
    # !+DECL remember all declarative attrs *as-is*
    f._decl = (
        ("name", name),
        ("label", label),
        ("description", description),
        ("required", required),
        #("localizable", localizable),
        ("value_type", value_type),
        ("render_type", render_type),
        ("vocabulary", vocabulary),
        ("extended", extended),
        ("derived", derived),
    )
    return f