web/formfields.py
changeset 4162 d2663bcf5306
parent 4161 4273f5094651
child 4165 eb9acad29407
equal deleted inserted replaced
4161:4273f5094651 4162:d2663bcf5306
   296             vocab = [(label and form._cw._(label), value) for label, value in vocab]
   296             vocab = [(label and form._cw._(label), value) for label, value in vocab]
   297         if self.sort:
   297         if self.sort:
   298             vocab = vocab_sort(vocab)
   298             vocab = vocab_sort(vocab)
   299         return vocab
   299         return vocab
   300 
   300 
       
   301     def format(self, form):
       
   302         """return MIME type used for the given (text or bytes) field"""
       
   303         if self.eidparam and self.role == 'subject':
       
   304             entity = form.edited_entity
       
   305             if entity.e_schema.has_metadata(self.name, 'format') and (
       
   306                 entity.has_eid() or '%s_format' % self.name in entity):
       
   307                 return form.edited_entity.attr_metadata(self.name, 'format')
       
   308         return form._cw.property_value('ui.default-text-format')
       
   309 
       
   310     def encoding(self, form):
       
   311         """return encoding used for the given (text) field"""
       
   312         if self.eidparam:
       
   313             entity = form.edited_entity
       
   314             if entity.e_schema.has_metadata(self.name, 'encoding') and (
       
   315                 entity.has_eid() or '%s_encoding' % self.name in entity):
       
   316                 return form.edited_entity.attr_metadata(self.name, 'encoding')
       
   317         return form._cw.encoding
       
   318 
   301     def form_init(self, form):
   319     def form_init(self, form):
   302         """method called before by build_context to trigger potential field
   320         """method called before by build_context to trigger potential field
   303         initialization requiring the form instance
   321         initialization requiring the form instance
   304         """
   322         """
   305         pass
   323         pass
       
   324 
       
   325     def has_been_modified(self, form):
       
   326         if self.is_visible():
       
   327             # fields not corresponding to an entity attribute / relations
       
   328             # are considered modified
       
   329             if not self.eidparam or not self.role or not form.edited_entity.has_eid():
       
   330                 return True # XXX
       
   331             try:
       
   332                 if self.role == 'subject':
       
   333                     previous_value = getattr(form.edited_entity, self.name)
       
   334                 else:
       
   335                     previous_value = getattr(form.edited_entity,
       
   336                                              'reverse_%s' % self.name)
       
   337             except AttributeError:
       
   338                 # fields with eidparam=True but not corresponding to an actual
       
   339                 # attribute or relation
       
   340                 return True
       
   341             # if it's a non final relation, we need the eids
       
   342             if isinstance(previous_value, list):
       
   343                 # widget should return untyped eids
       
   344                 previous_value = set(unicode(e.eid) for e in previous_value)
       
   345             if form.edited_entity.has_eid() and (previous_value == self.process_form_value(form)):
       
   346                 return False # not modified
       
   347             return True
       
   348         return False
   306 
   349 
   307     def process_form_value(self, form):
   350     def process_form_value(self, form):
   308         """process posted form and return correctly typed value"""
   351         """process posted form and return correctly typed value"""
   309         widget = self.get_widget(form)
   352         widget = self.get_widget(form)
   310         return widget.process_field_data(form, self)
   353         return widget.process_field_data(form, self)
   417     def use_fckeditor(self, form):
   460     def use_fckeditor(self, form):
   418         """return True if fckeditor should be used to edit entity's attribute named
   461         """return True if fckeditor should be used to edit entity's attribute named
   419         `attr`, according to user preferences
   462         `attr`, according to user preferences
   420         """
   463         """
   421         if form._cw.use_fckeditor():
   464         if form._cw.use_fckeditor():
   422             return form.form_field_format(self) == 'text/html'
   465             return self.format(form) == 'text/html'
   423         return False
   466         return False
   424 
   467 
   425     def render(self, form, renderer):
   468     def render(self, form, renderer):
   426         format_field = self.get_format_field(form)
   469         format_field = self.get_format_field(form)
   427         if format_field:
   470         if format_field:
   524     def render(self, form, renderer):
   567     def render(self, form, renderer):
   525         wdgs = [super(EditableFileField, self).render(form, renderer)]
   568         wdgs = [super(EditableFileField, self).render(form, renderer)]
   526         if self.format(form) in self.editable_formats:
   569         if self.format(form) in self.editable_formats:
   527             data = self.typed_value(form, load_bytes=True)
   570             data = self.typed_value(form, load_bytes=True)
   528             if data:
   571             if data:
   529                 encoding = form.form_field_encoding(self)
   572                 encoding = self.encoding(form)
   530                 try:
   573                 try:
   531                     form.formvalues[self] = unicode(data.getvalue(), encoding)
   574                     form.formvalues[self] = unicode(data.getvalue(), encoding)
   532                 except UnicodeError:
   575                 except UnicodeError:
   533                     pass
   576                     pass
   534                 else:
   577                 else:
   549 
   592 
   550     def process_form_value(self, form):
   593     def process_form_value(self, form):
   551         value = form._cw.form.get(self.input_name(form))
   594         value = form._cw.form.get(self.input_name(form))
   552         if isinstance(value, unicode):
   595         if isinstance(value, unicode):
   553             # file modified using a text widget
   596             # file modified using a text widget
   554             encoding = form.form_field_encoding(self)
   597             return Binary(value.encode(self.encoding(form)))
   555             return Binary(value.encode(encoding))
       
   556         return super(EditableFileField, self).process_form_value(form)
   598         return super(EditableFileField, self).process_form_value(form)
   557 
   599 
   558 
   600 
   559 class IntField(Field):
   601 class IntField(Field):
   560     def __init__(self, min=None, max=None, **kwargs):
   602     def __init__(self, min=None, max=None, **kwargs):