work in progress: rule handling
git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@2146 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
parent
f9e8a3f45c
commit
81b8564278
4 changed files with 46 additions and 22 deletions
|
@ -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))
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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.
|
||||
"""
|
||||
|
|
Loading…
Add table
Reference in a new issue