web/views/forms.py
branchstable
changeset 3953 19aefd78f61b
parent 3923 be05eeeb2db1
child 3998 94cc7cad3d2d
child 4133 24ffe983abfc
equal deleted inserted replaced
3952:fbd77bda27c1 3953:19aefd78f61b
     8 __docformat__ = "restructuredtext en"
     8 __docformat__ = "restructuredtext en"
     9 
     9 
    10 from warnings import warn
    10 from warnings import warn
    11 
    11 
    12 from logilab.common.compat import any
    12 from logilab.common.compat import any
       
    13 from logilab.common.deprecation import deprecated
    13 
    14 
    14 from cubicweb.selectors import non_final_entity, match_kwargs, one_line_rset
    15 from cubicweb.selectors import non_final_entity, match_kwargs, one_line_rset
    15 from cubicweb.web import INTERNAL_FIELD_VALUE, eid_param
    16 from cubicweb.web import INTERNAL_FIELD_VALUE, eid_param
    16 from cubicweb.web import form, formwidgets as fwdgs
    17 from cubicweb.web import form, formwidgets as fwdgs
    17 from cubicweb.web.controller import NAV_FORM_PARAMETERS
    18 from cubicweb.web.controller import NAV_FORM_PARAMETERS
   125         if self.needs_js:
   126         if self.needs_js:
   126             self.req.add_js(self.needs_js)
   127             self.req.add_js(self.needs_js)
   127         if self.needs_css:
   128         if self.needs_css:
   128             self.req.add_css(self.needs_css)
   129             self.req.add_css(self.needs_css)
   129 
   130 
   130     def form_render(self, **values):
   131     def render(self, formvalues=None, rendervalues=None, renderer=None):
   131         """render this form, using the renderer given in args or the default
   132         """render this form, using the renderer given in args or the default
   132         FormRenderer()
   133         FormRenderer()
   133         """
   134         """
   134         self.build_context(values)
   135         self.build_context(formvalues or {})
   135         renderer = values.pop('renderer', None)
       
   136         if renderer is None:
   136         if renderer is None:
   137             renderer = self.form_default_renderer()
   137             renderer = self.form_default_renderer()
   138         return renderer.render(self, values)
   138         return renderer.render(self, rendervalues or {})
   139 
   139 
   140     def form_default_renderer(self):
   140     def form_default_renderer(self):
   141         return self.vreg['formrenderers'].select(self.form_renderer_id,
   141         return self.vreg['formrenderers'].select(self.form_renderer_id,
   142                                                 self.req, rset=self.rset,
   142                                                 self.req, rset=self.rset,
   143                                                 row=self.row, col=self.col)
   143                                                 row=self.row, col=self.col)
   146         """build form context values (the .context attribute which is a
   146         """build form context values (the .context attribute which is a
   147         dictionary with field instance as key associated to a dictionary
   147         dictionary with field instance as key associated to a dictionary
   148         containing field 'name' (qualified), 'id', 'value' (for display, always
   148         containing field 'name' (qualified), 'id', 'value' (for display, always
   149         a string).
   149         a string).
   150 
   150 
   151         rendervalues is an optional dictionary containing extra kwargs given to
   151         rendervalues is an optional dictionary containing extra form values
   152         form_render()
   152         given to render()
   153         """
   153         """
   154         if self.context is not None:
   154         if self.context is not None:
   155             return # already built
   155             return # already built
   156         self.context = context = {}
   156         self.context = context = {}
   157         # ensure rendervalues is a dict
   157         # ensure rendervalues is a dict
   245 
   245 
   246     def _field_has_error(self, field):
   246     def _field_has_error(self, field):
   247         """return true if the field has some error in given validation exception
   247         """return true if the field has some error in given validation exception
   248         """
   248         """
   249         return self.form_valerror and field.name in self.form_valerror.errors
   249         return self.form_valerror and field.name in self.form_valerror.errors
       
   250 
       
   251     @deprecated('use .render(formvalues, rendervalues)')
       
   252     def form_render(self, **values):
       
   253         """render this form, using the renderer given in args or the default
       
   254         FormRenderer()
       
   255         """
       
   256         self.build_context(values)
       
   257         renderer = values.pop('renderer', None)
       
   258         if renderer is None:
       
   259             renderer = self.form_default_renderer()
       
   260         return renderer.render(self, values)
   250 
   261 
   251 
   262 
   252 class EntityFieldsForm(FieldsForm):
   263 class EntityFieldsForm(FieldsForm):
   253     id = 'base'
   264     id = 'base'
   254     __select__ = (match_kwargs('entity')
   265     __select__ = (match_kwargs('entity')
   440         """return dom id for the given field"""
   451         """return dom id for the given field"""
   441         if field.eidparam:
   452         if field.eidparam:
   442             return eid_param(field.id, self.edited_entity.eid)
   453             return eid_param(field.id, self.edited_entity.eid)
   443         return field.id
   454         return field.id
   444 
   455 
       
   456     # XXX all this vocabulary handling should be on the field, no?
       
   457 
   445     def form_field_vocabulary(self, field, limit=None):
   458     def form_field_vocabulary(self, field, limit=None):
   446         """return vocabulary for the given field"""
   459         """return vocabulary for the given field"""
   447         role, rtype = field.role, field.name
   460         role, rtype = field.role, field.name
   448         method = '%s_%s_vocabulary' % (role, rtype)
   461         method = '%s_%s_vocabulary' % (role, rtype)
   449         try:
   462         try:
   462         #       important because `vocabfunc` might return a list with
   475         #       important because `vocabfunc` might return a list with
   463         #       couples (label, None) which act as separators. In these
   476         #       couples (label, None) which act as separators. In these
   464         #       cases, it doesn't make sense to sort results afterwards.
   477         #       cases, it doesn't make sense to sort results afterwards.
   465         return vocabfunc(rtype, limit)
   478         return vocabfunc(rtype, limit)
   466 
   479 
   467     # XXX should be on the field, no?
       
   468     def subject_relation_vocabulary(self, rtype, limit=None):
   480     def subject_relation_vocabulary(self, rtype, limit=None):
   469         """defaut vocabulary method for the given relation, looking for
   481         """defaut vocabulary method for the given relation, looking for
   470         relation's object entities (i.e. self is the subject)
   482         relation's object entities (i.e. self is the subject)
   471         """
   483         """
   472         entity = self.edited_entity
   484         entity = self.edited_entity