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
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