web/form.py
changeset 1995 ec95eaa2b711
parent 1977 606923dff11b
child 2005 e8032965f37a
equal deleted inserted replaced
1994:56a235af050e 1995:ec95eaa2b711
    15 from cubicweb.appobject import AppRsetObject
    15 from cubicweb.appobject import AppRsetObject
    16 from cubicweb.selectors import yes, non_final_entity, match_kwargs, one_line_rset
    16 from cubicweb.selectors import yes, non_final_entity, match_kwargs, one_line_rset
    17 from cubicweb.view import NOINDEX, NOFOLLOW
    17 from cubicweb.view import NOINDEX, NOFOLLOW
    18 from cubicweb.common import tags
    18 from cubicweb.common import tags
    19 from cubicweb.web import INTERNAL_FIELD_VALUE, eid_param, stdmsgs
    19 from cubicweb.web import INTERNAL_FIELD_VALUE, eid_param, stdmsgs
    20 from cubicweb.web.httpcache import NoHTTPCacheManager
    20 from cubicweb.web import formwidgets as fwdgs, httpcache
    21 from cubicweb.web.controller import NAV_FORM_PARAMETERS
    21 from cubicweb.web.controller import NAV_FORM_PARAMETERS
    22 from cubicweb.web.formfields import (Field, StringField, RelationField,
    22 from cubicweb.web.formfields import (Field, StringField, RelationField,
    23                                      HiddenInitialValueField)
    23                                      HiddenInitialValueField)
    24 from cubicweb.web import formrenderers
    24 
    25 from cubicweb.web import formwidgets as fwdgs
       
    26 
    25 
    27 class FormViewMixIn(object):
    26 class FormViewMixIn(object):
    28     """abstract form view mix-in"""
    27     """abstract form view mix-in"""
    29     category = 'form'
    28     category = 'form'
    30     controller = 'edit'
    29     controller = 'edit'
    31     http_cache_manager = NoHTTPCacheManager
    30     http_cache_manager = httpcache.NoHTTPCacheManager
    32     add_to_breadcrumbs = False
    31     add_to_breadcrumbs = False
    33 
    32 
    34     def html_headers(self):
    33     def html_headers(self):
    35         """return a list of html headers (eg something to be inserted between
    34         """return a list of html headers (eg something to be inserted between
    36         <head> and </head> of the returned page
    35         <head> and </head> of the returned page
    89     # XXX deprecated with new form system. Should disappear
    88     # XXX deprecated with new form system. Should disappear
    90 
    89 
    91     domid = 'entityForm'
    90     domid = 'entityForm'
    92     category = 'form'
    91     category = 'form'
    93     controller = 'edit'
    92     controller = 'edit'
    94     http_cache_manager = NoHTTPCacheManager
    93     http_cache_manager = httpcache.NoHTTPCacheManager
    95     add_to_breadcrumbs = False
    94     add_to_breadcrumbs = False
    96 
    95 
    97     def html_headers(self):
    96     def html_headers(self):
    98         """return a list of html headers (eg something to be inserted between
    97         """return a list of html headers (eg something to be inserted between
    99         <head> and </head> of the returned page
    98         <head> and </head> of the returned page
   216 class FieldsForm(FormMixIn, AppRsetObject):
   215 class FieldsForm(FormMixIn, AppRsetObject):
   217     __metaclass__ = metafieldsform
   216     __metaclass__ = metafieldsform
   218     __registry__ = 'forms'
   217     __registry__ = 'forms'
   219     __select__ = yes()
   218     __select__ = yes()
   220 
   219 
   221     renderer_cls = formrenderers.FormRenderer
       
   222     is_subform = False
   220     is_subform = False
   223 
   221 
   224     # attributes overrideable through __init__
   222     # attributes overrideable through __init__
   225     internal_fields = ('__errorurl',) + NAV_FORM_PARAMETERS
   223     internal_fields = ('__errorurl',) + NAV_FORM_PARAMETERS
   226     needs_js = ('cubicweb.ajax.js', 'cubicweb.edition.js',)
   224     needs_js = ('cubicweb.ajax.js', 'cubicweb.edition.js',)
   234     cwtarget = None
   232     cwtarget = None
   235     redirect_path = None
   233     redirect_path = None
   236     set_error_url = True
   234     set_error_url = True
   237     copy_nav_params = False
   235     copy_nav_params = False
   238     form_buttons = None # form buttons (button widgets instances)
   236     form_buttons = None # form buttons (button widgets instances)
       
   237     form_renderer_id = 'default'
   239 
   238 
   240     def __init__(self, req, rset=None, row=None, col=None, submitmsg=None,
   239     def __init__(self, req, rset=None, row=None, col=None, submitmsg=None,
   241                  **kwargs):
   240                  **kwargs):
   242         super(FieldsForm, self).__init__(req, rset, row=row, col=col)
   241         super(FieldsForm, self).__init__(req, rset, row=row, col=col)
   243         self.fields = list(self.__class__._fields_)
   242         self.fields = list(self.__class__._fields_)
   332 
   331 
   333     def form_render(self, **values):
   332     def form_render(self, **values):
   334         """render this form, using the renderer given in args or the default
   333         """render this form, using the renderer given in args or the default
   335         FormRenderer()
   334         FormRenderer()
   336         """
   335         """
   337         renderer = values.pop('renderer', self.renderer_cls())
   336         renderer = values.pop('renderer', None)
       
   337         if renderer is None:
       
   338             renderer = self.form_default_renderer()
   338         return renderer.render(self, values)
   339         return renderer.render(self, values)
       
   340 
       
   341     def form_default_renderer(self):
       
   342         return self.vreg.select_object('formrenderers', self.form_renderer_id,
       
   343                                        self.req, self.rset,
       
   344                                        row=self.row, col=self.col)
   339 
   345 
   340     def form_build_context(self, rendervalues=None):
   346     def form_build_context(self, rendervalues=None):
   341         """build form context values (the .context attribute which is a
   347         """build form context values (the .context attribute which is a
   342         dictionary with field instance as key associated to a dictionary
   348         dictionary with field instance as key associated to a dictionary
   343         containing field 'name' (qualified), 'id', 'value' (for display, always
   349         containing field 'name' (qualified), 'id', 'value' (for display, always
   513                 value = value()
   519                 value = value()
   514         else:
   520         else:
   515             value = super(EntityFieldsForm, self).form_field_value(field,
   521             value = super(EntityFieldsForm, self).form_field_value(field,
   516                                                                    load_bytes)
   522                                                                    load_bytes)
   517         return value
   523         return value
       
   524 
       
   525     def form_default_renderer(self):
       
   526         return self.vreg.select_object('formrenderers', self.form_renderer_id,
       
   527                                        self.req, self.rset,
       
   528                                        row=self.row, col=self.col,
       
   529                                        entity=self.edited_entity)
   518 
   530 
   519     def form_build_context(self, values=None):
   531     def form_build_context(self, values=None):
   520         """overriden to add edit[s|o] hidden fields and to ensure schema fields
   532         """overriden to add edit[s|o] hidden fields and to ensure schema fields
   521         have eidparam set to True
   533         have eidparam set to True
   522 
   534 
   694         return sorted(results)
   706         return sorted(results)
   695 
   707 
   696 
   708 
   697 class CompositeForm(FieldsForm):
   709 class CompositeForm(FieldsForm):
   698     """form composed for sub-forms"""
   710     """form composed for sub-forms"""
       
   711     form_renderer_id = 'composite'
   699 
   712 
   700     def __init__(self, *args, **kwargs):
   713     def __init__(self, *args, **kwargs):
   701         super(CompositeForm, self).__init__(*args, **kwargs)
   714         super(CompositeForm, self).__init__(*args, **kwargs)
   702         self.forms = []
   715         self.forms = []
   703 
   716