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

Last change on this file since 9217 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
RevLine 
[6637]1"""Workflow for students.
2"""
3import grok
[9161]4from datetime import datetime
[7615]5from zope.component import getUtility
[6637]6from hurry.workflow.workflow import Transition, WorkflowState, NullCondition
7from hurry.workflow.interfaces import IWorkflowState, IWorkflowTransitionEvent
[7811]8from waeup.kofa.interfaces import (
[7819]9    IObjectHistory, IKofaWorkflowInfo, IKofaUtils,
[6990]10    CREATED, ADMITTED, CLEARANCE, REQUESTED, CLEARED, PAID, RETURNING,
11    REGISTERED, VALIDATED)
[7811]12from waeup.kofa.interfaces import MessageFactory as _
[7819]13from waeup.kofa.workflow import KofaWorkflow, KofaWorkflowInfo
[7811]14from waeup.kofa.students.interfaces import IStudent, IStudentsUtils
[9161]15from waeup.kofa.utils.helpers import get_current_principal
[6637]16
[7615]17
[7513]18IMPORTABLE_STATES = (ADMITTED, CLEARANCE, REQUESTED, CLEARED, PAID, RETURNING,
19    REGISTERED, VALIDATED)
20
[9028]21FORBIDDEN_POSTGRAD_STATES = (RETURNING, REGISTERED, VALIDATED)
22
[6637]23REGISTRATION_TRANSITIONS = (
24    Transition(
25        transition_id = 'create',
[7677]26        title = _('Create student'),
[6637]27        source = None,
28        condition = NullCondition,
[9022]29        msg = _('Record created'),
[6637]30        destination = CREATED),
31
32    Transition(
33        transition_id = 'admit',
[7670]34        title = _('Admit student'),
[9022]35        msg = _('Admitted'),
[6637]36        source = CREATED,
37        destination = ADMITTED),
38
39    Transition(
40        transition_id = 'reset1',
[7677]41        title = _('Reset student'),
[7996]42        msg = _('Reset to initial state'),
[6637]43        source = ADMITTED,
44        destination = CREATED),
[6720]45
46    Transition(
47        transition_id = 'start_clearance',
[7677]48        title = _('Start clearance'),
49        msg = _('Clearance started'),
[6720]50        source = ADMITTED,
51        destination = CLEARANCE),
52
53    Transition(
54        transition_id = 'reset2',
[7677]55        title = _('Reset to admitted'),
[7996]56        msg = _("Reset to 'admitted'"),
[6720]57        source = CLEARANCE,
58        destination = ADMITTED),
59
60    Transition(
61        transition_id = 'request_clearance',
[7677]62        title = _('Request clearance'),
63        msg = _('Clearance requested'),
[6720]64        source = CLEARANCE,
65        destination = REQUESTED),
66
67    Transition(
68        transition_id = 'reset3',
[9022]69        title = _('Reset to clearance started'),
70        msg = _("Reset to 'clearance started'"),
[6720]71        source = REQUESTED,
72        destination = CLEARANCE),
73
74    Transition(
75        transition_id = 'clear',
[7677]76        title = _('Clear student'),
77        msg = _('Cleared'),
[6720]78        source = REQUESTED,
79        destination = CLEARED),
80
81    Transition(
82        transition_id = 'reset4',
[9022]83        title = _('Reset to clearance started'),
84        msg = _("Reset to 'clearance started'"),
[6720]85        source = CLEARED,
86        destination = CLEARANCE),
[6742]87
88    Transition(
89        transition_id = 'pay_first_school_fee',
[7677]90        title = _('Pay school fee'),
[9022]91        msg = _('First school fee payment made'),
[6742]92        source = CLEARED,
93        destination = PAID),
94
95    Transition(
[8434]96        transition_id = 'approve_first_school_fee',
97        title = _('Approve payment'),
[9022]98        msg = _('First school fee payment approved'),
[8434]99        source = CLEARED,
100        destination = PAID),
101
102    Transition(
[6742]103        transition_id = 'reset5',
[7677]104        title = _('Reset to cleared'),
[7996]105        msg = _("Reset to 'cleared'"),
[6742]106        source = PAID,
107        destination = CLEARED),
108
109    Transition(
110        transition_id = 'pay_school_fee',
[7677]111        title = _('Pay school fee'),
[9022]112        msg = _('School fee payment made'),
[6742]113        source = RETURNING,
114        destination = PAID),
115
116    Transition(
[8471]117        transition_id = 'pay_pg_fee',
[9022]118        title = _('Pay PG school fee'),
119        msg = _('PG school fee payment made'),
[8471]120        source = PAID,
121        destination = PAID),
122
123    Transition(
[8434]124        transition_id = 'approve_school_fee',
[9022]125        title = _('Approve school fee payment'),
[8434]126        msg = _('School fee payment approved'),
127        source = RETURNING,
128        destination = PAID),
129
130    Transition(
[8471]131        transition_id = 'approve_pg_fee',
[9022]132        title = _('Approve PG school fee payment'),
133        msg = _('PG school fee payment approved'),
[8471]134        source = PAID,
135        destination = PAID),
136
137    Transition(
[6742]138        transition_id = 'reset6',
[7677]139        title = _('Reset to returning'),
[7996]140        msg = _("Reset to 'returning'"),
[6742]141        source = PAID,
142        destination = RETURNING),
[6801]143
144    Transition(
145        transition_id = 'register_courses',
[7677]146        title = _('Register courses'),
147        msg = _('Courses registered'),
[6801]148        source = PAID,
149        destination = REGISTERED),
150
151    Transition(
152        transition_id = 'reset7',
[9022]153        title = _('Reset to school fee paid'),
154        msg = _("Reset to 'school fee paid'"),
[6801]155        source = REGISTERED,
156        destination = PAID),
157
158    Transition(
159        transition_id = 'validate_courses',
[7677]160        title = _('Validate courses'),
161        msg = _('Courses validated'),
[6801]162        source = REGISTERED,
163        destination = VALIDATED),
164
165    Transition(
166        transition_id = 'reset8',
[9022]167        title = _('Reset to school fee paid'),
168        msg = _("Reset to 'school fee paid'"),
[6801]169        source = VALIDATED,
170        destination = PAID),
171
172    Transition(
173        transition_id = 'return',
[7677]174        title = _('Return'),
[7996]175        msg = _("Reset to 'returning'"),
[6801]176        source = VALIDATED,
177        destination = RETURNING),
178
179    Transition(
180        transition_id = 'reset9',
[9022]181        title = _('Reset to courses validated'),
182        msg = _("Reset to 'courses validated'"),
[6801]183        source = RETURNING,
184        destination = VALIDATED),
[6637]185    )
186
[8309]187IMPORTABLE_TRANSITIONS = [i.transition_id for i in REGISTRATION_TRANSITIONS]
188
[9028]189FORBIDDEN_POSTGRAD_TRANS = ['reset6', 'register_courses']
[6722]190LOCK_CLEARANCE_TRANS = ('reset2', 'request_clearance')
191UNLOCK_CLEARANCE_TRANS = ('reset3', 'reset4', 'start_clearance')
[6720]192
[7819]193registration_workflow = KofaWorkflow(REGISTRATION_TRANSITIONS)
[6637]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
[7819]204class RegistrationWorkflowInfo(KofaWorkflowInfo, grok.Adapter):
[6637]205    """Adapter to adapt Student objects to workflow info objects.
206    """
207    grok.context(IStudent)
[7819]208    grok.provides(IKofaWorkflowInfo)
[6637]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):
[6644]216    """Append message to student history and log file when transition happened.
[7133]217
[7681]218    Lock and unlock clearance form.
[9005]219    Trigger actions after school fee payment.
[6637]220    """
[7679]221
222    msg = event.transition.user_data['msg']
[6637]223    history = IObjectHistory(obj)
224    history.addMessage(msg)
[6722]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
[6742]229    # School fee payment of returning students triggers the change of
230    # current session, current level, and current verdict
[8434]231    if event.transition.transition_id in (
232        'pay_school_fee', 'approve_school_fee'):
[7615]233        getUtility(IStudentsUtils).setReturningData(obj)
[8471]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
[9161]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
[7652]257    # In some tests we don't have a students container
[6644]258    try:
259        students_container = grok.getSite()['students']
[7652]260        students_container.logger.info('%s - %s' % (obj.student_id,msg))
[6644]261    except (TypeError, AttributeError):
262        pass
[6637]263    return
Note: See TracBrowser for help on using the repository browser.