source: main/waeup.sirp/trunk/src/waeup/sirp/students/workflow.py @ 7673

Last change on this file since 7673 was 7670, checked in by Henrik Bettermann, 13 years ago

Move MessageFactory? definition to w.s.interfaces to avoid conflicting imports.

Start translation of workflow (for demonstration).

  • Property svn:keywords set to Id
File size: 6.2 KB
Line 
1"""Workflow for students.
2"""
3import grok
4from zope.component import getUtility
5from hurry.workflow.workflow import Transition, WorkflowState, NullCondition
6from hurry.workflow.interfaces import IWorkflowState, IWorkflowTransitionEvent
7from waeup.sirp.interfaces import (
8    IObjectHistory, ISIRPWorkflowInfo,
9    CREATED, ADMITTED, CLEARANCE, REQUESTED, CLEARED, PAID, RETURNING,
10    REGISTERED, VALIDATED)
11from waeup.sirp.interfaces import MessageFactory as _
12from waeup.sirp.workflow import SIRPWorkflow, SIRPWorkflowInfo
13from waeup.sirp.students.interfaces import IStudent, IStudentsUtils
14
15
16IMPORTABLE_STATES = (ADMITTED, CLEARANCE, REQUESTED, CLEARED, PAID, RETURNING,
17    REGISTERED, VALIDATED)
18
19REGISTRATION_TRANSITIONS = (
20    Transition(
21        transition_id = 'create',
22        title = 'Create student',
23        source = None,
24        condition = NullCondition,
25        msg = 'Student record created',
26        destination = CREATED),
27
28    Transition(
29        transition_id = 'admit',
30        title = _('Admit student'),
31        msg = 'Student admitted',
32        source = CREATED,
33        destination = ADMITTED),
34
35    Transition(
36        transition_id = 'reset1',
37        title = 'Reset student',
38        msg = 'Student record reset',
39        source = ADMITTED,
40        destination = CREATED),
41
42    Transition(
43        transition_id = 'start_clearance',
44        title = 'Start clearance',
45        msg = 'Clearance started',
46        source = ADMITTED,
47        destination = CLEARANCE),
48
49    Transition(
50        transition_id = 'reset2',
51        title = 'Reset to admitted',
52        msg = "Student record reset to 'admitted'",
53        source = CLEARANCE,
54        destination = ADMITTED),
55
56    Transition(
57        transition_id = 'request_clearance',
58        title = 'Request clearance',
59        msg = 'Clearance requested',
60        source = CLEARANCE,
61        destination = REQUESTED),
62
63    Transition(
64        transition_id = 'reset3',
65        title = 'Reset to clearance',
66        msg = "Student record reset to 'clearance'",
67        source = REQUESTED,
68        destination = CLEARANCE),
69
70    Transition(
71        transition_id = 'clear',
72        title = 'Clear student',
73        msg = 'Cleared',
74        source = REQUESTED,
75        destination = CLEARED),
76
77    Transition(
78        transition_id = 'reset4',
79        title = 'Reset to clearance',
80        msg = "Student record reset to 'clearance'",
81        source = CLEARED,
82        destination = CLEARANCE),
83
84    Transition(
85        transition_id = 'pay_first_school_fee',
86        title = 'Pay school fee',
87        msg = 'School fee paid',
88        source = CLEARED,
89        destination = PAID),
90
91    Transition(
92        transition_id = 'reset5',
93        title = 'Reset to cleared',
94        msg = "Student record reset to 'cleared'",
95        source = PAID,
96        destination = CLEARED),
97
98    Transition(
99        transition_id = 'pay_school_fee',
100        title = 'Pay school fee',
101        msg = 'School fee paid',
102        source = RETURNING,
103        destination = PAID),
104
105    Transition(
106        transition_id = 'reset6',
107        title = 'Reset to returning',
108        msg = "Student record reset to 'returning'",
109        source = PAID,
110        destination = RETURNING),
111
112    Transition(
113        transition_id = 'register_courses',
114        title = 'Register courses',
115        msg = 'Courses registered',
116        source = PAID,
117        destination = REGISTERED),
118
119    Transition(
120        transition_id = 'reset7',
121        title = 'Reset to paid',
122        msg = "Student record reset to 'paid'",
123        source = REGISTERED,
124        destination = PAID),
125
126    Transition(
127        transition_id = 'validate_courses',
128        title = 'Validate courses',
129        msg = 'Courses validated',
130        source = REGISTERED,
131        destination = VALIDATED),
132
133    Transition(
134        transition_id = 'reset8',
135        title = 'Reset to paid',
136        msg = "Student record reset to 'paid'",
137        source = VALIDATED,
138        destination = PAID),
139
140    Transition(
141        transition_id = 'return',
142        title = 'Return',
143        msg = 'Returned',
144        source = VALIDATED,
145        destination = RETURNING),
146
147    Transition(
148        transition_id = 'reset9',
149        title = 'Reset to validated',
150        msg = "Student record reset to 'validated'",
151        source = RETURNING,
152        destination = VALIDATED),
153    )
154
155LOCK_CLEARANCE_TRANS = ('reset2', 'request_clearance')
156UNLOCK_CLEARANCE_TRANS = ('reset3', 'reset4', 'start_clearance')
157
158registration_workflow = SIRPWorkflow(REGISTRATION_TRANSITIONS)
159
160class RegistrationWorkflowState(WorkflowState, grok.Adapter):
161    """An adapter to adapt Student objects to workflow states.
162    """
163    grok.context(IStudent)
164    grok.provides(IWorkflowState)
165
166    state_key = 'wf.registration.state'
167    state_id = 'wf.registration.id'
168
169class RegistrationWorkflowInfo(SIRPWorkflowInfo, grok.Adapter):
170    """Adapter to adapt Student objects to workflow info objects.
171    """
172    grok.context(IStudent)
173    grok.provides(ISIRPWorkflowInfo)
174
175    def __init__(self, context):
176        self.context = context
177        self.wf = registration_workflow
178
179@grok.subscribe(IStudent, IWorkflowTransitionEvent)
180def handle_student_transition_event(obj, event):
181    """Append message to student history and log file when transition happened.
182
183      Lock and unlock clearance form.
184    """
185    msg = '%s' % event.transition.user_data['msg']
186    history = IObjectHistory(obj)
187    history.addMessage(msg)
188    if event.transition.transition_id in LOCK_CLEARANCE_TRANS:
189        obj.clearance_locked = True
190    if event.transition.transition_id in UNLOCK_CLEARANCE_TRANS:
191        obj.clearance_locked = False
192    # Student data don't change after first-time payment
193    if event.transition.transition_id == 'pay_first_school_fee':
194        pass
195    # School fee payment of returning students triggers the change of
196    # current session, current level, and current verdict
197    if event.transition.transition_id == 'pay_school_fee':
198        getUtility(IStudentsUtils).setReturningData(obj)
199    # In some tests we don't have a students container
200    try:
201        students_container = grok.getSite()['students']
202        students_container.logger.info('%s - %s' % (obj.student_id,msg))
203    except (TypeError, AttributeError):
204        pass
205    return
Note: See TracBrowser for help on using the repository browser.