diff -r 1dd655788ece -r 5a394fc419b4 web/views/uicfg.py --- a/web/views/uicfg.py Mon Jan 21 16:34:09 2013 +0100 +++ b/web/views/uicfg.py Thu Jan 10 18:11:33 2013 +0100 @@ -354,18 +354,184 @@ continue yield (rschema, targetschemas, role) + def hide_field(self, etype, attr, desttype='*', formtype='main'): + """hide `attr` in `etype` forms. + + :param etype: the entity type as a string + :param attr: the name of the attribute or relation to hide + :param formtype: which form will be affected ('main', 'inlined', etc.), + *main* by default. + + `attr` can be a string or 2-tuple (relname, role_of_etype_in_the_rel) + + Examples: + + .. sourcecode:: python + + from cubicweb.web.views.uicfg import autoform_section as afs + afs.hide_field('CWUser', 'login') + afs.hide_field('*', 'name') + afs.hide_field('CWUser', 'use_email', formtype='inlined') + + """ + self._tag_etype_attr(etype, attr, desttype, + formtype=formtype, section='hidden') + + def hide_fields(self, etype, attrs, formtype='main'): + """simple for-loop wrapper around :func:`hide_field`. + + :param etype: the entity type as a string + :param attrs: the ordered list of attribute names (or relations) + :param formtype: which form will be affected ('main', 'inlined', etc.), + *main* by default. + + `attrs` can be strings or 2-tuples (relname, role_of_etype_in_the_rel) + + Examples: + + .. sourcecode:: python + + from cubicweb.web.views.uicfg import autoform_section as afs + afs.hide_fields('CWUser', ('login', ('use_email', 'subject')), + formtype='inlined') + """ + for attr in attrs: + self.hide_field(etype, attr, formtype=formtype) + + def edit_inline(self, etype, attr, desttype='*', formtype=('main', 'inlined')): + """edit `attr` with and inlined form. + + :param etype: the entity type as a string + :param attr: the name of the attribute or relation + :param desttype: the destination type(s) concerned, default is everything + :param formtype: which form will be affected ('main', 'inlined', etc.), + *main* and *inlined* by default. + + `attr` can be a string or 2-tuple (relname, role_of_etype_in_the_relation) + + Examples: + + .. sourcecode:: python + + from cubicweb.web.views.uicfg import autoform_section as afs + + afs.edit_inline('*', 'use_email') + """ + self._tag_etype_attr(etype, attr, desttype, formtype=formtype, + section='inlined') + + def edit_as_attr(self, etype, attr, desttype='*', formtype=('main', 'muledit')): + """make `attr` appear in the *attributes* section of `etype` form. + + :param etype: the entity type as a string + :param attr: the name of the attribute or relation + :param desttype: the destination type(s) concerned, default is everything + :param formtype: which form will be affected ('main', 'inlined', etc.), + *main* and *muledit* by default. + + `attr` can be a string or 2-tuple (relname, role_of_etype_in_the_relation) + + Examples: + + .. sourcecode:: python + + from cubicweb.web.views.uicfg import autoform_section as afs + + afs.edit_as_attr('CWUser', 'in_group') + """ + self._tag_etype_attr(etype, attr, desttype, + formtype=formtype, section='attributes') + + def set_muledit_editable(self, etype, attrs): + """make `attrs` appear in muledit form of `etype`. + + :param etype: the entity type as a string + :param attrs: the ordered list of attribute names (or relations) + + `attrs` can be strings or 2-tuples (relname, role_of_etype_in_the_relation) + + Examples: + + .. sourcecode:: python + + from cubicweb.web.views.uicfg import autoform_section as afs + + afs.set_muledit_editable('CWUser', ('firstname', 'surname', 'in_group')) + """ + for attr in attrs: + self.edit_as_attr(self, etype, attr, formtype='muledit') + autoform_section = AutoformSectionRelationTags() + # relations'field class + class AutoformFieldTags(RelationTags): __regid__ = 'autoform_field' + def set_field(self, etype, attr, field): + """sets the `attr` field of `etype`. + + :param etype: the entity type as a string + :param attr: the name of the attribute or relation + + `attr` can be a string or 2-tuple (relname, role_of_etype_in_the_relation) + + """ + self._tag_etype_attr(etype, attr, '*', field) + autoform_field = AutoformFieldTags() + # relations'field explicit kwargs (given to field's __init__) + class AutoformFieldKwargsTags(RelationTagsDict): __regid__ = 'autoform_field_kwargs' + def set_fields_order(self, etype, attrs): + """specify the field order in `etype` main edition form. + + :param etype: the entity type as a string + :param attrs: the ordered list of attribute names (or relations) + + `attrs` can be strings or 2-tuples (relname, role_of_etype_in_the_rel) + + Unspecified fields will be displayed after specified ones, their + order being consistent with the schema definition. + + Examples: + + .. sourcecode:: python + + from cubicweb.web.views.uicfg import autoform_field_kwargs as affk + affk.set_fields_order('CWUser', ('firstname', 'surname', 'login')) + affk.set_fields_order('CWUser', ('firstname', ('in_group', 'subject'), + 'surname', 'login')) + + """ + for index, attr in enumerate(attrs): + self._tag_etype_attr(etype, attr, '*', {'order': index}) + + def set_field_kwargs(self, etype, attr, **kwargs): + """tag `attr` field of `etype` with additional named paremeters. + + :param etype: the entity type as a string + :param attr: the name of the attribute or relation + + `attr` can be a string or 2-tuple (relname, role_of_etype_in_the_relation) + + Examples: + + .. sourcecode:: python + + from cubicweb.web.views.uicfg import autoform_field_kwargs as affk + affk.set_field_kwargs('Person', 'works_for', widget=fwdgs.AutoCompletionWidget()) + affk.set_field_kwargs('CWUser', 'login', label=_('login or email address'), + widget=fwdgs.TextInput(attrs={'size': 30})) + """ + self._tag_etype_attr(etype, attr, '*', kwargs) + + autoform_field_kwargs = AutoformFieldKwargsTags() @@ -442,6 +608,7 @@ # boxes.EditBox configuration ################################################# # 'link' / 'create' relation tags, used to control the "add entity" submenu + class ActionBoxUicfg(RelationTagsBool): __regid__ = 'actionbox_appearsin_addmenu' @@ -454,6 +621,39 @@ if not rdef.role_cardinality(role) in '?1' and rdef.composite == role: self.tag_relation((sschema, rschema, oschema, role), True) + def _tag_etype_attr(self, etype, attr, desttype='*', *args, **kwargs): + if isinstance(attr, basestring): + attr, role = attr, 'subject' + else: + attr, role = attr + if role == 'subject': + self.tag_subject_of((etype, attr, desttype), *args, **kwargs) + else: + self.tag_object_of((desttype, attr, etype), *args, **kwargs) + + def append_to_addmenu(self, etype, attr, createdtype='*'): + """adds `attr` in the actions box *addrelated* submenu of `etype`. + + :param etype: the entity type as a string + :param attr: the name of the attribute or relation to hide + :param createdtype: the target type of the relation (optional, defaults to '*' (all possible types)) + + `attr` can be a string or 2-tuple (relname, role_of_etype_in_the_relation) + + """ + self._tag_etype_attr(etype, attr, createdtype, True) + + def remove_from_addmenu(self, etype, attr, createdtype='*'): + """removes `attr` from the actions box *addrelated* submenu of `etype`. + + :param etype: the entity type as a string + :param attr: the name of the attribute or relation to hide + :param createdtype: the target type of the relation (optional, defaults to '*' (all possible types)) + + `attr` can be a string or 2-tuple (relname, role_of_etype_in_the_relation) + """ + self._tag_etype_attr(etype, attr, createdtype, False) + actionbox_appearsin_addmenu = ActionBoxUicfg()