source: main/waeup.sirp/trunk/src/waeup/sirp/workflow.py @ 6294

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

Reuse workflow.py for applicants.

File size: 4.1 KB
RevLine 
[6294]1"""Workflow for applicants.
[4308]2"""
3import grok
4from hurry.workflow.workflow import Transition, Workflow, WorkflowVersions
5from hurry.workflow.workflow import WorkflowInfo, WorkflowState, NullCondition
6from hurry.workflow.interfaces import MANUAL, AUTOMATIC, SYSTEM
7from hurry.workflow.interfaces import IWorkflow, IWorkflowState, IWorkflowInfo
8from hurry.workflow.interfaces import IWorkflowVersions
[6294]9from waeup.sirp.applicants.interfaces import IApplicantBaseData
[4308]10
[6294]11INITIALIZED = 'initialized'
12STARTED = 'started'
13SUBMITTED = 'submitted'
14ADMITTED = 'admitted'
15NOT_ADMITTED = 'not admitted'
16CREATED = 'created'
[4308]17
18def create_workflow():
19    init_transition = Transition(
20        transition_id = 'init',
21        title = 'Initialize',
22        source = None,
23        condition = NullCondition,
[6294]24        destination = INITIALIZED)
[4308]25
[6294]26    start_transition = Transition(
27        transition_id = 'start',
28        title = 'Start',
29        source = INITIALIZED,
30        destination = STARTED)
[4308]31
[6294]32    submit_transition = Transition(
33        transition_id = 'submit',
34        title = 'Submit',
35        source = STARTED,
36        destination = SUBMITTED)
[4308]37
[6294]38    admit_transition = Transition(
39        transition_id = 'admit',
40        title = 'Admit',
41        source = SUBMITTED,
42        destination = ADMITTED)
[4308]43
[6294]44    defer_transition = Transition(
45        transition_id = 'defer',
46        title = 'Defer',
47        source = SUBMITTED,
48        destination = NOT_ADMITTED)
[4308]49
[6294]50    create_transition = Transition(
51        transition_id = 'create',
52        title = 'Create Student',
53        source = ADMITTED,
54        destination = CREATED)
55
56    #final_transition = Transition(
57    #    transition_id = 'finalize',
58    #    title = 'Delete',
59    #    source = ADMITTED,
60    #    destination = None)
61
62    return [init_transition, start_transition, submit_transition, admit_transition,
63        defer_transition, create_transition,]
64
65
66class ApplicationWorkflow(Workflow):
[4308]67    """A hurry.workflow Workflow with more appropriate error messages.
68    """
69    grok.provides(IWorkflow)
70    def __init__(self):
71        super(Workflow, self).__init__()
72        self.refresh(create_workflow())
73
74    def getTransition(self, source, transition_id):
75        from hurry.workflow.interfaces import\
76            InvalidTransitionError, ConditionFailedError
77
78        transition = self._id_transitions[transition_id]
79        if transition.source != source:
80            raise InvalidTransitionError(
81                "Transition '%s' requires '%s' as source state (is: '%s')" % (
82                    transition_id, transition.source, source))
83        return transition
84
85
[6294]86class ApplicationWorkflowNullVersions(WorkflowVersions):
[4308]87    """A workflow versions manager that does not handle versions.
88
89    Sounds odd, but the default implementation of
90    :class:`hurry.workflow.workflow.WorkflowVersions` is a base
91    implementation that raises :exc:`NotImplemented` exceptions for
92    most of the methods defined below.
93
94    If we want to register a versionless workflow, an utility
95    implementing IWorkflowVersions is looked up nevertheless by
96    WorkflowInfo and WorkflowState components so we **have** to
97    provide workflow versions, even if we do not support versioned
98    workflows.
99
100    This implementation returns empty result sets for any requests,
101    but does not raise :exc:`NotImplemented`.
102    """
103    def getVersions(self, state, id):
104        return []
105
106    def getVersionsWithAutomaticTransitions(self):
107        return []
108
109    def hasVersion(self, id, state):
110        return False
111
112    def hasVersionId(self, id):
113        return False
114
115# Register global utilities for workflows and workflow versions...
[6294]116grok.global_utility(ApplicationWorkflow, IWorkflow)
117grok.global_utility(ApplicationWorkflowNullVersions, IWorkflowVersions)
[4308]118
119class WorkflowState(grok.Adapter, WorkflowState):
[6294]120    """An adapter to adapt Applicant objects to workflow states.
[4308]121    """
[6294]122    grok.context(IApplicantBaseData)
[4308]123    grok.provides(IWorkflowState)
124   
125class WorkflowInfo(grok.Adapter, WorkflowInfo):
[6294]126    """Adapter to adapt Applicant objects to workflow info objects.
[4308]127    """
[6294]128    grok.context(IApplicantBaseData)
[4308]129    grok.provides(IWorkflowInfo)
Note: See TracBrowser for help on using the repository browser.