0001-workflows-handle-add-block-buttons-in-display-form-a.patch
tests/backoffice_pages/test_all.py | ||
---|---|---|
4232 | 4232 |
] |
4233 | 4233 | |
4234 | 4234 | |
4235 |
def test_backoffice_workflow_display_form_with_block_add(pub): |
|
4236 |
user = create_user(pub) |
|
4237 |
create_environment(pub) |
|
4238 | ||
4239 |
block = BlockDef() |
|
4240 |
block.name = 'foobar' |
|
4241 |
block.fields = [ |
|
4242 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
4243 |
] |
|
4244 |
block.store() |
|
4245 | ||
4246 |
wf = Workflow.get_default_workflow() |
|
4247 |
wf.id = '2' |
|
4248 |
wf.store() |
|
4249 |
wf = Workflow.get(wf.id) |
|
4250 |
status = wf.get_status('new') |
|
4251 |
status.items = [] |
|
4252 |
display_form = FormWorkflowStatusItem() |
|
4253 |
display_form.id = '_display_form' |
|
4254 |
display_form.by = [user.roles[0]] |
|
4255 |
display_form.varname = 'blah' |
|
4256 |
display_form.formdef = WorkflowFormFieldsFormDef(item=display_form) |
|
4257 |
display_form.formdef.fields = [ |
|
4258 |
fields.StringField(id='1', label='Test', varname='str', type='string', required=True), |
|
4259 |
fields.BlockField(id='2', label='Blocks', type='block:foobar', varname='data', max_items=3), |
|
4260 |
] |
|
4261 |
status.items.append(display_form) |
|
4262 |
display_form.parent = status |
|
4263 | ||
4264 |
jump = JumpOnSubmitWorkflowStatusItem() |
|
4265 |
jump.id = '_jump' |
|
4266 |
jump.status = 'accepted' |
|
4267 |
status.items.append(jump) |
|
4268 |
jump.parent = status |
|
4269 | ||
4270 |
wf.store() |
|
4271 |
formdef = FormDef.get_by_urlname('form-title') |
|
4272 |
formdef.workflow_id = wf.id |
|
4273 |
formdef.store() |
|
4274 | ||
4275 |
for formdata in formdef.data_class().select(): |
|
4276 |
if formdata.status == 'wf-new': |
|
4277 |
break |
|
4278 |
app = login(get_app(pub)) |
|
4279 |
resp = app.get(formdata.get_url(backoffice=True)) |
|
4280 |
resp.form['fblah_1'] = 'blah' |
|
4281 |
resp.form['fblah_2$element0$f123'] = 'foo' |
|
4282 |
resp = resp.form.submit('fblah_2$add_element') |
|
4283 |
resp.form['fblah_2$element1$f123'] = 'bar' |
|
4284 |
resp = resp.form.submit('submit') |
|
4285 | ||
4286 |
assert formdef.data_class().get(formdata.id).workflow_data == { |
|
4287 |
'blah_var_data': 'foobar, foobar', |
|
4288 |
'blah_var_data_raw': {'data': [{'123': 'foo'}, {'123': 'bar'}], 'schema': {'123': 'string'}}, |
|
4289 |
'blah_var_str': 'blah', |
|
4290 |
} |
|
4291 | ||
4292 | ||
4235 | 4293 |
def test_backoffice_criticality_in_formdef_listing(pub): |
4236 | 4294 |
if not pub.is_using_postgresql(): |
4237 | 4295 |
pytest.skip('this requires SQL') |
wcs/forms/common.py | ||
---|---|---|
26 | 26 |
from wcs import data_sources |
27 | 27 |
from wcs.api_utils import get_user_from_api_query_string, is_url_signed, sign_url_auto_orig |
28 | 28 |
from wcs.fields import WidgetField, FileField |
29 |
from wcs.workflows import EditableWorkflowStatusItem |
|
29 |
from wcs.workflows import EditableWorkflowStatusItem, RedisplayFormException
|
|
30 | 30 | |
31 | 31 |
from ..qommon import _ |
32 | 32 |
from ..qommon import misc |
... | ... | |
547 | 547 | |
548 | 548 |
user = self.check_receiver() |
549 | 549 |
form = self.get_workflow_form(user) |
550 |
response = self.check_submitted_form(form) |
|
551 |
if response: |
|
552 |
get_session().unmark_visited_object(self.filled) |
|
553 |
return response |
|
550 |
try: |
|
551 |
response = self.check_submitted_form(form) |
|
552 |
except RedisplayFormException: |
|
553 |
# don't display errors after "add block" button has been clicked. |
|
554 |
form.clear_errors() |
|
555 |
else: |
|
556 |
if response: |
|
557 |
get_session().unmark_visited_object(self.filled) |
|
558 |
return response |
|
554 | 559 | |
555 | 560 |
get_logger().info('form %s - id: %s - view status' % (self.formdef.name, self.filled.id)) |
556 | 561 |
get_response().add_javascript(['jquery.js', 'qommon.forms.js']) |
wcs/wf/form.py | ||
---|---|---|
19 | 19 |
from ..qommon import _, N_ |
20 | 20 |
from ..qommon.form import * |
21 | 21 | |
22 |
from wcs.workflows import WorkflowStatusItem, register_item_class |
|
22 |
from wcs.workflows import WorkflowStatusItem, register_item_class, RedisplayFormException
|
|
23 | 23 |
from wcs.formdef import FormDef, lax_int |
24 | 24 | |
25 | 25 |
from wcs.admin.fields import FieldDefPage, FieldsDirectory |
... | ... | |
244 | 244 |
def submit_form(self, form, formdata, user, evo): |
245 | 245 |
if not self.formdef: |
246 | 246 |
return |
247 |
if form.get_submit() is True: |
|
248 |
# non-submit button, maybe a "add block" button, look for them. |
|
249 |
for widget in form.widgets: |
|
250 |
if isinstance(widget, WidgetList): # BlockWidget |
|
251 |
add_element_widget = widget.get_widget('add_element') |
|
252 |
if add_element_widget and add_element_widget.parse(): |
|
253 |
raise RedisplayFormException() |
|
247 | 254 |
if form.get_submit() == 'submit' and not form.has_errors(): |
248 | 255 |
self.evaluate_live_form(form, formdata, user) |
249 | 256 |
formdata.store() |
wcs/workflows.py | ||
---|---|---|
104 | 104 |
pass |
105 | 105 | |
106 | 106 | |
107 |
class RedisplayFormException(Exception): |
|
108 |
pass |
|
109 | ||
110 | ||
107 | 111 |
class AttachmentSubstitutionProxy(object): |
108 | 112 |
def __init__(self, formdata, attachment_evolution_part): |
109 | 113 |
self.formdata = formdata |
110 |
- |