# HG changeset patch # User sylvain.thenault@logilab.fr # Date 1236879624 -3600 # Node ID 739d4dce9b19aa2f609dee357bb2e1d55f1c6020 # Parent 611bacbbe001951b5bbf7f69b5d42cf4df1d8bba * turn tidy_html_hook into a regular application hook * use format_fields instead of formatted_attrs method * drop formatted_attrs diff -r 611bacbbe001 -r 739d4dce9b19 entity.py --- a/entity.py Thu Mar 12 16:34:13 2009 +0100 +++ b/entity.py Thu Mar 12 18:40:24 2009 +0100 @@ -461,17 +461,6 @@ needcheck = False return mainattr, needcheck - @cached - def formatted_attrs(self): - """returns the list of attributes which have some format information - (i.e. rich text strings) - """ - attrs = [] - for rschema, attrschema in self.e_schema.attribute_definitions(): - if attrschema.type == 'String' and self.has_format(rschema): - attrs.append(rschema.type) - return attrs - @classmethod @obsolete('use method of the same name on the schema') def has_format(cls, attr): diff -r 611bacbbe001 -r 739d4dce9b19 server/hooks.py --- a/server/hooks.py Thu Mar 12 16:34:13 2009 +0100 +++ b/server/hooks.py Thu Mar 12 18:40:24 2009 +0100 @@ -11,8 +11,6 @@ from cubicweb import UnknownProperty, ValidationError, BadConnectionId -from cubicweb.common.uilib import soup2xhtml - from cubicweb.server.pool import Operation, LateOperation, PreCommitOperation from cubicweb.server.hookhelper import (check_internal_entity, previous_state, get_user_sessions, rproperty) @@ -208,30 +206,6 @@ -class tidy_html_fields(object): - """tidy HTML in rich text strings - - FIXME: (adim) the whole idea of having a class is to store the - event type. There might be another way to get dynamically the - event inside the hook function. - """ - # FIXME hooks manager use func_name to register - func_name = 'tidy_html_field' - - def __init__(self, event): - self.event = event - - def __call__(self, session, entity): - for attr in entity.formatted_attrs(): - value = entity.get(attr) - # text was not changed - if self.event == 'before_add_entity': - fmt = entity.get('%s_format' % attr) - else: - fmt = entity.get_value('%s_format' % attr) - if value and fmt == 'text/html': - entity[attr] = soup2xhtml(value, session.encoding) - class CheckRequiredRelationOperation(LateOperation): """checking relation cardinality has to be done after commit in @@ -315,8 +289,6 @@ hm.register_hook(cstrcheck_after_add_relation, 'after_add_relation', '') hm.register_hook(uniquecstrcheck_before_modification, 'before_add_entity', '') hm.register_hook(uniquecstrcheck_before_modification, 'before_update_entity', '') - hm.register_hook(tidy_html_fields('before_add_entity'), 'before_add_entity', '') - hm.register_hook(tidy_html_fields('before_update_entity'), 'before_update_entity', '') # user/groups synchronisation ################################################# diff -r 611bacbbe001 -r 739d4dce9b19 sobjects/hooks.py --- a/sobjects/hooks.py Thu Mar 12 16:34:13 2009 +0100 +++ b/sobjects/hooks.py Thu Mar 12 18:40:24 2009 +0100 @@ -1,14 +1,16 @@ """various library content hooks :organization: Logilab -:copyright: 2001-2008 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +:copyright: 2001-2009 LOGILAB S.A. (Paris, FRANCE), all rights reserved. :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr """ __docformat__ = "restructuredtext en" +from cubicweb.common.uilib import soup2xhtml from cubicweb.server.hooksmanager import Hook from cubicweb.server.pool import PreCommitOperation + class AddUpdateEUserHook(Hook): """ensure user logins are stripped""" events = ('before_add_entity', 'before_update_entity',) @@ -35,3 +37,24 @@ def call(self, session, subj, rtype, obj): AutoDeleteBookmark(session, beid=subj) + + +class TidyHtmlFields(Hook): + """tidy HTML in rich text strings""" + events = ('before_add_entity', 'before_update_entity') + 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) + diff -r 611bacbbe001 -r 739d4dce9b19 test/unittest_entity.py --- a/test/unittest_entity.py Thu Mar 12 16:34:13 2009 +0100 +++ b/test/unittest_entity.py Thu Mar 12 18:40:24 2009 +0100 @@ -374,13 +374,6 @@ e['content'] = u'été' self.assertEquals(e.printable_value('content'), e['content']) - - def test_entity_formatted_attrs(self): - e = self.etype_instance('EUser') - self.assertEquals(e.formatted_attrs(), []) - e = self.etype_instance('File') - self.assertEquals(e.formatted_attrs(), ['description']) - def test_fulltextindex(self): e = self.etype_instance('File')