From 81b8564278fc18d026cbb8cddf1914853ace7461 Mon Sep 17 00:00:00 2001 From: helmutm Date: Sun, 4 Nov 2007 08:42:04 +0000 Subject: [PATCH] work in progress: rule handling git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@2146 fd906abe-77d9-0310-91a1-e0d9ade77398 --- composer/rule/README.txt | 6 +++++- composer/rule/base.py | 27 ++++++++++++++++----------- composer/rule/instance.py | 23 +++++++++++++++-------- composer/rule/interfaces.py | 12 ++++++++++-- 4 files changed, 46 insertions(+), 22 deletions(-) diff --git a/composer/rule/README.txt b/composer/rule/README.txt index bb03422..0c54bf0 100644 --- a/composer/rule/README.txt +++ b/composer/rule/README.txt @@ -8,6 +8,9 @@ Rule-based Execution of Actions >>> from cybertools.composer.rule.base import RuleManager, Rule, Action >>> from cybertools.composer.rule.base import EventType, Event + >>> from cybertools.composer.rule.instance import RuleInstance + >>> from cybertools.composer.rule.interfaces import IRuleInstance + >>> component.provideAdapter(RuleInstance, provides=IRuleInstance) >>> from cybertools.composer.rule.base import ActionHandler >>> component.provideAdapter(ActionHandler, name='message') >>> component.provideAdapter(ActionHandler, name='sendmail') @@ -26,7 +29,8 @@ Rule-based Execution of Actions >>> manager.handleEvent(Event(loginEvent)) - >>> client = object() + >>> from cybertools.composer.schema.client import Client + >>> client = Client() >>> manager.handleEvent(Event(checkoutEvent, client)) diff --git a/composer/rule/base.py b/composer/rule/base.py index 4825ce9..eb0be83 100644 --- a/composer/rule/base.py +++ b/composer/rule/base.py @@ -30,6 +30,7 @@ from cybertools.composer.base import Component, Element, Compound from cybertools.composer.base import Template from cybertools.composer.interfaces import IInstance from cybertools.composer.rule.interfaces import IRuleManager, IRule +from cybertools.composer.rule.interfaces import IRuleInstance from cybertools.composer.rule.interfaces import IEvent, ICondition from cybertools.composer.rule.interfaces import IAction, IActionHandler from cybertools.util.jeep import Jeep @@ -58,15 +59,19 @@ class RuleManager(object): def handleEvent(self, event): rules = self.getRulesForEvent(event) for r in rules: - for c in r.conditions: - cond = component.getAdapter(r, ICondition, name=c) - if not cond(event): - continue - data = None - for action in r.actions: - handler = component.getAdapter(action, IActionHandler, - name=action.handlerName) - data = handler(data, event) + ri = IRuleInstance(event.context) + ri.template = r + ri.event = event + ri.applyTemplate() + #for c in r.conditions: + # cond = component.getAdapter(r, ICondition, name=c) + # if not cond(event): + # continue + #data = None + #for action in r.actions: + # handler = component.getAdapter(action, IActionHandler, + # name=action.handlerName) + # data = handler(data, event) class Rule(Template): @@ -123,7 +128,7 @@ class Event(object): class Condition(object): implements(ICondition) - adapts(IRule) + adapts(IRuleInstance) def __init__(self, context): self.context = context @@ -156,7 +161,7 @@ class Action(Component): class ActionHandler(object): implements(IActionHandler) - adapts(IAction) + adapts(IRuleInstance) def __init__(self, context): self.context = context diff --git a/composer/rule/instance.py b/composer/rule/instance.py index 19ae24c..194e2d5 100644 --- a/composer/rule/instance.py +++ b/composer/rule/instance.py @@ -22,22 +22,29 @@ Rule instance and related classes. $Id$ """ -from string import Template from zope import component -from zope.interface import implements +from zope.component import adapts +from zope.interface import Interface, implements from cybertools.composer.instance import Instance -from cybertools.composer.interfaces import IInstance +from cybertools.composer.rule.interfaces import IRuleInstance, IActionHandler class RuleInstance(Instance): - template = client = None + implements(IRuleInstance) + adapts(Interface) - def __init__(self, client, template): - self.client = client - self.template = template + event = None def applyTemplate(self, **kw): - pass + for c in self.template.conditions: + cond = component.getAdapter(self, ICondition, name=c) + if not cond(): + continue + data = None + for action in self.template.actions: + handler = component.getAdapter(self, IActionHandler, + name=action.handlerName) + data = handler(data, self.event) diff --git a/composer/rule/interfaces.py b/composer/rule/interfaces.py index 62c62a5..ea89012 100644 --- a/composer/rule/interfaces.py +++ b/composer/rule/interfaces.py @@ -26,7 +26,7 @@ from zope.interface import Interface, Attribute from zope.i18nmessageid import MessageFactory from zope import schema -from cybertools.composer.interfaces import ITemplate, IComponent +from cybertools.composer.interfaces import ITemplate, IComponent, IInstance _ = MessageFactory('zope') @@ -83,6 +83,14 @@ class IRule(ITemplate): actions = Attribute('Sequence of actions to be carried out by this rule.') +class IRuleInstance(IInstance): + """ A rule instance (typically used as an adapter) acts on some context + (client) object for executing the rule's actions. + """ + + event = Attribute('The event the rule instance was created for.') + + class IEvent(Interface): name = Attribute('The name by which the event will be identified.') @@ -92,7 +100,7 @@ class IEvent(Interface): class ICondition(Interface): - def __call__(context, event, params): + def __call__(context, params): """ Should return True if the condition should be fulfilled; will allow the rule to call its actions. """