web/form.py
branchtls-sprint
changeset 1529 7d1794175e40
parent 1528 864ae7c15ef5
parent 1519 5cfc5cc1dd20
child 1530 849fd3d64f11
equal deleted inserted replaced
1528:864ae7c15ef5 1529:7d1794175e40
    28     category = 'form'
    28     category = 'form'
    29     controller = 'edit'
    29     controller = 'edit'
    30     http_cache_manager = NoHTTPCacheManager
    30     http_cache_manager = NoHTTPCacheManager
    31     add_to_breadcrumbs = False
    31     add_to_breadcrumbs = False
    32 
    32 
       
    33     def html_headers(self):
       
    34         """return a list of html headers (eg something to be inserted between
       
    35         <head> and </head> of the returned page
       
    36 
       
    37         by default forms are neither indexed nor followed
       
    38         """
       
    39         return [NOINDEX, NOFOLLOW]
       
    40 
       
    41     def linkable(self):
       
    42         """override since forms are usually linked by an action,
       
    43         so we don't want them to be listed by appli.possible_views
       
    44         """
       
    45         return False
       
    46 
       
    47 
       
    48 # XXX should disappear
       
    49 class FormMixIn(object):
       
    50     """abstract form mix-in
       
    51     XXX: you should inherit from this FIRST (obscure pb with super call)
       
    52     """
       
    53 
       
    54     def initialize_varmaker(self):
       
    55         varmaker = self.req.get_page_data('rql_varmaker')
       
    56         if varmaker is None:
       
    57             varmaker = self.req.varmaker
       
    58             self.req.set_page_data('rql_varmaker', varmaker)
       
    59         self.varmaker = varmaker
       
    60 
    33     def __init__(self, req, rset, **kwargs):
    61     def __init__(self, req, rset, **kwargs):
    34         super(FormViewMixIn, self).__init__(req, rset, **kwargs)
    62         super(FormMixIn, self).__init__(req, rset, **kwargs)
    35         # get validation session data which may have been previously set.
    63         # get validation session data which may have been previously set.
    36         # deleting validation errors here breaks form reloading (errors are
    64         # deleting validation errors here breaks form reloading (errors are
    37         # no more available), they have to be deleted by application's publish
    65         # no more available), they have to be deleted by application's publish
    38         # method on successful commit
    66         # method on successful commit
    39         formurl = req.url()
    67         forminfo = req.get_session_data(req.url())
    40         forminfo = req.get_session_data(formurl)
       
    41         if forminfo:
    68         if forminfo:
    42             req.data['formvalues'] = forminfo['values']
    69             req.data['formvalues'] = forminfo['values']
    43             req.data['formerrors'] = errex = forminfo['errors']
    70             req.data['formerrors'] = errex = forminfo['errors']
    44             req.data['displayederrors'] = set()
    71             req.data['displayederrors'] = set()
    45             # if some validation error occured on entity creation, we have to
    72             # if some validation error occured on entity creation, we have to
    50                     errex.eid = var
    77                     errex.eid = var
    51                     break
    78                     break
    52             else:
    79             else:
    53                 errex.eid = foreid
    80                 errex.eid = foreid
    54 
    81 
    55     def html_headers(self):
       
    56         """return a list of html headers (eg something to be inserted between
       
    57         <head> and </head> of the returned page
       
    58 
       
    59         by default forms are neither indexed nor followed
       
    60         """
       
    61         return [NOINDEX, NOFOLLOW]
       
    62 
       
    63     def linkable(self):
       
    64         """override since forms are usually linked by an action,
       
    65         so we don't want them to be listed by appli.possible_views
       
    66         """
       
    67         return False
       
    68 
       
    69 
       
    70 # XXX should disappear
       
    71 class FormMixIn(object):
       
    72     """abstract form mix-in
       
    73     XXX: you should inherit from this FIRST (obscure pb with super call)
       
    74     """
       
    75 
       
    76     def initialize_varmaker(self):
       
    77         varmaker = self.req.get_page_data('rql_varmaker')
       
    78         if varmaker is None:
       
    79             varmaker = self.req.varmaker
       
    80             self.req.set_page_data('rql_varmaker', varmaker)
       
    81         self.varmaker = varmaker
       
    82 
       
    83     # XXX deprecated with new form system. Should disappear
    82     # XXX deprecated with new form system. Should disappear
    84 
    83 
    85     domid = 'entityForm'
    84     domid = 'entityForm'
    86     category = 'form'
    85     category = 'form'
    87     controller = 'edit'
    86     controller = 'edit'
    88     http_cache_manager = NoHTTPCacheManager
    87     http_cache_manager = NoHTTPCacheManager
    89     add_to_breadcrumbs = False
    88     add_to_breadcrumbs = False
    90 
       
    91     def __init__(self, req, rset, **kwargs):
       
    92         super(FormMixIn, self).__init__(req, rset, **kwargs)
       
    93         # get validation session data which may have been previously set.
       
    94         # deleting validation errors here breaks form reloading (errors are
       
    95         # no more available), they have to be deleted by application's publish
       
    96         # method on successful commit
       
    97         formurl = req.url()
       
    98         forminfo = req.get_session_data(formurl)
       
    99         if forminfo:
       
   100             req.data['formvalues'] = forminfo['values']
       
   101             req.data['formerrors'] = errex = forminfo['errors']
       
   102             req.data['displayederrors'] = set()
       
   103             # if some validation error occured on entity creation, we have to
       
   104             # get the original variable name from its attributed eid
       
   105             foreid = errex.entity
       
   106             for var, eid in forminfo['eidmap'].items():
       
   107                 if foreid == eid:
       
   108                     errex.eid = var
       
   109                     break
       
   110             else:
       
   111                 errex.eid = foreid
       
   112 
    89 
   113     def html_headers(self):
    90     def html_headers(self):
   114         """return a list of html headers (eg something to be inserted between
    91         """return a list of html headers (eg something to be inserted between
   115         <head> and </head> of the returned page
    92         <head> and </head> of the returned page
   116 
    93 
   369         4. field's typed value
   346         4. field's typed value
   370 
   347 
   371         values found in 1. and 2. are expected te be already some 'display'
   348         values found in 1. and 2. are expected te be already some 'display'
   372         value while those found in 3. and 4. are expected to be correctly typed.
   349         value while those found in 3. and 4. are expected to be correctly typed.
   373         """
   350         """
   374         if field.name in self._previous_values:
   351         qname = self.form_field_name(field)
   375             value = self._previous_values[field.name]
   352         if qname in self._previous_values:
   376         elif field.name in self.req.form:
   353             value = self._previous_values[qname]
   377             value = self.req.form[field.name]
   354         elif qname in self.req.form:
       
   355             value = self.req.form[qname]
   378         else:
   356         else:
   379             if field.name in rendervalues:
   357             if field.name in rendervalues:
   380                 value = rendervalues[field.name]
   358                 value = rendervalues[field.name]
   381             else:
   359             else:
   382                 value = self.form_field_value(field, load_bytes)
   360                 value = self.form_field_value(field, load_bytes)
   447             # If we need to directly attach the new object to another one
   425             # If we need to directly attach the new object to another one
   448             for linkto in self.req.list_form_param('__linkto'):
   426             for linkto in self.req.list_form_param('__linkto'):
   449                 self.form_add_hidden('__linkto', linkto)
   427                 self.form_add_hidden('__linkto', linkto)
   450                 msg = '%s %s' % (msg, self.req._('and linked'))
   428                 msg = '%s %s' % (msg, self.req._('and linked'))
   451             self.form_add_hidden('__message', msg)
   429             self.form_add_hidden('__message', msg)
       
   430         # in case of direct instanciation
       
   431         self.schema = self.edited_entity.schema
       
   432         self.vreg = self.edited_entity.vreg
   452 
   433 
   453     def _errex_match_field(self, errex, field):
   434     def _errex_match_field(self, errex, field):
   454         """return true if the field has some error in given validation exception
   435         """return true if the field has some error in given validation exception
   455         """
   436         """
   456         return errex.eid == self.edited_entity.eid and field.name in errex.errors
   437         return errex.eid == self.edited_entity.eid and field.name in errex.errors