misc: add more infos to <title> in form pages (#40924) #122

Merged
fpeters merged 1 commits from wip/40924-form-pages-title into main 2023-02-24 08:00:08 +01:00
8 changed files with 132 additions and 20 deletions

View File

@ -10370,3 +10370,55 @@ def test_form_edit_single_page(pub):
resp = resp.form.submit('submit')
formdata.refresh_from_storage()
assert formdata.data == {'2': 'a', '4': 'other change', '6': 'last change'}
def test_form_html_titles(pub):
formdef = create_formdef()
formdef.fields = [
fields.StringField(id='1', label='string', required=False),
]
formdef.store()
formdef.data_class().wipe()
resp = get_app(pub).get('/test/')
assert resp.pyquery('title').text() == 'test - 1/2 - Filling'
resp = resp.forms[0].submit('submit') # -> validation
assert resp.pyquery('title').text() == 'test - 2/2 - Validating'
resp = resp.forms[0].submit('submit').follow() # -> submit
assert resp.pyquery('title').text() == 'test #1-1'
# without confirmation page, single page, no counter
formdef.confirmation = False
formdef.store()
resp = get_app(pub).get('/test/')
assert resp.pyquery('title').text() == 'test - Filling'
# naming first page
formdef.fields = [
fields.PageField(id='0', label='1st page', type='page'),
fields.StringField(id='1', label='string'),
]
formdef.store()
resp = get_app(pub).get('/test/')
assert resp.pyquery('title').text() == 'test - 1st page'
# multi pages
formdef.fields = [
fields.PageField(id='0', label='1st page', type='page'),
fields.StringField(id='1', label='string', required=False),
fields.PageField(id='2', label='2nd page', type='page'),
]
formdef.store()
resp = get_app(pub).get('/test/')
assert resp.pyquery('title').text() == 'test - 1/2 - 1st page'
resp = resp.forms[0].submit('submit') # -> 2nd page
assert resp.pyquery('title').text() == 'test - 2/2 - 2nd page'
# multi pages and confirmation page
formdef.confirmation = True
formdef.store()
resp = get_app(pub).get('/test/')
assert resp.pyquery('title').text() == 'test - 1/3 - 1st page'
resp = resp.forms[0].submit('submit') # -> 2nd page
assert resp.pyquery('title').text() == 'test - 2/3 - 2nd page'
resp = resp.forms[0].submit('submit') # -> validation
assert resp.pyquery('title').text() == 'test - 3/3 - Validating'

View File

@ -356,3 +356,37 @@ def test_translated_datetime(pub, user):
resp = app.get('/fr/test-form/')
# check date end with /year
assert ('/%s ' % datetime.date.today().year) in resp.pyquery('.drafts-recall li:first-child a').text()
def test_form_titles(pub):
FormDef.wipe()
formdef = FormDef()
formdef.name = 'test form'
formdef.store()
formdef.data_class().wipe()
TranslatableMessage.wipe()
msg = TranslatableMessage()
msg.string = 'test form'
msg.string_fr = 'formulaire de test'
msg.store()
resp = get_app(pub).get(formdef.get_url(language='en'))
assert resp.pyquery('title').text() == 'test form - 1/2 - Filling'
assert resp.pyquery('h1').text() == 'test form'
resp = resp.form.submit('submit') # -> validation
assert resp.pyquery('title').text() == 'test form - 2/2 - Validating'
assert resp.pyquery('h1').text() == 'test form'
resp = resp.form.submit('submit').follow()
assert resp.pyquery('title').text() == 'test form #1-1'
assert resp.pyquery('h1').text() == 'test form'
resp = get_app(pub).get(formdef.get_url(language='fr'))
assert resp.pyquery('title').text().startswith('formulaire de test - 1/2')
assert resp.pyquery('h1').text() == 'formulaire de test'
resp = resp.form.submit('submit') # -> validation
assert resp.pyquery('title').text().startswith('formulaire de test - 2/2')
assert resp.pyquery('h1').text() == 'formulaire de test'
resp = resp.form.submit('submit').follow()
assert resp.pyquery('title').text().startswith('formulaire de test')
assert resp.pyquery('h1').text() == 'formulaire de test'

View File

@ -425,7 +425,7 @@ def test_field_live_select_content_on_workflow_form(pub, http_requests):
app = get_app(pub)
resp = login(app, username='foo', password='foo').get('/test/')
assert resp.pyquery('title').text() == 'test'
assert resp.pyquery('title').text() == 'test - Filling'
resp = resp.form.submit('submit').follow()
assert 'The form has been recorded' in resp.text

View File

@ -1326,7 +1326,10 @@ class FormData(StorableObject):
self.store()
def get_display_name(self):
return _('%(name)s #%(id)s') % {'name': self.formdef.name, 'id': self.get_display_id()}
return _('%(name)s #%(id)s') % {
'name': get_publisher().translate(self.formdef.name),
'id': self.get_display_id(),
}
@property
def default_digest(self):

View File

@ -340,7 +340,8 @@ class FormStatusPage(Directory, FormTemplateMixin):
form.add_media()
get_response().add_javascript(['jquery.js', 'qommon.forms.js', 'qommon.map.js'])
self.html_top(self.formdef.name)
self.html_top(get_publisher().translate(self.formdef.name))
get_response().filter['page_title'] = self.filled.get_display_label()
context = {
'view': self,
'mine': mine,

View File

@ -56,8 +56,8 @@ class SubmittedDraftException(Exception):
pass
def html_top(title=None):
template.html_top(title=title, default_org=_('Forms'))
def html_top(title=None, page_title=None):
template.html_top(title=title, default_org=_('Forms'), page_title=page_title)
def get_user_forms(formdef):
@ -363,7 +363,7 @@ class FormPage(FormdefDirectoryBase, FormTemplateMixin):
return i + 1
return 0
def step(self):
def step_context(self):
page_labels = []
current_position = 1
@ -380,16 +380,13 @@ class FormPage(FormdefDirectoryBase, FormTemplateMixin):
if self.on_validation_page:
current_position = len(page_labels)
if not self.on_validation_page:
self.substvars['current_page_no'] = current_position
return {'current_page_no': current_position, 'page_labels': page_labels}
return template.render(
list(self.get_formdef_template_variants(self.steps_templates)),
{
'page_labels': page_labels,
'current_page_no': current_position,
},
)
def step(self):
context = self.step_context()
if not self.on_validation_page:
self.substvars['current_page_no'] = context.get('current_page_no')
return template.render(list(self.get_formdef_template_variants(self.steps_templates)), context)
@classmethod
def iter_with_block_fields(cls, form, fields):
@ -532,6 +529,29 @@ class FormPage(FormdefDirectoryBase, FormTemplateMixin):
had_prefill = True
return had_prefill
def set_page_title(self):
step_context = self.step_context()
if len(step_context.get('page_labels')) > 1:
self.html_top(
title=get_publisher().translate(self.formdef.name),
page_title='%s - %s/%s - %s'
% (
get_publisher().translate(self.formdef.name),
step_context['current_page_no'],
len(step_context['page_labels']),
step_context['page_labels'][step_context['current_page_no'] - 1],
),
)
else:
self.html_top(
title=get_publisher().translate(self.formdef.name),
page_title='%s - %s'
% (
get_publisher().translate(self.formdef.name),
step_context['page_labels'][step_context['current_page_no'] - 1],
),
)
def page(
self, page, page_change=True, page_error_messages=None, submit_button=None, transient_formdata=None
):
@ -669,7 +689,7 @@ class FormPage(FormdefDirectoryBase, FormTemplateMixin):
widget.options = kwargs['options']
widget.options_with_attributes = kwargs['options_with_attributes']
self.html_top(get_publisher().translate(self.formdef.name))
self.set_page_title()
form.add_hidden('step', '0')
form.add_hidden('page', self.pages.index(page))
@ -1756,7 +1776,7 @@ class FormPage(FormdefDirectoryBase, FormTemplateMixin):
def validating(self, data, page_error_messages=None):
self.on_validation_page = True
get_request().view_name = 'validation'
self.html_top(get_publisher().translate(self.formdef.name))
self.set_page_title()
# fake a GET request to avoid previous page POST data being carried
# over in rendering.
get_request().environ['REQUEST_METHOD'] = 'GET'

View File

@ -23,7 +23,7 @@ def generate_header_menu(selected=None):
return get_publisher().get_backoffice_root().generate_header_menu(selected=selected)
def html_top(section, title=None, scripts=None):
def html_top(section, title=None, scripts=None, page_title=None):
header_menu = generate_header_menu(section)
if not scripts:
script = ''

View File

@ -49,11 +49,12 @@ def get_theme_directory(theme_id):
return location
def html_top(title=None, default_org=None):
def html_top(title=None, default_org=None, page_title=None):
if not hasattr(get_response(), 'filter'):
get_response().filter = {}
get_response().filter['title'] = title
get_response().filter['default_org'] = default_org
get_response().filter['page_title'] = page_title
def error_page(error_message, error_title=None, location_hint=None):
@ -115,7 +116,8 @@ def get_decorate_vars(body, response, generate_breadcrumb=True, **kwargs):
current_theme = get_cfg('branding', {}).get('theme', get_publisher().default_theme)
if kwargs.get('title'):
page_title = title = kwargs.get('title')
title = kwargs.get('title')
page_title = kwargs.get('page_title') or title
title_or_orgname = title
else:
page_title = site_name