From: Nikolay K. <faf...@us...> - 2004-09-20 11:36:17
|
Update of /cvsroot/collective/CMFBoard In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9726 Modified Files: Forum.py ForumCatalog.py ForumFolder.py ForumMessage.py ForumTopic.py ForumWorkflow.py ListSupport.py __init__.py forum_export.py forum_import.py Log Message: start work on import from old cmfbforum version Index: Forum.py =================================================================== RCS file: /cvsroot/collective/CMFBoard/Forum.py,v retrieving revision 1.96 retrieving revision 1.97 diff -u -d -r1.96 -r1.97 --- Forum.py 8 Sep 2004 11:13:34 -0000 1.96 +++ Forum.py 20 Sep 2004 11:36:06 -0000 1.97 @@ -108,6 +108,19 @@ }, } + _attributes = [ + 'portal_type', 'workflow_history', 'creation_date', 'modification_date', + '_uid', '_at_uid', '_version', + + # ListSupport + '_hash_map', '_list_index', '_list_unindex', + '_list_access_index', '_list_access_unindex', + + # ForumCatalog + '_review_index', '_access_index', '_access_unindex', + '_sticky_on', '_sticky_off', + ] + security.declareProtected(ManageForum, 'processForm') def __init__(self, oid, **kw): @@ -115,7 +128,7 @@ ForumCatalogSupport.__init__(self) self.replies = Length() - self._internal_version = INTERNAL_VERSION + self._version = INTERNAL_VERSION security.declarePublic('isModerated') def isModerated(self): @@ -210,7 +223,9 @@ if not id: id = str(random.random())[2:] kwargs['id'] = id - kwargs['__new_topic__'] = 1 + + if not kwargs.has_key('__no_new_topic__'): + kwargs['__new_topic__'] = 1 tp = self.portal_types.getTypeInfo(portal_type) if tp is None: Index: ForumMessage.py =================================================================== RCS file: /cvsroot/collective/CMFBoard/ForumMessage.py,v retrieving revision 1.113 retrieving revision 1.114 diff -u -d -r1.113 -r1.114 --- ForumMessage.py 14 Sep 2004 16:36:07 -0000 1.113 +++ ForumMessage.py 20 Sep 2004 11:36:06 -0000 1.114 @@ -121,6 +121,12 @@ 'forum_static',]}, } + _attributes = [ + 'workflow_history', 'creation_date', 'modification_date', + '_anonymous', '_sended', + '_uid', '_at_uid', '_version', + ] + def _setId(self, *args, **kwargs): pass @@ -179,7 +185,7 @@ dir, fileName = os.path.split(f_name) if fileName: self.invokeFactory('ForumAttachment', fileName, file=attach) - + def manage_afterAdd(self, item, container): OrderedBaseFolder.manage_afterAdd(self, item, container) Index: __init__.py =================================================================== RCS file: /cvsroot/collective/CMFBoard/__init__.py,v retrieving revision 1.40 retrieving revision 1.41 diff -u -d -r1.40 -r1.41 --- __init__.py 4 Sep 2004 16:36:02 -0000 1.40 +++ __init__.py 20 Sep 2004 11:36:07 -0000 1.41 @@ -85,4 +85,4 @@ allow_module('Products.CMFBoard.forum_export') allow_module('Products.CMFBoard.forum_import') except: - pass + raise Index: forum_export.py =================================================================== RCS file: /cvsroot/collective/CMFBoard/forum_export.py,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- forum_export.py 22 Aug 2004 17:24:29 -0000 1.12 +++ forum_export.py 20 Sep 2004 11:36:07 -0000 1.13 @@ -26,7 +26,7 @@ StringTypes = (StringType, UnicodeType) -attrs_list = [ +attrs_perms = [ '_Access_contents_information_Permission', '_List_folder_contents_Permission', '_Modify_portal_content_Permission', @@ -36,29 +36,17 @@ '_CMFBoard__Add_forum_topic_Permission', '_CMFBoard__Add_forum_topic_reply_Permission', '_CMFBoard__Add_forum_poll_Permission', + '_CMFBoard__Add_forum_announce_Permission', '_CMFBoard__Manage_forum_Permission', '_CMFBoard__Manage_forum_topic_Permission', '_CMFBoard__Modify_forum_topic_Permission', - '_CMFBoard__Modify_topic_attachements_Permission', - '_CMFBoard__Modify_forum_topic_reply_Permission', - '_CMFBoard__Modify_reply_attachements_Permission', + '_CMFBoard__Modify_attachements_Permission', '_CMFBoard__View_admin_topic_Permission', '_CMFBoard__Delete_forum_topic_Permission', - '_CMFBoard__Delete_forum_reply_Permission', + '_CMFBoard__Delete_forum_message_Permission', + + '__ac_local_roles__', ] - '_owner', - '__ac_local_roles__', - 'portal_type', - 'workflow_history', - 'creation_date', - 'modification_date', - 'topic_type', - '_anonymous', - '_subscription', - '_votes', - '_list_index', - '_list_index_length', - ] types_map = { types.NoneType: '_NoneType', types.IntType: '_IntType', @@ -122,12 +110,21 @@ def _TextField(self, object, field, charset): field_id = field.getName() - mimetype = object.getContentType(field_id) + + try: + mimetype = object.getContentType(field_id) + except: + mimetype = 'text/plain' + attrs = AttributesImpl({u'id': unicode(field_id), u'mimetype': mimetype}) self._xmlgen.startElement(u'TextField', attrs) - self.export_value('', field.get(object, mimetype=mimetype), charset) + try: + val = field.get(object, mimetype=mimetype) + except: + val = '' + self.export_value('', val, charset) self._xmlgen.endElement(u'TextField') def _ImageField(self, object, field, charset): @@ -163,7 +160,11 @@ attrs = AttributesImpl({u'id': unicode(field.getName())}) self._xmlgen.startElement(u'LinesField', attrs) - self.export_value('', field.get(object), charset) + try: + val = field.get(object) + except: + val = [] + self.export_value('', val, charset) self._xmlgen.endElement(u'LinesField') def _DateTimeField(self, object, field, charset): @@ -197,8 +198,10 @@ ob = aq_base(instance) charset = instance.getCharset() + attrs = instance._attributes + for key, val in ob.__dict__.items(): - if key in attrs_list: + if (key in attrs_perms) or (key in attrs): self.export_value('', key, charset) self.export_value('', val, charset) @@ -415,17 +418,10 @@ self.export_Attributes(topic) exporter.startElement(u'children', AttributesImpl({})) - - proccesed_uids = [] - for msg in topic.getChildren(): - self.export_ForumMessage(msg, proccesed_uids) - for msg in topic.contentValues(): - if msg.UID() not in proccesed_uids: - self.export_ForumMessage(msg, proccesed_uids) - + self.export_ForumMessage(msg) exporter.endElement(u'children') - + exporter.endElement(unicode(pt)) @@ -444,16 +440,10 @@ export_ForumPoll = export_ForumTopic - def export_ForumMessage(self, msg, proccesed_uids=None): + def export_ForumMessage(self, msg): attr_vals = {u'id': unicode(msg.getId()), u'uid': unicode(msg.UID())} - - if proccesed_uids is None: - proccesed_uids = [] - - if msg.UID() in proccesed_uids: - return - + proccesed_uids.append(msg.UID()) exporter = self._xmlgen @@ -470,7 +460,6 @@ exporter.endElement(u'ForumMessage') - def close(self): self._xmlgen.endDocument() return Index: ForumCatalog.py =================================================================== RCS file: /cvsroot/collective/CMFBoard/ForumCatalog.py,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- ForumCatalog.py 7 Sep 2004 14:03:10 -0000 1.11 +++ ForumCatalog.py 20 Sep 2004 11:36:06 -0000 1.12 @@ -23,14 +23,19 @@ security = ClassSecurityInfo() - security.declarePublic(View, 'dump_catalog') - def dump_catalog(self): + def DumpIndex(self): """ """ + for key, val in self._list_index.items(): + print key, val + for key, val in list(self._review_index.items()): print key, list(val.keys()) def __init__(self): - ListSupport.__init__(self) + self._clear() + + def _clear(self): + ListSupport._clear(self) # review_state index review_index = OOBTree() @@ -48,6 +53,13 @@ self._sticky_on = IITreeSet() self._sticky_off = IITreeSet() + def _rebuildListIndex(self): + """ """ + self._clear() + + for obj in self.contentValues(): + self.insertMessageIntoList(obj) + def _get_time_key(self, obj): return self._convert(obj.modified()) Index: ForumTopic.py =================================================================== RCS file: /cvsroot/collective/CMFBoard/ForumTopic.py,v retrieving revision 1.86 retrieving revision 1.87 diff -u -d -r1.86 -r1.87 --- ForumTopic.py 8 Sep 2004 11:13:34 -0000 1.86 +++ ForumTopic.py 20 Sep 2004 11:36:06 -0000 1.87 @@ -20,6 +20,7 @@ import config from config import * from ForumPermissions import * +from ForumMessage import ForumMessage from HitsCounter import HitsCounterTopic from ForumCatalog import ForumCatalogAware from TreeSupport import TreeSupport @@ -97,6 +98,18 @@ 'topic_subs': {'views': ['forum_topic_menu'],} } + _attributes = [ + 'portal_type', 'workflow_history', 'creation_date', 'modification_date', + '_uid', '_at_uid', '_version', + + '_subscription', '_votes', '_member_votes', + + '_hash_map', '_list_index', + '_list_unindex', '_list_access_index', + '_list_access_unindex', + '_tree_index', '_tree_unindex', + ] + def __init__(self, id, **kwargs): BaseBTreeFolder.__init__(self, id, **kwargs) TreeSupport.__init__(self) @@ -121,11 +134,12 @@ self._anonymous = 1 self._topic_initialized = 1 - self._version = config.version + self._version = config.INTERNAL_VERSION BaseBTreeFolder.initializeArchetype(self, **kwargs) if (kwargs.has_key('__new_topic__') and kwargs['__new_topic__']): + print '=================== initializeArchetype =========================' msg = self.manage_addReply(**kwargs) def manage_afterAdd(self, item, container): @@ -247,4 +261,75 @@ self.getForum().Hits() return HitsCounterTopic.Hits(self) + # + # import / export + # + security.declarePrivate('import_fields') + def import_fields(self, fields): + if 'text' in fields.keys(): + # old format, convert + msg = self.manage_addReply() + + self._old_converted = 1 + for key, val in fields.items(): + field = msg.getField(key) + if field: + mutator = field.getMutator(msg) + if mutator: + try: + mutator(val[0], **val[1]) + continue + except: + traceback.print_exc() + + try: + field.set(msg, val[0], **val[1]) + except: + traceback.print_exc() + #msg.indexObject() + + for key, val in fields.items(): + field = self.getField(key) + if field: + mutator = field.getMutator(self) + if mutator: + try: + mutator(val[0], **val[1]) + continue + except: + pass + + try: + field.set(self, val[0], **val[1]) + except: + pass + + print fields.keys() + + security.declarePrivate('import_attributes') + def import_attributes(self, attrs): + if getattr(self, '_old_converted', 0): + del self._old_converted + + self.DumpIndex() + + msgId = self.getFirstMessage() + msg = self._getOb(self.getFirstMessage()) + + if self.isModerated(): + self.portal_workflow.doActionFor(msg, 'publish') + + for key, val in attrs.items(): + if ((key in ForumMessage._attributes) and + (key not in '_uid','_at_uid','_version','workflow_history')): + setattr(msg, key, val) + + for key, val in attrs.items(): + if key == 'workflow_history': + data = val['forum_topic_workflow'] + if data[-1]['review_state'] not in ('admin','announce','visible','locked'): + data[-1]['review_state'] = 'visible' + + setattr(self, key, val) + registerType(ForumTopic) Index: ForumWorkflow.py =================================================================== RCS file: /cvsroot/collective/CMFBoard/ForumWorkflow.py,v retrieving revision 1.39 retrieving revision 1.40 diff -u -d -r1.39 -r1.40 --- ForumWorkflow.py 14 Sep 2004 16:36:07 -0000 1.39 +++ ForumWorkflow.py 20 Sep 2004 11:36:07 -0000 1.40 @@ -400,7 +400,7 @@ sdef = wf.states['initial'] sdef.setProperties( title='Initial state', - transitions=('auto_visible', 'auto_publish', 'auto_submit')) + transitions=('auto_visible', 'auto_submit')) sdef = wf.states['waitreview'] sdef.setProperties( @@ -441,7 +441,7 @@ sdef = wf.states['visible'] sdef.setProperties( title='Visible for all, editable by owner', - transitions=('publish', 'reject', 'private', 'wm_publish', 'wm_submit')) + transitions=('publish', 'reject', 'private')) sdef.setPermission(p_access, 1,()) sdef.setPermission(p_view, 1,()) sdef.setPermission(p_modify, 0,(r_manager, r_fmanager, r_owner)) @@ -491,7 +491,7 @@ actbox_name='Visible', after_script_name='stateChanged', props={'guard_permissions': p_review, - 'guard_expr':'here/isModerated'}) + 'guard_expr':'not:here/isModerated'}) tdef = wf.transitions['auto_visible'] tdef.setProperties( Index: ForumFolder.py =================================================================== RCS file: /cvsroot/collective/CMFBoard/ForumFolder.py,v retrieving revision 1.47 retrieving revision 1.48 diff -u -d -r1.47 -r1.48 --- ForumFolder.py 2 Sep 2004 11:12:02 -0000 1.47 +++ ForumFolder.py 20 Sep 2004 11:36:06 -0000 1.48 @@ -107,6 +107,12 @@ _cache_invalidates = { 'topic_changed': {'views': ['forum_folder_view']}, } + + _attributes = [ + 'portal_type', 'workflow_history', 'creation_date', 'modification_date', + '_uid', '_at_uid', '_version', + ] + security.declareProtected(View, 'Title') def Title(self): @@ -173,7 +179,7 @@ skin = self.custom_skin else: skin = self.predefined_skin - + if skin: self.changeSkin(skin) except: Index: ListSupport.py =================================================================== RCS file: /cvsroot/collective/CMFBoard/ListSupport.py,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- ListSupport.py 14 Sep 2004 16:36:07 -0000 1.10 +++ ListSupport.py 20 Sep 2004 11:36:07 -0000 1.11 @@ -42,7 +42,15 @@ security = ClassSecurityInfo() + def DumpIndex(self): + """ """ + for key, val in self._list_index.items(): + print key, val + def __init__(self): + self._clear() + + def _clear(self): self._hash_map = IOBTree() # mtime index @@ -53,6 +61,13 @@ self._list_access_index = IOBTree() self._list_access_unindex = IOBTree() + def _rebuildListIndex(self): + """ """ + self._clear() + + for obj in self.contentValues(): + self.insertMessageIntoList(obj) + def _get_time_key(self, obj): return self._convert(obj.created()) Index: forum_import.py =================================================================== RCS file: /cvsroot/collective/CMFBoard/forum_import.py,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- forum_import.py 14 May 2004 03:00:55 -0000 1.11 +++ forum_import.py 20 Sep 2004 11:36:07 -0000 1.12 @@ -3,7 +3,7 @@ # Authors: Nik Kim <fa...@le...> import zlib, StringIO, binascii, traceback -from types import StringType, UnicodeType +from types import StringType, UnicodeType, TupleType from cPickle import loads, dumps from DateTime import DateTime from BTrees.Length import Length @@ -19,18 +19,6 @@ StringTypes = (StringType, UnicodeType) -attrs_mapping = { - '_Add_forum_topic_Permission': '_CMFBoard__Add_forum_topic_Permission', - '_Add_forum_topic_reply_Permission': '_CMFBoard__Add_forum_topic_reply_Permission', - '_Manage_forum_Permission': '_CMFBoard__Manage_forum_Permission', - '_Manage_forum_topic_Permission': '_CMFBoard__Manage_forum_topic_Permission', - '_Modify_forum_topic_Permission': '_CMFBoard__Modify_forum_topic_Permission', - '_Modify_forum_topic_reply_Permission': '_CMFBoard__Modify_forum_topic_reply_Permission', - '_View_admin_topic_Permission': '_CMFBoard__View_admin_topic_Permission', - '_Delete_forum_topic_Permission': '_CMFBoard__Delete_forum_topic_Permission', - '_Delete_forum_reply_Permission': '_CMFBoard__Delete_forum_reply_Permission', - } - string_fields = ['title', 'desscription', 'text', 'authorname'] uid_mapping = {} @@ -39,7 +27,7 @@ unmarshal_meth = { 'Data': (None, None), - 'fields': (None, None), + 'fields': ('start_fields', 'end_fields'), 'folders': (None, None), 'forums': (None, None), 'attributes': ('start_attributes', 'end_attributes'), @@ -48,17 +36,17 @@ 'ForumFolder': ('start_ForumFolder', 'end_generic_ForumType'), 'ForumNB': ('start_ForumNB', 'end_ForumNB'), - 'ForumTopic': ('start_ForumTopic', 'end_generic_ForumType'), - 'ForumPoll': ('start_ForumTopic', 'end_generic_ForumType'), - 'ForumContentTopic': ('start_ForumContentTopic', 'end_generic_ForumType'), + 'ForumTopic': ('start_ForumTopic', 'end_ForumTopic'), + 'ForumPoll': ('start_ForumTopic', 'end_ForumTopic'), + 'ForumContentTopic': ('start_ForumContentTopic', 'end_ForumTopic'), 'ForumMessage': ('start_ForumMessage', 'end_generic_ForumType'), 'IntegerField': ('start_IntegerField', 'end_IntegerField'), 'BooleanField': ('start_BooleanField', 'end_BooleanField'), 'StringField': ('start_StringField', 'end_StringField'), 'TextField': ('start_TextField', 'end_TextField'), - 'ImageField': ('start_ImageField', 'end_ImageField'), - 'ForumFileField': ('start_ForumFileField', 'end_ForumFileField'), + #'ImageField': ('start_ImageField', 'end_ImageField'), + #'ForumFileField': ('start_ForumFileField', 'end_ForumFileField'), 'LinesField': ('start_LinesField', 'end_LinesField'), 'DateTimeField': ('start_DateTimeField', 'end_DateTimeField'), @@ -104,7 +92,7 @@ start_DateTime = start_Length = Unmarshaller.um_start_generic start_unicode = start_boolean = start_Pickled = Unmarshaller.um_start_generic - start_attributes = start_PersistentMapping = Unmarshaller.um_start_dictionary + start_attributes = start_fields = start_PersistentMapping = Unmarshaller.um_start_dictionary end_PersistentMapping = Unmarshaller.um_end_dictionary def end_DateTime(self, name): @@ -141,25 +129,14 @@ def end_attributes(self, name): self.um_end_dictionary(name) + root = self.root_stack[-1] attrs = self.data_stack[-1] - object = self.root_stack[-1] - items = attrs.items() - items.sort() - for key, val in items: - if (key == 'hits') and (type(val) == type(1)): - val = Length(val) - - if attrs_mapping.has_key(key): - setattr(object, attrs_mapping[key], val) - else: - setattr(object, key, val) - - if '_owner' not in attrs.keys(): - try: - del object._owner - except: - pass + if hasattr(root.__class__, 'import_attributes'): + root.import_attributes(attrs) + else: + for key, val in attrs.items(): + setattr(root, key, val) del self.data_stack[-1] @@ -168,6 +145,7 @@ self.root_stack.pop() self.portal.portal_catalog.indexObject(root) + root.indexObject() def start_ForumFolder(self, name, attrs): id = str(attrs['id']) @@ -175,14 +153,18 @@ root = self.root_stack[-1] - root.invokeFactory('ForumFolder', id, uid=uid) + print 'start_ForumFolder', id - ob = getattr(root, id) - try: - ob._delObject('members') - ob._delObject('public') - except: - pass + if not hasattr(root, id): + root.invokeFactory('ForumFolder', id, uid=uid) + ob = getattr(root, id) + try: + ob._delObject('members') + ob._delObject('public') + except: + pass + else: + ob = getattr(root, id) ob._p_changed = 1 self.root_stack.append(ob) @@ -193,6 +175,8 @@ root = self.root_stack[-1] + print 'start_ForumNB', id + root.invokeFactory('ForumNB', id, uid=uid) ob = getattr(root, id) @@ -203,15 +187,17 @@ def end_ForumNB(self, name): root = self.root_stack[-1] - hits = 0 - for topic in root.contentValues(): - hits += topic.RawHits() + #hits = 0 + #for topic in root.contentValues(): + # hits += topic.RawHits() - root.hits.set(hits) + #root.hits.set(hits) #print root.RawHits() - root.forum_catalog.refreshCatalog(clear=1) - self.portal.portal_catalog.indexObject(root) + #self.portal.portal_catalog.indexObject(root) + root._rebuildListIndex() + + root.indexObject() self.root_stack.pop() def start_ForumTopic(self, name, attrs): @@ -223,11 +209,17 @@ 'portal_type': str(name), 'uid': str(attrs['uid'])} - ob = root._addTopic(id, **kw) + ob = root._addTopic(id, __no_new_topic__=0, **kw) ob._p_changed = 1 - + self.root_stack.append(ob) + def end_ForumTopic(self, name): + root = self.root_stack[-1] + self.root_stack.pop() + + root._rebuildListIndex() + def start_ForumContentTopic(self, name, attrs): root = self.root_stack[-1] @@ -250,14 +242,13 @@ pass try: - ob = root._addTopic(id, **kw) + ob = root._addTopic(id, __no_new_topic__=0, **kw) except: log('Import error creating Forum Content Topic') raise self.root_stack.append(ob) - def start_ForumMessage(self, name, attrs): root = self.root_stack[-1] topic = root.getTopic() @@ -270,36 +261,57 @@ ################### ## Fields ################### - def start_generic_Field(self, name, attrs): - self.data_stack.append(attrs) + def end_fields(self, name): + self.um_end_dictionary(name) - def end_generic_Field(self, name): - ds = self.data_stack root = self.root_stack[-1] + + attrs = self.data_stack[-1] - field_id = str(ds[-2]['id']) + items = attrs.items() + items.sort() - field = root.getField(field_id) + fields = {} + for key, val in items: + if type(val) == TupleType: + value = val[0] + kw = val[1] + else: + value = val + kw = {} - if field is not None: - mutator = field.getMutator(root) + fields[key['id']] = (value, kw) - if mutator: - try: - mutator(ds[-1]) - except: - #traceback.print_exc() - #print 'Import error: %s' % field.getName() + if hasattr(root.__class__, 'import_fields'): + root.import_fields(fields) + else: + for id, val in fields.items(): + field = root.getField(id) + if field is None: + continue + + mutator = field.getMutator(root) + + if mutator: try: - log('Import error: %s' % field.getName()) + mutator(val[0], **val[1]) except: - pass - else: - field.set(root, ds[-1]) - else: - log('Import error: field not found "%s"' % ds[-2]['id']) - - self.data_stack = ds[:-2] + log('Import error: %s' % id) + else: + try: + field.set(root, val[0], **val[1]) + except: + log('Import error: %s' % id) + + print root + + + def start_generic_Field(self, name, attrs): + self.data_stack.append(attrs) + + def end_generic_Field(self, name): + #self.data_stack = self.data_stack[:-1] + self.accumulating_chars = 0 start_IntegerField = start_BooleanField = start_StringField = start_generic_Field start_TextField = start_ImageField = start_ForumFileField = start_generic_Field @@ -310,13 +322,9 @@ def end_TextField(self, name): ds = self.data_stack - root = self.root_stack[-1] attrs = ds[-2] - field = root.getField(str(attrs['id'])) - - mutator = field.getMutator(root) - + print name, type(attrs), attrs if attrs.has_key('mimetype'): mimetype = attrs['mimetype'] if type(mimetype) == type([]): @@ -329,18 +337,11 @@ mimetype = 'text/plain' mimetype = str(mimetype) - - if mutator: - mutator(ds[-1], mimetype=mimetype) - else: - field.set(root, ds[-1], mimetype=mimetype) else: - if mutator: - mutator(ds[-1]) - else: - field.set(root, ds[-1]) - - self.data_stack = ds[:-2] + mimetype = 'text/plain' + + ds[-1] = (ds[-1], {'mimetype': mimetype}) + self.accumulating_chars = 0 def end_ImageField(self, name): ds = self.data_stack @@ -387,11 +388,13 @@ pass self.data_stack = ds[:-2] + def um_end_string(self, name): ds = self.data_stack ds[-1] = self.encode(u''.join(ds[-1])) self.accumulating_chars = 0 + def start_User(self, name, attrs): member = self.portal.portal_membership.getMemberById(str(attrs['id'])) |