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

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

Fix typo.

  • Property svn:keywords set to Id
File size: 9.2 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,
[10446]11    REGISTERED, VALIDATED, GRADUATED, TRANSCRIPT)
[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,
[10452]19    REGISTERED, VALIDATED, GRADUATED)
[7513]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(
[9284]166        transition_id = 'bypass_validation',
167        title = _('Return and bypass validation'),
[9295]168        msg = _("Course validation bypassed"),
[9284]169        source = REGISTERED,
170        destination = RETURNING),
171
172    Transition(
[6801]173        transition_id = 'reset8',
[9022]174        title = _('Reset to school fee paid'),
175        msg = _("Reset to 'school fee paid'"),
[6801]176        source = VALIDATED,
177        destination = PAID),
178
179    Transition(
180        transition_id = 'return',
[7677]181        title = _('Return'),
[9284]182        msg = _("Returned"),
[6801]183        source = VALIDATED,
184        destination = RETURNING),
185
186    Transition(
187        transition_id = 'reset9',
[9022]188        title = _('Reset to courses validated'),
189        msg = _("Reset to 'courses validated'"),
[6801]190        source = RETURNING,
191        destination = VALIDATED),
[10446]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),
[6637]208    )
209
[10446]210
[8309]211IMPORTABLE_TRANSITIONS = [i.transition_id for i in REGISTRATION_TRANSITIONS]
212
[9028]213FORBIDDEN_POSTGRAD_TRANS = ['reset6', 'register_courses']
[6722]214LOCK_CLEARANCE_TRANS = ('reset2', 'request_clearance')
215UNLOCK_CLEARANCE_TRANS = ('reset3', 'reset4', 'start_clearance')
[6720]216
[7819]217registration_workflow = KofaWorkflow(REGISTRATION_TRANSITIONS)
[6637]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
[7819]228class RegistrationWorkflowInfo(KofaWorkflowInfo, grok.Adapter):
[6637]229    """Adapter to adapt Student objects to workflow info objects.
230    """
231    grok.context(IStudent)
[7819]232    grok.provides(IKofaWorkflowInfo)
[6637]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):
[6644]240    """Append message to student history and log file when transition happened.
[7133]241
[7681]242    Lock and unlock clearance form.
[9005]243    Trigger actions after school fee payment.
[6637]244    """
[7679]245
246    msg = event.transition.user_data['msg']
[6637]247    history = IObjectHistory(obj)
248    history.addMessage(msg)
[6722]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
[6742]253    # School fee payment of returning students triggers the change of
254    # current session, current level, and current verdict
[8434]255    if event.transition.transition_id in (
256        'pay_school_fee', 'approve_school_fee'):
[7615]257        getUtility(IStudentsUtils).setReturningData(obj)
[8471]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
[9161]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()
[9484]275    elif event.transition.transition_id == 'clear':
[9486]276        obj.officer_comment = None
[9161]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
[7652]283    # In some tests we don't have a students container
[6644]284    try:
285        students_container = grok.getSite()['students']
[7652]286        students_container.logger.info('%s - %s' % (obj.student_id,msg))
[6644]287    except (TypeError, AttributeError):
288        pass
[6637]289    return
Note: See TracBrowser for help on using the repository browser.