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

Last change on this file since 14716 was 13610, checked in by Henrik Bettermann, 9 years ago

Add button and view which allow students to unregister their
current course list unless the courses have not been validated.

  • Property svn:keywords set to Id
File size: 8.9 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',
[13610]153        title = _('Unregister courses'),
154        msg = _("Courses unregistered"),
[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']
[6720]214
[7819]215registration_workflow = KofaWorkflow(REGISTRATION_TRANSITIONS)
[6637]216
217class RegistrationWorkflowState(WorkflowState, grok.Adapter):
218    """An adapter to adapt Student objects to workflow states.
219    """
220    grok.context(IStudent)
221    grok.provides(IWorkflowState)
222
223    state_key = 'wf.registration.state'
224    state_id = 'wf.registration.id'
225
[7819]226class RegistrationWorkflowInfo(KofaWorkflowInfo, grok.Adapter):
[6637]227    """Adapter to adapt Student objects to workflow info objects.
228    """
229    grok.context(IStudent)
[7819]230    grok.provides(IKofaWorkflowInfo)
[6637]231
232    def __init__(self, context):
233        self.context = context
234        self.wf = registration_workflow
235
236@grok.subscribe(IStudent, IWorkflowTransitionEvent)
237def handle_student_transition_event(obj, event):
[6644]238    """Append message to student history and log file when transition happened.
[7133]239
[7681]240    Lock and unlock clearance form.
[9005]241    Trigger actions after school fee payment.
[6637]242    """
[7679]243
244    msg = event.transition.user_data['msg']
[6637]245    history = IObjectHistory(obj)
246    history.addMessage(msg)
[6742]247    # School fee payment of returning students triggers the change of
248    # current session, current level, and current verdict
[8434]249    if event.transition.transition_id in (
250        'pay_school_fee', 'approve_school_fee'):
[7615]251        getUtility(IStudentsUtils).setReturningData(obj)
[8471]252    elif event.transition.transition_id in (
253        'pay_pg_fee', 'approve_pg_fee'):
254        new_session = obj['studycourse'].current_session + 1
255        obj['studycourse'].current_session = new_session
[9161]256    elif event.transition.transition_id == 'validate_courses':
257        current_level = obj['studycourse'].current_level
258        level_object = obj['studycourse'].get(str(current_level), None)
259        if level_object is not None:
260            user = get_current_principal()
261            if user is None:
262                usertitle = 'system'
263            else:
264                usertitle = getattr(user, 'public_name', None)
265                if not usertitle:
266                    usertitle = user.title
267            level_object.validated_by = usertitle
268            level_object.validation_date = datetime.utcnow()
[9484]269    elif event.transition.transition_id == 'clear':
[9486]270        obj.officer_comment = None
[9161]271    elif event.transition.transition_id == 'reset8':
272        current_level = obj['studycourse'].current_level
273        level_object = obj['studycourse'].get(str(current_level), None)
274        if level_object is not None:
275            level_object.validated_by = None
276            level_object.validation_date = None
[7652]277    # In some tests we don't have a students container
[6644]278    try:
279        students_container = grok.getSite()['students']
[7652]280        students_container.logger.info('%s - %s' % (obj.student_id,msg))
[6644]281    except (TypeError, AttributeError):
282        pass
[6637]283    return
Note: See TracBrowser for help on using the repository browser.