136 lines
5.1 KiB
Python
136 lines
5.1 KiB
Python
# w.c.s. - web application for online forms
|
|
# Copyright (C) 2005-2013 Entr'ouvert
|
|
#
|
|
# 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
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
|
|
|
import xml.etree.ElementTree as ET
|
|
|
|
from qommon.form import *
|
|
|
|
from wcs.workflows import WorkflowStatusItem, register_item_class
|
|
from wcs.formdef import FormDef
|
|
|
|
from wcs.admin.fields import FieldDefPage, FieldsDirectory
|
|
from wcs.formdata import get_dict_with_varnames
|
|
|
|
|
|
class WorkflowFormFieldsFormDef(FormDef):
|
|
def __init__(self, item):
|
|
self.name = _('Workflow Form Fields')
|
|
self.item = item
|
|
self.fields = []
|
|
self.id = None
|
|
|
|
def store(self):
|
|
self.item.parent.parent.store()
|
|
|
|
class WorkflowFormFieldDefPage(FieldDefPage):
|
|
section = 'workflows'
|
|
|
|
|
|
class WorkflowFormFieldsDirectory(FieldsDirectory):
|
|
section = 'workflows'
|
|
support_import = False
|
|
blacklisted_types = ['page']
|
|
|
|
|
|
class FormWorkflowStatusItem(WorkflowStatusItem):
|
|
description = N_('Display a form')
|
|
key = 'form'
|
|
|
|
by = []
|
|
formdef = None
|
|
varname = None
|
|
|
|
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
|
|
if 'by' in parameters:
|
|
form.add(WidgetList, '%sby' % prefix, title = _('To'), element_type = SingleSelectWidget,
|
|
value = self.by,
|
|
add_element_label = _('Add Role'),
|
|
element_kwargs = {'render_br': False,
|
|
'options': [(None, '---')] +
|
|
self.get_list_of_roles(include_logged_in_users=False)})
|
|
if 'varname' in parameters:
|
|
form.add(VarnameWidget, '%svarname' % prefix, required=True,
|
|
title=_('Variable Name'), value=self.varname)
|
|
|
|
form.widgets.append(HtmlWidget(htmltext('<p><a href="fields/">%s</a></p>') % _('Edit Fields')))
|
|
|
|
def get_parameters(self):
|
|
return ('by', 'varname')
|
|
|
|
def export_to_xml(self, charset, include_id=False):
|
|
item = WorkflowStatusItem.export_to_xml(self, charset, include_id=include_id)
|
|
if not hasattr(self, 'formdef') or not self.formdef or not self.formdef.fields:
|
|
return item
|
|
formdef = ET.SubElement(item, 'formdef')
|
|
|
|
# we give a name to the formdef because it is required in the formdef
|
|
# xml import.
|
|
ET.SubElement(formdef, 'name').text = '-'
|
|
|
|
fields = ET.SubElement(formdef, 'fields')
|
|
for field in self.formdef.fields:
|
|
fields.append(field.export_to_xml(charset=charset, include_id=include_id))
|
|
return item
|
|
|
|
def init_with_xml(self, elem, charset, include_id=False):
|
|
WorkflowStatusItem.init_with_xml(self, elem, charset)
|
|
el = elem.find('formdef')
|
|
# we can always include id in the formdef export as it lives in
|
|
# a different space, isolated from other formdefs.
|
|
imported_formdef = FormDef.import_from_xml_tree(el, include_id=True)
|
|
self.formdef = WorkflowFormFieldsFormDef(item=self)
|
|
self.formdef.fields = imported_formdef.fields
|
|
|
|
def q_admin_lookup(self, workflow, status, component, html_top):
|
|
if component == 'fields':
|
|
if not self.formdef:
|
|
self.formdef = WorkflowFormFieldsFormDef(item=self)
|
|
fields_directory = WorkflowFormFieldsDirectory(self.formdef)
|
|
fields_directory.html_top = html_top
|
|
return fields_directory
|
|
return None
|
|
|
|
def fill_form(self, form, formdata, user):
|
|
self.formdef.add_fields_to_form(form)
|
|
form.add_submit('submit', _('Submit'))
|
|
|
|
formdata.feed_session()
|
|
|
|
req = get_request()
|
|
for field in self.formdef.fields:
|
|
if ('f%s' % field.id) in req.form:
|
|
continue
|
|
if not field.prefill or field.prefill.get('type') == 'none':
|
|
continue
|
|
v = field.get_prefill_value()
|
|
if v:
|
|
form.get_widget('f%s' % field.id).set_value(v)
|
|
req.form['f%s' % field.id] = v
|
|
else:
|
|
form.get_widget('f%s' % field.id).clear_error()
|
|
|
|
def submit_form(self, form, formdata, user, evo):
|
|
if form.get_submit() == 'submit' and not form.has_errors():
|
|
workflow_data = {}
|
|
for k, v in get_dict_with_varnames(
|
|
self.formdef.fields, self.formdef.get_data(form),
|
|
varnames_only=True).items():
|
|
workflow_data['%s_%s' % (self.varname, k)] = v
|
|
formdata.update_workflow_data(workflow_data)
|
|
formdata.store()
|
|
|
|
register_item_class(FormWorkflowStatusItem)
|