"""Workflow for students. """ import grok from datetime import datetime from hurry.workflow.workflow import Transition, WorkflowState, NullCondition from hurry.workflow.interfaces import IWorkflowState, IWorkflowTransitionEvent from waeup.sirp.students.interfaces import IStudent from waeup.sirp.interfaces import IObjectHistory, IWAeUPWorkflowInfo from waeup.sirp.workflow import WAeUPWorkflow, WAeUPWorkflowInfo from waeup.sirp.utils.helpers import get_current_principal CREATED = 'created' ADMITTED = 'admitted' REGISTRATION_TRANSITIONS = ( Transition( transition_id = 'create', title = 'Create student', source = None, condition = NullCondition, msg = 'Student record created', destination = CREATED), Transition( transition_id = 'admit', title = 'Admit student', msg = 'Student admitted', source = CREATED, destination = ADMITTED), Transition( transition_id = 'reset1', title = 'Reset student', msg = 'Student record reset', source = ADMITTED, destination = CREATED), ) registration_workflow = WAeUPWorkflow(REGISTRATION_TRANSITIONS) class RegistrationWorkflowState(WorkflowState, grok.Adapter): """An adapter to adapt Student objects to workflow states. """ grok.context(IStudent) grok.provides(IWorkflowState) state_key = 'wf.registration.state' state_id = 'wf.registration.id' class RegistrationWorkflowInfo(WAeUPWorkflowInfo, grok.Adapter): """Adapter to adapt Student objects to workflow info objects. """ grok.context(IStudent) grok.provides(IWAeUPWorkflowInfo) def __init__(self, context): self.context = context self.wf = registration_workflow @grok.subscribe(IStudent, IWorkflowTransitionEvent) def handle_student_transition_event(obj, event): """Append message to student history and log file when transition happened. """ msg = '%s' % event.transition.user_data['msg'] history = IObjectHistory(obj) history.addMessage(msg) # In some tests we don't have a students container or a user try: user = get_current_principal() students_container = grok.getSite()['students'] students_container.logger.info('%s - %s - %s' % (user.id,obj.student_id,msg)) except (TypeError, AttributeError): pass return