admin: reassign formdata status on workflow change

This commit is contained in:
Frédéric Péters 2012-08-13 22:46:07 +02:00
parent cd11fa46e0
commit d99af3f075
1 changed files with 101 additions and 22 deletions

View File

@ -38,7 +38,7 @@ from qommon import tokens
from qommon.afterjobs import AfterJob
from qommon import emails
from wcs.formdata import FormData
from wcs.formdata import FormData, Evolution
from wcs.formdef import FormDef, FormField
from wcs.categories import Category
from wcs.roles import Role, logged_users_role, get_user_roles
@ -67,8 +67,8 @@ def get_categories():
t = sorted([(misc.simplify(x.name), x.id, x.name) for x in Category.select()])
return [x[1:] for x in t]
def get_workflows():
t = sorted([(misc.simplify(x.name), x.id, x.name) for x in Workflow.select()])
def get_workflows(condition=lambda x: True):
t = sorted([(misc.simplify(x.name), x.id, x.name) for x in Workflow.select() if condition(x)])
return [x[1:] for x in t]
@ -273,7 +273,8 @@ class FieldsDirectory(FieldsDirectory):
class FormDefPage(Directory):
_q_exports = ['', 'fields', 'edit', 'delete', 'duplicate', 'export',
'archive', 'invite', 'enable', 'workflow', 'category',
'recipient']
'recipient', ('workflow-options', 'workflow_options'),
('workflow-status-remapping', 'workflow_status_remapping'),]
def __init__(self, component):
try:
@ -308,16 +309,20 @@ class FormDefPage(Directory):
'(<a href="category" rel="popup">%s</a>)' % _('change')
'</li>'
'<li>%s ' % _('Workflow:')
if self.formdef.workflow:
self.formdef.workflow.name
else:
'-'
if self.formdef.workflow_id:
pristine_workflow = Workflow.get(self.formdef.workflow_id)
if pristine_workflow.has_options():
' (<a href="workflow">%s</a>)' % _('options')
'</li>'
workflows = get_workflows()
if workflows:
'<li>%s ' % _('Workflow:')
if self.formdef.workflow:
self.formdef.workflow.name
else:
'-'
if self.formdef.workflow_id:
pristine_workflow = Workflow.get(self.formdef.workflow_id)
if pristine_workflow.has_options():
' (<a href="workflow-options">%s</a>)' % _('options')
' '
'(<a href="workflow" rel="popup">%s</a>)' % _('change')
'</li>'
'<li>%s ' % _('Recipient Role:')
if self.formdef.receiver:
@ -445,6 +450,85 @@ class FormDefPage(Directory):
self.formdef.store()
redirect('.')
def workflow [html] (self):
form = Form(enctype='multipart/form-data')
workflows = get_workflows(condition=lambda x: x.possible_status)
form.add(SingleSelectWidget, 'workflow_id',
value=self.formdef.workflow_id,
options = [(None, _('Default'))] + workflows)
form.add_submit('submit', _('Submit'))
form.add_submit('cancel', _('Cancel'))
if form.get_widget('cancel').parse():
return redirect('.')
if not form.is_submitted() or form.has_errors():
get_response().breadcrumb.append( ('workflow', _('Workflow')) )
html_top('forms', title=self.formdef.name)
'<p>%s</p>' % _('Select the workflow that will handle those forms.')
form.render()
else:
workflow_id = form.get_widget('workflow_id').parse()
if self.formdef.data_class().keys():
# there are existing formdata, status will have to be mapped
if workflow_id is None:
workflow_id = '_default'
return redirect('workflow-status-remapping?new=%s' % workflow_id)
self.formdef.workflow_id = workflow_id
self.formdef.store()
redirect('.')
def workflow_status_remapping [html] (self):
new_workflow = Workflow.get(get_request().form.get('new'))
if get_request().get_method() == 'GET':
get_request().form = None # do not be considered submitted already
new_workflow_status = [(x.id, x.name) for x in new_workflow.possible_status]
form = Form(enctype='multipart/form-data')
for status in self.formdef.workflow.possible_status:
default = status.id
if not default in [x.id for x in new_workflow.possible_status]:
default = new_workflow_status[0]
form.add(SingleSelectWidget, 'mapping-%s' % status.id,
title=status.name,
value=default, options=new_workflow_status)
form.add_submit('submit', _('Submit'))
form.add_submit('cancel', _('Cancel'))
if form.get_widget('cancel').parse():
return redirect('.')
if not form.is_submitted() or form.has_errors():
get_response().breadcrumb.append( ('workflow-status-remapping', _('Workflow Status Remapping')) )
html_top('forms', title=self.formdef.name)
'<p>'
_('From %(here)s to %(there)s') % {'here': self.formdef.workflow.name,
'there': new_workflow.name}
'</p>'
form.render()
else:
self.workflow_status_remapping_submit(form)
if new_workflow.id == '_default':
self.formdef.workflow_id = None
else:
self.formdef.workflow_id = new_workflow.id
self.formdef.store()
return redirect('.')
def workflow_status_remapping_submit(self, form):
status_mapping = {}
for status in self.formdef.workflow.possible_status:
status_mapping['wf-%s' % status.id] = 'wf-%s' % \
form.get_widget('mapping-%s' % status.id).parse()
for item in self.formdef.data_class().select():
item.status = status_mapping.get(item.status)
evo = Evolution()
evo.time = time.localtime()
evo.status = item.status
evo.comment = _('Administrator changed workflow, reassigned status')
if not item.evolution:
item.evolution = []
item.evolution.append(evo)
item.store()
def get_preview [html] (self):
form = Form()
on_page = 0
@ -474,7 +558,6 @@ class FormDefPage(Directory):
form.render()
'</div>'
def edit [html] (self, duplicate = False):
form = self.formdefui.edit_form_ui()
@ -533,7 +616,6 @@ class FormDefPage(Directory):
self.formdef.remove_self()
return redirect('..')
def export(self):
x = self.formdef.export_to_xml()
indent(x)
@ -565,7 +647,6 @@ class FormDefPage(Directory):
else:
return self.archive_submit(form)
def archive_submit(self, form):
all_forms = self.formdef.data_class().select()
@ -696,7 +777,6 @@ class FormDefPage(Directory):
invitation_sender.send)
return redirect('invite?job=%s' % job.id)
def sending_invitations [html] (self):
try:
job = AfterJob.get(get_request().form.get('job'))
@ -727,14 +807,13 @@ class FormDefPage(Directory):
return redirect('fields/')
return redirect('.')
def workflow [html] (self):
def workflow_options [html] (self):
request = get_request()
if request.get_method() == 'GET' and request.form.get('file'):
value = self.formdef.workflow_options.get(request.form.get('file'))
if value:
return value.build_response()
html_top('forms', title = _('Workflow Options'))
'<h2>%s</h2>' % _('Workflow Options')
form = Form(enctype='multipart/form-data')
@ -762,10 +841,10 @@ class FormDefPage(Directory):
return redirect('.')
if form.is_submitted() and not form.has_errors():
self.workflow_submit(form)
self.workflow_options_submit(form)
return redirect('.')
def workflow_submit(self, form):
def workflow_options_submit(self, form):
self.formdef.workflow_options = {}
for widget in form.get_all_widgets():
if widget in form.get_submit_widgets():