diff -r 1dd655788ece -r 5a394fc419b4 web/uihelper.py --- a/web/uihelper.py Mon Jan 21 16:34:09 2013 +0100 +++ b/web/uihelper.py Thu Jan 10 18:11:33 2013 +0100 @@ -1,4 +1,4 @@ -# copyright 2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# copyright 2011-2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved. # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr # # This file is part of CubicWeb. @@ -45,207 +45,30 @@ """ __docformat__ = "restructuredtext en" + +from logilab.common.deprecation import deprecated from cubicweb.web.views import uicfg -from functools import partial - -def _tag_rel(rtag, etype, attr, desttype='*', *args, **kwargs): - if isinstance(attr, basestring): - attr, role = attr, 'subject' - else: - attr, role = attr - if role == 'subject': - rtag.tag_subject_of((etype, attr, desttype), *args, **kwargs) - else: - rtag.tag_object_of((desttype, attr, etype), *args, **kwargs) ## generic uicfg helpers ###################################################### -def append_to_addmenu(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 - - `attr` can be a string or 2-tuple (relname, role_of_etype_in_the_relation) - - """ - _tag_rel(uicfg.actionbox_appearsin_addmenu, etype, attr, createdtype, True) - -def remove_from_addmenu(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 - - `attr` can be a string or 2-tuple (relname, role_of_etype_in_the_relation) - """ - _tag_rel(uicfg.actionbox_appearsin_addmenu, etype, attr, createdtype, False) - - -## form uicfg helpers ########################################################## -def set_fields_order(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_relation) - - Unspecified fields will be displayed after specified ones, their - order being consistent with the schema definition. - - Examples: - -.. sourcecode:: python - - from cubicweb.web import uihelper - uihelper.set_fields_order('CWUser', ('firstname', 'surname', 'login')) - uihelper.set_fields_order('CWUser', ('firstname', ('in_group', 'subject'), 'surname', 'login')) - - """ - afk = uicfg.autoform_field_kwargs - for index, attr in enumerate(attrs): - _tag_rel(afk, etype, attr, '*', {'order': index}) - - -def hide_field(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_relation) - - Examples: - -.. sourcecode:: python - - from cubicweb.web import uihelper - uihelper.hide_field('CWUser', 'login') - uihelper.hide_field('*', 'name') - uihelper.hide_field('CWUser', 'use_email', formtype='inlined') - - """ - _tag_rel(uicfg.autoform_section, etype, attr, desttype, - formtype=formtype, section='hidden') - - -def hide_fields(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_relation) - - Examples: - -.. sourcecode:: python - - from cubicweb.web import uihelper - uihelper.hide_fields('CWUser', ('login', ('use_email', 'subject')), formtype='inlined') - """ - for attr in attrs: - hide_field(etype, attr, formtype=formtype) - -def set_field_kwargs(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 import uihelper, formwidgets as fwdgs - - uihelper.set_field_kwargs('Person', 'works_for', widget=fwdgs.AutoCompletionWidget()) - uihelper.set_field_kwargs('CWUser', 'login', label=_('login or email address'), - widget=fwdgs.TextInput(attrs={'size': 30})) - """ - _tag_rel(uicfg.autoform_field_kwargs, etype, attr, '*', kwargs) - - -def set_field(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) - - """ - _tag_rel(uicfg.autoform_field, etype, attr, '*', field) - - -def edit_inline(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 +backward_compat_funcs = (('append_to_addmenu', uicfg.actionbox_appearsin_addmenu), + ('remove_from_addmenu', uicfg.actionbox_appearsin_addmenu), + ('set_fields_order', uicfg.autoform_field_kwargs), + ('hide_field', uicfg.autoform_section), + ('hide_fields', uicfg.autoform_section), + ('set_field_kwargs', uicfg.autoform_field_kwargs), + ('set_field', uicfg.autoform_field), + ('edit_inline', uicfg.autoform_section), + ('edit_as_attr', uicfg.autoform_section), + ('set_muledit_editable', uicfg.autoform_section), + ) - from cubicweb.web import uihelper - - uihelper.edit_inline('*', 'use_email') - """ - _tag_rel(uicfg.autoform_section, etype, attr, desttype, - formtype=formtype, section='inlined') - - -def edit_as_attr(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 import uihelper - - uihelper.edit_as_attr('CWUser', 'in_group') - """ - _tag_rel(uicfg.autoform_section, etype, attr, desttype, - formtype=formtype, section='attributes') - - -def set_muledit_editable(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 import uihelper - - uihelper.set_muledit_editable('CWUser', ('firstname', 'surname', 'in_group')) - """ - for attr in attrs: - edit_as_attr(etype, attr, formtype='muledit') +for funcname, tag in backward_compat_funcs: + msg = ('[3.16] uihelper.%(name)s is deprecated, please use ' + 'web.uicfg.%(classname)s.%(name)s' % dict( + name=funcname, classname=tag.__class__.__name__)) + globals()[funcname] = deprecated(msg)(getattr(tag, funcname)) class meta_formconfig(type): @@ -253,17 +76,23 @@ def __init__(cls, name, bases, classdict): if cls.etype is None: return + if cls.uicfg_afs is None: + uicfg_afs = uicfg.autoform_section + if cls.uicfg_aff is None: + uicfg_aff = uicfg.autoform_field + if cls.uicfg_affk is None: + uicfg_affk = uicfg.autoform_field_kwargs for attr_role in cls.hidden: - hide_field(cls.etype, attr_role, formtype=cls.formtype) + uicfg_afs.hide_field(cls.etype, attr_role, formtype=cls.formtype) for attr_role in cls.rels_as_attrs: - edit_as_attr(cls.etype, attr_role, formtype=cls.formtype) + uicfg_afs.edit_as_attr(cls.etype, attr_role, formtype=cls.formtype) for attr_role in cls.inlined: - edit_inline(cls.etype, attr_role, formtype=cls.formtype) + uicfg_afs.edit_inline(cls.etype, attr_role, formtype=cls.formtype) for rtype, widget in cls.widgets.items(): - set_field_kwargs(cls.etype, rtype, widget=widget) + uicfg_affk.set_field_kwargs(cls.etype, rtype, widget=widget) for rtype, field in cls.fields.items(): - set_field(cls.etype, rtype, field) - set_fields_order(cls.etype, cls.fields_order) + uicfg_aff.set_field(cls.etype, rtype, field) + uicfg_affk.set_fields_order(cls.etype, cls.fields_order) super(meta_formconfig, cls).__init__(name, bases, classdict) @@ -303,6 +132,18 @@ :attr:`fields` a dictionary mapping attribute names to field instances. + :attr:`uicfg_afs` + an instance of ``cubicweb.web.uicfg.AutoformSectionRelationTags`` + Default is None, meaning ``cubicweb.web.uicfg.autoform_section`` is used. + + :attr:`uicfg_aff` + an instance of ``cubicweb.web.uicfg.AutoformFieldTags`` + Default is None, meaning ``cubicweb.web.uicfg.autoform_field`` is used. + + :attr:`uicfg_affk` + an instance of ``cubicweb.web.uicfg.AutoformFieldKwargsTags`` + Default is None, meaning ``cubicweb.web.uicfg.autoform_field_kwargs`` is used. + Examples: .. sourcecode:: python @@ -333,3 +174,6 @@ fields_order = () widgets = {} fields = {} + uicfg_afs = None + uicfg_aff = None + uicfg_affk = None