|
/
Zope
/
gocept svn checkins
/
Archive
/
2005
/
2005-06
/
SVN: r3079 - in PloneImageCompetition/trunk: . tests
[
SVN: r3058 - CMFLinkChecker/trunk / Christian ... ]
[
SVN: r3084 - LeuBsm/trunk/skins/leu_templates / ... ]
SVN: r3079 - in PloneImageCompetition/trunk: . tests
Daniel Havlik <dh(at)gocept.com> |
2005-06-23 10:48:42 |
[ FULL ]
|
Author: nilo
Date: Thu Jun 23 10:44:08 2005
New Revision: 3079
Modified:
PloneImageCompetition/trunk/PCImage.py
PloneImageCompetition/trunk/tests/test_pcimage.py
Log:
fixed getIcon to work with newer plone versions
Modified: PloneImageCompetition/trunk/PCImage.py
==============================================================================
--- PloneImageCompetition/trunk/PCImage.py (original)
+++ PloneImageCompetition/trunk/PCImage.py Thu Jun 23 10:44:08 2005
(at)(at) -2,7 +2,7 (at)(at)
from AccessControl import ClassSecurityInfo
from Products.CMFCore import CMFCorePermissions
-#from Products.CMFCore.utils import getToolByName
+from Products.CMFCore.utils import getToolByName
from Products.Archetypes import public as atapi
(at)(at) -165,9 +165,13 (at)(at)
"""for backward compatibility ..."""
return self.Title()
- def getIcon(self):
- return '%s/image_thumb' % self.absolute_url()
-
+ def getIcon(self, relative=0):
+ url = '%s/image_thumb' % self.absolute_url()
+ if relative:
+ portal_url = getToolByName(self, 'portal_url')()
+ url = url[len(portal_url) + 1:]
+ return url
+
actions = (
{
'id': 'view',
Modified: PloneImageCompetition/trunk/tests/test_pcimage.py
==============================================================================
--- PloneImageCompetition/trunk/tests/test_pcimage.py (original)
+++ PloneImageCompetition/trunk/tests/test_pcimage.py Thu Jun 23 10:44:08 2005
(at)(at) -1,7 +1,7 (at)(at)
# -*- coding: latin1 -*-
# Copyright (c) 2004 gocept gmbh & co. kg
# See also LICENSE.txt
-# $Id: test_pcimage.py,v 1.2 2004/11/25 14:35:23 nilo Exp $
+# $Id$
import os, sys
(at)(at) -65,6 +65,20 (at)(at)
for obid in votes.keys():
self.assertEqual(getattr(i1,obid).getVotes(), votes[obid])
+ def test_getIcon(self):
+ portal = self.getPortal()
+ portal.invokeFactory('ImageCompetitionContainer', 'i1')
+ i1 = portal.i1
+ i1.invokeFactory('PCImage', 'vc1')
+ image = i1.vc1
+ exp = image.absolute_url() + '/image_thumb'
+ self.assertEqual(exp, image.getIcon())
+ exp = 'i1/vc1/image_thumb'
+ self.assertEqual(exp, image.getIcon(1))
+
+
+
+
def test_suite():
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(PCImageTest))
|
SVN: r3080 - in AlphaFlow/trunk: . activities tests
Michael Howitz <mh(at)gocept.com> |
2005-06-23 11:22:34 |
[ FULL ]
|
Author: mac
Date: Thu Jun 23 11:17:38 2005
New Revision: 3080
Modified:
AlphaFlow/trunk/activities/alarm.py
AlphaFlow/trunk/activities/condition.py
AlphaFlow/trunk/activities/configuration.py
AlphaFlow/trunk/activities/dcworkflow.py
AlphaFlow/trunk/activities/decision.py
AlphaFlow/trunk/activities/expression.py
AlphaFlow/trunk/activities/gates.py
AlphaFlow/trunk/activities/interfaces.py
AlphaFlow/trunk/activities/notify.py
AlphaFlow/trunk/activities/ntask.py
AlphaFlow/trunk/activities/permission.py
AlphaFlow/trunk/activities/recursion.py
AlphaFlow/trunk/activities/review.py
AlphaFlow/trunk/activities/routing.py
AlphaFlow/trunk/activities/task.py
AlphaFlow/trunk/activity.py
AlphaFlow/trunk/interfaces.py
AlphaFlow/trunk/process.py
AlphaFlow/trunk/tests/test_definition.py
AlphaFlow/trunk/workitem.py
Log:
added ActivityAttribute which describes an attribute of an activity
the instances thereof should be used by import and export later on
Modified: AlphaFlow/trunk/activities/alarm.py
==============================================================================
--- AlphaFlow/trunk/activities/alarm.py (original)
+++ AlphaFlow/trunk/activities/alarm.py Thu Jun 23 11:17:38 2005
(at)(at) -16,23 +16,19 (at)(at)
class AlarmActivity(BaseTalesActivity):
+ __implements__ = BaseTalesActivity.__implements__ + (IAlarmActivity, )
meta_type = "AlphaFlow Alarm Activity"
activity_type = "alarm"
icon = "alarm"
- __implements__ = BaseTalesActivity.__implements__ + \
- (IAlarmActivity, )
-
- error_string = "Tal expression required which "\
+ error_string = "TALES expression required which " \
"should return a DateTime object, in %r."
class AlarmWorkItem(BaseTalesWorkItem):
+ __implements__ = BaseTalesWorkItem.__implements__ + (IAlarmWorkItem, )
activity_type = "alarm"
-
- __implements__ = BaseTalesWorkItem.__implements__ + \
- (IAlarmWorkItem, )
def trigger_workitem(self):
"""triggers a workitem if the deadline is exceeded"""
Modified: AlphaFlow/trunk/activities/condition.py
==============================================================================
--- AlphaFlow/trunk/activities/condition.py (original)
+++ AlphaFlow/trunk/activities/condition.py Thu Jun 23 11:17:38 2005
(at)(at) -11,30 +11,41 (at)(at)
# Zope imports
from Products.PageTemplates.Expressions import getEngine
from AccessControl import ClassSecurityInfo
-from Globals import InitializeClass
# Sibling imports
from Products.AlphaFlow.workitem import registerWorkItem, BaseTalesWorkItem
-from Products.AlphaFlow.activity import registerActivity, BaseTalesActivity
+from Products.AlphaFlow.activity import \
+ registerActivity, BaseTalesActivity, ActivityAttribute
from Products.AlphaFlow.interfaces import IConditionActivity,
IConditionWorkItem
from Products.AlphaFlow import utils, config
class ConditionActivity(BaseTalesActivity):
- meta_type = "AlphaFlow Condition Activity"
- security = ClassSecurityInfo()
-
__implements__ = BaseTalesActivity.__implements__ + \
(IConditionActivity, )
+ security = ClassSecurityInfo()
+ meta_type = "AlphaFlow Condition Activity"
activity_type = "condition"
+
+ attributes = BaseTalesActivity.attributes + (
+ ActivityAttribute('continue_activity', 'continue_activity', (),
+ 'Activities that can follow this automatic
activity.'
+ ), # XXX required
+ ActivityAttribute('expression', 'expression', '',
+ 'TALES expression which returns list of activities '
+ 'for continuation (must be in continue_activity)!',
+ importHandler=None, # done by BaseTalesActivity
+ exportHandler=None),
+ )
+
error_string = "TALES expression required which must return a list of " \
"WorkItem activity_types (in %r)"
- continue_activity = ()
- security.declareProtected(config.MANAGE_WORKFLOW,
"graphGetPossibleChildren")
+ security.declareProtected(config.MANAGE_WORKFLOW,
+ "graphGetPossibleChildren")
def graphGetPossibleChildren(self):
"""Return a list of possible following activities. (List of ids)"""
acts = []
(at)(at) -51,8 +62,6 (at)(at)
raise ConfigurationError, self.error_string % self.activity_type
self.continue_activity =
utils.flexSplit(node.getAttribute("continue_activity").encode('ascii'))
-InitializeClass(ConditionActivity)
-
(at)(at) -90,10 +99,6 (at)(at)
return False
return True
-InitializeClass(ConditionWorkItem)
-
-
-
# register the stuff
registerActivity(ConditionActivity)
Modified: AlphaFlow/trunk/activities/configuration.py
==============================================================================
--- AlphaFlow/trunk/activities/configuration.py (original)
+++ AlphaFlow/trunk/activities/configuration.py Thu Jun 23 11:17:38 2005
(at)(at) -16,7 +16,7 (at)(at)
from Products.AlphaFlow.workitem import \
registerWorkItem, BaseAssignableWorkItem, Group
from Products.AlphaFlow.activity import \
- registerActivity, BaseAssignableActivity
+ registerActivity, BaseAssignableActivity, ActivityAttribute
from Products.AlphaFlow import utils, config
from Products.AlphaFlow.exception import ConfigurationError
from Products.AlphaFlow.action import Action
(at)(at) -29,16 +29,25 (at)(at)
(IConfigurationActivity, )
meta_type = "AlphaFlow Configuration Activity"
-
activity_type = "configuration"
icon = "configuration"
- continue_activity = ()
- configures = ()
+ attributes = BaseAssignableActivity.attributes + (
+ ActivityAttribute('viewUrlExpression', 'view_url_expr',
+ 'string:${content/absolute_url}/af_edit_workitem?'
+ 'workitem=${workitem/getId}&action=configure',
+ '(TALES expression) URL to "view" a workitem, '
+ 'e.g. "Edit document" points to the edit-tab'),
+ ActivityAttribute('continue_activity', 'continue_activity', (),
+ 'Activity to start after completion.'),
+ ActivityAttribute('configures', '', (),
+ 'Other activities which are configured by this '
+ 'activity or None as marker for all activities.',
+ importHandler='attrImport_configure',
+ exportHandler='attrExport_configure'),
+ )
- viewUrlExpression = 'string:${content/absolute_url}/af_edit_workitem?' \
- 'workitem=${workitem/getId}&action=configure'
-
+
def configureFromDOMNode(self, node):
"""Configures the activity from a given DOM-Node"""
ConfigurationActivity.inheritedAttribute(
Modified: AlphaFlow/trunk/activities/dcworkflow.py
==============================================================================
--- AlphaFlow/trunk/activities/dcworkflow.py (original)
+++ AlphaFlow/trunk/activities/dcworkflow.py Thu Jun 23 11:17:38 2005
(at)(at) -12,20 +12,25 (at)(at)
# Sibling imports
from Products.AlphaFlow.workitem import registerWorkItem,
BaseAutomaticWorkItem
-from Products.AlphaFlow.activity import registerActivity,
BaseAutomaticActivity
+from Products.AlphaFlow.activity import \
+ registerActivity, BaseAutomaticActivity, ActivityAttribute
from Products.AlphaFlow.exception import ConfigurationError
from Products.AlphaFlow.interfaces import IDCWorkFlowActivity
class DCWorkFlowActivity(BaseAutomaticActivity):
- __implements__ = BaseAutomaticActivity.__implements__ +
(IDCWorkFlowActivity,)
+ __implements__ = BaseAutomaticActivity.__implements__ + (
+ IDCWorkFlowActivity,)
meta_type = "AlphaFlow DCWorkFlow Activity"
activity_type = "dcworkflow"
icon = "dcworkflow"
- status = ""
+ attributes = BaseAutomaticActivity.attributes + (
+ ActivityAttribute('status', 'status', '',
+ 'Status which is set as DCWorkFlow status.'),
+ )
_properties = BaseAutomaticActivity._properties + \
({'id': 'status', 'type': 'text', 'mode': 'w'},
Modified: AlphaFlow/trunk/activities/decision.py
==============================================================================
--- AlphaFlow/trunk/activities/decision.py (original)
+++ AlphaFlow/trunk/activities/decision.py Thu Jun 23 11:17:38 2005
(at)(at) -15,7 +15,7 (at)(at)
from Products.AlphaFlow.workitem import \
BaseAssignableWorkItem, registerWorkItem
from Products.AlphaFlow.activity import \
- BaseAssignableActivity, registerActivity
+ BaseAssignableActivity, registerActivity, ActivityAttribute
from Products.AlphaFlow import config, utils
from Products.AlphaFlow.action import Action
from Products.AlphaFlow.exception import ConfigurationError
(at)(at) -28,16 +28,23 (at)(at)
decision_modus says how many 'yes' are needed for a 'yes' result.
"""
- __implements__ = (IDecisionActivity,) +
BaseAssignableActivity.__implements__
+ __implements__ = (IDecisionActivity,) + \
+ BaseAssignableActivity.__implements__
meta_type = "AlphaFlow Decision Activity"
activity_type = "decision"
icon = "decision"
- decision_notice = ""
- reject_activity = ()
- accept_activity = ()
- decision_modus = ""
+ attributes = BaseAssignableActivity.attributes + (
+ ActivityAttribute('decision_notice', 'decision_notice', '',
+ 'Describing the task for the decision.'),
+ ActivityAttribute('decision_modus', 'decision_modus', '',
+ 'One of ["first_yes", "all_yes"]'),
+ ActivityAttribute('reject_activity', 'reject_activity', (),
+ 'Activity if result is "no".'),
+ ActivityAttribute('accept_activity', 'accept_activity', (),
+ 'Activity if result is "yes".'),
+ )
known_decision_modi = ['first_yes', 'all_yes']
(at)(at) -110,12 +117,11 (at)(at)
class DecisionWorkItem(BaseAssignableWorkItem):
- __implements__ = (IDecisionWorkItem,) +
BaseAssignableWorkItem.__implements__
+ __implements__ = (IDecisionWorkItem,) + \
+ BaseAssignableWorkItem.__implements__
activity_type = "decision"
-
security = ClassSecurityInfo()
-
decisions = None
def __init__(self, *args, **kw):
(at)(at) -142,8 +148,8 (at)(at)
return actions
- #################
- # IReviewWorkItem
+ ###################
+ # IDecisionWorkItem
security.declareProtected(config.HANDLE_WORKITEM, "reject")
def reject(self, REQUEST=None):
Modified: AlphaFlow/trunk/activities/expression.py
==============================================================================
--- AlphaFlow/trunk/activities/expression.py (original)
+++ AlphaFlow/trunk/activities/expression.py Thu Jun 23 11:17:38 2005
(at)(at) -21,21 +21,27 (at)(at)
# Sibling imports
from Products.AlphaFlow.workitem import registerWorkItem,
BaseAutomaticWorkItem
-from Products.AlphaFlow.activity import registerActivity,
BaseAutomaticActivity
+from Products.AlphaFlow.activity import \
+ registerActivity, BaseAutomaticActivity, ActivityAttribute
from Products.AlphaFlow.exception import ConfigurationError
from Products.AlphaFlow.interfaces import IExpressionActivity
from Products.AlphaFlow.interfaces import IExpressionWorkItem
class ExpressionActivity(BaseAutomaticActivity):
+ __implements__ = BaseAutomaticActivity.__implements__ + \
+ (IExpressionActivity, )
+
meta_type = "AlphaFlow Expression Activity"
activity_type = "expression"
icon = "expression"
- __implements__ = BaseAutomaticActivity.__implements__ + \
- (IExpressionActivity, )
- expression = ""
-
+ # XXX change this on migration to BaseTalesActivity as base class
+ attributes = BaseAutomaticActivity.attributes + (
+ ActivityAttribute('expression', 'expression', '',
+ 'Expression to be called.'),
+ )
+
_properties = BaseAutomaticActivity._properties + \
({'id': 'expression', 'type': 'string', 'mode': 'w'},
)
Modified: AlphaFlow/trunk/activities/gates.py
==============================================================================
--- AlphaFlow/trunk/activities/gates.py (original)
+++ AlphaFlow/trunk/activities/gates.py Thu Jun 23 11:17:38 2005
(at)(at) -6,7 +6,8 (at)(at)
# Sibling imports
from Products.AlphaFlow.workitem import registerWorkItem, BaseWorkItem
-from Products.AlphaFlow.activity import registerActivity,
BaseAutomaticActivity
+from Products.AlphaFlow.activity import \
+ registerActivity, BaseAutomaticActivity, ActivityAttribute
from Products.AlphaFlow.exception import ConfigurationError
from Products.AlphaFlow.interfaces import IDaemonActivity, IGateActivity
(at)(at) -15,12 +16,14 (at)(at)
__implements__ = BaseAutomaticActivity.__implements__ + (IDaemonActivity,
IGateActivity)
-
meta_type = "AlphaFlow Gate Activity"
activity_type = "gate"
icon = "gate"
- mode = ""
+ attributes = BaseAutomaticActivity.attributes + (
+ ActivityAttribute('mode', 'mode', '',
+ 'Mode the gate works, values see self.mode_types'),
+ )
mode_types = ('multi-merge', 'discriminate', 'synchronizing-merge')
Modified: AlphaFlow/trunk/activities/interfaces.py
==============================================================================
--- AlphaFlow/trunk/activities/interfaces.py (original)
+++ AlphaFlow/trunk/activities/interfaces.py Thu Jun 23 11:17:38 2005
(at)(at) -13,9 +13,7 (at)(at)
class ITaskActivity(IActivity):
-
- completion_activity = Attribute("Activity to start after"
- "completion")
+ """Task which is to be done by assignee."""
class ITaskWorkItem(IAssignableWorkItem):
(at)(at) -27,8 +25,7 (at)(at)
class INTaskActivity(IActivity):
-
- exits = Attribute("A list of IExit objects")
+ """Generalized task (task + decision about continuation)"""
class INTaskWorkItem(IAssignableWorkItem):
(at)(at) -40,9 +37,6 (at)(at)
exit ... one of the exit ids
"""
-
-
-
class IDecisionActivity(IAssignableActivity):
"""Decide to accept or reject.
(at)(at) -50,11 +44,6 (at)(at)
decision_modus says how many 'yes' are needed for a 'yes' result.
"""
- decision_notice = Attribute("Describing the task for the decision.")
- reject_activity = Attribute("Activity if result is 'no'")
- accept_activity = Attribute("Activity if result is 'yes'")
- decision_modus = Attribute("['first_yes', 'all_yes']")
-
class IDecisionWorkItem(IAssignableWorkItem):
"""WorkItem for DecisionActivity."""
(at)(at) -70,9 +59,6 (at)(at)
class IPermissionActivity(IActivity):
"""Modifies the permission configuration of the associated object."""
- permissions = Attribute("tuple of IPermissionSetting")
- continue_activity = Attribute("Activities to trigger after permission"
- " change")
def setPermissions(permission_setting):
"""set the permissions to set
(at)(at) -107,10 +93,6 (at)(at)
"""Sends an email to certain interested users about activities in
this workflow."""
- template = Attribute("ID of a DTML-Method-Object being available from
portal root.")
- recipient = Attribute("One of ['owner', 'assignee'] who will get the
email.")
- mailSubject = Attribute("Static subject line for the mails sent.")
-
def getRecipientModes():
"""Return list of IEMailRecipientMode instances."""
(at)(at) -147,16 +129,11 (at)(at)
class IConditionActivity(ITalesActivity):
"""Gets a TALES-expression which returns a list of activity ids (defined
in the current workflow) which get generated as WorkItems.
-
- Does not evaluate the continue_activity!
"""
class IConditionWorkItem(ITalesWorkItem):
- """condition workitem
-
- Does not evaluate the continue_activity!
- """
+ """condition workitem"""
class IRoutingActivity(IActivity):
"""Routing activity
(at)(at) -201,10 +178,6 (at)(at)
# XXX deprecated
- review_notice = Attribute("Describing the review role")
- reject_activity = Attribute("Activity if one votes 'no'")
- accept_activity = Attribute("Activity if all vote 'yes'")
-
class IReviewWorkItem(IAssignableWorkItem):
Modified: AlphaFlow/trunk/activities/notify.py
==============================================================================
--- AlphaFlow/trunk/activities/notify.py (original)
+++ AlphaFlow/trunk/activities/notify.py Thu Jun 23 11:17:38 2005
(at)(at) -20,7 +20,8 (at)(at)
from Products.AlphaFlow.utils import unique, flexSplit, \
listMembersWithRolesAndLocalRoles
from Products.AlphaFlow.workitem import registerWorkItem,
BaseAutomaticWorkItem
-from Products.AlphaFlow.activity import registerActivity,
BaseAutomaticActivity
+from Products.AlphaFlow.activity import \
+ registerActivity, BaseAutomaticActivity, ActivityAttribute
from Products.AlphaFlow.exception import ConfigurationError
from Products.AlphaFlow.interfaces import \
IEMailActivity, IEMailWorkItem, IEMailRecipientMode
(at)(at) -29,18 +30,30 (at)(at)
class EMailActivity(BaseAutomaticActivity):
- meta_type = "AlphaFlow EMail Activity"
- activity_type = "email"
- icon = "email"
-
__implements__ = BaseAutomaticActivity.__implements__ + \
(IEMailActivity, )
- possible_recipients = ['owner', 'assignee']
+ meta_type = "AlphaFlow EMail Activity"
+ activity_type = "email"
+ icon = "email"
- template = ''
- recipient = 'assignee'
- mailSubject = 'AlphaFlow notification message'
+ attributes = BaseAutomaticActivity.attributes + (
+ ActivityAttribute('template', 'template', '',
+ 'ID of a DTML-Method-Object being available from '
+ 'portal root.'),
+ ActivityAttribute('mailSubject', 'mailSubject',
+ 'AlphaFlow notification message',
+ 'Static subject line for the mails sent.'),
+ ActivityAttribute('recipient', '', 'next_assignees',
+ 'One of ["owner", "next_assignees", "actual_role"] '
+ 'who will get the email.',
+ importHandler="attrImport_email",
+ exportHandler="attrExport_email"),
+ )
+
+ # XXX this is error prone because on new recipent_mode this gets forgotten
+ # XXX to update.
+ possible_recipients = ['owner', 'next_assignees', 'actual_role']
_properties = BaseAutomaticActivity._properties + \
({'id': 'template', 'type': 'string', 'mode': 'w',},
Modified: AlphaFlow/trunk/activities/ntask.py
==============================================================================
--- AlphaFlow/trunk/activities/ntask.py (original)
+++ AlphaFlow/trunk/activities/ntask.py Thu Jun 23 11:17:38 2005
(at)(at) -16,7 +16,7 (at)(at)
from Products.AlphaFlow.workitem import \
registerWorkItem, BaseAssignableWorkItem
from Products.AlphaFlow.activity import \
- registerActivity, BaseAssignableActivity
+ registerActivity, BaseAssignableActivity, ActivityAttribute
from Products.AlphaFlow import config, utils
from Products.AlphaFlow.exception import ConfigurationError
from Products.AlphaFlow.action import Action
(at)(at) -38,10 +38,15 (at)(at)
__implements__ = BaseAssignableActivity.__implements__ + (INTaskActivity,
)
meta_type = "AlphaFlow NTask Activity"
-
activity_type = "ntask"
icon = "ntask"
- exits = ()
+
+ attributes = BaseAssignableActivity.attributes + (
+ ActivityAttribute('exits', '', (),
+ 'Tuple of Exit objects',
+ importHandler="attrImport_ntask",
+ exportHandler="attrExport_ntask"),
+ )
configurationSchema = atapi.Schema((
atapi.TextField("task",
Modified: AlphaFlow/trunk/activities/permission.py
==============================================================================
--- AlphaFlow/trunk/activities/permission.py (original)
+++ AlphaFlow/trunk/activities/permission.py Thu Jun 23 11:17:38 2005
(at)(at) -16,7 +16,8 (at)(at)
from Products.AlphaFlow.interfaces import \
IPermissionActivity, IPermissionWorkItem, IPermissionSetting
from Products.AlphaFlow.workitem import registerWorkItem,
BaseAutomaticWorkItem
-from Products.AlphaFlow.activity import registerActivity,
BaseAutomaticActivity
+from Products.AlphaFlow.activity import \
+ registerActivity, BaseAutomaticActivity, ActivityAttribute
from Products.AlphaFlow.utils import \
modifyRolesForPermission, makeBoolFromUnicode, flexSplit
from Products.AlphaFlow.exception import ConfigurationError
(at)(at) -61,13 +62,18 (at)(at)
__implements__ = ((IPermissionActivity, ) +
BaseAutomaticActivity.__implements__)
+ security = ClassSecurityInfo()
meta_type = "AlphaFlow Permission Activity"
activity_type = "permission-change"
- security = ClassSecurityInfo()
icon = "permission-change"
- permissions = ()
+ attributes = BaseAutomaticActivity.attributes + (
+ ActivityAttribute('permissions', '', (),
+ 'Tuple of IPermissionSettings',
+ importHandler="attrImport_permission",
+ exportHandler="attrExport_permission"),
+ )
def configureFromDOMNode(self, node):
"""Configures the activity from a given DOM-Node"""
Modified: AlphaFlow/trunk/activities/recursion.py
==============================================================================
--- AlphaFlow/trunk/activities/recursion.py (original)
+++ AlphaFlow/trunk/activities/recursion.py Thu Jun 23 11:17:38 2005
(at)(at) -14,7 +14,7 (at)(at)
# Sibling imports
from Products.AlphaFlow.workitem import registerWorkItem,
BaseAutomaticWorkItem
from Products.AlphaFlow.activity import \
- registerActivity, BaseAutomaticActivity
+ registerActivity, BaseAutomaticActivity, ActivityAttribute
from Products.AlphaFlow import config, utils
from Products.AlphaFlow.interfaces import IDaemonActivity
(at)(at) -26,13 +26,21 (at)(at)
__implements__ = BaseAutomaticActivity.__implements__ + (IDaemonActivity,)
meta_type = "AlphaFlow Recursion Activity"
-
activity_type = "recursion"
icon = "recursion"
- recursion_activity = ()
- break_activities = ()
- optional_recursion = 1
+ attributes = BaseAutomaticActivity.attributes + (
+ ActivityAttribute('recursion_activity', 'recursion_activity', (),
+ 'Activities which will get called recursively.'),
+ ActivityAttribute('break_activities', 'break_activities', (),
+ 'Activities which stop recursion.'),
+ ActivityAttribute('optional_recursion', 'optional_recursion', True,
+ 'User can select via UI if recursion should be '
+ 'called.',
+ importHandler="attrImport_bool",
+ exportHandler="attrExport_bool"),
+ )
+
configurationSchema = Schema((
BooleanField("apply",
widget=BooleanWidget(
Modified: AlphaFlow/trunk/activities/review.py
==============================================================================
--- AlphaFlow/trunk/activities/review.py (original)
+++ AlphaFlow/trunk/activities/review.py Thu Jun 23 11:17:38 2005
(at)(at) -18,7 +18,7 (at)(at)
from Products.AlphaFlow.workitem import \
BaseAssignableWorkItem, registerWorkItem
from Products.AlphaFlow.activity import \
- BaseAssignableActivity, registerActivity
+ BaseAssignableActivity, registerActivity, ActivityAttribute
from Products.AlphaFlow import config, utils
from Products.AlphaFlow.action import Action
(at)(at) -35,9 +35,14 (at)(at)
meta_type = "AlphaFlow Review Activity"
activity_type = "review"
- review_notice = ""
- reject_activity = ()
- accept_activity = ()
+ aatributes = BaseAssignableActivity.attributes + (
+ ActivityAttribute('review_notice', 'review_notice', '',
+ 'Describing the review role.'),
+ ActivityAttribute('reject_activity', 'reject_activity', (),
+ 'Activity if one votes "no".'),
+ ActivityAttribute('accept_activity', 'accept_activity', (),
+ 'Activity if all vote "yes".'),
+ )
configurationSchema = BaseAssignableActivity.configurationSchema.copy()
# gets modified by __init__!
Modified: AlphaFlow/trunk/activities/routing.py
==============================================================================
--- AlphaFlow/trunk/activities/routing.py (original)
+++ AlphaFlow/trunk/activities/routing.py Thu Jun 23 11:17:38 2005
(at)(at) -9,7 +9,8 (at)(at)
# Sibling imports
from Products.AlphaFlow.workitem import registerWorkItem, BaseWorkItem
-from Products.AlphaFlow.activity import registerActivity, BaseActivity
+from Products.AlphaFlow.activity import \
+ registerActivity, BaseActivity, ActivityAttribute
from Products.AlphaFlow import config
from Products.AlphaFlow.utils import killWorkItemRecursively
from Products.AlphaFlow.interfaces import IRoutingActivity, IRoutingWorkItem
(at)(at) -29,17 +30,24 (at)(at)
this routing activity.
"""
- meta_type = "AlphaFlow Routing Activity"
- activity_type = "route"
- icon = "route"
-
-
__implements__ = BaseActivity.__implements__ + \
(IRoutingActivity, )
security = ClassSecurityInfo()
- gates = ()
- routes = ()
+ meta_type = "AlphaFlow Routing Activity"
+ activity_type = "route"
+ icon = "route"
+
+ attributes = BaseActivity.attributes + (
+ ActivityAttribute('gates', '', (),
+ 'Gate activities inside the route.',
+ importHandler="attrImport_route",
+ exportHandler="attrExport_route"),
+ ActivityAttribute('routes', '', (),
+ 'All activities inside route which are no gates.',
+ importHandler=None, # done by handler above
+ exportHandler=None),
+ )
_properties = BaseActivity._properties + \
({'id': 'gates', 'type': 'multiple selection', 'mode': 'w',
Modified: AlphaFlow/trunk/activities/task.py
==============================================================================
--- AlphaFlow/trunk/activities/task.py (original)
+++ AlphaFlow/trunk/activities/task.py Thu Jun 23 11:17:38 2005
(at)(at) -15,7 +15,7 (at)(at)
from Products.AlphaFlow.workitem import\
registerWorkItem, BaseAssignableWorkItem
from Products.AlphaFlow.activity import \
- registerActivity, BaseAssignableActivity
+ registerActivity, BaseAssignableActivity, ActivityAttribute
from Products.AlphaFlow import config, utils
from Products.AlphaFlow.action import Action
from Products.AlphaFlow.exception import ConfigurationError
(at)(at) -26,11 +26,13 (at)(at)
__implements__ = BaseAssignableActivity.__implements__ + (ITaskActivity, )
meta_type = "AlphaFlow Task Activity"
-
activity_type = "task"
- completion_activity = ()
icon = "task"
-
+
+ attributes = BaseAssignableActivity.attributes + (
+ ActivityAttribute('completion_activity', 'completion_activity', (),
+ 'Activity to start after completion.'),
+ )
configurationSchema = atapi.Schema((
atapi.TextField("task",
Modified: AlphaFlow/trunk/activity.py
==============================================================================
--- AlphaFlow/trunk/activity.py (original)
+++ AlphaFlow/trunk/activity.py Thu Jun 23 11:17:38 2005
(at)(at) -17,11 +17,45 (at)(at)
# Sibling imports
from Products.AlphaFlow.interfaces import \
IActivity, IAutomaticActivity, IInstance, ITalesActivity, \
- IAssignableActivity
+ IAssignableActivity, IActivityAttribute
from Products.AlphaFlow import config, utils
from Products.AlphaFlow.exception import ConfigurationError
from Products.AlphaFlow.adapters.activitiesadapter import getActivitiesAdapter
+
+
+class ActivityAttribute:
+
+ __implements__ = (IActivityAttribute,)
+ """Attribute for an activity ... data used by import and export"""
+
+ classAttr = None
+ domAttr = None
+ default = ""
+ description = ""
+ importHandler = "attrImport_simple"
+ exportHandler = "attrExport_simple"
+
+ def __init__(self, classAttr, domAttr, default, description,
+ importHandler="attrImport_simple",
+ exportHandler="attrExport_simple"):
+ if not isinstance(classAttr, str):
+ raise ValueError, "classAttr must be a string."
+ self.classAttr = classAttr
+ if not isinstance(domAttr, str):
+ raise ValueError, "domAttr must be a string."
+ self.domAttr = domAttr
+ self.default = default
+ self.description = description
+ if not (isinstance(importHandler, str) or importHandler is None):
+ raise ValueError, "importHandler must be a string or None."
+ self.importHandler = importHandler
+ if not (isinstance(exportHandler, str) or exportHandler is None):
+ raise ValueError, "exportHandler must be a string or None."
+ self.exportHandler = exportHandler
+
+
+
class BaseActivity(PropertyManager, SimpleItem):
"""A base class to implement activities"""
(at)(at) -29,11 +63,25 (at)(at)
security = ClassSecurityInfo()
configurationSchema = None
- sortPriority = 0
- title = ""
- nonEditableFields = ()
icon = "generic"
- startActivity = ()
+
+ attributes = (
+ ActivityAttribute('id', 'id', None,
+ 'Id of the activity.',
+ importHandler=None,
+ exportHandler="idAttrExport"),
+ ActivityAttribute('title', 'title', '',
+ 'Title of the activity.'),
+ ActivityAttribute('sortPriority', 'sort', 0,
+ 'Lower priority activities will be shown first.',
+ importHandler="attrImport_int"),
+ ActivityAttribute('nonEditableFields', 'nonEditableFields', (),
+ 'Fields in schema which are not to be edited '
+ 'aka configured by user of workflow.'),
+ ActivityAttribute('startActivity', 'startActivity', (),
+ 'Workitems to be spawned just before the '
+ 'workitem for this activity is started.'),
+ )
def __init__(self, id):
self.id = id
(at)(at) -95,6 +143,16 (at)(at)
REQUEST.RESPONSE.setHeader('Content-type', 'text/xml')
return xml
+ def getPossibleChildren(self):
+ """Return a list of all ids of activities that can be instantiated as
+ successors by instances of this activity."""
+ return [] # to be overwritten by subclasses
+
+ def graphGetPossibleChildren():
+ "Return a list of possible successor activities as dictionaries."
+ return [] # to be overwritten by subclasses
+
+
InitializeClass(BaseActivity)
(at)(at) -112,7 +170,12 (at)(at)
manage_options = (PropertyManager.manage_options + \
SimpleItem.manage_options)
- continue_activity = ()
+ attributes = BaseActivity.attributes + (
+ ActivityAttribute('continue_activity', 'continue_activity', (),
+ 'A list of activities that follow this'
+ 'automatic activity. (single exit)'),
+ )
+
_properties = PropertyManager._properties + \
({'id': 'continue_activity', 'type': 'multiple selection',
(at)(at) -154,13 +217,31 (at)(at)
_properties = BaseActivity._properties + (
{ 'id': 'roles', 'type': 'lines', 'mode': 'w' },
)
-
- roles = None
- assigneesExpression = None
- assigneesKind = 'possible'
- contentRoles = None
- viewUrlExpression = 'string:${content/absolute_url}/view'
+ attributes = BaseActivity.attributes + (
+ ActivityAttribute('viewUrlExpression', 'view_url_expr',
+ 'string:${content/absolute_url}/view',
+ '(TALES expression) URL to "view" a workitem, '
+ 'e.g. "Edit document" points to the edit-tab'),
+ ActivityAttribute('contentRoles', 'content_roles', None,
+ 'Roles which assigned users get on the '
+ 'content object.'),
+ ActivityAttribute('assigneesKind', 'kind', 'possible',
+ 'Defines the user assignment method, either '
+ '"possible" or "actual".',
+ importHandler="attrImport_assignees",
+ exportHandler="attrExport_assignees"),
+ ActivityAttribute('roles', 'roles', None,
+ 'Roles to compute which members are assignees',
+ importHandler=None, # done by attrImport_assignees
(see above)
+ exportHandler=None),
+ ActivityAttribute('assigneesExpression', 'expression', None,
+ 'Tales Expression returning a list of member ids, '
+ 'may be None.',
+ importHandler=None,
+ exportHandler=None),
+ )
+
configurationSchema = atapi.Schema((
atapi.LinesField("assignees",
vocabulary="getPossibleAssignees",
(at)(at) -303,10 +384,18 (at)(at)
(ITalesActivity, )
security = ClassSecurityInfo()
icon = "basetalesactivity"
- expression = ""
+
+ attributes = BaseAutomaticActivity.attributes + (
+ ActivityAttribute('expression', 'expression', '',
+ 'TALES expression which is to be executed.'),
+ )
+
error_string = "Tal expression required which" \
"should return a DateTime object, in %r."
+
+
+
_properties = BaseAutomaticActivity._properties + \
({'id': 'expression', 'type': 'string', 'mode': 'w'},
)
(at)(at) -329,6 +418,8 (at)(at)
def registerActivity(activity):
InitializeClass(activity)
+ for attribute in activity.attributes:
+ setattr(activity, attribute.classAttr, attribute.default)
activity_registry[activity.activity_type] = activity
def getActivity(activity_type):
Modified: AlphaFlow/trunk/interfaces.py
==============================================================================
--- AlphaFlow/trunk/interfaces.py (original)
+++ AlphaFlow/trunk/interfaces.py Thu Jun 23 11:17:38 2005
(at)(at) -271,12 +271,13 (at)(at)
These are the building blocks for process definitions.
"""
- id = Attribute("Id of the activity.")
- title = Attribute("Title of the activity.")
+ attributes = Attribute("Tuple of IActivityAttribute instances which "
+ "configure the attributes of the activity.")
+
configurationSchema = Attribute(
"An AT schema that can be used to configure a process instance "
"including this activity.")
- sortPriority = Attribute("Lower priority activities will be shown first")
+
def getPossibleChildren():
"""Return a list of all ids of activities that can be instantiated as
(at)(at) -313,14 +314,6 (at)(at)
class IAssignableActivity(IActivity):
"""A workflow activity instances of which may be assigned to a member."""
- assigneesKind = Attribute(
- 'Defines the user assignment method, either "possible" or "actual"')
- assigneesExpression = Attribute(
- "Tales Expression returning a list of member ids, may be None.")
- viewUrlExpression = Attribute("(TALES expression) URL to 'view' a "
- "workitem, e.g. 'Edit document' points to "
- "the edit-tab")
-
def getPossibleAssignees():
"""Return a list of users that may be assigned this activity.
(at)(at) -666,9 +659,6 (at)(at)
"""Activity which automatically performes an action and continues
the workflow."""
- continue_activity = Attribute("A list of activities that follow this"
- "automatic activity. (single exit)")
-
class IAutomaticWorkItem(IWorkItem):
"""Implements the automatic activity.
(at)(at) -690,7 +680,6 (at)(at)
portal - the portal root object
"""
- expression = Attribute("TALES-expression which is to be executed.")
error_string = Attribute("String which is shown when the "
"expression-attribute is missing. (String must"
"include a %r for the activity_type.)")
(at)(at) -707,6 +696,32 (at)(at)
completed when only daemon activities are left."""
+class IActivityAttribute(Interface):
+ """Attribute for an activity ... data used by import and export"""
+
+ classAttr = Attribute("Name of the attribute in the activity class.")
+ domAttr = Attribute("Name of the attribute in the dom.")
+ default = Attribute("Default value.")
+ description = Attribute("Description for the attribute.")
+ importHandler = Attribute("Name of the method which handles the import "
+ "of this attribute or None for no import. "
+ "The method must accept exactly two parameters:"
+ " - the activity attribute"
+ " - the dom node to be read from")
+ exportHandler = Attribute("Name of the method which handles the export "
+ "of this attribute or None for no export. "
+ "The method must accept exactly two parameters:"
+ " - the activity attribute"
+ " - the dom node to be written to")
+
+ def __init__(classAttr, domAttr, default, description,
+ importHandler="attrImport_simple",
+ exportHandler="attrExport_simple"):
+ "Constructor."
+
+
+
+
# Need the activity interface here after a refactoring for backwards
# compatibility
from Products.AlphaFlow.activities.interfaces import *
Modified: AlphaFlow/trunk/process.py
==============================================================================
--- AlphaFlow/trunk/process.py (original)
+++ AlphaFlow/trunk/process.py Thu Jun 23 11:17:38 2005
(at)(at) -181,7 +181,7 (at)(at)
def exportAsXML(self):
"""Exports process as XML-String."""
doc = self.getProcessDOM()
- workflow = doc.getElementsByTagName('workflow')[0]
+ workflow = doc.documentElement
for activitiy in self.objectValues():
act_adapt = getActivitiesAdapter(activitiy)
if act_adapt is None:
Modified: AlphaFlow/trunk/tests/test_definition.py
==============================================================================
--- AlphaFlow/trunk/tests/test_definition.py (original)
+++ AlphaFlow/trunk/tests/test_definition.py Thu Jun 23 11:17:38 2005
(at)(at) -27,11 +27,14 (at)(at)
from Products.AlphaFlow.interfaces import \
IProcess, IAlphaFlowed, IInstance, IActivity, \
- IWorkItem, IAutomaticWorkItem, IAction, IReviewWorkItem, IReviewActivity
+ IWorkItem, IAutomaticWorkItem, IAction, IReviewWorkItem, IReviewActivity,
\
+ IActivityAttribute, ITalesActivity, IAssignableActivity,
IAutomaticActivity
from Products.AlphaFlow.workflowedobject import AlphaFlowed
from Products.AlphaFlow.instance import Instance
from Products.AlphaFlow.process import Process
-from Products.AlphaFlow.activity import listActivities, getActivity
+from Products.AlphaFlow.activity import \
+ listActivities, getActivity, ActivityAttribute, BaseTalesActivity, \
+ BaseAssignableActivity, BaseActivity, BaseAutomaticActivity
from Products.AlphaFlow import config
from Products.AlphaFlow.workitem import \
BaseWorkItem, BaseAutomaticWorkItem, \
(at)(at) -74,6 +77,11 (at)(at)
(IAction, Action),
(IProcess, Process),
(IReviewActivity, ReviewActivity),
+ (IActivityAttribute, ActivityAttribute),
+ (ITalesActivity, BaseTalesActivity),
+ (IAssignableActivity, BaseAssignableActivity),
+ (IActivity, BaseActivity),
+ (IAutomaticActivity, BaseAutomaticActivity),
(IReviewWorkItem, ReviewWorkItem)] + \
[(IActivity, getActivity(act_id))
for act_id in listActivities() ] + \
(at)(at) -93,6 +101,10 (at)(at)
def _check_DOM_frag_recursive(self, exp, got, wf_name):
+ self.failIf(got is None,
+ "%s: %s(%s) missing in got DOM" % (wf_name,
+ exp.nodeName,
+
exp.attributes.items()))
if exp.childNodes:
exp_childs = [x for x in exp.childNodes
if x.nodeType not in [minidom.Node.COMMENT_NODE,
(at)(at) -115,7 +127,7 (at)(at)
def _find_in_node(self, src_node, node):
- pot_nodes = src_node.childNodes
+ pot_nodes = src_node.getElementsByTagName(node.nodeName)
if len(pot_nodes) == 1: # the only one should be the searched
return pot_nodes[0]
for pot_node in pot_nodes:
(at)(at) -188,6 +200,8 (at)(at)
continue
wf_file.seek(0)
test = alf.getProcess('test')
+# if wf_name == "configuration.alf":
+# import pdb; pdb.set_trace() #############################
got_dom = minidom.parseString(test.exportAsXML().encode('utf-8'))
exp_dom = minidom.parseString(wf_file.read())
self._check_DOM_equality(exp_dom, got_dom, wf_name)
Modified: AlphaFlow/trunk/workitem.py
==============================================================================
--- AlphaFlow/trunk/workitem.py (original)
+++ AlphaFlow/trunk/workitem.py Thu Jun 23 11:17:38 2005
(at)(at) -584,6 +584,7 (at)(at)
workitem_registry = {}
def registerWorkItem(workitem):
+ InitializeClass(workitem)
atapi.registerType(workitem, config.PROJECTNAME)
workitem_registry[workitem.activity_type] = workitem
|
SVN: r3083 - in PloneImageCompetition/trunk: . doc skins/pic_content tests
Daniel Havlik <dh(at)gocept.com> |
2005-06-23 15:13:32 |
[ FULL ]
|
Author: nilo
Date: Thu Jun 23 15:08:22 2005
New Revision: 3083
Added:
PloneImageCompetition/trunk/doc/example.xml
PloneImageCompetition/trunk/doc/export.rng
PloneImageCompetition/trunk/skins/pic_content/get_xml_export.py
PloneImageCompetition/trunk/skins/pic_content/resolveuid.py
Modified:
PloneImageCompetition/trunk/PCImage.py
PloneImageCompetition/trunk/PicContainer.py
PloneImageCompetition/trunk/interfaces.py
PloneImageCompetition/trunk/tests/PicTestCase.py
PloneImageCompetition/trunk/tests/test_imagecompetition.py
PloneImageCompetition/trunk/tests/test_pcimage.py
Log:
implemented xml export of images
Modified: PloneImageCompetition/trunk/PCImage.py
==============================================================================
--- PloneImageCompetition/trunk/PCImage.py (original)
+++ PloneImageCompetition/trunk/PCImage.py Thu Jun 23 15:08:22 2005
(at)(at) -66,7 +66,7 (at)(at)
),
),
atapi.TextField('schoolAddress',
- read_permission=CMFCorePermissions.ModifyPortalContent,
+ read_permission=CMFCorePermissions.ModifyPortalContent,
widget=atapi.TextAreaWidget(
label="School address",
label_msgid='label_school_address',
(at)(at) -76,7 +76,7 (at)(at)
),
),
atapi.StringField('country',
- read_permission=CMFCorePermissions.ModifyPortalContent,
+ read_permission=CMFCorePermissions.ModifyPortalContent,
widget=atapi.StringWidget(
label="Country",
label_msgid='label_country',
(at)(at) -86,7 +86,7 (at)(at)
),
),
atapi.StringField('teacherName',
- read_permission=CMFCorePermissions.ModifyPortalContent,
+ read_permission=CMFCorePermissions.ModifyPortalContent,
widget=atapi.StringWidget(
label="Teacher",
label_msgid='label_teacher',
(at)(at) -96,7 +96,7 (at)(at)
),
),
atapi.StringField('teacherEmail',
- read_permission=CMFCorePermissions.ModifyPortalContent,
+ read_permission=CMFCorePermissions.ModifyPortalContent,
widget=atapi.StringWidget(
label="Teacher e-mail",
label_msgid='label_teacher_email',
(at)(at) -106,7 +106,7 (at)(at)
),
),
atapi.StringField('teacherTel',
- read_permission=CMFCorePermissions.ModifyPortalContent,
+ read_permission=CMFCorePermissions.ModifyPortalContent,
widget=atapi.StringWidget(
label="Teacher telephone",
label_msgid='label_teacher_phone',
(at)(at) -142,8 +142,6 (at)(at)
visible= {'edit': 'hidden', 'view': 'hidden'},
),
),
-
-
))
class PCImage(PCVoteableContent):
(at)(at) -151,7 +149,7 (at)(at)
__implements__ = (IPCImage,) + PCVoteableContent.__implements__
schema = PCVoteableContent.schema + PCImageSchema
type_name = archetype_name = portal_type = meta_type = 'PCImage'
- Security = ClassSecurityInfo()
+ security = ClassSecurityInfo()
def Title(self):
(at)(at) -171,7 +169,40 (at)(at)
portal_url = getToolByName(self, 'portal_url')()
url = url[len(portal_url) + 1:]
return url
-
+
+ security.declarePrivate('writeDOM')
+ def writeDOM(self, node):
+ portal_url = getToolByName(self, 'portal_url')()
+ doc = node.ownerDocument
+ uid = self.UID()
+ charset = self.getCharset()
+ image = node.appendChild(doc.createElement('image'))
+ image.setAttribute('category', unicode(self.getCategory(), charset))
+ image.setAttribute('votes', str(self.getVotes()))
+ image.setAttribute('story', unicode(self.getStory(), charset))
+ image.setAttribute('url', '%s/resolveuid/%s' % (portal_url, uid))
+ image.setAttribute('uid', uid)
+ child = image.appendChild(doc.createElement('child'))
+ child.setAttribute('firstname', unicode(self.getChildFirstname(),
+ charset))
+ child.setAttribute('lastname', unicode(self.getChildLastname(),
+ charset))
+ child.setAttribute('sex', unicode(self.getChildSex(), charset))
+ school = image.appendChild(doc.createElement('school'))
+ school.setAttribute('name', unicode(self.getSchoolName(), charset))
+ school.setAttribute('country', unicode(self.getCountry(), charset))
+ school.appendChild(doc.createTextNode(unicode(self.getSchoolAddress(),
+ charset)))
+ teacher = image.appendChild(doc.createElement('teacher'))
+ teacher.setAttribute('name', unicode(self.getTeacherName(), charset))
+ teacher.setAttribute('email', unicode(self.getTeacherEmail(),
+ charset))
+ teacher.setAttribute('phone', unicode(self.getTeacherTel(), charset))
+
+ security.declarePrivate('getXML')
+ def getXML(self):
+ raise NotImplementedError, "Images can't be exported seperately"
+
actions = (
{
'id': 'view',
Modified: PloneImageCompetition/trunk/PicContainer.py
==============================================================================
--- PloneImageCompetition/trunk/PicContainer.py (original)
+++ PloneImageCompetition/trunk/PicContainer.py Thu Jun 23 15:08:22 2005
(at)(at) -13,6 +13,8 (at)(at)
IImageCompetitionContainer
+from xml.dom.minidom import parseString
+
ICCSchema = atapi.BaseFolder.schema + atapi.Schema((
atapi.DateTimeField(
'votingStartDate',
(at)(at) -60,7 +62,7 (at)(at)
__implements__ = atapi.BaseFolder.__implements__ +
(IImageCompetitionContainer,)
schema = ICCSchema
archetype_name = portal_type = meta_type = 'ImageCompetitionContainer'
- Security = ClassSecurityInfo()
+ security = ClassSecurityInfo()
global_allow = 1
allowed_content_types = ('PCImage', )
(at)(at) -137,7 +139,7 (at)(at)
def getCompetitionTitle(self):
return self.Title()
- Security.declarePublic('vote')
+ security.declarePublic('vote')
def vote(self, voteId):
if not self.isVotingStartDateReached():
return (False, 'The voting in this competition has not been
started yet.')
(at)(at) -155,6 +157,19 (at)(at)
voteitem.addVote()
return (True, 'Your vote has been counted.')
+ security.declareProtected(CMFCorePermissions.ModifyPortalContent,
'getXML')
+ def getXML(self):
+ doc = parseString("<image-competition/>")
+ ic = doc.documentElement
+ self.writeDOM(ic)
+ return doc.toxml('utf-8')
+
+ security.declarePrivate('writeDOM')
+ def writeDOM(self, node):
+ images = self.getVoteableItems('PCImage', 'getSortfield')
+ for image in images:
+ image_object = image.getObject()
+ image_object.writeDOM(node)
actions = (
{
Added: PloneImageCompetition/trunk/doc/example.xml
==============================================================================
--- (empty file)
+++ PloneImageCompetition/trunk/doc/example.xml Thu Jun 23 15:08:22 2005
(at)(at) -0,0 +1,13 (at)(at)
+<image-competition>
+ <image category="age group 2" votes="3" story="" url="" uid="">
+ <child firstname="egon" lastname="krenz" sex="female"/>
+ <school name="bla" country="">
+ school address
+ ...
+ </school>
+ <teacher name="" email="" phone="" />
+
+ </image>
+
+
+</image-competition>
Added: PloneImageCompetition/trunk/doc/export.rng
==============================================================================
--- (empty file)
+++ PloneImageCompetition/trunk/doc/export.rng Thu Jun 23 15:08:22 2005
(at)(at) -0,0 +1,53 (at)(at)
+<?xml version="1.0"?>
+<element name="image-competition" xmlns="http://relaxng.org/ns/structure/1.0">
+ <zeroOrMore>
+ <element name="image">
+ <parameter name="category">
+ <text/>
+ </parameter>
+ <parameter name="votes">
+ <data type="int"/>
+ </parameter>
+ <parameter name="story">
+ <text/>
+ </parameter>
+ <parameter name="url">
+ <text/>
+ </parameter>
+ <parameter name="uid">
+ <text/>
+ </parameter>
+ <element name="child">
+ <parameter name="firstname">
+ <text/>
+ </parameter>
+ <parameter name="lastname">
+ <text/>
+ </parameter>
+ <parameter name="sex">
+ <text/>
+ </parameter>
+ </element>
+ <element name="school">
+ <parameter name="name">
+ <text/>
+ </parameter>
+ <parameter name="country">
+ <text/>
+ </parameter>
+ <text/>
+ </element>
+ <element name="teacher">
+ <parameter name="name">
+ <text/>
+ </parameter>
+ <parameter name="email">
+ <text/>
+ </parameter>
+ <parameter name="phone">
+ <text/>
+ </parameter>
+ </element>
+ </element>
+ </zeroOrMore>
+</element>
Modified: PloneImageCompetition/trunk/interfaces.py
==============================================================================
--- PloneImageCompetition/trunk/interfaces.py (original)
+++ PloneImageCompetition/trunk/interfaces.py Thu Jun 23 15:08:22 2005
(at)(at) -1,11 +1,22 (at)(at)
# -*- coding: latin1 -*-
# Copyright (c) 2004 gocept gmbh & co. kg
# See also LICENSE.txt
-# $Id: interfaces.py,v 1.6 2004/11/25 14:35:23 nilo Exp $
+# $Id$
from Interface import Interface, Attribute
-class IImageCompetitionContainer(Interface):
+
+class IXMLExportable(Interface):
+ """creates xml export"""
+
+ def getXML():
+ """returns xml export"""
+
+ def writeDOM(node):
+ """creates an xml node from the objects schema"""
+
+
+class IImageCompetitionContainer(IXMLExportable):
"""Container for Images taking part in the competition.
Images can be submitted by anonymous users and have to be reviewed.
Each visitor can then vote for one image to be the best.
(at)(at) -71,7 +82,8 (at)(at)
returns tuple (True|False, string:message)
"""
-
+
+
class IPCVoteableContent(Interface):
"""Content Item which users can vote for.
(at)(at) -91,5 +103,5 (at)(at)
returns nothing
"""
-class IPCImage(IPCVoteableContent):
+class IPCImage(IPCVoteableContent, IXMLExportable):
"""Image which users can vote for."""
Added: PloneImageCompetition/trunk/skins/pic_content/get_xml_export.py
==============================================================================
--- (empty file)
+++ PloneImageCompetition/trunk/skins/pic_content/get_xml_export.py Thu Jun 23
15:08:22 2005
(at)(at) -0,0 +1,5 (at)(at)
+context.REQUEST.RESPONSE.setHeader('Content-Type', 'text/xml')
+context.REQUEST.RESPONSE.setHeader('Content-Disposition',
+ 'attachment; filename=images.xml')
+
+return context.getXML()
Added: PloneImageCompetition/trunk/skins/pic_content/resolveuid.py
==============================================================================
--- (empty file)
+++ PloneImageCompetition/trunk/skins/pic_content/resolveuid.py Thu Jun 23
15:08:22 2005
(at)(at) -0,0 +1,32 (at)(at)
+## Script (Python) "resolveuid"
+##title=Retrieve an object using its UID
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=
+# (reference_url is supposed to do the same thing, but is broken)
+from Products.CMFCore.utils import getToolByName
+from Products.PythonScripts.standard import html_quote
+
+request = context.REQUEST
+response = request.RESPONSE
+
+uuid = traverse_subpath.pop(0)
+reference_tool = getToolByName(context, 'archetype_tool')
+obj = reference_tool.lookupObject(uuid)
+if not obj:
+ return context.standard_error_message(error_type=404,
+ error_message='''The link you followed appears to be broken''')
+
+if traverse_subpath:
+ traverse_subpath.insert(0, obj.absolute_url())
+ target = '/'.join(traverse_subpath)
+else:
+ target = obj.absolute_url()
+
+if request.QUERY_STRING:
+ target += '?' + request.QUERY_STRING
+return response.redirect(target)
+
Modified: PloneImageCompetition/trunk/tests/PicTestCase.py
==============================================================================
--- PloneImageCompetition/trunk/tests/PicTestCase.py (original)
+++ PloneImageCompetition/trunk/tests/PicTestCase.py Thu Jun 23 15:08:22 2005
(at)(at) -1,12 +1,13 (at)(at)
# -*- coding: latin1 -*-
# Copyright (c) 2004 gocept gmbh & co. kg
# See also LICENSE.txt
-# $Id: PicTestCase.py,v 1.2 2004/11/22 14:29:56 nilo Exp $
+# $Id$
from StringIO import StringIO
from Testing import ZopeTestCase
+from types import InstanceType
products = ['PloneImageCompetition',]
products.sort()
(at)(at) -39,15 +40,21 (at)(at)
request_out = self.request_out = StringIO()
return ZopeTestCase.utils.makerequest(app, request_out)
+
def test_interface(self):
+ failed = []
for i, c in self.interfaces_to_test:
- self.failUnless(i.isImplementedByInstancesOf(c),
- 'interface %s not implemented by %s' % (i,c))
- methlist = i.namesAndDescriptions()
+ if type(c) is InstanceType:
+ self.failUnless(i.isImplementedBy(c),
+ "%s is not implemented by %s" % (i, c))
+ else:
+ self.failUnless(i.isImplementedByInstancesOf(c),
+ "%s is not implemented by instances of %s" %
(i, c))
+ methlist = i.namesAndDescriptions(all=True)
for meth in methlist:
- self.failUnless(hasattr(c, meth[0]),
- 'Method %s not implemented by %s' % (meth[0],
- c))
-
-
+ if not hasattr(c, meth[0]):
+ failed.append('Method %r not implemented by %s' % (
+ meth[0], c))
+ self.assertEquals(failed, [], 'Interface tests failed:\n%s' % (
+ '\n'.join(failed), ))
Modified: PloneImageCompetition/trunk/tests/test_imagecompetition.py
==============================================================================
--- PloneImageCompetition/trunk/tests/test_imagecompetition.py (original)
+++ PloneImageCompetition/trunk/tests/test_imagecompetition.py Thu Jun 23
15:08:22 2005
(at)(at) -1,7 +1,7 (at)(at)
# -*- coding: latin1 -*-
# Copyright (c) 2004 gocept gmbh & co. kg
# See also LICENSE.txt
-# $Id: test_imagecompetition.py,v 1.10 2005/01/21 13:01:13 nilo Exp $
+# $Id$
import os, sys
(at)(at) -10,6 +10,8 (at)(at)
import unittest
+from xml.dom.minidom import parseString
+
from PicTestCase import PicTestCase
from zExceptions import Unauthorized
(at)(at) -168,7 +170,118 (at)(at)
self.failUnless(len(voteresult[1]) > 0, 'message is empty, but vote
not counted: item doesnt exist')
self.assertEqual(im1.getVotes(), 3)
-
+
+ def test_export(self):
+
+ def checkAttr(name, value, node):
+ self.assertEquals(value, node.getAttribute(name))
+
+ portal = self.getPortal()
+ portal.invokeFactory('ImageCompetitionContainer', 'i1')
+ i1 = portal.i1
+ i1.invokeFactory('PCImage', 'vc1')
+ i1.invokeFactory('PCImage', 'vc2')
+ vc1 = i1.vc1
+ vc2 = i1.vc2
+ vc1.edit(category='testcategory',
+ story='teststory',
+ childFirstname='Hans',
+ childLastname=u'Würst',
+ childSex='male',
+ schoolName=u'testschääl',
+ schoolAddress='address\naddress line 2',
+ country='Germany',
+ teacherName='Steve Miller',
+ teacherEmail='dh(at)gocept.com',
+ teacherTel='123455',
+ )
+ vc2.edit(category='testcategory',
+ story='teststory2',
+ childFirstname='Hans2',
+ childLastname=u'Würst2',
+ childSex='',
+ schoolName=u'testschääl2',
+ schoolAddress='address\naddress\nline 2',
+ country='Germany2',
+ teacherName='Steve Miller2',
+ teacherEmail='dh2(at)gocept.com',
+ teacherTel='543211',
+ )
+
+ for x in range(100):
+ vc1.addVote()
+
+ vc1.content_status_modify('publish')
+ vc2.content_status_modify('publish')
+
+ vc1.reindexObject()
+ vc2.reindexObject()
+ xml = parseString(i1.getXML())
+ fc = xml.firstChild
+
+ self.assertEquals('image-competition', fc.nodeName)
+ self.assertEquals(2, len(fc.childNodes))
+ image2 = fc.firstChild
+ image1 = image2.nextSibling
+
+ checkAttr('category', 'testcategory', image1)
+ checkAttr('story', 'teststory', image1)
+ checkAttr('votes', '100', image1)
+ checkAttr('url', '%s/resolveuid/%s' % (portal.absolute_url(),
+ vc1.UID()), image1)
+ checkAttr('uid', vc1.UID(), image1)
+
+ checkAttr('category', 'testcategory', image2)
+ checkAttr('story', 'teststory2', image2)
+ checkAttr('votes', '0', image2)
+ checkAttr('url', '%s/resolveuid/%s' % (portal.absolute_url(),
+ vc2.UID()), image2)
+ checkAttr('uid', vc2.UID(), image2)
+
+ child1 = image1.firstChild
+ school1 = child1.nextSibling
+ teacher1 = school1.nextSibling
+ self.assert_(teacher1.nextSibling is None)
+
+ checkAttr('firstname', 'Hans', child1)
+ checkAttr('lastname', u'Würst', child1)
+ checkAttr('sex', 'male', child1)
+ self.assert_(child1.firstChild is None)
+
+ checkAttr('name', u'testschääl', school1)
+ checkAttr('country', 'Germany', school1)
+
+ school1addr = school1.firstChild
+ self.assertEquals(vc1.getSchoolAddress(), school1addr.nodeValue)
+
+ checkAttr('name','Steve Miller', teacher1)
+ checkAttr('email', 'dh(at)gocept.com', teacher1)
+ checkAttr('phone', '123455', teacher1)
+ self.assert_(teacher1.firstChild is None)
+
+ child2 = image2.firstChild
+ school2 = child2.nextSibling
+ teacher2 = school2.nextSibling
+ self.assert_(teacher2.nextSibling is None)
+
+
+ checkAttr('firstname', 'Hans2', child2)
+ checkAttr('lastname', u'Würst2', child2)
+ checkAttr('sex', '', child2)
+ self.assert_(child2.firstChild is None)
+
+ checkAttr('name', u'testschääl2', school2)
+ checkAttr('country', 'Germany2', school2)
+
+ school2addr = school2.firstChild
+ self.assertEquals(vc2.getSchoolAddress(), school2addr.nodeValue)
+
+ checkAttr('name','Steve Miller2', teacher2)
+ checkAttr('email', 'dh2(at)gocept.com', teacher2)
+ checkAttr('phone', '543211', teacher2)
+ self.assert_(teacher2.firstChild is None)
+
+
def test_suite():
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(ImageCompetitionTest))
Modified: PloneImageCompetition/trunk/tests/test_pcimage.py
==============================================================================
--- PloneImageCompetition/trunk/tests/test_pcimage.py (original)
+++ PloneImageCompetition/trunk/tests/test_pcimage.py Thu Jun 23 15:08:22 2005
(at)(at) -18,13 +18,16 (at)(at)
from Products.Archetypes.utils import DisplayList
-from Products.PloneImageCompetition.interfaces import IPCImage
+from Products.PloneImageCompetition.interfaces import IPCImage, \
+IPCVoteableContent
from Products.PloneImageCompetition.PCImage import PCImage
+from Products.PloneImageCompetition.PCVoteableContent import PCVoteableContent
from Products.PloneImageCompetition import config
class PCImageTest(PicTestCase):
- interfaces_to_test = [(IPCImage, PCImage),]
+ interfaces_to_test = [(IPCImage, PCImage),
+ (IPCVoteableContent, PCVoteableContent),]
def test_setContentData(self):
portal = self.getPortal()
|
SVN: r3087 - in AlphaFlow/trunk: . activities tests
Michael Howitz <mh(at)gocept.com> |
2005-06-24 11:55:09 |
[ FULL ]
|
Author: mac
Date: Fri Jun 24 11:49:57 2005
New Revision: 3087
Added:
AlphaFlow/trunk/workflowattr.py (contents, props changed)
Modified:
AlphaFlow/trunk/activities/alarm.py
AlphaFlow/trunk/activities/condition.py
AlphaFlow/trunk/activities/configuration.py
AlphaFlow/trunk/activities/dcworkflow.py
AlphaFlow/trunk/activities/decision.py
AlphaFlow/trunk/activities/expression.py
AlphaFlow/trunk/activities/gates.py
AlphaFlow/trunk/activities/interfaces.py
AlphaFlow/trunk/activities/notify.py
AlphaFlow/trunk/activities/ntask.py
AlphaFlow/trunk/activities/permission.py
AlphaFlow/trunk/activities/recursion.py
AlphaFlow/trunk/activities/review.py
AlphaFlow/trunk/activities/routing.py
AlphaFlow/trunk/activities/task.py
AlphaFlow/trunk/activities/version.py
AlphaFlow/trunk/activity.py
AlphaFlow/trunk/interfaces.py
AlphaFlow/trunk/process.py
AlphaFlow/trunk/tests/test_definition.py
Log:
renamed ActivityAttribute to WorkflowAttribute and moved it to workflowattr.py
added Interface for WorkflowAttribute awareness
Modified: AlphaFlow/trunk/activities/alarm.py
==============================================================================
--- AlphaFlow/trunk/activities/alarm.py (original)
+++ AlphaFlow/trunk/activities/alarm.py Fri Jun 24 11:49:57 2005
(at)(at) -18,7 +18,7 (at)(at)
__implements__ = BaseTalesActivity.__implements__ + (IAlarmActivity, )
meta_type = "AlphaFlow Alarm Activity"
- activity_type = "alarm"
+ activity_type = nodeName = "alarm"
icon = "alarm"
error_string = "TALES expression required which " \
Modified: AlphaFlow/trunk/activities/condition.py
==============================================================================
--- AlphaFlow/trunk/activities/condition.py (original)
+++ AlphaFlow/trunk/activities/condition.py Fri Jun 24 11:49:57 2005
(at)(at) -14,10 +14,10 (at)(at)
# Sibling imports
from Products.AlphaFlow.workitem import registerWorkItem, BaseTalesWorkItem
-from Products.AlphaFlow.activity import \
- registerActivity, BaseTalesActivity, ActivityAttribute
+from Products.AlphaFlow.activity import registerActivity, BaseTalesActivity
from Products.AlphaFlow.interfaces import IConditionActivity,
IConditionWorkItem
from Products.AlphaFlow import utils, config
+from Products.AlphaFlow.workflowattr import WorkflowAttribute
class ConditionActivity(BaseTalesActivity):
(at)(at) -27,13 +27,13 (at)(at)
security = ClassSecurityInfo()
meta_type = "AlphaFlow Condition Activity"
- activity_type = "condition"
+ activity_type = nodeName = "condition"
attributes = BaseTalesActivity.attributes + (
- ActivityAttribute('continue_activity', 'continue_activity', (),
+ WorkflowAttribute('continue_activity', 'continue_activity', (),
'Activities that can follow this automatic
activity.'
), # XXX required
- ActivityAttribute('expression', 'expression', '',
+ WorkflowAttribute('expression', 'expression', '',
'TALES expression which returns list of activities '
'for continuation (must be in continue_activity)!',
importHandler=None, # done by BaseTalesActivity
Modified: AlphaFlow/trunk/activities/configuration.py
==============================================================================
--- AlphaFlow/trunk/activities/configuration.py (original)
+++ AlphaFlow/trunk/activities/configuration.py Fri Jun 24 11:49:57 2005
(at)(at) -16,11 +16,11 (at)(at)
from Products.AlphaFlow.workitem import \
registerWorkItem, BaseAssignableWorkItem, Group
from Products.AlphaFlow.activity import \
- registerActivity, BaseAssignableActivity, ActivityAttribute,
convert_to_xml
+ registerActivity, BaseAssignableActivity, convert_to_xml
from Products.AlphaFlow import utils, config
from Products.AlphaFlow.exception import ConfigurationError
from Products.AlphaFlow.action import Action
-
+from Products.AlphaFlow.workflowattr import WorkflowAttribute
class ConfigurationActivity(BaseAssignableActivity):
(at)(at) -29,18 +29,18 (at)(at)
(IConfigurationActivity, )
meta_type = "AlphaFlow Configuration Activity"
- activity_type = "configuration"
+ activity_type = nodeName = "configuration"
icon = "configuration"
attributes = BaseAssignableActivity.attributes + (
- ActivityAttribute('viewUrlExpression', 'view_url_expr',
+ WorkflowAttribute('viewUrlExpression', 'view_url_expr',
'string:${content/absolute_url}/af_edit_workitem?'
'workitem=${workitem/getId}&action=configure',
'(TALES expression) URL to "view" a workitem, '
'e.g. "Edit document" points to the edit-tab'),
- ActivityAttribute('continue_activity', 'continue_activity', (),
+ WorkflowAttribute('continue_activity', 'continue_activity', (),
'Activity to start after completion.'),
- ActivityAttribute('configures', '', (),
+ WorkflowAttribute('configures', '', (),
'Other activities which are configured by this '
'activity or None as marker for all activities.',
importHandler='attrImport_configure',
Modified: AlphaFlow/trunk/activities/dcworkflow.py
==============================================================================
--- AlphaFlow/trunk/activities/dcworkflow.py (original)
+++ AlphaFlow/trunk/activities/dcworkflow.py Fri Jun 24 11:49:57 2005
(at)(at) -12,10 +12,10 (at)(at)
# Sibling imports
from Products.AlphaFlow.workitem import registerWorkItem,
BaseAutomaticWorkItem
-from Products.AlphaFlow.activity import \
- registerActivity, BaseAutomaticActivity, ActivityAttribute
+from Products.AlphaFlow.activity import registerActivity,
BaseAutomaticActivity
from Products.AlphaFlow.exception import ConfigurationError
from Products.AlphaFlow.interfaces import IDCWorkFlowActivity
+from Products.AlphaFlow.workflowattr import WorkflowAttribute
class DCWorkFlowActivity(BaseAutomaticActivity):
(at)(at) -24,11 +24,11 (at)(at)
IDCWorkFlowActivity,)
meta_type = "AlphaFlow DCWorkFlow Activity"
- activity_type = "dcworkflow"
+ activity_type = nodeName = "dcworkflow"
icon = "dcworkflow"
attributes = BaseAutomaticActivity.attributes + (
- ActivityAttribute('status', 'status', '',
+ WorkflowAttribute('status', 'status', '',
'Status which is set as DCWorkFlow status.'),
)
Modified: AlphaFlow/trunk/activities/decision.py
==============================================================================
--- AlphaFlow/trunk/activities/decision.py (original)
+++ AlphaFlow/trunk/activities/decision.py Fri Jun 24 11:49:57 2005
(at)(at) -12,13 +12,12 (at)(at)
# # Sibling imports
from Products.AlphaFlow.interfaces import IDecisionActivity, IDecisionWorkItem
-from Products.AlphaFlow.workitem import \
- BaseAssignableWorkItem, registerWorkItem
-from Products.AlphaFlow.activity import \
- BaseAssignableActivity, registerActivity, ActivityAttribute
+from Products.AlphaFlow.workitem import BaseAssignableWorkItem,
registerWorkItem
+from Products.AlphaFlow.activity import BaseAssignableActivity,
registerActivity
from Products.AlphaFlow import config, utils
from Products.AlphaFlow.action import Action
from Products.AlphaFlow.exception import ConfigurationError
+from Products.AlphaFlow.workflowattr import WorkflowAttribute
class DecisionActivity(BaseAssignableActivity):
(at)(at) -32,17 +31,17 (at)(at)
BaseAssignableActivity.__implements__
meta_type = "AlphaFlow Decision Activity"
- activity_type = "decision"
+ activity_type = nodeName = "decision"
icon = "decision"
attributes = BaseAssignableActivity.attributes + (
- ActivityAttribute('decision_notice', 'decision_notice', '',
+ WorkflowAttribute('decision_notice', 'decision_notice', '',
'Describing the task for the decision.'),
- ActivityAttribute('decision_modus', 'decision_modus', '',
+ WorkflowAttribute('decision_modus', 'decision_modus', '',
'One of ["first_yes", "all_yes"]'),
- ActivityAttribute('reject_activity', 'reject_activity', (),
+ WorkflowAttribute('reject_activity', 'reject_activity', (),
'Activity if result is "no".'),
- ActivityAttribute('accept_activity', 'accept_activity', (),
+ WorkflowAttribute('accept_activity', 'accept_activity', (),
'Activity if result is "yes".'),
)
Modified: AlphaFlow/trunk/activities/expression.py
==============================================================================
--- AlphaFlow/trunk/activities/expression.py (original)
+++ AlphaFlow/trunk/activities/expression.py Fri Jun 24 11:49:57 2005
(at)(at) -21,11 +21,12 (at)(at)
# Sibling imports
from Products.AlphaFlow.workitem import registerWorkItem,
BaseAutomaticWorkItem
-from Products.AlphaFlow.activity import \
- registerActivity, BaseAutomaticActivity, ActivityAttribute
+from Products.AlphaFlow.activity import registerActivity,
BaseAutomaticActivity
from Products.AlphaFlow.exception import ConfigurationError
-from Products.AlphaFlow.interfaces import IExpressionActivity
-from Products.AlphaFlow.interfaces import IExpressionWorkItem
+from Products.AlphaFlow.interfaces import \
+ IExpressionActivity, IExpressionWorkItem
+from Products.AlphaFlow.workflowattr import WorkflowAttribute
+
class ExpressionActivity(BaseAutomaticActivity):
(at)(at) -33,12 +34,12 (at)(at)
(IExpressionActivity, )
meta_type = "AlphaFlow Expression Activity"
- activity_type = "expression"
+ activity_type = nodeName = "expression"
icon = "expression"
# XXX change this on migration to BaseTalesActivity as base class
attributes = BaseAutomaticActivity.attributes + (
- ActivityAttribute('expression', 'expression', '',
+ WorkflowAttribute('expression', 'expression', '',
'Expression to be called.'),
)
Modified: AlphaFlow/trunk/activities/gates.py
==============================================================================
--- AlphaFlow/trunk/activities/gates.py (original)
+++ AlphaFlow/trunk/activities/gates.py Fri Jun 24 11:49:57 2005
(at)(at) -6,10 +6,10 (at)(at)
# Sibling imports
from Products.AlphaFlow.workitem import registerWorkItem, BaseWorkItem
-from Products.AlphaFlow.activity import \
- registerActivity, BaseAutomaticActivity, ActivityAttribute
+from Products.AlphaFlow.activity import registerActivity,
BaseAutomaticActivity
from Products.AlphaFlow.exception import ConfigurationError
from Products.AlphaFlow.interfaces import IDaemonActivity, IGateActivity
+from Products.AlphaFlow.workflowattr import WorkflowAttribute
class GateActivity(BaseAutomaticActivity):
(at)(at) -17,11 +17,11 (at)(at)
__implements__ = BaseAutomaticActivity.__implements__ + (IDaemonActivity,
IGateActivity)
meta_type = "AlphaFlow Gate Activity"
- activity_type = "gate"
+ activity_type = nodeName = "gate"
icon = "gate"
attributes = BaseAutomaticActivity.attributes + (
- ActivityAttribute('mode', 'mode', '',
+ WorkflowAttribute('mode', 'mode', '',
'Mode the gate works, values see self.mode_types'),
)
Modified: AlphaFlow/trunk/activities/interfaces.py
==============================================================================
--- AlphaFlow/trunk/activities/interfaces.py (original)
+++ AlphaFlow/trunk/activities/interfaces.py Fri Jun 24 11:49:57 2005
(at)(at) -27,7 +27,7 (at)(at)
class INTaskActivity(IActivity):
"""Generalized task (task + decision about continuation)"""
-class IExit(IDOMExportable):
+class IExit(IWorkflowAttributeAware, IDOMExportable, IDOMExportable):
"""Exit for INTaskActivity."""
(at)(at) -70,7 +70,8 (at)(at)
(permission, roles, acquire)
"""
-class IPermissionSetting(IDOMExportable):
+class IPermissionSetting(IWorkflowAttributeAware,
+ IDOMExportable, IDOMExportable):
"""Permission Setting for IPermissionActivity."""
class IPermissionWorkItem(IAutomaticWorkItem):
(at)(at) -100,7 +101,8 (at)(at)
"""Implements the sending of the email."""
-class IEMailRecipientMode(IDOMConfigurable):
+class IEMailRecipientMode(IWorkflowAttributeAware, IDOMConfigurable,
+ IDOMExportable):
"""Configure which users are recipients for an email activity."""
def getRecipientsForWorkItem(workitem):
Modified: AlphaFlow/trunk/activities/notify.py
==============================================================================
--- AlphaFlow/trunk/activities/notify.py (original)
+++ AlphaFlow/trunk/activities/notify.py Fri Jun 24 11:49:57 2005
(at)(at) -21,11 +21,12 (at)(at)
listMembersWithRolesAndLocalRoles
from Products.AlphaFlow.workitem import registerWorkItem,
BaseAutomaticWorkItem
from Products.AlphaFlow.activity import \
- registerActivity, BaseAutomaticActivity, ActivityAttribute, DOMExporter,
\
- setActivityAttributes
+ registerActivity, BaseAutomaticActivity, DOMExporter
from Products.AlphaFlow.exception import ConfigurationError
from Products.AlphaFlow.interfaces import \
IEMailActivity, IEMailWorkItem, IEMailRecipientMode
+from Products.AlphaFlow.workflowattr import \
+ WorkflowAttribute, InitializeWorkflowAttributes
(at)(at) -35,17 +36,17 (at)(at)
(IEMailActivity, )
meta_type = "AlphaFlow EMail Activity"
- activity_type = "email"
+ activity_type = nodeName = "email"
icon = "email"
attributes = BaseAutomaticActivity.attributes + (
- ActivityAttribute('template', 'template', '',
+ WorkflowAttribute('template', 'template', '',
'ID of a DTML-Method-Object being available from '
'portal root.'),
- ActivityAttribute('mailSubject', 'mailSubject',
+ WorkflowAttribute('mailSubject', 'mailSubject',
'AlphaFlow notification message',
'Static subject line for the mails sent.'),
- ActivityAttribute('recipientModes', '', (),
+ WorkflowAttribute('recipientModes', '', (),
'One of ["owner", "next_assignees", "actual_role"] '
'who will get the email.',
importHandler="attrImport_email",
(at)(at) -193,7 +194,8 (at)(at)
__implements__ = (IEMailRecipientMode, )
- activity_type = "recipient"
+ nodeName = "recipient"
+ attributes = ()
def configureFromDOMNode(self, node):
"""Configures the activity from the given DOM node."""
(at)(at) -204,7 +206,7 (at)(at)
class RecipientOwner(AbstractRecipent):
"""Recipient mode for notifying the owner of a process."""
- attributes = (ActivityAttribute('mode_name', 'type', 'owner',
+ attributes = (WorkflowAttribute('mode_name', 'type', 'owner',
'Identifier for a specific mode.',
importHandler=None),
)
(at)(at) -220,7 +222,7 (at)(at)
class RecipientNextAssignees(AbstractRecipent):
"""Recipient mode for notifying the assignee of the next workitems."""
- attributes = (ActivityAttribute('mode_name', 'type', 'next_assignees',
+ attributes = (WorkflowAttribute('mode_name', 'type', 'next_assignees',
'Identifier for a specific mode.',
importHandler=None),
)
(at)(at) -244,10 +246,10 (at)(at)
class RecipientActualRole(AbstractRecipent):
"""Recipient mode for notifying users with one of the given roles."""
- attributes = (ActivityAttribute('mode_name', 'type', 'actual_role',
+ attributes = (WorkflowAttribute('mode_name', 'type', 'actual_role',
'Identifier for a specific mode.',
importHandler=None),
- ActivityAttribute('roles', 'roles', (),
+ WorkflowAttribute('roles', 'roles', (),
'Members with this roles get an e-mail.'),
)
(at)(at) -280,9 +282,9 (at)(at)
# register the stuff
registerActivity(EMailActivity)
registerWorkItem(EMailWorkItem)
-setActivityAttributes(RecipientOwner)
-setActivityAttributes(RecipientNextAssignees)
-setActivityAttributes(RecipientActualRole)
+InitializeWorkflowAttributes(RecipientOwner)
+InitializeWorkflowAttributes(RecipientNextAssignees)
+InitializeWorkflowAttributes(RecipientActualRole)
registerEMailRecipientMode(RecipientOwner)
registerEMailRecipientMode(RecipientNextAssignees)
registerEMailRecipientMode(RecipientActualRole)
Modified: AlphaFlow/trunk/activities/ntask.py
==============================================================================
--- AlphaFlow/trunk/activities/ntask.py (original)
+++ AlphaFlow/trunk/activities/ntask.py Fri Jun 24 11:49:57 2005
(at)(at) -16,23 +16,25 (at)(at)
from Products.AlphaFlow.workitem import \
registerWorkItem, BaseAssignableWorkItem
from Products.AlphaFlow.activity import \
- registerActivity, BaseAssignableActivity, ActivityAttribute, \
- setActivityAttributes, DOMExporter
+ registerActivity, BaseAssignableActivity, DOMExporter
from Products.AlphaFlow import config, utils
from Products.AlphaFlow.exception import ConfigurationError
from Products.AlphaFlow.action import Action
+from Products.AlphaFlow.workflowattr import \
+ WorkflowAttribute, InitializeWorkflowAttributes
+
class Exit(Persistent, DOMExporter):
__implements__ = (IExit, )
- activity_type = "exit"
+ nodeName = "exit"
attributes = (
- ActivityAttribute('id', 'id', None,
+ WorkflowAttribute('id', 'id', None,
'Id of the exit.'),
- ActivityAttribute('title', 'title', None,
+ WorkflowAttribute('title', 'title', None,
'Title of the exit.'),
- ActivityAttribute('activities', 'activities', (),
+ WorkflowAttribute('activities', 'activities', (),
'Continue activities if this exit gets chosen.'),
)
(at)(at) -49,11 +51,11 (at)(at)
__implements__ = BaseAssignableActivity.__implements__ + (INTaskActivity,
)
meta_type = "AlphaFlow NTask Activity"
- activity_type = "ntask"
+ activity_type = nodeName = "ntask"
icon = "ntask"
attributes = BaseAssignableActivity.attributes + (
- ActivityAttribute('exits', '', (),
+ WorkflowAttribute('exits', '', (),
'Tuple of IExit objects',
importHandler="attrImport_ntask",
exportHandler="_attr_export_ntask"),
(at)(at) -180,6 +182,6 (at)(at)
# register the stuff
-setActivityAttributes(Exit)
+InitializeWorkflowAttributes(Exit)
registerActivity(NTaskActivity)
registerWorkItem(NTaskWorkItem)
Modified: AlphaFlow/trunk/activities/permission.py
==============================================================================
--- AlphaFlow/trunk/activities/permission.py (original)
+++ AlphaFlow/trunk/activities/permission.py Fri Jun 24 11:49:57 2005
(at)(at) -17,10 +17,11 (at)(at)
IPermissionActivity, IPermissionWorkItem, IPermissionSetting
from Products.AlphaFlow.workitem import registerWorkItem,
BaseAutomaticWorkItem
from Products.AlphaFlow.activity import \
- registerActivity, BaseAutomaticActivity, ActivityAttribute, DOMExporter,
\
- setActivityAttributes
+ registerActivity, BaseAutomaticActivity, DOMExporter
from Products.AlphaFlow.utils import \
modifyRolesForPermission, makeBoolFromUnicode, flexSplit
+from Products.AlphaFlow.workflowattr import \
+ WorkflowAttribute, InitializeWorkflowAttributes
from Products.AlphaFlow.exception import ConfigurationError
from Products.AlphaFlow import config
(at)(at) -28,13 +29,12 (at)(at)
__implements__ = (IPermissionSetting, )
- activity_type = "permission" # no real activity
-
- attributes = (ActivityAttribute('permission', 'name', '',
+ nodeName = "permission"
+ attributes = (WorkflowAttribute('permission', 'name', '',
'The permission affected.'),
- ActivityAttribute('roles', 'roles', '',
+ WorkflowAttribute('roles', 'roles', '',
'Sequence of affected roles.'),
- ActivityAttribute('acquire', 'acquire', '',
+ WorkflowAttribute('acquire', 'acquire', '',
'(bool) acquire permission or not.'),
)
(at)(at) -66,7 +66,7 (at)(at)
if not permission_valid:
raise ValueError, "The permission %r is invalid." % permission
-setActivityAttributes(PermissionSetting)
+InitializeWorkflowAttributes(PermissionSetting)
class PermissionActivity(BaseAutomaticActivity):
(at)(at) -76,11 +76,11 (at)(at)
security = ClassSecurityInfo()
meta_type = "AlphaFlow Permission Activity"
- activity_type = "permission-change"
+ activity_type = nodeName = "permission-change"
icon = "permission-change"
attributes = BaseAutomaticActivity.attributes + (
- ActivityAttribute('permissions', '', (),
+ WorkflowAttribute('permissions', '', (),
'Tuple of IPermissionSettings',
importHandler="attrImport_permission",
exportHandler="_attr_export_permission"),
Modified: AlphaFlow/trunk/activities/recursion.py
==============================================================================
--- AlphaFlow/trunk/activities/recursion.py (original)
+++ AlphaFlow/trunk/activities/recursion.py Fri Jun 24 11:49:57 2005
(at)(at) -14,9 +14,10 (at)(at)
# Sibling imports
from Products.AlphaFlow.workitem import registerWorkItem,
BaseAutomaticWorkItem
from Products.AlphaFlow.activity import \
- registerActivity, BaseAutomaticActivity, ActivityAttribute
+ registerActivity, BaseAutomaticActivity
from Products.AlphaFlow import config, utils
from Products.AlphaFlow.interfaces import IDaemonActivity
+from Products.AlphaFlow.workflowattr import WorkflowAttribute
import zLOG
(at)(at) -26,15 +27,15 (at)(at)
__implements__ = BaseAutomaticActivity.__implements__ + (IDaemonActivity,)
meta_type = "AlphaFlow Recursion Activity"
- activity_type = "recursion"
+ activity_type = nodeName = "recursion"
icon = "recursion"
attributes = BaseAutomaticActivity.attributes + (
- ActivityAttribute('recursion_activity', 'recursion_activity', (),
+ WorkflowAttribute('recursion_activity', 'recursion_activity', (),
'Activities which will get called recursively.'),
- ActivityAttribute('break_activities', 'break_activities', (),
+ WorkflowAttribute('break_activities', 'break_activities', (),
'Activities which stop recursion.'),
- ActivityAttribute('optional_recursion', 'optional_recursion', True,
+ WorkflowAttribute('optional_recursion', 'optional_recursion', True,
'User can select via UI if recursion should be '
'called.',
importHandler="_attr_import_bool"),
Modified: AlphaFlow/trunk/activities/review.py
==============================================================================
--- AlphaFlow/trunk/activities/review.py (original)
+++ AlphaFlow/trunk/activities/review.py Fri Jun 24 11:49:57 2005
(at)(at) -17,10 +17,10 (at)(at)
from Products.AlphaFlow.interfaces import IReviewActivity, IReviewWorkItem
from Products.AlphaFlow.workitem import \
BaseAssignableWorkItem, registerWorkItem
-from Products.AlphaFlow.activity import \
- BaseAssignableActivity, registerActivity, ActivityAttribute
+from Products.AlphaFlow.activity import BaseAssignableActivity,
registerActivity
from Products.AlphaFlow import config, utils
from Products.AlphaFlow.action import Action
+from Products.AlphaFlow.workflowattr import WorkflowAttribute
# deprecated, use DecisionActivity instead
(at)(at) -33,14 +33,14 (at)(at)
__implements__ = (IReviewActivity,) +
BaseAssignableActivity.__implements__
meta_type = "AlphaFlow Review Activity"
- activity_type = "review"
+ activity_type = nodeName = "review"
attributes = BaseAssignableActivity.attributes + (
- ActivityAttribute('review_notice', 'review_notice', '',
+ WorkflowAttribute('review_notice', 'review_notice', '',
'Describing the review role.'),
- ActivityAttribute('reject_activity', 'reject_activity', (),
+ WorkflowAttribute('reject_activity', 'reject_activity', (),
'Activity if one votes "no".'),
- ActivityAttribute('accept_activity', 'accept_activity', (),
+ WorkflowAttribute('accept_activity', 'accept_activity', (),
'Activity if all vote "yes".'),
)
(at)(at) -108,7 +108,7 (at)(at)
# deprecated, use DecisionActivity instead
class RolebasedReviewActivity(ReviewActivity):
- activity_type = 'rolebased-review'
+ activity_type = nodeName = 'rolebased-review'
configurationSchema = None
Modified: AlphaFlow/trunk/activities/routing.py
==============================================================================
--- AlphaFlow/trunk/activities/routing.py (original)
+++ AlphaFlow/trunk/activities/routing.py Fri Jun 24 11:49:57 2005
(at)(at) -9,11 +9,11 (at)(at)
# Sibling imports
from Products.AlphaFlow.workitem import registerWorkItem, BaseWorkItem
-from Products.AlphaFlow.activity import \
- registerActivity, BaseActivity, ActivityAttribute
+from Products.AlphaFlow.activity import registerActivity, BaseActivity
from Products.AlphaFlow import config
from Products.AlphaFlow.utils import killWorkItemRecursively
from Products.AlphaFlow.interfaces import IRoutingActivity, IRoutingWorkItem
+from Products.AlphaFlow.workflowattr import WorkflowAttribute
class RoutingActivity(BaseActivity):
(at)(at) -35,15 +35,15 (at)(at)
security = ClassSecurityInfo()
meta_type = "AlphaFlow Routing Activity"
- activity_type = "route"
+ activity_type = nodeName = "route"
icon = "route"
attributes = BaseActivity.attributes + (
- ActivityAttribute('gates', '', (),
+ WorkflowAttribute('gates', '', (),
'Gate activities inside the route.',
importHandler="attrImport_route",
exportHandler="_attr_export_route"),
- ActivityAttribute('routes', '', (),
+ WorkflowAttribute('routes', '', (),
'All activities inside route which are no gates.',
importHandler=None, # done by handler above
exportHandler=None),
Modified: AlphaFlow/trunk/activities/task.py
==============================================================================
--- AlphaFlow/trunk/activities/task.py (original)
+++ AlphaFlow/trunk/activities/task.py Fri Jun 24 11:49:57 2005
(at)(at) -12,13 +12,12 (at)(at)
# Sibling imports
from Products.AlphaFlow.interfaces import ITaskActivity, ITaskWorkItem
-from Products.AlphaFlow.workitem import\
- registerWorkItem, BaseAssignableWorkItem
-from Products.AlphaFlow.activity import \
- registerActivity, BaseAssignableActivity, ActivityAttribute
+from Products.AlphaFlow.workitem import registerWorkItem,
BaseAssignableWorkItem
+from Products.AlphaFlow.activity import registerActivity,
BaseAssignableActivity
from Products.AlphaFlow import config, utils
from Products.AlphaFlow.action import Action
from Products.AlphaFlow.exception import ConfigurationError
+from Products.AlphaFlow.workflowattr import WorkflowAttribute
class TaskActivity(BaseAssignableActivity):
(at)(at) -26,11 +25,11 (at)(at)
__implements__ = BaseAssignableActivity.__implements__ + (ITaskActivity, )
meta_type = "AlphaFlow Task Activity"
- activity_type = "task"
+ activity_type = nodeName = "task"
icon = "task"
attributes = BaseAssignableActivity.attributes + (
- ActivityAttribute('completion_activity', 'completion_activity', (),
+ WorkflowAttribute('completion_activity', 'completion_activity', (),
'Activity to start after completion.'),
)
Modified: AlphaFlow/trunk/activities/version.py
==============================================================================
--- AlphaFlow/trunk/activities/version.py (original)
+++ AlphaFlow/trunk/activities/version.py Fri Jun 24 11:49:57 2005
(at)(at) -18,7 +18,7 (at)(at)
class VersioningActivity(BaseAutomaticActivity):
meta_type = "AlphaFlow Versioning Activity"
- activity_type = "version"
+ activity_type = nodeName = "version"
icon = "version"
Modified: AlphaFlow/trunk/activity.py
==============================================================================
--- AlphaFlow/trunk/activity.py (original)
+++ AlphaFlow/trunk/activity.py Fri Jun 24 11:49:57 2005
(at)(at) -21,46 +21,11 (at)(at)
# Sibling imports
from Products.AlphaFlow.interfaces import \
IActivity, IAutomaticActivity, IInstance, ITalesActivity, \
- IAssignableActivity, IActivityAttribute
+ IAssignableActivity
from Products.AlphaFlow import config, utils
from Products.AlphaFlow.exception import ConfigurationError
-
-
-class ActivityAttribute:
- """Attribute for an activity ... data used by import and export"""
-
- __implements__ = (IActivityAttribute,)
-
- classAttr = None
- domAttr = None
- default = ""
- description = ""
- importHandler = "_attr_import_simple"
- exportHandler = "_attr_export_simple"
-
- def __init__(self, classAttr, domAttr, default, description,
- importHandler="_attr_import_simple",
- exportHandler="_attr_export_simple"):
- if not isinstance(classAttr, str):
- raise ValueError, "classAttr must be a string."
- self.classAttr = classAttr
- if not isinstance(domAttr, str):
- raise ValueError, "domAttr must be a string."
- self.domAttr = domAttr
- self.default = default
- self.description = description
- if not (isinstance(importHandler, str) or importHandler is None):
- raise ValueError, "importHandler must be a string or None."
- self.importHandler = importHandler
- if not (isinstance(exportHandler, str) or exportHandler is None):
- raise ValueError, "exportHandler must be a string or None."
- self.exportHandler = exportHandler
-
- def __repr__(self):
- return "ActivityAttribute(%s, %s, %s)" % (self.classAttr,
- self.domAttr,
- self.default)
-
+from Products.AlphaFlow.workflowattr import \
+ WorkflowAttribute, InitializeWorkflowAttributes, findAttrInAttributes
class DOMExporter:
"""Mixin class with DOM export capabilities."""
(at)(at) -74,7 +39,7 (at)(at)
doc = node.ownerDocument # node inside
else:
doc = node # Document itself
- activity = node.appendChild(doc.createElement(self.activity_type))
+ activity = node.appendChild(doc.createElement(self.nodeName))
for attr in self.attributes:
if attr.exportHandler is None:
continue
(at)(at) -116,24 +81,24 (at)(at)
__implements__ = SimpleItem.__implements__ + (IActivity,)
security = ClassSecurityInfo()
- activity_type = None
+ activity_type = nodeName = None
configurationSchema = None
icon = "generic"
attributes = (
- ActivityAttribute('id', 'id', None,
+ WorkflowAttribute('id', 'id', None,
'Id of the activity.',
importHandler=None,
exportHandler="_attr_export_id"),
- ActivityAttribute('title', 'title', '',
+ WorkflowAttribute('title', 'title', '',
'Title of the activity.'),
- ActivityAttribute('sortPriority', 'sort', 0,
+ WorkflowAttribute('sortPriority', 'sort', 0,
'Lower priority activities will be shown first.',
importHandler="_attr_import_int"),
- ActivityAttribute('nonEditableFields', 'nonEditableFields', (),
+ WorkflowAttribute('nonEditableFields', 'nonEditableFields', (),
'Fields in schema which are not to be edited '
'aka configured by user of workflow.'),
- ActivityAttribute('startActivity', 'startActivity', (),
+ WorkflowAttribute('startActivity', 'startActivity', (),
'Workitems to be spawned just before the '
'workitem for this activity is started.'),
)
(at)(at) -206,7 +171,7 (at)(at)
SimpleItem.manage_options)
attributes = BaseActivity.attributes + (
- ActivityAttribute('continue_activity', 'continue_activity', (),
+ WorkflowAttribute('continue_activity', 'continue_activity', (),
'A list of activities that follow this'
'automatic activity. (single exit)'),
)
(at)(at) -254,23 +219,23 (at)(at)
)
attributes = BaseActivity.attributes + (
- ActivityAttribute('viewUrlExpression', 'view_url_expr',
+ WorkflowAttribute('viewUrlExpression', 'view_url_expr',
'string:${content/absolute_url}/view',
'(TALES expression) URL to "view" a workitem, '
'e.g. "Edit document" points to the edit-tab'),
- ActivityAttribute('contentRoles', 'content_roles', None,
+ WorkflowAttribute('contentRoles', 'content_roles', None,
'Roles which assigned users get on the '
'content object.'),
- ActivityAttribute('assigneesKind', 'kind', 'possible',
+ WorkflowAttribute('assigneesKind', 'kind', 'possible',
'Defines the user assignment method, either '
'"possible" or "actual".',
importHandler="_attr_import_assignees",
exportHandler="_attr_export_assignees"),
- ActivityAttribute('roles', 'roles', (),
+ WorkflowAttribute('roles', 'roles', (),
'Roles to compute which members are assignees',
importHandler=None, # done by attr_import_assignees
(see above)
exportHandler=None),
- ActivityAttribute('assigneesExpression', 'expression', None,
+ WorkflowAttribute('assigneesExpression', 'expression', None,
'Tales Expression returning a list of member ids, '
'may be None.',
importHandler=None,
(at)(at) -439,7 +404,7 (at)(at)
icon = "basetalesactivity"
attributes = BaseAutomaticActivity.attributes + (
- ActivityAttribute('expression', 'expression', '',
+ WorkflowAttribute('expression', 'expression', '',
'TALES expression which is to be executed.'),
)
(at)(at) -482,32 +447,15 (at)(at)
return ''
raise ValueError, "Don't know how to handle '%s'." % value
-def findAttrInAttributes(activity, classAttr):
- """Find classAttr in ActivityAttributes of activity."""
- for attr in activity.attributes:
- if attr.classAttr == classAttr:
- return attr
-
-
###################
# activity registry
activity_registry = {}
-activity_attributes_registry = {}
-
-def setActivityAttributes(activity):
- "Write the ActivityAttribute to the activity class."
- for attribute in activity.attributes:
- setattr(activity, attribute.classAttr, attribute.default)
- activity_attributes_registry[activity.activity_type] = activity
-
-def getActivityAttributes(activity_type):
- return activity_attributes_registry[activity_type].attributes
def registerActivity(activity):
InitializeClass(activity)
- setActivityAttributes(activity)
+ InitializeWorkflowAttributes(activity)
activity_registry[activity.activity_type] = activity
def getActivity(activity_type):
Modified: AlphaFlow/trunk/interfaces.py
==============================================================================
--- AlphaFlow/trunk/interfaces.py (original)
+++ AlphaFlow/trunk/interfaces.py Fri Jun 24 11:49:57 2005
(at)(at) -18,8 +18,6 (at)(at)
class IDOMExportable(Interface):
"""Implemented by objects which can export itself into a DOM."""
- activity_type = Attribute('NodeName in the DOM.')
-
def writeDOM(node):
"""Write the activity into dom node.
(at)(at) -33,6 +31,11 (at)(at)
If REQUEST is given mime-type is set.
"""
+class IWorkflowAttributeAware(Interface):
+ """Class implementing this interface uses IWorkflowAttributes."""
+
+ attributes = Attribute("Tuple of IWorkflowAttributes")
+ nodeName = Attribute("NodeName in DOM.")
class IContentObjectRetriever(Interface):
(at)(at) -242,7 +245,7 (at)(at)
"""detach all (current and old) instances"""
-class IProcess(IDOMConfigurable):
+class IProcess(IWorkflowAttributeAware, IDOMConfigurable, IDOMExportable):
"""A process definition."""
id = Attribute("Id of this process definition.")
(at)(at) -281,15 +284,12 (at)(at)
"""Exports process as XML-String."""
-class IActivity(IDOMConfigurable, IDOMExportable):
+class IActivity(IWorkflowAttributeAware, IDOMConfigurable, IDOMExportable):
"""A workflow activity.
These are the building blocks for process definitions.
"""
-
- attributes = Attribute("Tuple of IActivityAttribute instances which "
- "configure the attributes of the activity.")
-
+
configurationSchema = Attribute(
"An AT schema that can be used to configure a process instance "
"including this activity.")
(at)(at) -706,7 +706,7 (at)(at)
completed when only daemon activities are left."""
-class IActivityAttribute(Interface):
+class IWorkflowAttribute(Interface):
"""Attribute for an activity ... data used by import and export"""
classAttr = Attribute("Name of the attribute in the activity class.")
Modified: AlphaFlow/trunk/process.py
==============================================================================
--- AlphaFlow/trunk/process.py (original)
+++ AlphaFlow/trunk/process.py Fri Jun 24 11:49:57 2005
(at)(at) -20,10 +20,10 (at)(at)
from Products.AlphaFlow.interfaces import IProcess
from Products.AlphaFlow import utils, config
from Products.AlphaFlow.exception import ConfigurationError
-from Products.AlphaFlow.activity import \
- listActivities, getActivity, ActivityAttribute, setActivityAttributes, \
- DOMExporter
+from Products.AlphaFlow.activity import listActivities, getActivity,
DOMExporter
from Products.AlphaFlow.adapters.renderableadapter import getRenderableAdapter
+from Products.AlphaFlow.workflowattr import \
+ WorkflowAttribute, InitializeWorkflowAttributes
manage_addProcessForm=PageTemplateFile('www/addProcess', globals())
def manage_addProcess(self, id, REQUEST=None):
(at)(at) -36,15 +36,15 (at)(at)
meta_type = "AlphaFlow Process"
security = ClassSecurityInfo()
- activity_type = "workflow"
+ nodeName = "workflow"
attributes = (
- ActivityAttribute('title', 'title', '',
+ WorkflowAttribute('title', 'title', '',
'Title of this process definition.'),
- ActivityAttribute('startActivity', 'startActivity', (),
+ WorkflowAttribute('startActivity', 'startActivity', (),
'List of activity ids to instantiate at start.'),
- ActivityAttribute('description', 'description', '',
+ WorkflowAttribute('description', 'description', '',
'Description of this process definition.'),
- ActivityAttribute('roles', 'onlyAllowRoles', [],
+ WorkflowAttribute('roles', 'onlyAllowRoles', [],
'Only members with this roles my start this
workflow.'
),
)
(at)(at) -218,4 +218,4 (at)(at)
utils.modifyRolesForPermission(self, config.INIT_PROCESS, roles)
InitializeClass(Process)
-setActivityAttributes(Process)
+InitializeWorkflowAttributes(Process)
Modified: AlphaFlow/trunk/tests/test_definition.py
==============================================================================
--- AlphaFlow/trunk/tests/test_definition.py (original)
+++ AlphaFlow/trunk/tests/test_definition.py Fri Jun 24 11:49:57 2005
(at)(at) -28,24 +28,26 (at)(at)
from Products.AlphaFlow.interfaces import \
IProcess, IAlphaFlowed, IInstance, IActivity, \
IWorkItem, IAutomaticWorkItem, IAction, IReviewWorkItem, IReviewActivity,
\
- IActivityAttribute, ITalesActivity, IAssignableActivity,
IAutomaticActivity, \
+ IWorkflowAttribute, ITalesActivity, IAssignableActivity,
IAutomaticActivity, \
IExit, IPermissionSetting
from Products.AlphaFlow.workflowedobject import AlphaFlowed
from Products.AlphaFlow.instance import Instance
from Products.AlphaFlow.process import Process
from Products.AlphaFlow.activity import \
- listActivities, getActivity, ActivityAttribute, BaseTalesActivity, \
- BaseAssignableActivity, BaseActivity, BaseAutomaticActivity, \
- getActivityAttributes, findAttrInAttributes, convert_to_xml
+ listActivities, getActivity, BaseTalesActivity, BaseAssignableActivity, \
+ BaseActivity, BaseAutomaticActivity, convert_to_xml
from Products.AlphaFlow import config
from Products.AlphaFlow.workitem import \
- BaseWorkItem, BaseAutomaticWorkItem, \
- getWorkItemClass, listWorkItems
+ BaseWorkItem, BaseAutomaticWorkItem, getWorkItemClass, listWorkItems
from Products.AlphaFlow.action import Action
from Products.AlphaFlow.activities.review import ReviewWorkItem,
ReviewActivity
from Products.AlphaFlow.activities.permission import PermissionSetting
from Products.AlphaFlow.utils import flexSplit, unique
from Products.AlphaFlow.exception import ConfigurationError
+from Products.AlphaFlow.workflowattr import \
+ WorkflowAttribute, InitializeWorkflowAttributes, getWorkflowAttributes, \
+ findAttrInAttributes
+
_chars = 'abcdefghijklmnopqrstuvwxyz'
_ids_used = {}
(at)(at) -80,7 +82,7 (at)(at)
(IAction, Action),
(IProcess, Process),
(IReviewActivity, ReviewActivity),
- (IActivityAttribute, ActivityAttribute),
+ (IWorkflowAttribute, WorkflowAttribute),
(ITalesActivity, BaseTalesActivity),
(IAssignableActivity, BaseAssignableActivity),
(IActivity, BaseActivity),
(at)(at) -131,7 +133,7 (at)(at)
def _filter_relevant_attrs(self, node):
"""Get a sorted list of the relevant (not empty, not default)
attributes."""
try:
- act_attrs = getActivityAttributes(node.nodeName)
+ act_attrs = getWorkflowAttributes(node.nodeName)
except KeyError:
if node.nodeName == 'assignees':
task = getActivity('task')
Added: AlphaFlow/trunk/workflowattr.py
==============================================================================
--- (empty file)
+++ AlphaFlow/trunk/workflowattr.py Fri Jun 24 11:49:57 2005
(at)(at) -0,0 +1,70 (at)(at)
+# Copyright (c) 2005 gocept gmbh & co. kg
+# See also LICENSE.txt
+# $Id$
+"""WorkflowAttribute definitions and helpers"""
+
+# Sibling imports
+from Products.AlphaFlow.interfaces import IWorkflowAttribute
+
+
+class WorkflowAttribute:
+ """Attribute on objects in workflow (activity, process, ...)
+
+ data used for import and export
+ """
+
+ __implements__ = (IWorkflowAttribute,)
+
+ classAttr = None
+ domAttr = None
+ default = ""
+ description = ""
+ importHandler = "_attr_import_simple"
+ exportHandler = "_attr_export_simple"
+
+ def __init__(self, classAttr, domAttr, default, description,
+ importHandler="_attr_import_simple",
+ exportHandler="_attr_export_simple"):
+ if not isinstance(classAttr, str):
+ raise ValueError, "classAttr must be a string."
+ self.classAttr = classAttr
+ if not isinstance(domAttr, str):
+ raise ValueError, "domAttr must be a string."
+ self.domAttr = domAttr
+ self.default = default
+ self.description = description
+ if not (isinstance(importHandler, str) or importHandler is None):
+ raise ValueError, "importHandler must be a string or None."
+ self.importHandler = importHandler
+ if not (isinstance(exportHandler, str) or exportHandler is None):
+ raise ValueError, "exportHandler must be a string or None."
+ self.exportHandler = exportHandler
+
+ def __repr__(self):
+ return "WorkflowAttribute(%s, %s, %s)" % (self.classAttr,
+ self.domAttr,
+ self.default)
+
+def findAttrInAttributes(klass, classAttr):
+ """Find classAttr in WorkflowAttributes of klass."""
+ for attr in klass.attributes:
+ if attr.classAttr == classAttr:
+ return attr
+
+
+##########
+# registry
+
+_workflow_attributes_registry = {}
+
+def InitializeWorkflowAttributes(klass):
+ "Write the WorkflowAttribute on the class object klass."
+ for attribute in klass.attributes:
+ setattr(klass, attribute.classAttr, attribute.default)
+ _workflow_attributes_registry[klass.nodeName] = klass
+
+def getWorkflowAttributes(nodeName):
+ "Get the WorkflowAttributes for a class' nodeName."
+ return _workflow_attributes_registry[nodeName].attributes
+
+
|
SVN: r3088 - in AlphaFlow/trunk: . activities tests
Michael Howitz <mh(at)gocept.com> |
2005-06-24 12:19:13 |
[ FULL ]
|
Author: mac
Date: Fri Jun 24 12:14:29 2005
New Revision: 3088
Added:
AlphaFlow/trunk/importexport.py (contents, props changed)
Modified:
AlphaFlow/trunk/activities/configuration.py
AlphaFlow/trunk/activities/notify.py
AlphaFlow/trunk/activities/ntask.py
AlphaFlow/trunk/activities/permission.py
AlphaFlow/trunk/activity.py
AlphaFlow/trunk/process.py
AlphaFlow/trunk/tests/test_definition.py
Log:
moved DOMExporter and convert_to_xml to importexport.py
Modified: AlphaFlow/trunk/activities/configuration.py
==============================================================================
--- AlphaFlow/trunk/activities/configuration.py (original)
+++ AlphaFlow/trunk/activities/configuration.py Fri Jun 24 12:14:29 2005
(at)(at) -15,12 +15,12 (at)(at)
IConfigurationActivity, IConfigurationWorkItem
from Products.AlphaFlow.workitem import \
registerWorkItem, BaseAssignableWorkItem, Group
-from Products.AlphaFlow.activity import \
- registerActivity, BaseAssignableActivity, convert_to_xml
+from Products.AlphaFlow.activity import registerActivity,
BaseAssignableActivity
from Products.AlphaFlow import utils, config
from Products.AlphaFlow.exception import ConfigurationError
from Products.AlphaFlow.action import Action
from Products.AlphaFlow.workflowattr import WorkflowAttribute
+from Products.AlphaFlow.importexport import convert_to_xml
class ConfigurationActivity(BaseAssignableActivity):
Modified: AlphaFlow/trunk/activities/notify.py
==============================================================================
--- AlphaFlow/trunk/activities/notify.py (original)
+++ AlphaFlow/trunk/activities/notify.py Fri Jun 24 12:14:29 2005
(at)(at) -17,17 +17,16 (at)(at)
from Products.CMFCore.utils import getToolByName
# Sibling imports
-from Products.AlphaFlow.utils import unique, flexSplit, \
- listMembersWithRolesAndLocalRoles
+from Products.AlphaFlow.utils import \
+ unique, flexSplit, listMembersWithRolesAndLocalRoles
from Products.AlphaFlow.workitem import registerWorkItem,
BaseAutomaticWorkItem
-from Products.AlphaFlow.activity import \
- registerActivity, BaseAutomaticActivity, DOMExporter
+from Products.AlphaFlow.activity import registerActivity,
BaseAutomaticActivity
from Products.AlphaFlow.exception import ConfigurationError
from Products.AlphaFlow.interfaces import \
IEMailActivity, IEMailWorkItem, IEMailRecipientMode
from Products.AlphaFlow.workflowattr import \
WorkflowAttribute, InitializeWorkflowAttributes
-
+from Products.AlphaFlow.importexport import DOMExporter
class EMailActivity(BaseAutomaticActivity):
Modified: AlphaFlow/trunk/activities/ntask.py
==============================================================================
--- AlphaFlow/trunk/activities/ntask.py (original)
+++ AlphaFlow/trunk/activities/ntask.py Fri Jun 24 12:14:29 2005
(at)(at) -13,16 +13,14 (at)(at)
# Sibling imports
from Products.AlphaFlow.interfaces import INTaskActivity, INTaskWorkItem,
IExit
-from Products.AlphaFlow.workitem import \
- registerWorkItem, BaseAssignableWorkItem
-from Products.AlphaFlow.activity import \
- registerActivity, BaseAssignableActivity, DOMExporter
+from Products.AlphaFlow.workitem import registerWorkItem,
BaseAssignableWorkItem
+from Products.AlphaFlow.activity import registerActivity,
BaseAssignableActivity
from Products.AlphaFlow import config, utils
from Products.AlphaFlow.exception import ConfigurationError
from Products.AlphaFlow.action import Action
from Products.AlphaFlow.workflowattr import \
WorkflowAttribute, InitializeWorkflowAttributes
-
+from Products.AlphaFlow.importexport import DOMExporter
class Exit(Persistent, DOMExporter):
Modified: AlphaFlow/trunk/activities/permission.py
==============================================================================
--- AlphaFlow/trunk/activities/permission.py (original)
+++ AlphaFlow/trunk/activities/permission.py Fri Jun 24 12:14:29 2005
(at)(at) -16,14 +16,14 (at)(at)
from Products.AlphaFlow.interfaces import \
IPermissionActivity, IPermissionWorkItem, IPermissionSetting
from Products.AlphaFlow.workitem import registerWorkItem,
BaseAutomaticWorkItem
-from Products.AlphaFlow.activity import \
- registerActivity, BaseAutomaticActivity, DOMExporter
+from Products.AlphaFlow.activity import registerActivity,
BaseAutomaticActivity
from Products.AlphaFlow.utils import \
modifyRolesForPermission, makeBoolFromUnicode, flexSplit
from Products.AlphaFlow.workflowattr import \
WorkflowAttribute, InitializeWorkflowAttributes
from Products.AlphaFlow.exception import ConfigurationError
from Products.AlphaFlow import config
+from Products.AlphaFlow.importexport import DOMExporter
class PermissionSetting(DOMExporter):
Modified: AlphaFlow/trunk/activity.py
==============================================================================
--- AlphaFlow/trunk/activity.py (original)
+++ AlphaFlow/trunk/activity.py Fri Jun 24 12:14:29 2005
(at)(at) -1,6 +1,6 (at)(at)
# Copyright (c) 2004-2005 gocept gmbh & co. kg
# See also LICENSE.txt
-# activity.py,v 1.32.2.3 2005/05/02 09:02:02 zagy Exp
+# $Id$
"""Activity definitions"""
# python imports
(at)(at) -26,54 +26,7 (at)(at)
from Products.AlphaFlow.exception import ConfigurationError
from Products.AlphaFlow.workflowattr import \
WorkflowAttribute, InitializeWorkflowAttributes, findAttrInAttributes
-
-class DOMExporter:
- """Mixin class with DOM export capabilities."""
-
- security = ClassSecurityInfo()
-
- security.declarePrivate("writeDOM")
- def writeDOM(self, node):
- "Write the activity into dom node."
- if hasattr(node, 'ownerDocument') and node.ownerDocument is not None:
- doc = node.ownerDocument # node inside
- else:
- doc = node # Document itself
- activity = node.appendChild(doc.createElement(self.nodeName))
- for attr in self.attributes:
- if attr.exportHandler is None:
- continue
- exportHandler = getattr(self, attr.exportHandler)
- exportHandler(attr, activity)
-
-
- security.declareProtected(config.EDIT_WORKFLOW, "getXML")
- def getXML(self, REQUEST=None):
- """returns the AlphaFlow XML for this activity"""
- doc = minidom.Document()
- self.writeDOM(doc)
- xml = doc.toxml()
- if REQUEST is not None:
- REQUEST.RESPONSE.setHeader('Content-type', 'text/xml')
- return xml
-
- #########
- # private
-
- security.declarePrivate('_attr_export_simple')
- def _attr_export_simple(self, attr, node):
- "Export for attributes which need no special handling."
- value = getattr(self, attr.classAttr)
-# if value == attr.default:
-# value = "" # values which are default are not written as "" to
DOM
- node.setAttribute(attr.domAttr, convert_to_xml(value))
-
- security.declarePrivate('_attr_export_id')
- def _attr_export_id(self, attr, node):
- "Export for id attribute."
- node.setAttribute(attr.domAttr, convert_to_xml(self.getId()))
-
-InitializeClass(DOMExporter)
+from Products.AlphaFlow.importexport import DOMExporter, convert_to_xml
class BaseActivity(PropertyManager, SimpleItem, DOMExporter):
"""A base class to implement activities"""
(at)(at) -431,24 +384,6 (at)(at)
###################
-# helper methods
-
-def convert_to_xml(value):
- """Convert a value to XML notation."""
- if isinstance(value, basestring):
- return value
- elif isinstance(value, tuple) or isinstance(value, list):
- return ' '.join(value)
- elif isinstance(value, bool):
- return value and 'true' or 'false'
- elif isinstance(value, int):
- return str(value)
- elif value is None:
- return ''
- raise ValueError, "Don't know how to handle '%s'." % value
-
-
-###################
# activity registry
activity_registry = {}
Added: AlphaFlow/trunk/importexport.py
==============================================================================
--- (empty file)
+++ AlphaFlow/trunk/importexport.py Fri Jun 24 12:14:29 2005
(at)(at) -0,0 +1,82 (at)(at)
+# Copyright (c) 2004-2005 gocept gmbh & co. kg
+# See also LICENSE.txt
+# $Id$
+"""Mixins for import and export"""
+
+# python imports
+from xml.dom import minidom
+
+
+# Zope imports
+from Globals import InitializeClass
+from AccessControl import ClassSecurityInfo
+
+# Sibling imports
+from Products.AlphaFlow.interfaces import IDOMExportable
+from Products.AlphaFlow import config
+#from Products.AlphaFlow.exception import ConfigurationError
+
+class DOMExporter:
+ """Mixin class with DOM export capabilities."""
+
+ __implements__ = (IDOMExportable, )
+ security = ClassSecurityInfo()
+
+ security.declarePrivate("writeDOM")
+ def writeDOM(self, node):
+ "Write the activity into dom node."
+ if hasattr(node, 'ownerDocument') and node.ownerDocument is not None:
+ doc = node.ownerDocument # node inside
+ else:
+ doc = node # Document itself
+ activity = node.appendChild(doc.createElement(self.nodeName))
+ for attr in self.attributes:
+ if attr.exportHandler is None:
+ continue
+ exportHandler = getattr(self, attr.exportHandler)
+ exportHandler(attr, activity)
+
+
+ security.declareProtected(config.EDIT_WORKFLOW, "getXML")
+ def getXML(self, REQUEST=None):
+ """returns the AlphaFlow XML for this activity"""
+ doc = minidom.Document()
+ self.writeDOM(doc)
+ xml = doc.toxml()
+ if REQUEST is not None:
+ REQUEST.RESPONSE.setHeader('Content-type', 'text/xml')
+ return xml
+
+ ########################
+ # public export handlers
+
+ security.declarePrivate('_attr_export_simple')
+ def _attr_export_simple(self, attr, node):
+ "Export for attributes which need no special handling."
+ value = getattr(self, attr.classAttr)
+ node.setAttribute(attr.domAttr, convert_to_xml(value))
+
+ security.declarePrivate('_attr_export_id')
+ def _attr_export_id(self, attr, node):
+ "Export for id attribute."
+ node.setAttribute(attr.domAttr, convert_to_xml(self.getId()))
+
+InitializeClass(DOMExporter)
+
+
+###################
+# helper methods
+
+def convert_to_xml(value):
+ """Convert a value to XML notation."""
+ if isinstance(value, basestring):
+ return value
+ elif isinstance(value, tuple) or isinstance(value, list):
+ return ' '.join(value)
+ elif isinstance(value, bool):
+ return value and 'true' or 'false'
+ elif isinstance(value, int):
+ return str(value)
+ elif value is None:
+ return ''
+ raise ValueError, "Don't know how to handle '%s'." % value
Modified: AlphaFlow/trunk/process.py
==============================================================================
--- AlphaFlow/trunk/process.py (original)
+++ AlphaFlow/trunk/process.py Fri Jun 24 12:14:29 2005
(at)(at) -20,10 +20,12 (at)(at)
from Products.AlphaFlow.interfaces import IProcess
from Products.AlphaFlow import utils, config
from Products.AlphaFlow.exception import ConfigurationError
-from Products.AlphaFlow.activity import listActivities, getActivity,
DOMExporter
+from Products.AlphaFlow.activity import listActivities, getActivity
from Products.AlphaFlow.adapters.renderableadapter import getRenderableAdapter
from Products.AlphaFlow.workflowattr import \
WorkflowAttribute, InitializeWorkflowAttributes
+from Products.AlphaFlow.importexport import DOMExporter
+
manage_addProcessForm=PageTemplateFile('www/addProcess', globals())
def manage_addProcess(self, id, REQUEST=None):
Modified: AlphaFlow/trunk/tests/test_definition.py
==============================================================================
--- AlphaFlow/trunk/tests/test_definition.py (original)
+++ AlphaFlow/trunk/tests/test_definition.py Fri Jun 24 12:14:29 2005
(at)(at) -35,7 +35,7 (at)(at)
from Products.AlphaFlow.process import Process
from Products.AlphaFlow.activity import \
listActivities, getActivity, BaseTalesActivity, BaseAssignableActivity, \
- BaseActivity, BaseAutomaticActivity, convert_to_xml
+ BaseActivity, BaseAutomaticActivity
from Products.AlphaFlow import config
from Products.AlphaFlow.workitem import \
BaseWorkItem, BaseAutomaticWorkItem, getWorkItemClass, listWorkItems
(at)(at) -47,6 +47,7 (at)(at)
from Products.AlphaFlow.workflowattr import \
WorkflowAttribute, InitializeWorkflowAttributes, getWorkflowAttributes, \
findAttrInAttributes
+from Products.AlphaFlow.importexport import convert_to_xml
_chars = 'abcdefghijklmnopqrstuvwxyz'
|
SVN: r3096 - in AlphaFlow/trunk: . tests
Roman Joost <rj(at)gocept.com> |
2005-06-24 14:12:12 |
[ FULL ]
|
Author: roman
Date: Fri Jun 24 14:07:31 2005
New Revision: 3096
Modified:
AlphaFlow/trunk/activity.py
AlphaFlow/trunk/tests/test_definition.py
AlphaFlow/trunk/tests/test_editor.py
Log:
- added method which handles the XML string send by the javascript
- added method which adds editor specific attributes and corrected the
unit tests for that change
Modified: AlphaFlow/trunk/activity.py
==============================================================================
--- AlphaFlow/trunk/activity.py (original)
+++ AlphaFlow/trunk/activity.py Fri Jun 24 14:07:31 2005
(at)(at) -54,6 +54,12 (at)(at)
WorkflowAttribute('startActivity', 'startActivity', (),
'Workitems to be spawned just before the '
'workitem for this activity is started.'),
+ WorkflowAttribute('editor:availableActivities',
+ 'editor:availableActivities', None,
+ 'a string which holds all activity ids for '
+ 'the current workflow definition',
+ importHandler=None,
+ exportHandler="_attr_export_activities_list"),
)
def __init__(self, id):
(at)(at) -97,6 +103,13 (at)(at)
schema = schema.copy()
return schema
+ security.declareProtected(config.EDIT_WORKFLOW, "configureFromXML")
+ def configureFromXML(self, REQUEST):
+ """saves the properties to the activity"""
+ xmlstr = REQUEST.xml
+ node = minidom.parseString(xmlstr)
+ self.configureFromDOMNode(node.documentElement)
+
def getPossibleChildren(self):
"""Return a list of all ids of activities that can be instantiated as
successors by instances of this activity."""
(at)(at) -106,6 +119,13 (at)(at)
"Return a list of possible successor activities as dictionaries."
return [] # to be overwritten by subclasses
+ security.declarePrivate('_attr_export_id')
+ def _attr_export_activities_list(self, attr, node):
+ "Export for editor specific attributes."
+ node.setAttribute('xmlns:editor',
+ 'http://www.gocept.com/alf/editor')
+ node.setAttribute(attr.domAttr,
+ convert_to_xml(",".join(self.listActivityIds())))
InitializeClass(BaseActivity)
Modified: AlphaFlow/trunk/tests/test_definition.py
==============================================================================
--- AlphaFlow/trunk/tests/test_definition.py (original)
+++ AlphaFlow/trunk/tests/test_definition.py Fri Jun 24 14:07:31 2005
(at)(at) -148,6 +148,8 (at)(at)
for attr, value in node.attributes.items():
if value == '':
continue
+ if attr.startswith("editor:") or attr.startswith("xmlns"):
+ continue
breaked = False
for act_attr in act_attrs:
if act_attr.domAttr == attr:
Modified: AlphaFlow/trunk/tests/test_editor.py
==============================================================================
--- AlphaFlow/trunk/tests/test_editor.py (original)
+++ AlphaFlow/trunk/tests/test_editor.py Fri Jun 24 14:07:31 2005
(at)(at) -76,6 +76,8 (at)(at)
'nonEditableFields': '',
'content_roles': '',
'view_url_expr':
'string:${content/absolute_url}/view',
+ 'xmlns:editor':'http://www.gocept.com/alf/editor',
+
'editor:availableActivities':'deci_1,deci_n,private,public',
}
xml = editor.processes.test.deci_n.getXML()
xml = minidom.parseString(xml)
|
SVN: r3098 - PloneImageCompetition/trunk/doc
Daniel Havlik <dh(at)gocept.com> |
2005-06-27 15:11:00 |
[ FULL ]
|
Author: nilo
Date: Mon Jun 27 15:06:06 2005
New Revision: 3098
Added:
PloneImageCompetition/trunk/doc/EXPORT.txt
Log:
added export docu
Added: PloneImageCompetition/trunk/doc/EXPORT.txt
==============================================================================
--- (empty file)
+++ PloneImageCompetition/trunk/doc/EXPORT.txt Mon Jun 27 15:06:06 2005
(at)(at) -0,0 +1,5 (at)(at)
+To use the XML Export, call http://yoursite/path/to/imagecompetition/get_xml_export
.
+Please note that you have to be logged in as a user who has the appropriate
rights (same as for editing the content).
+
+
+
|
SVN: r3104 - in AlphaFlow/trunk: . tests
Michael Howitz <mh(at)gocept.com> |
2005-06-28 10:07:36 |
[ FULL ]
|
Author: mac
Date: Tue Jun 28 10:02:20 2005
New Revision: 3104
Modified:
AlphaFlow/trunk/activity.py
AlphaFlow/trunk/tests/test_definition.py
AlphaFlow/trunk/tests/test_editor.py
Log:
assignees tag (BaseAssignableActivity and subclasses) is now also exported when
it has only default values
Modified: AlphaFlow/trunk/activity.py
==============================================================================
--- AlphaFlow/trunk/activity.py (original)
+++ AlphaFlow/trunk/activity.py Tue Jun 28 10:02:20 2005
(at)(at) -273,16 +273,10 (at)(at)
attr_kind = findAttrInAttributes(self, 'assigneesKind')
attr_roles = findAttrInAttributes(self, 'roles')
attr_expr = findAttrInAttributes(self, 'assigneesExpression')
- if self.assigneesKind == attr_kind.default and \
- self.roles == attr_roles.default:
- return # XXX no assignees tag yet on default behavior
el = node.ownerDocument.createElement('assignees')
assignees = node.appendChild(el)
for curr_attr in (attr_kind, attr_roles, attr_expr):
- value = getattr(self, curr_attr.classAttr)
- if value != None: # XXX not sane
- assignees.setAttribute(curr_attr.domAttr,
- convert_to_xml(value))
+ self._attr_export_simple(curr_attr, assignees)
security.declarePrivate('_attr_import_assignees')
def _attr_import_assignees(self, attr, node):
Modified: AlphaFlow/trunk/tests/test_definition.py
==============================================================================
--- AlphaFlow/trunk/tests/test_definition.py (original)
+++ AlphaFlow/trunk/tests/test_definition.py Tue Jun 28 10:02:20 2005
(at)(at) -113,14 +113,13 (at)(at)
exp.nodeName,
exp.attributes.items()))
if exp.childNodes:
- exp_childs = [x for x in exp.childNodes
- if x.nodeType not in [minidom.Node.COMMENT_NODE,
- minidom.Node.TEXT_NODE]]
+ exp_childs = self._filter_relevant_childs(exp).childNodes
+ got = self._filter_relevant_childs(got)
+ got_childs = got.childNodes
self.assertEqual(len(exp_childs),
- len(got.childNodes),
- "%s:\nexp: %s\ngot: %s" % (wf_name,
- exp_childs,
- got.childNodes))
+ len(got_childs),
+ "%s:\nexp: %s\ngot: %s" % (wf_name, exp_childs,
+ got_childs))
for child in exp_childs:
self._check_DOM_frag_recursive(child,
self._find_in_node(got, child),
(at)(at) -130,7 +129,13 (at)(at)
documentElement = True
self._compare_DOM_nodes(exp, got, wf_name,
documentElement=documentElement)
-
+ def _get_assignees_attrs(self):
+ task = activity_registry.get('task')
+ act_attrs = (findAttrInAttributes(task, 'assigneesKind'),
+ findAttrInAttributes(task, 'roles'),
+ findAttrInAttributes(task, 'assigneesExpression'),
+ )
+ return act_attrs
def _filter_relevant_attrs(self, node):
"Get a sorted list of the relevant (not empty, not default)
attributes."
(at)(at) -146,11 +151,7 (at)(at)
pass
if act_attrs is None:
if nodeName == 'assignees':
- task = activity_registry.get('task')
- act_attrs = (findAttrInAttributes(task, 'assigneesKind'),
- findAttrInAttributes(task, 'roles'),
- findAttrInAttributes(task,
'assigneesExpression'),
- )
+ act_attrs = self._get_assignees_attrs()
else:
raise AssertionError, '%s: can not get Workflowattributes' % (
nodeName)
(at)(at) -173,7 +174,28 (at)(at)
res.append((attr, value))
res.sort(sort_tuple_by_item_0)
return res
-
+
+ def _filter_relevant_childs(self, node):
+ assignees_attrs = self._get_assignees_attrs()
+ childNodes = node.childNodes[:]
+ for child in childNodes:
+ if child.nodeType in [minidom.Node.COMMENT_NODE,
+ minidom.Node.TEXT_NODE]:
+ # remove text and comment nodes
+ node.removeChild(child)
+ if child.nodeName == 'assignees':
+ breaked = False
+ for attr in assignees_attrs:
+ if child.getAttribute(attr.domAttr) != \
+ convert_to_xml(attr.default):
+ breaked = True
+ break
+ if not breaked:
+ # remove assignees tag if all attributes are default
+ node.removeChild(child)
+ return node
+
+
def _find_in_node(self, src_node, node):
pot_nodes = src_node.getElementsByTagName(node.nodeName)
if len(pot_nodes) == 1: # the only one should be the searched
Modified: AlphaFlow/trunk/tests/test_editor.py
==============================================================================
--- AlphaFlow/trunk/tests/test_editor.py (original)
+++ AlphaFlow/trunk/tests/test_editor.py Tue Jun 28 10:02:20 2005
(at)(at) -91,7 +91,8 (at)(at)
"expected property %s not an xml attribute!" %prop)
assignees_expected = {'kind':'actual',
- 'roles':"Editor Reviewer"}
+ 'roles':'Editor Reviewer',
+ 'expression': ''}
el = xml.getElementsByTagName('assignees')[0]
self.assertEqual(len(el.attributes.values()), len(assignees_expected),
"The 'assignees' element has not the amount of"\
|
SVN: r3106 - in AlphaFlow/trunk: . activities tests
Michael Howitz <mh(at)gocept.com> |
2005-06-28 10:35:47 |
[ FULL ]
|
Author: mac
Date: Tue Jun 28 10:30:42 2005
New Revision: 3106
Modified:
AlphaFlow/trunk/activities/notify.py
AlphaFlow/trunk/activities/ntask.py
AlphaFlow/trunk/activities/permission.py
AlphaFlow/trunk/activity.py
AlphaFlow/trunk/interfaces.py
AlphaFlow/trunk/process.py
AlphaFlow/trunk/registry.py
AlphaFlow/trunk/tests/test_registry.py
AlphaFlow/trunk/workflowattr.py
Log:
The registries now know how to compute the key out of the class, this makes
registering easier
Modified: AlphaFlow/trunk/activities/notify.py
==============================================================================
--- AlphaFlow/trunk/activities/notify.py (original)
+++ AlphaFlow/trunk/activities/notify.py Tue Jun 28 10:30:42 2005
(at)(at) -33,6 +33,9 (at)(at)
class EMailRegistry(Registry):
"""Registry for email recipents."""
+ def _compute_key(self, klass):
+ return klass.mode_name
+
def getFromDOMNode(self, node):
"""Get a class object from data given in DOM-Node.
(at)(at) -265,18 +268,9 (at)(at)
return relevant
-
-def registerRecipentMode(mode):
- global notify_registry
- InitializeWorkflowAttributes(mode,
- findAttrInAttributes(mode,
- 'mode_name').default,
- registry=notify_registry)
-
-
# register the stuff
registerActivity(EMailActivity)
registerWorkItem(EMailWorkItem)
-registerRecipentMode(RecipientOwner)
-registerRecipentMode(RecipientNextAssignees)
-registerRecipentMode(RecipientActualRole)
+InitializeWorkflowAttributes(RecipientOwner, registry=notify_registry)
+InitializeWorkflowAttributes(RecipientNextAssignees, registry=notify_registry)
+InitializeWorkflowAttributes(RecipientActualRole, registry=notify_registry)
Modified: AlphaFlow/trunk/activities/ntask.py
==============================================================================
--- AlphaFlow/trunk/activities/ntask.py (original)
+++ AlphaFlow/trunk/activities/ntask.py Tue Jun 28 10:30:42 2005
(at)(at) -175,6 +175,6 (at)(at)
# register the stuff
-InitializeWorkflowAttributes(Exit, Exit.nodeName)
+InitializeWorkflowAttributes(Exit)
registerActivity(NTaskActivity)
registerWorkItem(NTaskWorkItem)
Modified: AlphaFlow/trunk/activities/permission.py
==============================================================================
--- AlphaFlow/trunk/activities/permission.py (original)
+++ AlphaFlow/trunk/activities/permission.py Tue Jun 28 10:30:42 2005
(at)(at) -70,7 +70,7 (at)(at)
self._attr_import_simple(attr, node)
-InitializeWorkflowAttributes(PermissionSetting, PermissionSetting.nodeName)
+InitializeWorkflowAttributes(PermissionSetting)
class PermissionActivity(BaseAutomaticActivity):
Modified: AlphaFlow/trunk/activity.py
==============================================================================
--- AlphaFlow/trunk/activity.py (original)
+++ AlphaFlow/trunk/activity.py Tue Jun 28 10:30:42 2005
(at)(at) -350,5 +350,4 (at)(at)
def registerActivity(activity):
InitializeClass(activity)
- InitializeWorkflowAttributes(activity, activity.nodeName,
- registry=activity_registry)
+ InitializeWorkflowAttributes(activity, registry=activity_registry)
Modified: AlphaFlow/trunk/interfaces.py
==============================================================================
--- AlphaFlow/trunk/interfaces.py (original)
+++ AlphaFlow/trunk/interfaces.py Tue Jun 28 10:30:42 2005
(at)(at) -762,16 +762,22 (at)(at)
class IRegistry(Interface):
"""Registry for class objects."""
- def register(key, klass):
+ def register(klass):
"""Register a class object on the registry.
+ The key for searching the class is computed via
self._compute_key(klass)
If key already exists, its value gets replaced.
- key ... string: search key in registry
klass ... class: object behind key
Raises ValueError if klass is no class object.
"""
+ def _compute_key(klass):
+ """Compute the search key from a class object.
+
+ Each registy implementation can have its own algorithm.
+ """
+
def get(key):
"""Get class object by key.
(at)(at) -786,6 +792,7 (at)(at)
Raises KeyError if key not found.
"""
+
def keys():
"""Return the keys in the registry as a list."""
Modified: AlphaFlow/trunk/process.py
==============================================================================
--- AlphaFlow/trunk/process.py (original)
+++ AlphaFlow/trunk/process.py Tue Jun 28 10:30:42 2005
(at)(at) -205,4 +205,4 (at)(at)
InitializeClass(Process)
-InitializeWorkflowAttributes(Process, Process.nodeName)
+InitializeWorkflowAttributes(Process)
Modified: AlphaFlow/trunk/registry.py
==============================================================================
--- AlphaFlow/trunk/registry.py (original)
+++ AlphaFlow/trunk/registry.py Tue Jun 28 10:30:42 2005
(at)(at) -13,7 +13,7 (at)(at)
from Products.AlphaFlow.interfaces import IRegistry
class Registry:
- """Registry for class objects."""
+ """Registry for class objects which implement IWorkflowAttributeAware."""
__implements__ = (IRegistry, )
(at)(at) -22,12 +22,16 (at)(at)
def __init__(self):
self._registry = {}
- def register(self, key, klass):
+ def _compute_key(self, klass):
+ "Compute the key for a class."
+ return klass.nodeName # from IWorkflowAttributeAware
+
+ def register(self, klass):
"Register a class object on the registry."
t_klass = type(klass)
if not (t_klass == ClassType or t_klass == ExtensionClass):
raise ValueError, "klass must be a classobj not %s." % t_klass
- self._registry[key] = klass
+ self._registry[self._compute_key(klass)] = klass
def get(self, key):
"Get class object by key."
Modified: AlphaFlow/trunk/tests/test_registry.py
==============================================================================
--- AlphaFlow/trunk/tests/test_registry.py (original)
+++ AlphaFlow/trunk/tests/test_registry.py Tue Jun 28 10:30:42 2005
(at)(at) -22,10 +22,15 (at)(at)
from Products.AlphaFlow.activities.notify import notify_registry,
RecipientOwner
class Demo1:
+ nodeName = 'asdf'
pass
class Demo2:
- pass
+ nodeName = 'qwe'
+
+class Demo3:
+ nodeName = 'asdf'
+
(at)(at) -36,30 +41,29 (at)(at)
def test_registry(self):
r = Registry()
- self.assertRaises(ValueError, r.register, 'asdf', None)
- self.assertRaises(ValueError, r.register, 'asdf', 'asdf')
- self.assertRaises(ValueError, r.register, 'asdf', object())
+ self.assertRaises(ValueError, r.register, None)
+ self.assertRaises(ValueError, r.register, 'asdf')
+ self.assertRaises(ValueError, r.register, object())
self.assertRaises(KeyError, r.get, 'asdf')
self.assertEqual([], r.keys())
- r.register('asdf', Demo1)
+ r.register(Demo1)
self.assertEqual(Demo1, r.get('asdf'))
self.assertEqual(['asdf'], r.keys())
- r.register('qwe', Demo2)
+ r.register(Demo2)
self.assertEqual(Demo1, r.get('asdf'))
self.assertEqual(Demo2, r.get('qwe'))
- r.register('asdf', Demo2)
- self.assertEqual(Demo2, r.get('asdf'))
+ r.register(Demo3)
+ self.assertEqual(Demo3, r.get('asdf'))
self.assertEqual(Demo2, r.get('qwe'))
keys = r.keys()
keys.sort()
self.failUnless(['asdf', 'qwe'], keys)
- r.register('qwe', Demo1)
# test getFromDOMNode
dom1 = minidom.parseString('<asdf/>')
dom2 = minidom.parseString('<qwe asdf="asdf"/>')
dom3 = minidom.parseString('<zui/>')
- self.assertEqual(Demo2, r.getFromDOMNode(dom1.documentElement))
- self.assertEqual(Demo1, r.getFromDOMNode(dom2.documentElement))
+ self.assertEqual(Demo3, r.getFromDOMNode(dom1.documentElement))
+ self.assertEqual(Demo2, r.getFromDOMNode(dom2.documentElement))
self.assertRaises(KeyError, r.getFromDOMNode, dom3.documentElement)
def test_notify_registry(self):
Modified: AlphaFlow/trunk/workflowattr.py
==============================================================================
--- AlphaFlow/trunk/workflowattr.py (original)
+++ AlphaFlow/trunk/workflowattr.py Tue Jun 28 10:30:42 2005
(at)(at) -81,11 +81,9 (at)(at)
# Registry keys should be class.nodeName
workflow_attributes_registry = Registry()
-def InitializeWorkflowAttributes(klass, registry_key,
- registry=workflow_attributes_registry):
+def InitializeWorkflowAttributes(klass,
registry=workflow_attributes_registry):
"""Write the WorkflowAttribute on the class object klass.
- registry_key: Key under which the entry is stored in registry
registry: registry object (IRegistry) to register within
None means: do not register class
(at)(at) -93,6 +91,6 (at)(at)
for attribute in klass.attributes:
setattr(klass, attribute.classAttr, attribute.default)
if registry is not None:
- registry.register(registry_key, klass)
+ registry.register(klass)
|
SVN: r3107 - in AlphaFlow/trunk: . editor tests
Michael Howitz <mh(at)gocept.com> |
2005-06-28 10:44:12 |
[ FULL ]
|
Author: mac
Date: Tue Jun 28 10:39:11 2005
New Revision: 3107
Modified:
AlphaFlow/trunk/editor/editor.py
AlphaFlow/trunk/interfaces.py
AlphaFlow/trunk/registry.py
AlphaFlow/trunk/tests/test_registry.py
Log:
- added values method to registry
- using values method in editor
Modified: AlphaFlow/trunk/editor/editor.py
==============================================================================
--- AlphaFlow/trunk/editor/editor.py (original)
+++ AlphaFlow/trunk/editor/editor.py Tue Jun 28 10:39:11 2005
(at)(at) -65,13 +65,10 (at)(at)
global activity_registry
result = []
- activity_ids = activity_registry.keys()
- for activity_id in activity_ids:
- activity = activity_registry.get(activity_id)
+ for activity in activity_registry.values():
if activity.activity_type in filter:
continue
- name, icon = activity.activity_type, activity.icon
- result.append((name, icon))
+ result.append((activity.activity_type, activity.icon))
return result
InitializeClass(AlphaFlowEditor)
Modified: AlphaFlow/trunk/interfaces.py
==============================================================================
--- AlphaFlow/trunk/interfaces.py (original)
+++ AlphaFlow/trunk/interfaces.py Tue Jun 28 10:39:11 2005
(at)(at) -796,6 +796,9 (at)(at)
def keys():
"""Return the keys in the registry as a list."""
+ def values():
+ """Return the class objects in the registry as a list."""
+
# Need the activity interface here after a refactoring for backwards
# compatibility
Modified: AlphaFlow/trunk/registry.py
==============================================================================
--- AlphaFlow/trunk/registry.py (original)
+++ AlphaFlow/trunk/registry.py Tue Jun 28 10:39:11 2005
(at)(at) -44,3 +44,7 (at)(at)
def keys(self):
"""Return the keys in the registry as a list."""
return self._registry.keys()
+
+ def values(self):
+ """Return the class objects in the registry as a list."""
+ return self._registry.values()
Modified: AlphaFlow/trunk/tests/test_registry.py
==============================================================================
--- AlphaFlow/trunk/tests/test_registry.py (original)
+++ AlphaFlow/trunk/tests/test_registry.py Tue Jun 28 10:39:11 2005
(at)(at) -46,9 +46,11 (at)(at)
self.assertRaises(ValueError, r.register, object())
self.assertRaises(KeyError, r.get, 'asdf')
self.assertEqual([], r.keys())
+ self.assertEqual([], r.values())
r.register(Demo1)
self.assertEqual(Demo1, r.get('asdf'))
self.assertEqual(['asdf'], r.keys())
+ self.assertEqual([Demo1], r.values())
r.register(Demo2)
self.assertEqual(Demo1, r.get('asdf'))
self.assertEqual(Demo2, r.get('qwe'))
(at)(at) -57,7 +59,10 (at)(at)
self.assertEqual(Demo2, r.get('qwe'))
keys = r.keys()
keys.sort()
- self.failUnless(['asdf', 'qwe'], keys)
+ self.assertEqual(['asdf', 'qwe'], keys)
+ values = r.values()
+ values.sort(lambda a,b: cmp(a.nodeName, b.nodeName))
+ self.assertEqual([Demo3, Demo2], values)
# test getFromDOMNode
dom1 = minidom.parseString('<asdf/>')
dom2 = minidom.parseString('<qwe asdf="asdf"/>')
|
SVN: r3108 - in AlphaFlow/trunk: . activities tests
Michael Howitz <mh(at)gocept.com> |
2005-06-28 11:02:07 |
[ FULL ]
|
Author: mac
Date: Tue Jun 28 10:56:54 2005
New Revision: 3108
Modified:
AlphaFlow/trunk/activities/notify.py
AlphaFlow/trunk/instance.py
AlphaFlow/trunk/tests/test_definition.py
AlphaFlow/trunk/tests/test_registry.py
AlphaFlow/trunk/workitem.py
Log:
workflow_registry is now also a Registry instance
Modified: AlphaFlow/trunk/activities/notify.py
==============================================================================
--- AlphaFlow/trunk/activities/notify.py (original)
+++ AlphaFlow/trunk/activities/notify.py Tue Jun 28 10:56:54 2005
(at)(at) -34,6 +34,7 (at)(at)
"""Registry for email recipents."""
def _compute_key(self, klass):
+ "Compute the search key from a class object."
return klass.mode_name
def getFromDOMNode(self, node):
(at)(at) -48,7 +49,6 (at)(at)
#################################
# Registry for all recipent modes
-# Registry keys should be class.mode_name
notify_registry = EMailRegistry()
Modified: AlphaFlow/trunk/instance.py
==============================================================================
--- AlphaFlow/trunk/instance.py (original)
+++ AlphaFlow/trunk/instance.py Tue Jun 28 10:56:54 2005
(at)(at) -24,7 +24,7 (at)(at)
# Sibling imports
from Products.AlphaFlow.interfaces import \
IInstance, IWorkItem, IAlphaFlowed, IDaemonActivity
-from Products.AlphaFlow.workitem import getWorkItemClass
+from Products.AlphaFlow.workitem import workitem_registry
from Products.AlphaFlow import config, utils
(at)(at) -582,7 +582,7 (at)(at)
for activity_id in activity_ids:
w_id = utils.generateUniqueId('Workitem')
activity_type = process[activity_id].activity_type
- wi_class = getWorkItemClass(activity_type)
+ wi_class = workitem_registry.get(activity_type)
wi = wi_class(w_id, activity_id, content_object)
self._setObject(w_id, wi)
Modified: AlphaFlow/trunk/tests/test_definition.py
==============================================================================
--- AlphaFlow/trunk/tests/test_definition.py (original)
+++ AlphaFlow/trunk/tests/test_definition.py Tue Jun 28 10:56:54 2005
(at)(at) -38,7 +38,7 (at)(at)
BaseActivity, BaseAutomaticActivity
from Products.AlphaFlow import config
from Products.AlphaFlow.workitem import \
- BaseWorkItem, BaseAutomaticWorkItem, getWorkItemClass, listWorkItems
+ BaseWorkItem, BaseAutomaticWorkItem, workitem_registry
from Products.AlphaFlow.action import Action
from Products.AlphaFlow.activities.review import ReviewWorkItem,
ReviewActivity
from Products.AlphaFlow.activities.permission import PermissionSetting
(at)(at) -93,8 +93,8 (at)(at)
(IReviewWorkItem, ReviewWorkItem)] + \
[(IActivity, activity_registry.get(act_id))
for act_id in activity_registry.keys() ] + \
- [(IWorkItem, getWorkItemClass(wi_id))
- for wi_id in listWorkItems()]
+ [(IWorkItem, workitem_registry.get(wi_id))
+ for wi_id in workitem_registry.keys()]
def _check_DOM_equality(self, exp_dom, got_dom, wf_name):
Modified: AlphaFlow/trunk/tests/test_registry.py
==============================================================================
--- AlphaFlow/trunk/tests/test_registry.py (original)
+++ AlphaFlow/trunk/tests/test_registry.py Tue Jun 28 10:56:54 2005
(at)(at) -19,7 +19,10 (at)(at)
from Products.AlphaFlow.interfaces import IRegistry
from Products.AlphaFlow.registry import Registry
-from Products.AlphaFlow.activities.notify import notify_registry,
RecipientOwner
+from Products.AlphaFlow.activities.notify import \
+ notify_registry, RecipientOwner, EMailWorkItem
+from Products.AlphaFlow.workitem import workitem_registry
+
class Demo1:
nodeName = 'asdf'
(at)(at) -87,6 +90,17 (at)(at)
self.assertEqual(RecipientOwner,
nr.getFromDOMNode(dom4.documentElement))
+ def test_workitem_registry(self):
+ global workitem_registry
+
+ wr = workitem_registry
+ self.assertRaises(KeyError, wr.get, 'asdf')
+ self.assertEqual(EMailWorkItem, wr.get('email'))
+ dom1 = minidom.parseString('<email />')
+ self.assertRaises(NotImplementedError, wr.getFromDOMNode,
+ dom1.documentElement)
+
+
def test_suite():
Modified: AlphaFlow/trunk/workitem.py
==============================================================================
--- AlphaFlow/trunk/workitem.py (original)
+++ AlphaFlow/trunk/workitem.py Tue Jun 28 10:56:54 2005
(at)(at) -27,7 +27,7 (at)(at)
from Products.AlphaFlow.interfaces import \
IWorkItem, IAlphaFlowed, IAutomaticWorkItem, ITalesWorkItem, \
IAssignableActivity, IAssignableWorkItem, IFieldGroup
-
+from Products.AlphaFlow.registry import Registry
class LocalRoleFake(dict):
(at)(at) -574,23 +574,28 (at)(at)
def getSortPriority(self):
return self.getActivity().sortPriority
+class WorkItemRegistry(Registry):
+ """Registry for workitems."""
+
+ def _compute_key(self, klass):
+ "Compute the search key from a class object."
+ return klass.activity_type
+ def getFromDOMNode(self, node):
+ """Get a class object from data given in DOM-Node.
+
+ node.getAttribute('mode_name') is used as key.
+ """
+ raise NotImplementedError, 'There are no DOM nodes for workitems'
+
+
####################
# Work item registry
-
-workitem_registry = {}
+workitem_registry = WorkItemRegistry()
def registerWorkItem(workitem):
InitializeClass(workitem)
atapi.registerType(workitem, config.PROJECTNAME)
- workitem_registry[workitem.activity_type] = workitem
-
-def getWorkItemClass(activity_type):
- return workitem_registry[activity_type]
-
-def listWorkItems():
- return workitem_registry.keys()
-
-
+ workitem_registry.register(workitem)
|
|