source: products/ShortMessage/trunk/Extensions/Sm_Workflow.py

Last change on this file was 1, checked in by myroslav, 18 years ago

Building directory structure

File size: 5.6 KB
Line 
1# Author: Melnychuk Taras
2# Contact: fenix@quintagroup.com
3# Date: $Date: 2005-11-23 13:33:15 +0200 (Thu, 23 Nov 2005) $
4# Copyright: quintagroup.com
5
6"""
7This is workflow for ShortMessage type that sends SMS upon object publishing.
8This module define the following functions:
9
10    - `createWorkflow`: create new workflow.
11    - `fillWorkflow`: takes created workflow and add to it state, transitions, permissions and etc.
12    - `addWorkflowScripts`: add ExternalMethod named send_publishedMessage to the workflow
13    - `setupWorkflow`: setup created workflow to portal and set it to ShortMessage type
14    - `send_publishedMessage`: Send message if it is published
15"""
16__docformat__ = 'restructuredtext'
17
18from Products.DCWorkflow.DCWorkflow import DCWorkflowDefinition
19from Products.CMFCore.CMFCorePermissions import ModifyPortalContent
20from AccessControl.Permissions import view, access_contents_information
21from Products.DCWorkflow.Default import r_anon, r_manager, r_owner, r_reviewer, \
22                                        p_access, p_modify, p_view, p_request , p_review
23from Products.CMFCore.WorkflowTool import addWorkflowFactory
24from Products.CMFCore import CMFCorePermissions
25from Products.ShortMessage.config import *
26from Products import ShortMessage
27
28def addWorkflowScripts(wf):
29    """add ExternalMethod named send_publishedMessage to the workflow"""
30    if 'send_publishedMessage' not in wf.scripts.objectIds():
31        wf.scripts.manage_addProduct['ExternalMethod'].manage_addExternalMethod('send_publishedMessage', 'Send Message', 'ShortMessage.Sm_Workflow', 'send_publishedMessage')
32
33def fillWorkflow(wf):
34    """takes created workflow and add to it state, transitions, permissions and etc"""
35    for state in  ('pending', 'visible', 'published',):
36        wf.states.addState(state)
37    for transition in ('publish', 'submit', 'retract'):
38        wf.transitions.addTransition(transition)
39    for permision in (p_access, p_modify, view):
40        wf.addManagedPermission(permision)
41    for l in ('reviewer_queue',):
42        wf.worklists.addWorklist(l)
43
44    # set initial state
45    wf.states.setInitialState('visible')
46
47    wf_visible = wf.states['visible']
48    wf_visible.setProperties(
49                             title='Visible but not published',
50                             transitions=('publish','submit'))
51    wf_visible.setPermission(p_access, 1, (r_anon, r_manager, r_reviewer))
52    wf_visible.setPermission(p_view, 1, (r_anon, r_manager, r_reviewer))
53    wf_visible.setPermission(p_modify, 0, (r_manager, r_owner))
54
55
56    wf_visible = wf.states['pending']
57    wf_visible.setProperties(
58                             title='Waiting for reviewer',
59                             transitions=('retract', 'publish',))
60    wf_visible.setPermission(p_access, 1, (r_manager, r_owner,  r_reviewer))
61    wf_visible.setPermission(p_view, 1, (r_manager, r_owner,  r_reviewer))
62    wf_visible.setPermission(p_modify, 0, (r_manager, r_reviewer))
63
64    wf_published = wf.states['published']
65    wf_published.setProperties(
66                               title='Public',
67                               transitions=())
68    wf_published.setPermission(p_access, 1, (r_anon, r_manager,))
69    wf_published.setPermission(p_view, 1, (r_anon, r_manager))
70    wf_published.setPermission(p_modify, 0, (r_manager, ))
71
72
73    tdef = wf.transitions['submit']
74    tdef.setProperties(
75                       title='Member requests publishing',
76                       new_state_id='pending',
77                       actbox_name='Submit',
78                       actbox_url='%(content_url)s/content_submit_form',
79                       props={'guard_permissions':p_request})
80
81    tdef = wf.transitions['retract']
82    tdef.setProperties(
83                       title='Member retracts submission',
84                       new_state_id='visible',
85                       actbox_name='Retract',
86                       actbox_url='%(content_url)s/content_retract_form',
87                       props={'guard_permissions':p_request})
88
89    tdef = wf.transitions['publish']
90    tdef.setProperties(
91                       title='Reviewer publishes content',
92                       new_state_id='published',
93                       script_name = 'send_publishedMessage',
94                       actbox_name='Publish',
95                       actbox_url='%(content_url)s/content_publish_form',
96                       props={'guard_permissions':r_anon})
97
98    wf.variables.setStateVar('review_state')
99
100    ldef = wf.worklists['reviewer_queue']
101    ldef.setProperties(description='Reviewer tasks',
102                       actbox_name='Pending (%(count)d)',
103                       actbox_url='%(portal_url)s/search?review_state=pending',
104                       props={'var_match_review_state':'pending',
105                              'guard_permissions':p_review})
106
107
108def setupWorkflow(portal):
109    portal_workflow = portal.portal_workflow
110    addWorkflowFactory(createWorkflow,
111                   id=Sm_WORKFLOWID,
112                   title='ShortMessage Workflow')
113    portal_workflow.manage_addWorkflow(id=Sm_WORKFLOWID, workflow_type=Sm_WORKFLOWID +' (ShortMessage Workflow)')
114    addWorkflowScripts(portal_workflow[Sm_WORKFLOWID])
115    #set workflow for SMS
116    portal_workflow.setChainForPortalTypes( ('ShortMessage'), Sm_WORKFLOWID)
117
118def send_publishedMessage(self, state_change):
119    """Send message if it is published"""
120    message_obj = state_change.object
121    #send message to user(s)
122    state_change.getPortal().portal_smsCommunicator.send_Request(message_obj.getSender(), message_obj.getRecipient(), message_obj.getBody())
123
124def createWorkflow(id):
125    """create new workflow"""
126    wf = DCWorkflowDefinition(id)
127    fillWorkflow(wf)
128    return wf
Note: See TracBrowser for help on using the repository browser.