misc: skip hidden pages when editing from a given page (#78219) #1128

Merged
fpeters merged 2 commits from wip/78219-edit-from-invisible-page into main 2024-02-13 11:35:09 +01:00
3 changed files with 90 additions and 9 deletions

View File

@ -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)

View File

@ -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'}

rien à voir, mais le test s'appelle test_form_edit_single_page mais teste les modes single et partial, peut-être le renommer ?

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é.

Je l'ai renommé.
# 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')

View File

@ -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]

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 ?

Ç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