web/form.py
branchtls-sprint
changeset 848 f5aca5c5f6ca
parent 847 27c4ebe90d03
child 849 8591d896db7e
equal deleted inserted replaced
847:27c4ebe90d03 848:f5aca5c5f6ca
     4 :copyright: 2001-2009 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
     4 :copyright: 2001-2009 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
     5 :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
     5 :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
     6 """
     6 """
     7 __docformat__ = "restructuredtext en"
     7 __docformat__ = "restructuredtext en"
     8 
     8 
       
     9 from warnings import warn
     9 from simplejson import dumps
    10 from simplejson import dumps
    10 
    11 
    11 from logilab.common.compat import any
    12 from logilab.common.compat import any
    12 from logilab.mtconverter import html_escape
    13 from logilab.mtconverter import html_escape
    13 
    14 
   417         self.id = id or 'form'
   418         self.id = id or 'form'
   418         self.title = title
   419         self.title = title
   419         self.action = action
   420         self.action = action
   420         self.redirect_path = None
   421         self.redirect_path = None
   421         self.fields = list(self.__class__._fields_)
   422         self.fields = list(self.__class__._fields_)
       
   423         self.fields.append(TextField(name='__errorurl', widget=HiddenInput,
       
   424                                      initial=req.url()))
   422         self.context = {}
   425         self.context = {}
   423         
   426         
   424     @property
   427     @property
   425     def form_needs_multipart(self):
   428     def form_needs_multipart(self):
   426         return any(field.needs_multipart for field in self.fields) 
   429         return any(field.needs_multipart for field in self.fields) 
   437                               'name': self.form_field_name(field, values),
   440                               'name': self.form_field_name(field, values),
   438                               'id': self.form_field_id(field, values),
   441                               'id': self.form_field_id(field, values),
   439                               }
   442                               }
   440 
   443 
   441     def form_field_value(self, field, values):
   444     def form_field_value(self, field, values):
   442         value = values.get(field.name, field.initial)
   445         """looks for field's value in
       
   446         1. kw args given to render_form
       
   447         2. req.form
       
   448         3. field's initial value
       
   449         """
       
   450         if field.name in values:
       
   451             value = values[field.name]
       
   452         elif field.name in self.req.form:
       
   453             value = self.req.form[field.name]
       
   454         else:
       
   455             value = field.initial
   443         return field.format_value(self.req, value) 
   456         return field.format_value(self.req, value) 
   444 
   457 
   445     def form_field_name(self, field, values):
   458     def form_field_name(self, field, values):
   446         return field.name
   459         return field.name
   447 
   460 
   486     def form_render(self, entity, **values):
   499     def form_render(self, entity, **values):
   487         self.entity = entity
   500         self.entity = entity
   488         return super(EntityFieldsForm, self).form_render(**values)
   501         return super(EntityFieldsForm, self).form_render(**values)
   489 
   502 
   490     def form_field_value(self, field, values):
   503     def form_field_value(self, field, values):
   491         try:
   504         """look for field's value with the following rules:
       
   505         1. handle special __type and eid fields
       
   506         2. looks in kw args given to render_form
       
   507         3. looks in req.form
       
   508         4. if entity has an eid:
       
   509              1. looks for an associated attribute / method
       
   510              2. use field's initial value
       
   511            else:
       
   512              1. looks for a default_<fieldname> attribute / method on the form
       
   513              2. use field's initial value
       
   514              
       
   515         values found in step 4 may be a callable which'll then be called.
       
   516         """
       
   517         if field.name == '__type':
       
   518             value = self.entity.id
       
   519         elif field.name == 'eid':
       
   520             value = self.entity.eid
       
   521         elif field.name in values:
   492             value = values[field.name]
   522             value = values[field.name]
   493         except KeyError:
   523         elif field.name in self.req.form:
   494             value = getattr(self.entity, field.name, field.initial)
   524             value = self.req.form[field.name]
       
   525         else:
       
   526             if self.entity.has_eid():
       
   527                 # use value found on the entity or field's initial value if it's
       
   528                 # not an attribute of the entity (XXX may conflicts and get
       
   529                 # undesired value)
       
   530                 value = getattr(self.entity, field.name, field.initial)
       
   531             else:
       
   532                 defaultattr = 'default_%s' % field.name
       
   533                 if hasattr(self.entity, defaultattr):
       
   534                     # XXX bw compat, default_<field name> on the entity
       
   535                     warn('found %s on %s, should be set on a specific form'
       
   536                          % (defaultattr, self.entity.id), DeprecationWarning)
       
   537                     value = getattr(self.entity, defaultattr)
       
   538                 elif hasattr(self, defaultattr):
       
   539                     # search for default_<field name> on the form instance
       
   540                     value = getattr(self, defaultattr)
       
   541                 else:
       
   542                     # use field's initial value
       
   543                     value = field.initial
       
   544             if callable(value):
       
   545                 values = value()
   495         return field.format_value(self.req, value) 
   546         return field.format_value(self.req, value) 
   496 
   547 
   497     def form_field_name(self, field, values):
   548     def form_field_name(self, field, values):
   498         if field.eidparam:
   549         if field.eidparam:
   499             return eid_param(field.name, self.entity.eid)
   550             return eid_param(field.name, self.entity.eid)