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

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

Add clearance_comment attribute. When CO rejects clearance she is requested to enter a comment. This comment is stored with the student object and logged. The contact form is pre-filled with the comment. When a student is cleared the comment will be automatically removed.

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