web/views/forms.py
changeset 3451 6b46d73823f5
parent 3396 fb261afd49cd
child 3467 a6405235aac6
equal deleted inserted replaced
3448:495862266785 3451:6b46d73823f5
   164         return field
   164         return field
   165 
   165 
   166     def add_media(self):
   166     def add_media(self):
   167         """adds media (CSS & JS) required by this widget"""
   167         """adds media (CSS & JS) required by this widget"""
   168         if self.needs_js:
   168         if self.needs_js:
   169             self.req.add_js(self.needs_js)
   169             self._cw.add_js(self.needs_js)
   170         if self.needs_css:
   170         if self.needs_css:
   171             self.req.add_css(self.needs_css)
   171             self._cw.add_css(self.needs_css)
   172 
   172 
   173     def form_render(self, **values):
   173     def form_render(self, **values):
   174         """render this form, using the renderer given in args or the default
   174         """render this form, using the renderer given in args or the default
   175         FormRenderer()
   175         FormRenderer()
   176         """
   176         """
   178         if renderer is None:
   178         if renderer is None:
   179             renderer = self.form_default_renderer()
   179             renderer = self.form_default_renderer()
   180         return renderer.render(self, values)
   180         return renderer.render(self, values)
   181 
   181 
   182     def form_default_renderer(self):
   182     def form_default_renderer(self):
   183         return self.vreg['formrenderers'].select(self.form_renderer_id,
   183         return self._cw.vreg['formrenderers'].select(self.form_renderer_id,
   184                                                 self.req, rset=self.rset,
   184                                                 self._cw, rset=self.cw_rset,
   185                                                 row=self.row, col=self.col)
   185                                                 row=self.cw_row, col=self.cw_col)
   186 
   186 
   187     def form_build_context(self, rendervalues=None):
   187     def form_build_context(self, rendervalues=None):
   188         """build form context values (the .context attribute which is a
   188         """build form context values (the .context attribute which is a
   189         dictionary with field instance as key associated to a dictionary
   189         dictionary with field instance as key associated to a dictionary
   190         containing field 'name' (qualified), 'id', 'value' (for display, always
   190         containing field 'name' (qualified), 'id', 'value' (for display, always
   227             else:
   227             else:
   228                 value = self.form_field_value(field, load_bytes)
   228                 value = self.form_field_value(field, load_bytes)
   229                 if callable(value):
   229                 if callable(value):
   230                     value = value(self)
   230                     value = value(self)
   231             if value != INTERNAL_FIELD_VALUE:
   231             if value != INTERNAL_FIELD_VALUE:
   232                 value = field.format_value(self.req, value)
   232                 value = field.format_value(self._cw, value)
   233         return value
   233         return value
   234 
   234 
   235     def _req_display_value(self, field):
   235     def _req_display_value(self, field):
   236         qname = self.form_field_name(field)
   236         qname = self.form_field_name(field)
   237         if qname in self.form_previous_values:
   237         if qname in self.form_previous_values:
   238             return self.form_previous_values[qname]
   238             return self.form_previous_values[qname]
   239         if qname in self.req.form:
   239         if qname in self._cw.form:
   240             return self.req.form[qname]
   240             return self._cw.form[qname]
   241         if field.name in self.req.form:
   241         if field.name in self._cw.form:
   242             return self.req.form[field.name]
   242             return self._cw.form[field.name]
   243         return None
   243         return None
   244 
   244 
   245     def form_field_value(self, field, load_bytes=False):
   245     def form_field_value(self, field, load_bytes=False):
   246         """return field's *typed* value"""
   246         """return field's *typed* value"""
   247         myattr = '%s_%s_default' % (field.role, field.name)
   247         myattr = '%s_%s_default' % (field.role, field.name)
   259             return u'<span class="error">%s</span>' % self.form_valerror.errors[field.name]
   259             return u'<span class="error">%s</span>' % self.form_valerror.errors[field.name]
   260         return u''
   260         return u''
   261 
   261 
   262     def form_field_format(self, field):
   262     def form_field_format(self, field):
   263         """return MIME type used for the given (text or bytes) field"""
   263         """return MIME type used for the given (text or bytes) field"""
   264         return self.req.property_value('ui.default-text-format')
   264         return self._cw.property_value('ui.default-text-format')
   265 
   265 
   266     def form_field_encoding(self, field):
   266     def form_field_encoding(self, field):
   267         """return encoding used for the given (text) field"""
   267         """return encoding used for the given (text) field"""
   268         return self.req.encoding
   268         return self._cw.encoding
   269 
   269 
   270     def form_field_name(self, field):
   270     def form_field_name(self, field):
   271         """return qualified name for the given field"""
   271         """return qualified name for the given field"""
   272         return field.name
   272         return field.name
   273 
   273 
   301     def __init__(self, *args, **kwargs):
   301     def __init__(self, *args, **kwargs):
   302         self.edited_entity = kwargs.pop('entity', None)
   302         self.edited_entity = kwargs.pop('entity', None)
   303         msg = kwargs.pop('submitmsg', None)
   303         msg = kwargs.pop('submitmsg', None)
   304         super(EntityFieldsForm, self).__init__(*args, **kwargs)
   304         super(EntityFieldsForm, self).__init__(*args, **kwargs)
   305         if self.edited_entity is None:
   305         if self.edited_entity is None:
   306             self.edited_entity = self.complete_entity(self.row or 0, self.col or 0)
   306             self.edited_entity = self.complete_entity(self.cw_row or 0, self.cw_col or 0)
   307         self.form_add_hidden('__type', eidparam=True)
   307         self.form_add_hidden('__type', eidparam=True)
   308         self.form_add_hidden('eid')
   308         self.form_add_hidden('eid')
   309         if kwargs.get('mainform', True): # mainform default to true in parent
   309         if kwargs.get('mainform', True): # mainform default to true in parent
   310             self.form_add_hidden(u'__maineid', self.edited_entity.eid)
   310             self.form_add_hidden(u'__maineid', self.edited_entity.eid)
   311             # If we need to directly attach the new object to another one
   311             # If we need to directly attach the new object to another one
   312             if self.req.list_form_param('__linkto'):
   312             if self._cw.list_form_param('__linkto'):
   313                 for linkto in self.req.list_form_param('__linkto'):
   313                 for linkto in self._cw.list_form_param('__linkto'):
   314                     self.form_add_hidden('__linkto', linkto)
   314                     self.form_add_hidden('__linkto', linkto)
   315                 if msg:
   315                 if msg:
   316                     msg = '%s %s' % (msg, self.req._('and linked'))
   316                     msg = '%s %s' % (msg, self._cw._('and linked'))
   317                 else:
   317                 else:
   318                     msg = self.req._('entity linked')
   318                     msg = self._cw._('entity linked')
   319         if msg:
   319         if msg:
   320             self.form_add_hidden('__message', msg)
   320             self.form_add_hidden('__message', msg)
   321 
   321 
   322     def _field_has_error(self, field):
   322     def _field_has_error(self, field):
   323         """return true if the field has some error in given validation exception
   323         """return true if the field has some error in given validation exception
   359     def _form_field_default_value(self, field, load_bytes):
   359     def _form_field_default_value(self, field, load_bytes):
   360         defaultattr = 'default_%s' % field.name
   360         defaultattr = 'default_%s' % field.name
   361         if hasattr(self.edited_entity, defaultattr):
   361         if hasattr(self.edited_entity, defaultattr):
   362             # XXX bw compat, default_<field name> on the entity
   362             # XXX bw compat, default_<field name> on the entity
   363             warn('found %s on %s, should be set on a specific form'
   363             warn('found %s on %s, should be set on a specific form'
   364                  % (defaultattr, self.edited_entity.id), DeprecationWarning)
   364                  % (defaultattr, self.edited_entity.__regid__), DeprecationWarning)
   365             value = getattr(self.edited_entity, defaultattr)
   365             value = getattr(self.edited_entity, defaultattr)
   366             if callable(value):
   366             if callable(value):
   367                 value = value()
   367                 value = value()
   368         else:
   368         else:
   369             value = super(EntityFieldsForm, self).form_field_value(field,
   369             value = super(EntityFieldsForm, self).form_field_value(field,
   370                                                                    load_bytes)
   370                                                                    load_bytes)
   371         return value
   371         return value
   372 
   372 
   373     def form_default_renderer(self):
   373     def form_default_renderer(self):
   374         return self.vreg['formrenderers'].select(
   374         return self._cw.vreg['formrenderers'].select(
   375             self.form_renderer_id, self.req, rset=self.rset, row=self.row,
   375             self.form_renderer_id, self._cw, rset=self.cw_rset, row=self.cw_row,
   376             col=self.col, entity=self.edited_entity)
   376             col=self.cw_col, entity=self.edited_entity)
   377 
   377 
   378 ##    def form_build_context(self, values=None):
   378 ##    def form_build_context(self, values=None):
   379 ##        """overriden to add edit[s|o] hidden fields and to ensure schema fields
   379 ##        """overriden to add edit[s|o] hidden fields and to ensure schema fields
   380 ##        have eidparam set to True
   380 ##        have eidparam set to True
   381 ##        """
   381 ##        """
   402         if attr == 'eid':
   402         if attr == 'eid':
   403             return entity.eid
   403             return entity.eid
   404         if not field.eidparam:
   404         if not field.eidparam:
   405             return super(EntityFieldsForm, self).form_field_value(field, load_bytes)
   405             return super(EntityFieldsForm, self).form_field_value(field, load_bytes)
   406         if attr == '__type':
   406         if attr == '__type':
   407             return entity.id
   407             return entity.__regid__
   408         if self.schema.rschema(attr).is_final():
   408         if self._cw.schema.rschema(attr).is_final():
   409             attrtype = entity.e_schema.destination(attr)
   409             attrtype = entity.e_schema.destination(attr)
   410             if attrtype == 'Password':
   410             if attrtype == 'Password':
   411                 return entity.has_eid() and INTERNAL_FIELD_VALUE or ''
   411                 return entity.has_eid() and INTERNAL_FIELD_VALUE or ''
   412             if attrtype == 'Bytes':
   412             if attrtype == 'Bytes':
   413                 if entity.has_eid():
   413                 if entity.has_eid():
   432         """return MIME type used for the given (text or bytes) field"""
   432         """return MIME type used for the given (text or bytes) field"""
   433         entity = self.edited_entity
   433         entity = self.edited_entity
   434         if field.eidparam and entity.e_schema.has_metadata(field.name, 'format') and (
   434         if field.eidparam and entity.e_schema.has_metadata(field.name, 'format') and (
   435             entity.has_eid() or '%s_format' % field.name in entity):
   435             entity.has_eid() or '%s_format' % field.name in entity):
   436             return self.edited_entity.attr_metadata(field.name, 'format')
   436             return self.edited_entity.attr_metadata(field.name, 'format')
   437         return self.req.property_value('ui.default-text-format')
   437         return self._cw.property_value('ui.default-text-format')
   438 
   438 
   439     def form_field_encoding(self, field):
   439     def form_field_encoding(self, field):
   440         """return encoding used for the given (text) field"""
   440         """return encoding used for the given (text) field"""
   441         entity = self.edited_entity
   441         entity = self.edited_entity
   442         if field.eidparam and entity.e_schema.has_metadata(field.name, 'encoding') and (
   442         if field.eidparam and entity.e_schema.has_metadata(field.name, 'encoding') and (
   468                 vocabfunc = getattr(self.edited_entity, method)
   468                 vocabfunc = getattr(self.edited_entity, method)
   469             except AttributeError:
   469             except AttributeError:
   470                 vocabfunc = getattr(self, '%s_relation_vocabulary' % role)
   470                 vocabfunc = getattr(self, '%s_relation_vocabulary' % role)
   471             else:
   471             else:
   472                 warn('found %s on %s, should be set on a specific form'
   472                 warn('found %s on %s, should be set on a specific form'
   473                      % (method, self.edited_entity.id), DeprecationWarning)
   473                      % (method, self.edited_entity.__regid__), DeprecationWarning)
   474         # NOTE: it is the responsibility of `vocabfunc` to sort the result
   474         # NOTE: it is the responsibility of `vocabfunc` to sort the result
   475         #       (direclty through RQL or via a python sort). This is also
   475         #       (direclty through RQL or via a python sort). This is also
   476         #       important because `vocabfunc` might return a list with
   476         #       important because `vocabfunc` might return a list with
   477         #       couples (label, None) which act as separators. In these
   477         #       couples (label, None) which act as separators. In these
   478         #       cases, it doesn't make sense to sort results afterwards.
   478         #       cases, it doesn't make sense to sort results afterwards.
   508         """defaut vocabulary method for the given relation, looking for
   508         """defaut vocabulary method for the given relation, looking for
   509         relation's object entities (i.e. self is the subject)
   509         relation's object entities (i.e. self is the subject)
   510         """
   510         """
   511         entity = self.edited_entity
   511         entity = self.edited_entity
   512         if isinstance(rtype, basestring):
   512         if isinstance(rtype, basestring):
   513             rtype = entity.schema.rschema(rtype)
   513             rtype = self._cw.vreg.schema.rschema(rtype)
   514         done = None
   514         done = None
   515         assert not rtype.is_final(), rtype
   515         assert not rtype.is_final(), rtype
   516         if entity.has_eid():
   516         if entity.has_eid():
   517             done = set(e.eid for e in getattr(entity, str(rtype)))
   517             done = set(e.eid for e in getattr(entity, str(rtype)))
   518         result = []
   518         result = []
   530         """defaut vocabulary method for the given relation, looking for
   530         """defaut vocabulary method for the given relation, looking for
   531         relation's subject entities (i.e. self is the object)
   531         relation's subject entities (i.e. self is the object)
   532         """
   532         """
   533         entity = self.edited_entity
   533         entity = self.edited_entity
   534         if isinstance(rtype, basestring):
   534         if isinstance(rtype, basestring):
   535             rtype = entity.schema.rschema(rtype)
   535             rtype = self._cw.vreg.schema.rschema(rtype)
   536         done = None
   536         done = None
   537         if entity.has_eid():
   537         if entity.has_eid():
   538             done = set(e.eid for e in getattr(entity, 'reverse_%s' % rtype))
   538             done = set(e.eid for e in getattr(entity, 'reverse_%s' % rtype))
   539         result = []
   539         result = []
   540         rsetsize = None
   540         rsetsize = None