admin: reassign formdata status on workflow change
This commit is contained in:
parent
cd11fa46e0
commit
d99af3f075
|
@ -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():
|
||||
|
|
Loading…
Reference in New Issue