141 lines
5.8 KiB
Python
141 lines
5.8 KiB
Python
|
from appy.gen import *
|
||
|
|
||
|
class BunchOfGeek:
|
||
|
description = String(format=String.TEXT)
|
||
|
|
||
|
class ZopeComponentTool(Tool):
|
||
|
someUsefulConfigurationOption = String()
|
||
|
def onInstall(self):
|
||
|
self.someUsefulConfigurationOption = 'My app is configured now!'
|
||
|
install = Action(action=onInstall)
|
||
|
|
||
|
class ZopeComponentFlavour(Flavour):
|
||
|
anIntegerOption = Integer()
|
||
|
bunchesOfGeeks = Ref(BunchOfGeek, multiplicity=(0,None), add=True,
|
||
|
link=False, back=Ref(attribute='backToTool'),
|
||
|
shownInfo=('description',), page='data')
|
||
|
def onEdit(self, created):
|
||
|
if 'Escadron de la mort' not in [b.title for b in self.bunchesOfGeeks]:
|
||
|
self.create('bunchesOfGeeks', title='Escadron de la mort',
|
||
|
description='I want those guys everywhere!')
|
||
|
|
||
|
class ZopeComponentWorkflow:
|
||
|
# Specific permissions
|
||
|
wf = WritePermission('ZopeComponent.funeralDate')
|
||
|
rb = ReadPermission('ZopeComponent.responsibleBunch')
|
||
|
# Roles
|
||
|
zManager = 'ZManager'
|
||
|
zLeader = 'ZLeader'
|
||
|
managerM = (zManager, 'Manager')
|
||
|
leaderM = (zLeader, 'Manager')
|
||
|
everybody = (zManager, zLeader, 'Manager')
|
||
|
# States
|
||
|
created = State({r:leaderM, w:('Owner', 'Manager'), d:leaderM, wf:'Owner',
|
||
|
rb:everybody}, initial=True)
|
||
|
validated = State({r:everybody, w:everybody, d:None, wf:everybody,
|
||
|
rb:everybody})
|
||
|
underDevelopment = State({r:everybody, w:leaderM, d:None, wf:leaderM,
|
||
|
rb:everybody})
|
||
|
whereIsTheClient = State({r:everybody, w:managerM, d:None, wf:managerM,
|
||
|
rb:everybody})
|
||
|
# Transitions
|
||
|
def funeralOk(self, obj): return obj.funeralDate
|
||
|
validate = Transition( (created, validated),
|
||
|
condition=managerM + (funeralOk,))
|
||
|
def updateDescription(self, obj):
|
||
|
obj.description = 'Description edited by my manager was silly.'
|
||
|
startDevelopment = Transition( (validated, underDevelopment),
|
||
|
condition=leaderM, action=updateDescription)
|
||
|
cancelDevelopment = Transition( (underDevelopment, whereIsTheClient),
|
||
|
condition=managerM)
|
||
|
cancel = Transition( ( (whereIsTheClient, underDevelopment),
|
||
|
(underDevelopment, validated),
|
||
|
(validated, created)), condition='Manager')
|
||
|
|
||
|
class ZopeComponent:
|
||
|
root = True
|
||
|
workflow = ZopeComponentWorkflow
|
||
|
def showDate(self):
|
||
|
return True
|
||
|
def validateDescription(self, value):
|
||
|
res = True
|
||
|
if value.find('simple') != -1:
|
||
|
res = self.translate('zope_3_is_not_simple')
|
||
|
return res
|
||
|
description = String(editDefault=True)
|
||
|
technicalDescription = String(format=String.XHTML,
|
||
|
validator=validateDescription)
|
||
|
#status = String(validator=['underDevelopement', 'stillSomeWorkToPerform',
|
||
|
# 'weAreAlmostFinished', 'alphaReleaseIsBugged', 'whereIsTheClient'],
|
||
|
# optional=True, editDefault=True)
|
||
|
funeralDate = Date(optional=True, specificWritePermission=True)
|
||
|
responsibleBunch = Ref(BunchOfGeek, multiplicity=(1,1), add=False,
|
||
|
link=True, back=Ref(attribute='components'),
|
||
|
specificReadPermission=True)
|
||
|
|
||
|
class CobolComponentWorkflow(ZopeComponentWorkflow):
|
||
|
p = ZopeComponentWorkflow # Shortcut to workflow parent
|
||
|
# An additional state
|
||
|
finished = State(p.whereIsTheClient.permissions)
|
||
|
# Override validate: condition on funeralDate has no sense here
|
||
|
validate = Transition(p.validate.states, condition=p.managerM)
|
||
|
# Override cancelDevelopment: go to finished instead
|
||
|
cancelDevelopment = Transition( (p.underDevelopment, finished),
|
||
|
condition=p.managerM)
|
||
|
# Update cancel accordingly
|
||
|
cancel = Transition( ((finished, p.underDevelopment),) +p.cancel.states[1:],
|
||
|
condition=p.cancel.condition)
|
||
|
|
||
|
class CobolComponent:
|
||
|
root = True
|
||
|
workflow = CobolComponentWorkflow
|
||
|
description = String()
|
||
|
|
||
|
class Person:
|
||
|
abstract = True
|
||
|
pod = True
|
||
|
title = String(show=False)
|
||
|
n = 'name_3'
|
||
|
firstName = String(group=n, width=15)
|
||
|
middleInitial = String(group=n, width=3)
|
||
|
name = String(multiplicity=(1,1), group=n, width=30)
|
||
|
contractDetails = String(format=String.XHTML)
|
||
|
cia = {'page': 'contactInformation', 'group': 'address_2'}
|
||
|
street = String(**cia)
|
||
|
number = Integer(**cia)
|
||
|
country = String(**cia)
|
||
|
zipCode = Integer(**cia)
|
||
|
cio = {'page': 'contactInformation', 'group': 'numbers_2', 'width': 20}
|
||
|
phoneNumber = String(**cio)
|
||
|
faxNumber = String(**cio)
|
||
|
mobilePhone = String(**cio)
|
||
|
workPhoneNumber = String(**cio)
|
||
|
workFaxNumber = String(**cio)
|
||
|
workMobilePhone = String(**cio)
|
||
|
def onEdit(self, created):
|
||
|
self.title = self.firstName + ' ' + self.name
|
||
|
|
||
|
class Worker(Person):
|
||
|
root = True
|
||
|
productivity = Integer()
|
||
|
|
||
|
class Parasite(Person):
|
||
|
root = True
|
||
|
pod = ['SordidGossips', 'MoreGossips']
|
||
|
hairColor = String(group='hairyCharacteristics')
|
||
|
sordidGossips = String(format = String.XHTML, page='Gossips')
|
||
|
parasiteIndex = String(validator=['low', 'medium', 'high',
|
||
|
'unquantifiable'],
|
||
|
page='contactInformation', group='numbers')
|
||
|
details = String(page='contactInformation', group='numbers',
|
||
|
master=parasiteIndex, masterValue='unquantifiable')
|
||
|
avoidAnyPhysicalContact = Boolean(page='contactInformation')
|
||
|
def validate(self, new, errors):
|
||
|
if (new.hairColor == 'flashy') and (new.firstName == 'Gerard'):
|
||
|
errors.hairColor = True
|
||
|
errors.firstName = "Flashy Gerards are disgusting."
|
||
|
|
||
|
c = Config()
|
||
|
c.languages = ('en', 'fr')
|
||
|
c.defaultCreators += ['ZLeader']
|