misc: skip hidden pages when editing from a given page (#78219) #1128
|
@ -3199,6 +3199,57 @@ def test_backoffice_wfedit_single_page(pub):
|
|||
assert formdata.data == {'2': 'a', '4': 'changed', '5': None, '7': 'c'}
|
||||
|
||||
|
||||
def test_backoffice_wfedit_partial_pages(pub):
|
||||
user = create_user(pub)
|
||||
|
||||
workflow = Workflow(name='test')
|
||||
st1 = workflow.add_status('Status1', 'st1')
|
||||
editable = st1.add_action('editable', id='_editable')
|
||||
editable.by = ['_receiver']
|
||||
editable.operation_mode = 'partial'
|
||||
editable.page_identifier = 'plop'
|
||||
workflow.store()
|
||||
|
||||
FormDef.wipe()
|
||||
formdef = FormDef()
|
||||
formdef.name = 'test'
|
||||
formdef.fields = []
|
||||
formdef.store()
|
||||
|
||||
formdef.data_class().wipe()
|
||||
formdef.fields = [
|
||||
fields.PageField(id='1', label='1st page'),
|
||||
fields.StringField(id='2', label='field1'),
|
||||
fields.PageField(id='3', label='2nd page', varname='plop'),
|
||||
fields.StringField(id='4', label='field2'),
|
||||
fields.StringField(
|
||||
id='5', label='field2b', condition={'type': 'django', 'value': 'not is_in_backoffice'}
|
||||
),
|
||||
fields.PageField(id='6', label='3rd page'),
|
||||
fields.StringField(id='7', label='field3'),
|
||||
]
|
||||
formdef.workflow_id = workflow.id
|
||||
formdef.workflow_roles = {'_receiver': user.roles[0]}
|
||||
formdef.store()
|
||||
|
||||
formdata = formdef.data_class()()
|
||||
formdata.data = {'2': 'a', '4': 'b', '5': 'b2', '7': 'c'}
|
||||
formdata.just_created()
|
||||
formdata.store()
|
||||
|
||||
app = login(get_app(pub))
|
||||
|
||||
resp = app.get(formdata.get_backoffice_url())
|
||||
resp = resp.form.submit('button_editable').follow()
|
||||
assert [x.text for x in resp.pyquery('#steps .wcs-step--label-text')] == ['2nd page', '3rd page']
|
||||
resp.form['f4'] = 'changed'
|
||||
resp = resp.form.submit('submit')
|
||||
resp.form['f7'] = 'changed'
|
||||
resp = resp.form.submit('submit')
|
||||
formdata.refresh_from_storage()
|
||||
assert formdata.data == {'2': 'a', '4': 'changed', '5': None, '7': 'changed'}
|
||||
|
||||
|
||||
def test_global_listing(pub):
|
||||
create_user(pub)
|
||||
create_environment(pub)
|
||||
|
|
|
@ -5650,7 +5650,7 @@ def test_form_edit_with_category(pub):
|
|||
assert 'f1' in resp.form.fields
|
||||
|
||||
|
||||
def test_form_edit_single_page(pub):
|
||||
def test_form_edit_single_or_partial_pages(pub):
|
||||
user = create_user(pub)
|
||||
|
||||
workflow = Workflow(name='test')
|
||||
|
@ -5737,6 +5737,34 @@ def test_form_edit_single_page(pub):
|
|||
formdata.refresh_from_storage()
|
||||
assert formdata.data == {'2': 'a', '4': 'other change', '6': 'last change'}
|
||||
|
||||
# make page 2 hidden
|
||||
formdef.fields[2].condition = {'type': 'django', 'value': 'false'}
|
||||
formdef.store()
|
||||
|
||||
resp = app.get(formdata.get_url())
|
||||
resp = resp.form.submit('button_editable').follow()
|
||||
assert [x.text for x in resp.pyquery('#steps .wcs-step--label-text')] == ['3rd page']
|
||||
assert [x.text for x in resp.pyquery('.buttons button')] == ['Save Changes', 'Previous', 'Cancel']
|
||||
assert resp.pyquery('.buttons button.form-previous[hidden]')
|
||||
assert resp.pyquery('.buttons button.form-previous[disabled]')
|
||||
resp.form['f6'] = 'another last change'
|
||||
resp = resp.form.submit('submit')
|
||||
formdata.refresh_from_storage()
|
||||
assert formdata.data == {'2': 'a', '4': 'other change', '6': 'another last change'}
|
||||
|
||||
|
||||
# also make page 3 hidden -> 404
|
||||
formdef.fields[4].condition = {'type': 'django', 'value': 'false'}
|
||||
formdef.store()
|
||||
resp = app.get(formdata.get_url())
|
||||
resp = resp.form.submit('button_editable').follow(status=404)
|
||||
|
||||
# check single page mode with hidden page (also 404)
|
||||
editable.operation_mode = 'partial'
|
||||
workflow.store()
|
||||
formdef.store()
|
||||
resp = app.get(formdata.get_url())
|
||||
resp = resp.form.submit('button_editable').follow(status=404)
|
||||
|
||||
|
||||
def test_form_edit_and_jump_on_submit(pub):
|
||||
wf = Workflow(name='edit and jump on submit')
|
||||
|
|
|
@ -1060,18 +1060,17 @@ class FormPage(Directory, TempfileDirectoryMixin, FormTemplateMixin):
|
|||
if self._pages:
|
||||
return self._pages
|
||||
current_data = self.get_transient_formdata().data
|
||||
pages = []
|
||||
field_page = None
|
||||
|
||||
pages = [x for x in self.formdef.fields if x.key == 'page']
|
||||
has_page_fields = bool(pages)
|
||||
|
||||
with get_publisher().substitutions.freeze():
|
||||
# don't let evaluation of pages alter substitution variables (this
|
||||
# avoids a ConditionVars being added with current form data and
|
||||
# influencing later code evaluating field visibility based on
|
||||
# submitted data) (#27247).
|
||||
for field in self.formdef.fields:
|
||||
if field.key == 'page':
|
||||
field_page = field
|
||||
if field.is_visible(current_data, self.formdef):
|
||||
pages.append(field)
|
||||
hidden_pages = [x for x in pages if not x.is_visible(current_data, self.formdef)]
|
||||
|
||||
if self.edit_mode and self.edit_action and self.edit_action.operation_mode in ('single', 'partial'):
|
||||
edit_pages = []
|
||||
for page in pages:
|
||||
|
@ -1079,10 +1078,13 @@ class FormPage(Directory, TempfileDirectoryMixin, FormTemplateMixin):
|
|||
edit_pages.append(page)
|
||||
if self.edit_action.operation_mode == 'single':
|
||||
break
|
||||
edit_pages = [x for x in edit_pages if x not in hidden_pages]
|
||||
lguerin
commented
petit doute, est-ce qu'il y a un test en mode single et partial, pour le cas où il n'y a pas de page visible ? petit doute, est-ce qu'il y a un test en mode single et partial, pour le cas où il n'y a pas de page visible ?
fpeters
commented
Ça n'était en effet pas testé, je l'ai ajouté. Et j'ai ajouté un test du mode "partial" dans le backoffice, dans un commit séparé. Ça n'était en effet pas testé, je l'ai ajouté.
Et j'ai ajouté un test du mode "partial" dans le backoffice, dans un commit séparé.
|
||||
if not edit_pages:
|
||||
raise errors.TraversalError()
|
||||
pages = edit_pages
|
||||
if not field_page: # form without page fields
|
||||
else:
|
||||
pages = [x for x in pages if x not in hidden_pages]
|
||||
if not has_page_fields: # form without page fields
|
||||
pages = [None]
|
||||
self._pages = pages
|
||||
return pages
|
||||
|
|
Loading…
Reference in New Issue
rien à voir, mais le test s'appelle
test_form_edit_single_page
mais teste les modes single et partial, peut-être le renommer ?Je l'ai renommé.