source: main/waeup.ikoba/trunk/src/waeup/ikoba/customers/workflow.py @ 12125

Last change on this file since 12125 was 12097, checked in by Henrik Bettermann, 10 years ago

The term 'application' should really not be used in Python-based portal software.

Replace 'application' by 'contract': batch 1

  • Property svn:keywords set to Id
File size: 7.6 KB
Line 
1## $Id: workflow.py 12097 2014-11-30 20:49:22Z henrik $
2##
3## Copyright (C) 2014 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 customers.
19"""
20import grok
21from datetime import datetime
22from zope.component import getUtility
23from hurry.workflow.workflow import Transition, WorkflowState, NullCondition
24from hurry.workflow.interfaces import IWorkflowState, IWorkflowTransitionEvent
25from waeup.ikoba.interfaces import (
26    IObjectHistory, IIkobaWorkflowInfo, IIkobaUtils,
27    STARTED, CREATED, REQUESTED, APPROVED,
28    SUBMITTED, VERIFIED, REJECTED, EXPIRED)
29from waeup.ikoba.interfaces import MessageFactory as _
30from waeup.ikoba.workflow import IkobaWorkflow, IkobaWorkflowInfo
31from waeup.ikoba.customers.interfaces import (
32    ICustomer, ICustomersUtils,
33    IContract)
34from waeup.ikoba.utils.helpers import get_current_principal
35from waeup.ikoba.documents.workflow import VERIFICATION_TRANSITIONS
36
37# Customer workflow
38
39IMPORTABLE_REGISTRATION_STATES = (STARTED, REQUESTED, APPROVED)
40
41REGISTRATION_TRANSITIONS = (
42    Transition(
43        transition_id = 'create',
44        title = _('Create customer'),
45        source = None,
46        condition = NullCondition,
47        msg = _('Customer record created'),
48        destination = CREATED),
49
50    Transition(
51        transition_id = 'start',
52        title = _('Start registration'),
53        source = CREATED,
54        condition = NullCondition,
55        msg = _('Customer registration started'),
56        destination = STARTED),
57
58    Transition(
59        transition_id = 'request',
60        title = _('Request registration'),
61        msg = _('Customer registration requested'),
62        source = STARTED,
63        destination = REQUESTED),
64
65    Transition(
66        transition_id = 'approve',
67        title = _('Approve customer'),
68        msg = _('Customer registration approved'),
69        source = REQUESTED,
70        destination = APPROVED),
71
72    Transition(
73        transition_id = 'reject',
74        title = _('Reject customer'),
75        msg = _('Customer registration rejected'),
76        source = REQUESTED,
77        destination = STARTED),
78
79    Transition(
80        transition_id = 'reset1',
81        title = _('Reset customer'),
82        msg = _('Reset to initial customer state'),
83        source = APPROVED,
84        destination = STARTED),
85
86    Transition(
87        transition_id = 'reset2',
88        title = _('Reset to requested'),
89        msg = _("Reset to 'requested'"),
90        source = APPROVED,
91        destination = REQUESTED),
92
93    Transition(
94        transition_id = 'reset3',
95        title = _('Reset customer'),
96        msg = _("Reset to initial state"),
97        source = REQUESTED,
98        destination = STARTED),
99
100    )
101
102
103IMPORTABLE_REGISTRATION_TRANSITIONS = [i.transition_id for i in REGISTRATION_TRANSITIONS]
104
105registration_workflow = IkobaWorkflow(REGISTRATION_TRANSITIONS)
106
107
108class RegistrationWorkflowState(WorkflowState, grok.Adapter):
109    """An adapter to adapt Customer objects to workflow states.
110    """
111    grok.context(ICustomer)
112    grok.provides(IWorkflowState)
113
114    state_key = 'wf.registration.state'
115    state_id = 'wf.registration.id'
116
117
118class RegistrationWorkflowInfo(IkobaWorkflowInfo, grok.Adapter):
119    """Adapter to adapt Customer objects to workflow info objects.
120    """
121    grok.context(ICustomer)
122    grok.provides(IIkobaWorkflowInfo)
123
124    def __init__(self, context):
125        self.context = context
126        self.wf = registration_workflow
127
128
129@grok.subscribe(ICustomer, IWorkflowTransitionEvent)
130def handle_customer_transition_event(obj, event):
131    """Append message to customer history and log file when transition happened.
132    """
133
134    msg = event.transition.user_data['msg']
135    history = IObjectHistory(obj)
136    history.addMessage(msg)
137    try:
138        customers_container = grok.getSite()['customers']
139        customers_container.logger.info('%s - %s' % (obj.customer_id,msg))
140    except (TypeError, AttributeError):
141        pass
142    return
143
144# Contract workflow (the same as verification workflow)
145
146IMPORTABLE_CONTRACT_STATES = (CREATED, SUBMITTED, APPROVED, REJECTED, EXPIRED)
147
148CONTRACT_TRANSITIONS = (
149    Transition(
150        transition_id = 'create',
151        title = _('Create contract record'),
152        source = None,
153        condition = NullCondition,
154        msg = _('Contract record created'),
155        destination = CREATED),
156
157    Transition(
158        transition_id = 'submit',
159        title = _('Submit for approval'),
160        msg = _('Submitted for approval'),
161        source = CREATED,
162        destination = SUBMITTED),
163
164    Transition(
165        transition_id = 'approve',
166        title = _('Approve'),
167        msg = _('Approved'),
168        source = SUBMITTED,
169        destination = APPROVED),
170
171    Transition(
172        transition_id = 'reject',
173        title = _('Reject'),
174        msg = _('REJECTED'),
175        source = SUBMITTED,
176        destination = REJECTED),
177
178    Transition(
179        transition_id = 'reset1',
180        title = _('Reset to initial state'),
181        msg = _('Reset to initial state'),
182        source = REJECTED,
183        destination = CREATED),
184
185    Transition(
186        transition_id = 'reset2',
187        title = _('Reset to initial state'),
188        msg = _('Reset to initial state'),
189        source = APPROVED,
190        destination = CREATED),
191
192    Transition(
193        transition_id = 'reset3',
194        title = _('Reset to initial state'),
195        msg = _('Reset to initial state'),
196        source = SUBMITTED,
197        destination = CREATED),
198
199    Transition(
200        transition_id = 'expire',
201        title = _('Set to expired'),
202        msg = _('Set to expired'),
203        source = APPROVED,
204        destination = EXPIRED),
205
206    Transition(
207        transition_id = 'reset4',
208        title = _('Reset to initial state'),
209        msg = _('Reset to initial state'),
210        source = EXPIRED,
211        destination = CREATED),
212    )
213
214
215IMPORTABLE_CONTRACT_TRANSITIONS = [
216    i.transition_id for i in REGISTRATION_TRANSITIONS]
217
218contract_workflow = IkobaWorkflow(CONTRACT_TRANSITIONS)
219
220class ContractWorkflowState(WorkflowState, grok.Adapter):
221    """An adapter to adapt Contract objects to workflow states.
222    """
223    grok.context(IContract)
224    grok.provides(IWorkflowState)
225
226    state_key = 'wf.contract.state'
227    state_id = 'wf.contract.id'
228
229class ContractWorkflowInfo(IkobaWorkflowInfo, grok.Adapter):
230    """Adapter to adapt Contract objects to workflow info objects.
231    """
232    grok.context(IContract)
233    grok.provides(IIkobaWorkflowInfo)
234
235    def __init__(self, context):
236        self.context = context
237        self.wf = contract_workflow
238
239@grok.subscribe(IContract, IWorkflowTransitionEvent)
240def handle_document_transition_event(obj, event):
241    """Append message to contract history and log file and update
242    last_transition_date when transition happened.
243    """
244    msg = event.transition.user_data['msg']
245    history = IObjectHistory(obj)
246    history.addMessage(msg)
247    obj.last_transition_date = datetime.utcnow()
248    try:
249        customers_container = grok.getSite()['customers']
250        customers_container.logger.info('%s - %s' % (obj.customer_id,msg))
251    except (TypeError, AttributeError):
252        pass
253    return
Note: See TracBrowser for help on using the repository browser.