# HG changeset patch # User sylvain.thenault@logilab.fr # Date 1236883174 -3600 # Node ID 0c067de38e46225b5659449bc871d2c7e095c318 # Parent 7ca89f4468e4daee38ba91b3648d29ee60873f94 unification of meta-attributes handling: * remove has_format, has_text_encoding, format, text_encoding methods on Entity * remove rich_text_fields method on EntitySchema * use instead has_metadata / meta_attribute on EntitySchema (from yams) and attribute_metadata on Entity diff -r 7ca89f4468e4 -r 0c067de38e46 entities/__init__.py --- a/entities/__init__.py Thu Mar 12 18:41:26 2009 +0100 +++ b/entities/__init__.py Thu Mar 12 19:39:34 2009 +0100 @@ -89,13 +89,12 @@ @classmethod def __initialize__(cls): super(ANYENTITY, cls).__initialize__() # XXX + # set a default_ATTR method for rich text format fields + # XXX move this away once the old widgets have been dropped! eschema = cls.e_schema - eschema.format_fields = {} - # set a default_ATTR method for rich text format fields - for attr, formatattr in eschema.rich_text_fields(): - if not hasattr(cls, 'default_%s' % formatattr): - setattr(cls, 'default_%s' % formatattr, cls._default_format) - eschema.format_fields[formatattr] = attr + for metaattr, (metadata, attr) in eschema.meta_attributes().iteritems(): + if metadata == 'format' and not hasattr(cls, 'default_%s' % metaattr): + setattr(cls, 'default_%s' % metaattr, cls._default_format) # meta data api ########################################################### @@ -414,9 +413,9 @@ """return True if fckeditor should be used to edit entity's attribute named `attr`, according to user preferences """ - if self.req.use_fckeditor() and self.has_format(attr): + if self.req.use_fckeditor() and self.has_metadata(attr, 'format'): if self.has_eid() or '%s_format' % attr in self: - return self.format(attr) == 'text/html' + return self.attribute_metadata(attr, 'format') == 'text/html' return self.req.property_value('ui.default-text-format') == 'text/html' return False diff -r 7ca89f4468e4 -r 0c067de38e46 entity.py --- a/entity.py Thu Mar 12 18:41:26 2009 +0100 +++ b/entity.py Thu Mar 12 19:39:34 2009 +0100 @@ -461,29 +461,12 @@ needcheck = False return mainattr, needcheck - @classmethod - @obsolete('use method of the same name on the schema') - def has_format(cls, attr): - """return true if this entity's schema has a format field for the given - attribute - """ - return cls.e_schema.has_format(attr) - - def format(self, attr): - """return the mime type format for an attribute (if specified)""" - return getattr(self, '%s_format' % attr, None) - - def text_encoding(self, attr): - """return the text encoding for an attribute, default to site encoding - """ - encoding = getattr(self, '%s_encoding' % attr, None) - return encoding or self.vreg.property_value('ui.encoding') - - def has_text_encoding(self, attr): - """return true if this entity's schema has ab encoding field for the - given attribute - """ - return self.e_schema.has_subject_relation('%s_encoding' % attr) + def attribute_metadata(self, attr, metadata): + """return a metadata for an attribute (None if unspecified)""" + value = getattr(self, '%s_%s' % (attr, metadata), None) + if value is None and metadata == 'encoding': + value = self.vreg.property_value('ui.encoding') + return value def printable_value(self, attr, value=_marker, attrtype=None, format='text/html', displaytime=True): @@ -505,17 +488,14 @@ # description... if props.get('internationalizable'): value = self.req._(value) - attrformat = self.format(attr) + attrformat = self.attribute_metadata(attr, 'format') if attrformat: return self.mtc_transform(value, attrformat, format, self.req.encoding) elif attrtype == 'Bytes': - attrformat = self.format(attr) + attrformat = self.attribute_metadata(attr, 'format') if attrformat: - try: - encoding = getattr(self, '%s_encoding' % attr) - except AttributeError: - encoding = self.req.encoding + encoding = self.attribute_metadata(attr, 'encoding') return self.mtc_transform(value.getvalue(), attrformat, format, encoding) return u'' diff -r 7ca89f4468e4 -r 0c067de38e46 schema.py --- a/schema.py Thu Mar 12 18:41:26 2009 +0100 +++ b/schema.py Thu Mar 12 19:39:34 2009 +0100 @@ -322,28 +322,7 @@ def schema_entity(self): """return True if this entity type is used to build the schema""" return self.type in self.schema.schema_entity_types() - - def has_format(self, attr): - """return true if this entity's schema has a format field for the given - attribute - """ - return self.has_subject_relation('%s_format' % attr) - - def has_format(self, attr): - """return true if this entity's schema has an encoding field for the given - attribute - """ - return self.has_subject_relation('%s_format' % attr) - - def rich_text_fields(self): - """return an iterator on (attribute, format attribute) of rich text field - - (the first tuple element containing the text and the second the text format) - """ - for rschema, _ in self.attribute_definitions(): - if rschema.type.endswith('_format') and self.has_subject_relation(rschema.type[:-7]): - yield self.subject_relation(rschema.type[:-7]), rschema - + def check_perm(self, session, action, eid=None): # NB: session may be a server session or a request object user = session.user diff -r 7ca89f4468e4 -r 0c067de38e46 sobjects/hooks.py --- a/sobjects/hooks.py Thu Mar 12 18:41:26 2009 +0100 +++ b/sobjects/hooks.py Thu Mar 12 19:39:34 2009 +0100 @@ -45,16 +45,18 @@ accepts = ('Any',) def call(self, session, entity): - for formatattr, attr in entity.e_schema.format_fields.iteritems(): - try: - value = entity[attr] - except KeyError: - continue # no text to tidy - if isinstance(value, unicode): # filter out None and Binary - if self.event == 'before_add_entity': - fmt = entity.get(formatattr) - else: - fmt = entity.get_value(formatattr) - if fmt == 'text/html': - entity[attr] = soup2xhtml(value, session.encoding) + metaattrs = entity.e_schema.meta_attributes() + for metaattr, (metadata, attr) in metaattrs.iteritems(): + if metadata == 'format': + try: + value = entity[attr] + except KeyError: + continue # no text to tidy + if isinstance(value, unicode): # filter out None and Binary + if self.event == 'before_add_entity': + fmt = entity.get(metaattr) + else: + fmt = entity.get_value(metaattr) + if fmt == 'text/html': + entity[attr] = soup2xhtml(value, session.encoding) diff -r 7ca89f4468e4 -r 0c067de38e46 web/form.py --- a/web/form.py Thu Mar 12 18:41:26 2009 +0100 +++ b/web/form.py Thu Mar 12 19:39:34 2009 +0100 @@ -475,16 +475,16 @@ def form_field_format(self, field): entity = self.entity - if field.eidparam and entity.has_format(field.name) and ( + if field.eidparam and entity.has_metadata(field.name, 'format') and ( entity.has_eid() or '%s_format' % field.name in entity): - return self.entity.format(field.name) + return self.entity.attribute_metadata(field.name, 'format') return self.req.property_value('ui.default-text-format') def form_field_encoding(self, field): entity = self.entity - if field.eidparam and entity.has_encoding(field.name) and ( + if field.eidparam and entity.has_metadata(field.name, 'encoding') and ( entity.has_eid() or '%s_encoding' % field.name in entity): - return self.entity.text_encoding() + return self.entity.attribute_metadata(field.name, 'encoding') return super(EntityFieldsForm, self).form_field_encoding(field) def _form_field_entity_value(self, field, default_initial=True, load_bytes=False): diff -r 7ca89f4468e4 -r 0c067de38e46 web/formfields.py --- a/web/formfields.py Thu Mar 12 18:41:26 2009 +0100 +++ b/web/formfields.py Thu Mar 12 19:39:34 2009 +0100 @@ -373,7 +373,7 @@ return None if targetschema == 'Password': return StringField(widget=PasswordInput(), **kwargs) - if eschema.has_format(rschema): + if eschema.has_metadata(rschema, 'format'): constraints = rschema.rproperty(eschema, targetschema, 'constraints') for cstr in constraints: if isinstance(cstr, StaticVocabularyConstraint): diff -r 7ca89f4468e4 -r 0c067de38e46 web/views/editcontroller.py --- a/web/views/editcontroller.py Thu Mar 12 18:41:26 2009 +0100 +++ b/web/views/editcontroller.py Thu Mar 12 19:39:34 2009 +0100 @@ -201,24 +201,24 @@ if formparams.has_key('__%s_detach' % attr) or formparams.has_key('%s__detach' % attr): # drop current file value value = None - # no need to check value when nor explicit detach nor new file submitted, - # since it will think the attribut is not modified + # no need to check value when nor explicit detach nor new file + # submitted, since it will think the attribute is not modified elif isinstance(value, unicode): # file modified using a text widget - value = Binary(value.encode(entity.text_encoding(attr))) + value = Binary(value.encode(entity.attribute_metadata(attr, 'encoding'))) else: # (filename, mimetype, stream) val = Binary(value[2].read()) if not val.getvalue(): # usually an unexistant file value = None else: - # XXX suppose a File compatible schema val.filename = value[0] - if entity.has_format(attr): + if entity.has_metadata(attr, 'format'): key = '%s_format' % attr formparams[key] = value[1] self.relations.append('X %s_format %%(%s)s' % (attr, key)) + # XXX suppose a File compatible schema if entity.e_schema.has_subject_relation('name') \ and not formparams.get('name'): formparams['name'] = value[0] diff -r 7ca89f4468e4 -r 0c067de38e46 web/widgets.py --- a/web/widgets.py Thu Mar 12 18:41:26 2009 +0100 +++ b/web/widgets.py Thu Mar 12 19:39:34 2009 +0100 @@ -410,7 +410,7 @@ entity.req.fckeditor_config() if with_format: if entity.has_eid(): - format = entity.format(self.name) + format = entity.attribute_metadata(self.name, 'format') else: format = '' frname = eid_param(self.name + '_format', entity.eid) @@ -419,7 +419,7 @@ frname, format, frname) return u'%s' % ( hidden, self.rname, self.format_attrs(), dvalue) - if with_format and entity.has_format(self.name): + if with_format and entity.has_metadata(self.name, 'format'): fmtwdg = entity.get_widget(self.name + '_format') fmtwdgstr = fmtwdg.edit_render(entity, tabindex=self.attrs['tabindex']) self.attrs['tabindex'] = entity.req.next_tabindex() @@ -467,7 +467,7 @@ def _file_wdg(self, entity): wdgs = [u'' % (self.rname, self.format_attrs())] req = entity.req - if entity.has_format(self.name) or entity.has_text_encoding(self.name): + if entity.has_metadata(self.name, 'format') or entity.has_metadata(self.name, 'encoding'): divid = '%s-%s-advanced' % (self.name, entity.eid) wdgs.append(u'%s' % (html_escape(toggle_action(divid)), @@ -509,14 +509,14 @@ def _edit_render(self, entity): wdgs = [self._file_wdg(entity)] - if entity.format(self.name) in ('text/plain', 'text/html', 'text/rest'): + if entity.attribute_metadata(self.name, 'format') in ('text/plain', 'text/html', 'text/rest'): msg = self._edit_msg(entity) wdgs.append(u'

%s

' % msg) twdg = TextWidget(self.vreg, self.subjtype, self.rschema, self.objtype) twdg.rname = self.rname data = getattr(entity, self.name) if data: - encoding = entity.text_encoding(self.name) + encoding = entity.attribute_metadata(self.name, 'encoding') try: entity[self.name] = unicode(data.getvalue(), encoding) except UnicodeError: