source: main/waeup.kofa/trunk/src/waeup/kofa/students/workflow.py @ 10582

Last change on this file since 10582 was 10452, checked in by Henrik Bettermann, 11 years ago

Fix typo.

  • Property svn:keywords set to Id
File size: 9.2 KB
Line 
1"""Workflow for students.
2"""
3import grok
4from datetime import datetime
5from zope.component import getUtility
6from hurry.workflow.workflow import Transition, WorkflowState, NullCondition
7from hurry.workflow.interfaces import IWorkflowState, IWorkflowTransitionEvent
8from waeup.kofa.interfaces import (
9    IObjectHistory, IKofaWorkflowInfo, IKofaUtils,
10    CREATED, ADMITTED, CLEARANCE, REQUESTED, CLEARED, PAID, RETURNING,
11    REGISTERED, VALIDATED, GRADUATED, TRANSCRIPT)
12from waeup.kofa.interfaces import MessageFactory as _
13from waeup.kofa.workflow import KofaWorkflow, KofaWorkflowInfo
14from waeup.kofa.students.interfaces import IStudent, IStudentsUtils
15from waeup.kofa.utils.helpers import get_current_principal
16
17
18IMPORTABLE_STATES = (ADMITTED, CLEARANCE, REQUESTED, CLEARED, PAID, RETURNING,
19    REGISTERED, VALIDATED, GRADUATED)
20
21FORBIDDEN_POSTGRAD_STATES = (RETURNING, REGISTERED, VALIDATED)
22
23REGISTRATION_TRANSITIONS = (
24    Transition(
25        transition_id = 'create',
26        title = _('Create student'),
27        source = None,
28        condition = NullCondition,
29        msg = _('Record created'),
30        destination = CREATED),
31
32    Transition(
33        transition_id = 'admit',
34        title = _('Admit student'),
35        msg = _('Admitted'),
36        source = CREATED,
37        destination = ADMITTED),
38
39    Transition(
40        transition_id = 'reset1',
41        title = _('Reset student'),
42        msg = _('Reset to initial state'),
43        source = ADMITTED,
44        destination = CREATED),
45
46    Transition(
47        transition_id = 'start_clearance',
48        title = _('Start clearance'),
49        msg = _('Clearance started'),
50        source = ADMITTED,
51        destination = CLEARANCE),
52
53    Transition(
54        transition_id = 'reset2',
55        title = _('Reset to admitted'),
56        msg = _("Reset to 'admitted'"),
57        source = CLEARANCE,
58        destination = ADMITTED),
59
60    Transition(
61        transition_id = 'request_clearance',
62        title = _('Request clearance'),
63        msg = _('Clearance requested'),
64        source = CLEARANCE,
65        destination = REQUESTED),
66
67    Transition(
68        transition_id = 'reset3',
69        title = _('Reset to clearance started'),
70        msg = _("Reset to 'clearance started'"),
71        source = REQUESTED,
72        destination = CLEARANCE),
73
74    Transition(
75        transition_id = 'clear',
76        title = _('Clear student'),
77        msg = _('Cleared'),
78        source = REQUESTED,
79        destination = CLEARED),
80
81    Transition(
82        transition_id = 'reset4',
83        title = _('Reset to clearance started'),
84        msg = _("Reset to 'clearance started'"),
85        source = CLEARED,
86        destination = CLEARANCE),
87
88    Transition(
89        transition_id = 'pay_first_school_fee',
90        title = _('Pay school fee'),
91        msg = _('First school fee payment made'),
92        source = CLEARED,
93        destination = PAID),
94
95    Transition(
96        transition_id = 'approve_first_school_fee',
97        title = _('Approve payment'),
98        msg = _('First school fee payment approved'),
99        source = CLEARED,
100        destination = PAID),
101
102    Transition(
103        transition_id = 'reset5',
104        title = _('Reset to cleared'),
105        msg = _("Reset to 'cleared'"),
106        source = PAID,
107        destination = CLEARED),
108
109    Transition(
110        transition_id = 'pay_school_fee',
111        title = _('Pay school fee'),
112        msg = _('School fee payment made'),
113        source = RETURNING,
114        destination = PAID),
115
116    Transition(
117        transition_id = 'pay_pg_fee',
118        title = _('Pay PG school fee'),
119        msg = _('PG school fee payment made'),
120        source = PAID,
121        destination = PAID),
122
123    Transition(
124        transition_id = 'approve_school_fee',
125        title = _('Approve school fee payment'),
126        msg = _('School fee payment approved'),
127        source = RETURNING,
128        destination = PAID),
129
130    Transition(
131        transition_id = 'approve_pg_fee',
132        title = _('Approve PG school fee payment'),
133        msg = _('PG school fee payment approved'),
134        source = PAID,
135        destination = PAID),
136
137    Transition(
138        transition_id = 'reset6',
139        title = _('Reset to returning'),
140        msg = _("Reset to 'returning'"),
141        source = PAID,
142        destination = RETURNING),
143
144    Transition(
145        transition_id = 'register_courses',
146        title = _('Register courses'),
147        msg = _('Courses registered'),
148        source = PAID,
149        destination = REGISTERED),
150
151    Transition(
152        transition_id = 'reset7',
153        title = _('Reset to school fee paid'),
154        msg = _("Reset to 'school fee paid'"),
155        source = REGISTERED,
156        destination = PAID),
157
158    Transition(
159        transition_id = 'validate_courses',
160        title = _('Validate courses'),
161        msg = _('Courses validated'),
162        source = REGISTERED,
163        destination = VALIDATED),
164
165    Transition(
166        transition_id = 'bypass_validation',
167        title = _('Return and bypass validation'),
168        msg = _("Course validation bypassed"),
169        source = REGISTERED,
170        destination = RETURNING),
171
172    Transition(
173        transition_id = 'reset8',
174        title = _('Reset to school fee paid'),
175        msg = _("Reset to 'school fee paid'"),
176        source = VALIDATED,
177        destination = PAID),
178
179    Transition(
180        transition_id = 'return',
181        title = _('Return'),
182        msg = _("Returned"),
183        source = VALIDATED,
184        destination = RETURNING),
185
186    Transition(
187        transition_id = 'reset9',
188        title = _('Reset to courses validated'),
189        msg = _("Reset to 'courses validated'"),
190        source = RETURNING,
191        destination = VALIDATED),
192
193    # There is no transition to graduated.
194
195    Transition(
196        transition_id = 'request_transcript',
197        title = _('Request transript'),
198        msg = _("Transcript requested"),
199        source = GRADUATED,
200        destination = TRANSCRIPT),
201
202    Transition(
203        transition_id = 'process_transcript',
204        title = _('Transcript processed'),
205        msg = _("Transcript processed"),
206        source = TRANSCRIPT,
207        destination = GRADUATED),
208    )
209
210
211IMPORTABLE_TRANSITIONS = [i.transition_id for i in REGISTRATION_TRANSITIONS]
212
213FORBIDDEN_POSTGRAD_TRANS = ['reset6', 'register_courses']
214LOCK_CLEARANCE_TRANS = ('reset2', 'request_clearance')
215UNLOCK_CLEARANCE_TRANS = ('reset3', 'reset4', 'start_clearance')
216
217registration_workflow = KofaWorkflow(REGISTRATION_TRANSITIONS)
218
219class RegistrationWorkflowState(WorkflowState, grok.Adapter):
220    """An adapter to adapt Student objects to workflow states.
221    """
222    grok.context(IStudent)
223    grok.provides(IWorkflowState)
224
225    state_key = 'wf.registration.state'
226    state_id = 'wf.registration.id'
227
228class RegistrationWorkflowInfo(KofaWorkflowInfo, grok.Adapter):
229    """Adapter to adapt Student objects to workflow info objects.
230    """
231    grok.context(IStudent)
232    grok.provides(IKofaWorkflowInfo)
233
234    def __init__(self, context):
235        self.context = context
236        self.wf = registration_workflow
237
238@grok.subscribe(IStudent, IWorkflowTransitionEvent)
239def handle_student_transition_event(obj, event):
240    """Append message to student history and log file when transition happened.
241
242    Lock and unlock clearance form.
243    Trigger actions after school fee payment.
244    """
245
246    msg = event.transition.user_data['msg']
247    history = IObjectHistory(obj)
248    history.addMessage(msg)
249    if event.transition.transition_id in LOCK_CLEARANCE_TRANS:
250        obj.clearance_locked = True
251    if event.transition.transition_id in UNLOCK_CLEARANCE_TRANS:
252        obj.clearance_locked = False
253    # School fee payment of returning students triggers the change of
254    # current session, current level, and current verdict
255    if event.transition.transition_id in (
256        'pay_school_fee', 'approve_school_fee'):
257        getUtility(IStudentsUtils).setReturningData(obj)
258    elif event.transition.transition_id in (
259        'pay_pg_fee', 'approve_pg_fee'):
260        new_session = obj['studycourse'].current_session + 1
261        obj['studycourse'].current_session = new_session
262    elif event.transition.transition_id == 'validate_courses':
263        current_level = obj['studycourse'].current_level
264        level_object = obj['studycourse'].get(str(current_level), None)
265        if level_object is not None:
266            user = get_current_principal()
267            if user is None:
268                usertitle = 'system'
269            else:
270                usertitle = getattr(user, 'public_name', None)
271                if not usertitle:
272                    usertitle = user.title
273            level_object.validated_by = usertitle
274            level_object.validation_date = datetime.utcnow()
275    elif event.transition.transition_id == 'clear':
276        obj.officer_comment = None
277    elif event.transition.transition_id == 'reset8':
278        current_level = obj['studycourse'].current_level
279        level_object = obj['studycourse'].get(str(current_level), None)
280        if level_object is not None:
281            level_object.validated_by = None
282            level_object.validation_date = None
283    # In some tests we don't have a students container
284    try:
285        students_container = grok.getSite()['students']
286        students_container.logger.info('%s - %s' % (obj.student_id,msg))
287    except (TypeError, AttributeError):
288        pass
289    return
Note: See TracBrowser for help on using the repository browser.