[Erp5-report] r29545 - /erp5/trunk/products/ERP5Type/Interactor.py
nobody at svn.erp5.org
nobody at svn.erp5.org
Fri Oct 9 17:11:28 CEST 2009
Author: jp
Date: Fri Oct 9 17:11:27 2009
New Revision: 29545
URL: http://svn.erp5.org?rev=29545&view=rev
Log:
Refactored version of Interactor with compoenent sysytem
Removed:
erp5/trunk/products/ERP5Type/Interactor.py
Removed: erp5/trunk/products/ERP5Type/Interactor.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/Interactor.py?rev=29544&view=auto
==============================================================================
--- erp5/trunk/products/ERP5Type/Interactor.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/Interactor.py (removed)
@@ -1,251 +1,0 @@
-from MethodObject import Method
-from Products.ERP5Type.Base import _aq_reset
-"""
- Current implementation uses callable objects.
- Using decorator would be more modern and consistent with
- recent evolution of python. But we have 2.3 ERP5 users
- so we should, at least, provide both implementations.
-
- Code structure should be changed so that Interactors
- because a new "type" of ERP5 class such Document
- with a modular plugin structure.
-
- TODO: multiple instances of interactors could
- use different parameters. This way, interactions
- can be defined on "instances" or can be
- made generic.
-"""
-
-
-class InteractorMethodCall:
- """
- Method's wrapper used to keep arguments passed, in order to retrieve them
- from before and after scripts if needed.
- """
-
- def __init__(self, method, instance, *args, **kw):
- self.instance = instance
- self.args = args
- self.kw = kw
- self.method = method
-
- def __call__(self):
- # We use self.__dict__['instance'] to prevent inserting the
- # InteractorMethodCall instance in the acquisition chain
- # which has some side effects
- return self.method(self.__dict__['instance'], *self.args, **self.kw)
-
-class InteractorMethod(Method):
-
- def __init__(self, method):
- self.after_action_list = []
- self.before_action_list = []
- self.method = method
- self.func_code = method.func_code
- self.func_defaults = method.func_defaults
- self.__name__ = method.__name__
-
- def registerBeforeAction(self, action, args, kw):
- self.before_action_list.append((action, args, kw))
-
- def registerAfterAction(self, action, args, kw):
- self.after_action_list.append((action, args, kw))
-
- def __call__(self, instance, *args, **kw):
- method_call_object = InteractorMethodCall(self.method, instance, *args, **kw)
- for action, args, kw in self.before_action_list:
- action(method_call_object, *args, **kw)
- result = method_call_object()
- for action, args, kw in self.after_action_list:
- action(method_call_object, *args, **kw)
- return result
-
-class InteractorSource:
-
- def __init__(self, method):
- """
- Register method
- """
- self.method = method
-
- def doAfter(self, action, *args, **kw):
- """
- """
- im_class = self.method.im_class
- if not isinstance(self.method, InteractorMethod):
- # Turn this into an InteractorMethod
- interactor_method = InteractorMethod(self.method)
- setattr(im_class, self.method.__name__, interactor_method)
- self.method = interactor_method
- # Register the action
- self.method.registerAfterAction(action, args, kw)
-
-class Interactor:
- def install(self):
- raise NotImplementedError
-
- def uninstall(self):
- raise NotImplementedError
-
- # Interaction implementation
- def on(self, method):
- """
- Parameters may hold predicates ?
- no need - use InteractorMethodCall and decide on action
- """
- return InteractorSource(method)
-
-
-class AqDynamicInteractor(Interactor):
- """This base interactor will reset _aq_dynamic method cache, to regenerate
- new accessors.
- """
- def resetAqDynamic(self, *args, **kw):
- """
- Reset _aq_dynamic
- """
- _aq_reset()
-
-
-class WorkflowToolInteractor(AqDynamicInteractor):
- """This interactor reset aq_dynamic method cache whenever workflow
- associations are changed.
- """
- def install(self):
- from Products.CMFCore.WorkflowTool import WorkflowTool
- self.on(WorkflowTool.manage_changeWorkflows).doAfter(self.resetAqDynamic)
-
-
-class DCWorkflowInteractor(AqDynamicInteractor):
- """This interactor reset aq_dynamic method cache whenever a workflow
- definition changes
- """
- def install(self):
- from Products.DCWorkflow.Transitions import Transitions
- self.on(Transitions.addTransition).doAfter(self.resetAqDynamic)
- self.on(Transitions.deleteTransitions).doAfter(self.resetAqDynamic)
-
- from Products.DCWorkflow.Transitions import TransitionDefinition
- self.on(TransitionDefinition.setProperties).doAfter(self.resetAqDynamic)
-
- from Products.DCWorkflow.Variables import Variables
- self.on(Variables.setStateVar).doAfter(self.resetAqDynamic)
-
-## #
-## # Experimental part
-## #
-## class InteractionWorkflowAqDynamicInteractor(AqDynamicInteractor):
-
-## def install(self):
-## """
-## Installs interactions
-## """
-## from Products.ERP5.Interaction import InteractionDefinition
-## self.on(InteractionDefinition.setProperties).doAfter(self.resetAqDynamic, 1, 2, toto="foo")
-## self.on(InteractionDefinition.addVariable).doAfter(self.resetAqDynamic, 1, 2, toto="foo")
-
-## def uninstall(self):
-## """
-## Uninstall interactions
-## """
-
-## # Interaction example
-
-
-## class TypeInteractorExample(Interactor):
-## def __init__(self, portal_type):
-## self.portal_type = portal_type
-
-## def install(self):
-## from Products.CMFCore.TypesTool import TypesTool
-## self.on(TypesTool.manage_edit).doAfter(self.doSomething)
-
-## def doSomething(self, method_call_object):
-## if self.portal_type == method_call_object.instance.portal_type:
-## pass
-## # do whatever
-
-
-## class InteractorOfInteractor(Interactor):
-
-## def __init__(self, interactor):
-## self.interactor = interactor
-
-## def install(self):
-## self.on(interactor.doSomething).doAfter(self.doSomething)
-
-## def doSomething(self, method_call_object):
-## pass
-
-## test = AqDynamicInteractor()
-## test.install()
-
-
-class FieldValueInteractor(Interactor):
-
- def install(self):
- """
- Installs interactions
- """
- from Products.Formulator.Field import ZMIField
- from Products.ERP5Form.ProxyField import ProxyField
- from Products.Formulator.Form import ZMIForm
- self.on(ZMIField.manage_edit).doAfter(self.purgeFieldValueCache)
- self.on(ZMIField.manage_edit_xmlrpc).doAfter(self.purgeFieldValueCache)
- self.on(ZMIField.manage_tales).doAfter(self.purgeFieldValueCache)
- self.on(ZMIField.manage_tales_xmlrpc).doAfter(self.purgeFieldValueCache)
- self.on(ProxyField.manage_edit).doAfter(self.purgeFieldValueCache)
- self.on(ProxyField.manage_edit_target).doAfter(self.purgeFieldValueCache)
- self.on(ProxyField.manage_tales).doAfter(self.purgeFieldValueCache)
- self.on(ZMIForm.manage_renameObject).doAfter(self.purgeFieldValueCache)
-
- def uninstall(self):
- """
- Uninstall interactions
- """
-
- def purgeFieldValueCache(self, method_call_object):
- """
- """
- from Products.ERP5Form import Form, ProxyField
- Form.purgeFieldValueCache()
- ProxyField.purgeFieldValueCache()
-
-class TypeInteractorExample(Interactor):
- def __init__(self, portal_type):
- self.portal_type = portal_type
-
- def install(self):
- from Products.CMFCore.TypesTool import TypesTool
- self.on(TypesTool.manage_edit).doAfter(self.doSomething)
-
- def doSomething(self, method_call_object):
- if self.portal_type == method_call_object.instance.portal_type:
- pass
- # do whatever
-
-class InteractorOfInteractor(Interactor):
-
- def __init__(self, interactor):
- self.interactor = interactor
-
- def install(self):
- self.on(Interactor.doSomething).doAfter(self.doSomething)
-
- def doSomething(self, method_call_object):
- pass
-
-
-#interactor_of_interactor = InteractorOfInteractor(test)
-#interactor_of_interactor.install()
-
-
-# Install some interactors:
-
-WorkflowToolInteractor().install()
-DCWorkflowInteractor().install()
-
-# This is used in ERP5Form and install method is called in ERP5Form
-# Don't install this interactor here.
-field_value_interactor = FieldValueInteractor()
-
More information about the Erp5-report
mailing list