diff --git a/composer/schema/browser/schema.py b/composer/schema/browser/schema.py index 8fd747e..be62d72 100644 --- a/composer/schema/browser/schema.py +++ b/composer/schema/browser/schema.py @@ -33,6 +33,7 @@ from cybertools.composer.schema.browser.common import BaseView from cybertools.composer.schema.client import eventTypes, getCheckoutRule from cybertools.composer.schema.interfaces import IClientFactory, ISchema from cybertools.composer.schema.schema import FormState +from cybertools.stateful.interfaces import IStateful from cybertools.util.jeep import Jeep @@ -123,12 +124,16 @@ class FormManagerView(BaseView): break return False - def overview(self): + def overview(self, ignoreTemporary=True): result = [] for c in self.context.getClients().values(): + state = IStateful(c).state + if ignoreTemporary and state == 'temporary': + continue instance = IInstance(c) data = instance.applyTemplate() data['id'] = data['__name__'] + data['state'] = state result.append(data) return result @@ -142,7 +147,8 @@ class FormManagerView(BaseView): instance.template = s data = instance.applyTemplate() for f in s.fields: - result.append(dict(label=f.title, value=data[f.name])) + if f.storeData: + result.append(dict(label=f.title, value=data.get(f.name))) return result @@ -173,6 +179,10 @@ class CheckoutView(BaseView): client = self.getClient() if client is None: return True # TODO: error, redirect to overview + # submit + stf = IStateful(client) + if stf.state == 'temporary': + stf.doTransition('submit') # send mail rm = IRuleManager(self.context) rm.addRule(getCheckoutRule(self.context.senderEmail)) diff --git a/composer/schema/client.py b/composer/schema/client.py index 8c7dd4a..faffda0 100644 --- a/composer/schema/client.py +++ b/composer/schema/client.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2007 Helmut Merz helmutm@cy55.de +# Copyright (c) 2010 Helmut Merz helmutm@cy55.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -33,6 +33,10 @@ from cybertools.composer.rule.base import RuleManager, EventType from cybertools.composer.rule.base import Rule, Action from cybertools.composer.schema.interfaces import IClient from cybertools.composer.schema.interfaces import IClientManager, IClientFactory +from cybertools.stateful.base import StatefulAdapter +from cybertools.stateful.definition import registerStatesDefinition +from cybertools.stateful.definition import StatesDefinition +from cybertools.stateful.definition import State, Transition from cybertools.util.jeep import Jeep from cybertools.util.randomname import generateName @@ -124,6 +128,40 @@ class RuleManagerAdapter(RuleManager): self.context = context +# registration states + +clientStates = 'composer.schema.client' + +registerStatesDefinition( + StatesDefinition(clientStates, + State('temporary', 'temporary', ('submit', 'cancel',)), + State('submitted', 'submitted', + ('change', 'retract', 'confirm', 'reject',)), + State('cancelled', 'cancelled', ('activate',)), + State('retracted', 'retracted', ('activate', 'cancel',)), + State('confirmed', 'confirmed', + ('change', 'retract', 'reject',)), + State('rejected', 'rejected', + ('change', 'retract', 'confirm',)), + Transition('cancel', 'Cancel registration', 'cancelled'), + Transition('submit', 'Submit registration', 'submitted'), + Transition('change', 'Change registration', 'submitted'), + Transition('retract', 'Retract registration', 'retracted'), + Transition('activate', 'Activate cancelled registration', + 'temporary'), + Transition('confirm', 'Confirm registration', 'confirmed'), + Transition('reject', 'Reject registration', 'rejected'), + initialState='temporary', +)) + + +class StatefulClient(StatefulAdapter): + + adapts(IClient) + + statesDefinition = clientStates + + eventTypes = Jeep(( EventType('client.checkout'), ))