From: Tomek <tom...@us...> - 2005-02-25 22:04:10
|
Update of /cvsroot/collective/CMFEditions In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28251 Modified Files: ModifierRegistryTool.py Modifiers.py StandardModifiers.py Log Message: -We splitted IModifier into three interfaces: IAttributeModifier, ICloneModifier and ISaveRetrieveModifier. -small rearranges of the unit tests. Index: StandardModifiers.py =================================================================== RCS file: /cvsroot/collective/CMFEditions/StandardModifiers.py,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- StandardModifiers.py 23 Feb 2005 00:29:01 -0000 1.2 +++ StandardModifiers.py 25 Feb 2005 22:03:59 -0000 1.3 @@ -31,7 +31,9 @@ from Products.CMFCore.utils import getToolByName from Products.CMFCore.CMFCorePermissions import ManagePortal -from Products.CMFEditions.interfaces.IModifier import IModifier +from Products.CMFEditions.interfaces.IModifier import IAttributeModifier +from Products.CMFEditions.interfaces.IModifier import ICloneModifier +from Products.CMFEditions.interfaces.IModifier import ISaveRetrieveModifier from Products.CMFEditions.interfaces.IModifier import IConditionalTalesModifier from Products.CMFEditions.Modifiers import ConditionalModifier from Products.CMFEditions.Modifiers import ConditionalTalesModifier @@ -113,38 +115,10 @@ # Standard modifier implementation #---------------------------------------------------------------------- -class BaseModifier(Persistent): - """A Modifier that does nothing. - - Use this as base class. - """ - __implements__ = (IModifier, ) - - def getReferencedAttributes(self, obj): - # no BLOBs to be passed by reference - return {} - - def getOnCloneModifiers(self, obj): - # nothing to be omited from cloning - return None - - def beforeSaveModifier(self, obj, clone): - # no version aware references - return [], [] - - def afterRetrieveModifier(self, obj, repo_clone, preserve=[]): - # XXX should raise an exception if preserve is not empty. - return [] - - def reattachReferencedAttributes(self, object, referenced_data): - # no BLOBs to be reattached - return - - -class OMBaseModifier(BaseModifier): +class OMBaseModifier: """Base class for ObjectManager modifiers. """ - + def _getOnCloneModifiers(self, obj): """Removes all childrens and returns them as references. """ @@ -158,21 +132,9 @@ result_refs.append(sub) refs[str(id(aq_base(sub)))] = True # use sets python 2.4.x -# print 'refs: %s' % (refs) - - # do not pickle the big blob attributes - base_obj = aq_base(obj) - for attr in self.getReferencedAttributes(obj).keys(): - try: - pyid = id(getattr(base_obj, attr)) - except AttributeError: - pass - else: - refs[pyid] = False def persistent_id(obj): if id(obj) in refs: -# print 'pers:', id(obj) return id(obj) return None @@ -211,6 +173,9 @@ Treats childrens as outside references (the repository layer knows what to do with that fact). """ + + __implements__ = (ICloneModifier, ISaveRetrieveModifier) + def getOnCloneModifiers(self, obj): """Removes all childrens and returns them as references. """ @@ -224,7 +189,10 @@ """ inside_refs = self._beforeSaveModifier(obj, clone) return inside_refs, [] - + + def afterRetrieveModifier(self, obj, repo_clone): + return {} + InitializeClass(OMOutsideChildrensModifier) @@ -234,6 +202,9 @@ Treats childrens as inside references (the repository layer knows what to do with that fact). """ + + __implements__ = (ICloneModifier, ISaveRetrieveModifier) + def getOnCloneModifiers(self, obj): """Removes all childrens and returns them as references. """ @@ -247,17 +218,24 @@ """ inside_refs = self._beforeSaveModifier(obj, clone) return [], inside_refs + + def afterRetrieveModifier(self, obj, repo_clone): + return {} + InitializeClass(OMOutsideChildrensModifier) _marker = [] -class RetainWorkflowStateAndHistory(BaseModifier): +class RetainWorkflowStateAndHistory: """Standard modifier retaining the working copies workflow state Avoids the objects workflow state from beeing retrieved also. """ + def beforeSaveModifier(self, obj, clone): + return [], [] + def afterRetrieveModifier(self, obj, repo_clone, preserve=[]): # replace the workflow stuff of the repository clone by the # one of the working copy or delete it @@ -273,23 +251,22 @@ is not _marker): del repo_clone.workflow_history - return [] + return {} InitializeClass(RetainWorkflowStateAndHistory) -class SaveFileDataInFileTypeByReference(BaseModifier): +class SaveFileDataInFileTypeByReference: """Standard modifier avoiding unnecessary cloning of the file data. Called on 'Portal File' objects. """ - + + __implements__ = IAttributeModifier + def getReferencedAttributes(self, obj): - return {'data': getReferencedAttributes} + return ['data'] - def reattachReferencedAttributes(self, object, referenced_data): - object.data = referenced_data['data'] - InitializeClass(SaveFileDataInFileTypeByReference) Index: ModifierRegistryTool.py =================================================================== RCS file: /cvsroot/collective/CMFEditions/ModifierRegistryTool.py,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- ModifierRegistryTool.py 13 Feb 2005 11:52:58 -0000 1.12 +++ ModifierRegistryTool.py 25 Feb 2005 22:03:59 -0000 1.13 @@ -44,7 +44,9 @@ from Products.CMFEditions.utilities import KwAsAttributes -from Products.CMFEditions.interfaces.IModifier import IModifier +from Products.CMFEditions.interfaces.IModifier import IAttributeModifier +from Products.CMFEditions.interfaces.IModifier import ICloneModifier +from Products.CMFEditions.interfaces.IModifier import ISaveRetrieveModifier from Products.CMFEditions.interfaces.IModifier import IModifierRegistrySet from Products.CMFEditions.interfaces.IModifier import IModifierRegistryQuery from Products.CMFEditions.interfaces.IModifier import IBulkEditableModifierRegistry @@ -61,7 +63,7 @@ __implements__ = ( OrderedFolder.__implements__, # hide underspecified interfaces :-( - IModifier, + IAttributeModifier, ISaveRetrieveModifier, ICloneModifier, IModifierRegistrySet, IModifierRegistryQuery, # IBulkEditableSubscriberRegistry, # not yet implemented @@ -110,7 +112,7 @@ return self.orderedFolderSetObject(id, object, roles=roles, user=user, set_owner=set_owner) - def _collectModifiers(self, obj, reversed=False): + def _collectModifiers(self, obj, interface, reversed=False): """ Returns a list of valid modifiers """ modifier_list = [] @@ -120,7 +122,8 @@ if IConditionalModifier.isImplementedBy(o) \ and o.isApplicable(obj, portal): mod = o.getModifier() - modifier_list.append((id, mod)) + if interface.isImplementedBy(mod): + modifier_list.append((id, mod)) if reversed: modifier_list.reverse() @@ -140,7 +143,7 @@ """ # just loop over all objects implementing the IModifier interface. referenced_data = {} - for id, mod in self._collectModifiers(obj): + for id, mod in self._collectModifiers(obj, IAttributeModifier): # prepend the modifiers id to the attributes name template = '%s/%%s' % id for name, attrs in mod.getReferencedAttributes(obj).items(): @@ -168,7 +171,7 @@ # loop over modifiers in reverse if data_by_modid: - for id, mod in self._collectModifiers(obj, reversed=True): + for id, mod in self._collectModifiers(obj, IAttributeModifier, reversed=True): if id in data_by_modid: mod.reattachReferencedAttributes(obj, data_by_modid[id]) @@ -183,7 +186,7 @@ inside_orefs = [] outside_orefs = [] - for id, m in self._collectModifiers(obj): + for id, m in self._collectModifiers(obj, ICloneModifier): clone_mod = m.getOnCloneModifiers(obj) if clone_mod is not None: pers_id_list.append(clone_mod[0]) @@ -216,7 +219,7 @@ outside_crefs = [] # just loop over all modifiers - for ignored_id, mod in self._collectModifiers(obj): + for ignored_id, mod in self._collectModifiers(obj, ISaveRetrieveModifier): icrefs, ocrefs = mod.beforeSaveModifier(obj, obj_clone) inside_crefs.extend(icrefs) outside_crefs.extend(ocrefs) @@ -239,7 +242,7 @@ preserved[key] = v # just loop over all modifiers in reverse order - for ignored_id, mod in self._collectModifiers(obj, reversed=True): + for ignored_id, mod in self._collectModifiers(obj, ISaveRetrieveModifier, reversed=True): mod.afterRetrieveModifier(obj, repo_clone) return preserved Index: Modifiers.py =================================================================== RCS file: /cvsroot/collective/CMFEditions/Modifiers.py,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- Modifiers.py 7 Feb 2005 22:09:08 -0000 1.1 +++ Modifiers.py 25 Feb 2005 22:03:59 -0000 1.2 @@ -36,7 +36,6 @@ from Products.CMFCore.Expression import Expression from Products.CMFCore.CMFCorePermissions import ManagePortal -from Products.CMFEditions.interfaces.IModifier import IModifier from Products.CMFEditions.interfaces.IModifier import IConditionalTalesModifier from Products.CMFEditions.interfaces.IModifier import IConditionalModifier |