source: main/waeup.kofa/backup-trunk/src/waeup/kofa/students/workflow.py @ 9819

Last change on this file since 9819 was 9161, checked in by Henrik Bettermann, 12 years ago

In contrast to the comment of the last revision: We need to store validation_date and validated_by also in Kofa. They have to be set by the workflow transition events. They must not be editable (but importable and exportable).

  • Property svn:keywords set to Id
File size: 8.4 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)
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)
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 = 'reset8',
167        title = _('Reset to school fee paid'),
168        msg = _("Reset to 'school fee paid'"),
169        source = VALIDATED,
170        destination = PAID),
171
172    Transition(
173        transition_id = 'return',
174        title = _('Return'),
175        msg = _("Reset to 'returning'"),
176        source = VALIDATED,
177        destination = RETURNING),
178
179    Transition(
180        transition_id = 'reset9',
181        title = _('Reset to courses validated'),
182        msg = _("Reset to 'courses validated'"),
183        source = RETURNING,
184        destination = VALIDATED),
185    )
186
187IMPORTABLE_TRANSITIONS = [i.transition_id for i in REGISTRATION_TRANSITIONS]
188
189FORBIDDEN_POSTGRAD_TRANS = ['reset6', 'register_courses']
190LOCK_CLEARANCE_TRANS = ('reset2', 'request_clearance')
191UNLOCK_CLEARANCE_TRANS = ('reset3', 'reset4', 'start_clearance')
192
193registration_workflow = KofaWorkflow(REGISTRATION_TRANSITIONS)
194
195class RegistrationWorkflowState(WorkflowState, grok.Adapter):
196    """An adapter to adapt Student objects to workflow states.
197    """
198    grok.context(IStudent)
199    grok.provides(IWorkflowState)
200
201    state_key = 'wf.registration.state'
202    state_id = 'wf.registration.id'
203
204class RegistrationWorkflowInfo(KofaWorkflowInfo, grok.Adapter):
205    """Adapter to adapt Student objects to workflow info objects.
206    """
207    grok.context(IStudent)
208    grok.provides(IKofaWorkflowInfo)
209
210    def __init__(self, context):
211        self.context = context
212        self.wf = registration_workflow
213
214@grok.subscribe(IStudent, IWorkflowTransitionEvent)
215def handle_student_transition_event(obj, event):
216    """Append message to student history and log file when transition happened.
217
218    Lock and unlock clearance form.
219    Trigger actions after school fee payment.
220    """
221
222    msg = event.transition.user_data['msg']
223    history = IObjectHistory(obj)
224    history.addMessage(msg)
225    if event.transition.transition_id in LOCK_CLEARANCE_TRANS:
226        obj.clearance_locked = True
227    if event.transition.transition_id in UNLOCK_CLEARANCE_TRANS:
228        obj.clearance_locked = False
229    # School fee payment of returning students triggers the change of
230    # current session, current level, and current verdict
231    if event.transition.transition_id in (
232        'pay_school_fee', 'approve_school_fee'):
233        getUtility(IStudentsUtils).setReturningData(obj)
234    elif event.transition.transition_id in (
235        'pay_pg_fee', 'approve_pg_fee'):
236        new_session = obj['studycourse'].current_session + 1
237        obj['studycourse'].current_session = new_session
238    elif event.transition.transition_id == 'validate_courses':
239        current_level = obj['studycourse'].current_level
240        level_object = obj['studycourse'].get(str(current_level), None)
241        if level_object is not None:
242            user = get_current_principal()
243            if user is None:
244                usertitle = 'system'
245            else:
246                usertitle = getattr(user, 'public_name', None)
247                if not usertitle:
248                    usertitle = user.title
249            level_object.validated_by = usertitle
250            level_object.validation_date = datetime.utcnow()
251    elif event.transition.transition_id == 'reset8':
252        current_level = obj['studycourse'].current_level
253        level_object = obj['studycourse'].get(str(current_level), None)
254        if level_object is not None:
255            level_object.validated_by = None
256            level_object.validation_date = None
257    # In some tests we don't have a students container
258    try:
259        students_container = grok.getSite()['students']
260        students_container.logger.info('%s - %s' % (obj.student_id,msg))
261    except (TypeError, AttributeError):
262        pass
263    return
Note: See TracBrowser for help on using the repository browser.