source: main/waeup.kofa/trunk/src/waeup/kofa/applicants/workflow.py @ 8431

Last change on this file since 8431 was 8373, checked in by Henrik Bettermann, 13 years ago

Add state started to IMPORTABLE_STATES.

  • Property svn:keywords set to Id
File size: 5.5 KB
Line 
1## $Id: workflow.py 8373 2012-05-06 22:08:41Z henrik $
2##
3## Copyright (C) 2011 Uli Fouquet & Henrik Bettermann
4## This program is free software; you can redistribute it and/or modify
5## it under the terms of the GNU General Public License as published by
6## the Free Software Foundation; either version 2 of the License, or
7## (at your option) any later version.
8##
9## This program is distributed in the hope that it will be useful,
10## but WITHOUT ANY WARRANTY; without even the implied warranty of
11## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12## GNU General Public License for more details.
13##
14## You should have received a copy of the GNU General Public License
15## along with this program; if not, write to the Free Software
16## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17##
18"""Workflow for applicants.
19"""
20import grok
21from hurry.workflow.workflow import Transition, WorkflowState, NullCondition
22from hurry.workflow.interfaces import IWorkflowState, IWorkflowTransitionEvent
23from waeup.kofa.applicants.interfaces import IApplicantBaseData
24from waeup.kofa.interfaces import IObjectHistory, IKofaWorkflowInfo, IKofaUtils
25from waeup.kofa.interfaces import MessageFactory as _
26from waeup.kofa.workflow import KofaWorkflow, KofaWorkflowInfo
27
28INITIALIZED = 'initialized'
29STARTED = 'started'
30PAID = 'paid'
31SUBMITTED = 'submitted'
32ADMITTED = 'admitted'
33NOT_ADMITTED = 'not admitted'
34CREATED = 'created'
35
36IMPORTABLE_STATES = (INITIALIZED, STARTED, PAID, SUBMITTED, ADMITTED, NOT_ADMITTED)
37
38application_states_dict = {
39    INITIALIZED: _('initialized'),
40    STARTED: _('started'),
41    PAID: _('paid'),
42    SUBMITTED: _('submitted'),
43    ADMITTED: _('admitted'),
44    NOT_ADMITTED: _('not admitted'),
45    CREATED: _('created'),
46    }
47
48APPLICATION_TRANSITIONS = (
49    Transition(
50        transition_id = 'init',
51        title = _('Initialize application'),
52        source = None,
53        condition = NullCondition,
54        msg = _('Application initialized'),
55        destination = INITIALIZED),
56
57    Transition(
58        transition_id = 'start',
59        title = _('Start application'),
60        msg = _('Application started'),
61        source = INITIALIZED,
62        destination = STARTED),
63
64    Transition(
65        transition_id = 'pay',
66        title = _('Pay application fee'),
67        msg = _('Fee paid'),
68        source = STARTED,
69        destination = PAID),
70
71    Transition(
72        transition_id = 'submit',
73        title = _('Submit application'),
74        msg = _('Application submitted'),
75        source = PAID,
76        destination = SUBMITTED),
77
78    Transition(
79        transition_id = 'admit',
80        title = _('Admit applicant'),
81        msg = _('Applicant admitted'),
82        source = SUBMITTED,
83        destination = ADMITTED),
84
85    Transition(
86        transition_id = 'refuse1',
87        title = _('Refuse application'),
88        msg = _('Application refused'),
89        source = SUBMITTED,
90        destination = NOT_ADMITTED),
91
92    Transition(
93        transition_id = 'refuse2',
94        title = _('Refuse application'),
95        msg = _('Application refused'),
96        source = ADMITTED,
97        destination = NOT_ADMITTED),
98
99    Transition(
100        transition_id = 'create',
101        title = _('Create student record'),
102        msg = _('Student record created'),
103        source = ADMITTED,
104        destination = CREATED),
105
106    Transition(
107        transition_id = 'reset1',
108        title = _('Reset application to started'),
109        msg = _('Application reset'),
110        source = SUBMITTED,
111        destination = STARTED),
112
113    Transition(
114        transition_id = 'reset2',
115        title = _('Reset application to started'),
116        msg = _('Application reset'),
117        source = ADMITTED,
118        destination = STARTED),
119
120    Transition(
121        transition_id = 'reset3',
122        title = _('Reset application to started'),
123        msg = _('Application reset'),
124        source = NOT_ADMITTED,
125        destination = STARTED),
126
127    Transition(
128        transition_id = 'reset4',
129        title = _('Reset application to started'),
130        msg = _('Application reset'),
131        source = CREATED,
132        destination = STARTED),
133    Transition(
134        transition_id = 'reset5',
135        title = _('Reset application to paid'),
136        msg = _('Application reset'),
137        source = SUBMITTED,
138        destination = PAID),
139    )
140
141application_workflow = KofaWorkflow(APPLICATION_TRANSITIONS)
142
143class ApplicationWorkflowState(WorkflowState, grok.Adapter):
144    """An adapter to adapt Applicant objects to workflow states.
145    """
146    grok.context(IApplicantBaseData)
147    grok.provides(IWorkflowState)
148
149    state_key = 'wf.application.state'
150    state_id = 'wf.application.id'
151
152class ApplicationWorkflowInfo(KofaWorkflowInfo, grok.Adapter):
153    """Adapter to adapt Applicant objects to workflow info objects.
154    """
155    grok.context(IApplicantBaseData)
156    grok.provides(IKofaWorkflowInfo)
157
158    def __init__(self, context):
159        self.context = context
160        self.wf = application_workflow
161
162@grok.subscribe(IApplicantBaseData, IWorkflowTransitionEvent)
163def handle_applicant_transition_event(obj, event):
164    """Append message to applicant history when transition happened.
165    """
166    msg = event.transition.user_data['msg']
167    if event.transition.transition_id == 'create':
168        msg += ' (%s)' % obj.student_id
169    history = IObjectHistory(obj)
170    history.addMessage(msg)
171    # In some tests we don't have a an applicants root or a user
172    try:
173        applicants_root = grok.getSite()['applicants']
174        applicants_root.logger.info('%s - %s' % (obj.applicant_id,msg))
175    except (TypeError, AttributeError):
176        pass
177    return
Note: See TracBrowser for help on using the repository browser.