From df35bc818f699ea6e8627378792fa0c696f82575 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Sat, 29 Apr 2023 11:12:34 +0200 Subject: [PATCH] misc: replace html_top by response methods (#77144) --- wcs/admin/api_access.py | 12 ++-- wcs/admin/blocks.py | 23 +++---- wcs/admin/categories.py | 13 ++-- wcs/admin/comment_templates.py | 15 ++--- wcs/admin/data_sources.py | 15 ++--- wcs/admin/fields.py | 14 ++-- wcs/admin/forms.py | 50 ++++++-------- wcs/admin/logged_errors.py | 4 +- wcs/admin/mail_templates.py | 15 ++--- wcs/admin/roles.py | 19 +++--- wcs/admin/settings.py | 34 +++++----- wcs/admin/tests.py | 12 ++-- wcs/admin/users.py | 25 ++++--- wcs/admin/workflows.py | 105 +++++++++++++----------------- wcs/admin/wscalls.py | 13 ++-- wcs/backoffice/applications.py | 5 +- wcs/backoffice/cards.py | 4 +- wcs/backoffice/data_management.py | 9 +-- wcs/backoffice/deprecations.py | 3 +- wcs/backoffice/i18n.py | 5 +- wcs/backoffice/journal.py | 6 +- wcs/backoffice/management.py | 24 ++++--- wcs/backoffice/root.py | 4 +- wcs/backoffice/snapshots.py | 7 +- wcs/backoffice/studio.py | 9 +-- wcs/backoffice/submission.py | 12 ++-- wcs/forms/actions.py | 10 +-- wcs/forms/common.py | 7 +- wcs/forms/preview.py | 4 +- wcs/forms/root.py | 20 ++---- wcs/qommon/admin/emails.py | 7 +- wcs/qommon/admin/menu.py | 7 +- wcs/qommon/admin/texts.py | 8 +-- wcs/qommon/backoffice/__init__.py | 17 ----- wcs/qommon/backoffice/menu.py | 36 ---------- wcs/qommon/errors.py | 4 +- wcs/qommon/http_response.py | 8 +++ wcs/qommon/ident/franceconnect.py | 5 +- wcs/qommon/ident/idp.py | 23 ++++--- wcs/qommon/ident/password.py | 29 ++++----- wcs/qommon/myspace.py | 10 +-- wcs/qommon/saml2.py | 4 +- wcs/qommon/template.py | 22 ++----- wcs/root.py | 4 +- wcs/templates/wcs/backoffice.html | 2 +- wcs/views.py | 2 +- wcs/wf/form.py | 3 +- wcs/workflows.py | 2 +- 48 files changed, 278 insertions(+), 413 deletions(-) delete mode 100644 wcs/qommon/backoffice/__init__.py delete mode 100644 wcs/qommon/backoffice/menu.py diff --git a/wcs/admin/api_access.py b/wcs/admin/api_access.py index 163c294c9..93c464aa1 100644 --- a/wcs/admin/api_access.py +++ b/wcs/admin/api_access.py @@ -22,7 +22,6 @@ from quixote.html import TemplateIO, htmltext from wcs.api_access import ApiAccess from wcs.qommon import _, errors, template -from wcs.qommon.backoffice.menu import html_top from wcs.qommon.form import ( CheckboxWidget, Form, @@ -130,7 +129,7 @@ class ApiAccessPage(Directory): get_response().breadcrumb.append((component + '/', self.api_access.name)) def _q_index(self): - html_top('api-accesss', title=self.api_access.name) + get_response().set_title(self.api_access.name) return template.QommonTemplateResponse( templates=['wcs/backoffice/api_access.html'], context={'view': self, 'api_access': self.api_access}, @@ -150,7 +149,7 @@ class ApiAccessPage(Directory): return redirect('../%s/' % self.api_access.id) get_response().breadcrumb.append(('edit', _('Edit'))) - html_top('api-access', title=_('Edit API access')) + get_response().set_title(_('Edit API access')) r = TemplateIO(html=True) r += htmltext('

%s

') % _('Edit API access') r += form.render() @@ -167,7 +166,7 @@ class ApiAccessPage(Directory): return redirect('..') if not form.is_submitted() or form.has_errors(): get_response().breadcrumb.append(('delete', _('Delete'))) - html_top('api_accesss', title=_('Delete API access')) + get_response().set_title(_('Delete API access')) r = TemplateIO(html=True) r += htmltext('

%s %s

') % (_('Deleting API access:'), self.api_access.name) r += form.render() @@ -182,10 +181,11 @@ class ApiAccessDirectory(Directory): def _q_traverse(self, path): get_response().breadcrumb.append(('api-access/', _('API access'))) + get_response().set_backoffice_section('api-access') return super()._q_traverse(path) def _q_index(self): - html_top('api-access', title=_('API access')) + get_response().set_title(_('API access')) return template.QommonTemplateResponse( templates=['wcs/backoffice/api_accesses.html'], context={'view': self, 'api_accesses': ApiAccess.select(order_by='name')}, @@ -206,7 +206,7 @@ class ApiAccessDirectory(Directory): else: return redirect('.') - html_top('api-access', title=_('New API access')) + get_response().set_title(_('New API access')) r = TemplateIO(html=True) r += htmltext('

%s

') % _('New API access') r += form.render() diff --git a/wcs/admin/blocks.py b/wcs/admin/blocks.py index cf33875a7..f0643e96e 100644 --- a/wcs/admin/blocks.py +++ b/wcs/admin/blocks.py @@ -27,7 +27,6 @@ from wcs.blocks import BlockDef, BlockdefImportError from wcs.categories import BlockCategory from wcs.formdef import UpdateStatisticsDataAfterJob from wcs.qommon import _, misc, template -from wcs.qommon.backoffice.menu import html_top from wcs.qommon.errors import AccessForbiddenError, TraversalError from wcs.qommon.form import FileWidget, Form, HtmlWidget, SingleSelectWidget, SlugWidget, StringWidget @@ -65,11 +64,10 @@ class BlockDirectory(FieldsDirectory): fields_count_total_soft_limit = 30 fields_count_total_hard_limit = 60 - def __init__(self, section='forms', *args, **kwargs): + def __init__(self, *args, **kwargs): kwargs.pop('component', None) # snapshot if 'instance' in kwargs: kwargs['objectdef'] = kwargs.pop('instance') - self.section = section super().__init__(*args, **kwargs) self.snapshots_dir = SnapshotsDirectory(self.objectdef) @@ -136,7 +134,7 @@ class BlockDirectory(FieldsDirectory): return redirect('..') if not form.is_submitted() or form.has_errors(): get_response().breadcrumb.append(('delete', _('Delete'))) - html_top(self.section, title=_('Delete Block')) + get_response().set_title(_('Delete Block')) r = TemplateIO(html=True) r += htmltext('

%s %s

') % (_('Deleting Block:'), self.objectdef.name) r += form.render() @@ -164,7 +162,7 @@ class BlockDirectory(FieldsDirectory): name_widget.set_value(new_name) if not form.is_submitted() or form.has_errors(): - html_top(self.section, title=_('Duplicate Fields Block')) + get_response().set_title(_('Duplicate Fields Block')) r = TemplateIO(html=True) get_response().breadcrumb.append(('duplicate', _('Duplicate'))) r += htmltext('

%s

') % _('Duplicate Fields Block') @@ -244,14 +242,14 @@ class BlockDirectory(FieldsDirectory): self.objectdef.store() return redirect('.') - html_top(self.section, title=_('Settings')) + get_response().set_title(_('Settings')) r = TemplateIO(html=True) r += htmltext('

%s

') % _('Settings') r += form.render() return r.getvalue() def inspect(self): - self.html_top(self.objectdef.name) + get_response().set_title(self.objectdef.name) get_response().breadcrumb.append(('inspect', _('Inspector'))) return self.render_inspect() @@ -267,9 +265,8 @@ class BlocksDirectory(Directory): do_not_call_in_templates = True categories = BlockCategoriesDirectory() - def __init__(self, section): + def __init__(self): super().__init__() - self.section = section self.applications_dir = ApplicationsDirectory(BlockDef.xml_root_node) def _q_traverse(self, path): @@ -283,12 +280,12 @@ class BlocksDirectory(Directory): block = BlockDef.get(component) except KeyError: raise TraversalError() - return BlockDirectory(self.section, block) + return BlockDirectory(block) def _q_index(self): from wcs.applications import Application - html_top(self.section, title=_('Fields Blocks')) + get_response().set_title(_('Fields Blocks')) get_response().add_javascript(['popup.js']) context = { 'view': self, @@ -341,7 +338,7 @@ class BlocksDirectory(Directory): return redirect('%s/' % block.id) get_response().breadcrumb.append(('new', _('New Fields Block'))) - html_top(self.section, title=_('New Fields Block')) + get_response().set_title(_('New Fields Block')) r = TemplateIO(html=True) r += htmltext('

%s

') % _('New Fields Block') r += form.render() @@ -364,7 +361,7 @@ class BlocksDirectory(Directory): pass get_response().breadcrumb.append(('import', _('Import'))) - html_top(self.section, title=_('Import Fields Block')) + get_response().set_title(_('Import Fields Block')) r = TemplateIO(html=True) r += htmltext('

%s

') % _('Import Fields Block') r += htmltext('

%s

') % _('You can install a new fields block by uploading a file.') diff --git a/wcs/admin/categories.py b/wcs/admin/categories.py index ca4a09619..16a4b10c6 100644 --- a/wcs/admin/categories.py +++ b/wcs/admin/categories.py @@ -37,7 +37,6 @@ from wcs.data_sources import NamedDataSource from wcs.formdef import FormDef from wcs.mail_templates import MailTemplate from wcs.qommon import _, misc, template -from wcs.qommon.backoffice.menu import html_top from wcs.qommon.errors import AccessForbiddenError, TraversalError from wcs.qommon.form import Form, HtmlWidget, SingleSelectWidget, StringWidget, WidgetList, WysiwygTextWidget from wcs.workflows import Workflow @@ -215,7 +214,7 @@ class CategoryPage(Directory): get_response().breadcrumb.append((component + '/', self.category.name)) def _q_index(self): - html_top('categories', title=self.category.name) + get_response().set_title(self.category.name) get_response().add_javascript(['popup.js']) get_response().filter['sidebar'] = self.get_sidebar() return template.QommonTemplateResponse( @@ -253,7 +252,7 @@ class CategoryPage(Directory): return redirect('..') get_response().breadcrumb.append(('edit', _('Edit'))) - html_top('categories', title=_('Edit Category')) + get_response().set_title(_('Edit Category')) r = TemplateIO(html=True) r += htmltext('

%s

') % _('Edit Category') r += form.render() @@ -268,7 +267,7 @@ class CategoryPage(Directory): return redirect('.') if not form.is_submitted() or form.has_errors(): get_response().breadcrumb.append(('delete', _('Delete'))) - html_top('categories', title=_('Delete Category')) + get_response().set_title(_('Delete Category')) r = TemplateIO(html=True) r += htmltext('

%s %s

') % (_('Deleting Category:'), self.category.name) r += form.render() @@ -296,7 +295,7 @@ class CategoryPage(Directory): return redirect('.') get_response().breadcrumb.append(('description', _('Description'))) - html_top('categories', title=_('Edit Category Description')) + get_response().set_title(_('Edit Category Description')) r = TemplateIO(html=True) r += htmltext('

%s

') % _('Edit Category Description') r += form.render() @@ -377,7 +376,7 @@ class CategoriesDirectory(Directory): from wcs.applications import Application get_response().add_javascript(['biglist.js', 'qommon.wysiwyg.js', 'popup.js']) - html_top('categories', title=_('Categories')) + get_response().set_title(_('Categories')) categories = self.category_class.select() self.category_class.sort_by_position(categories) Application.populate_objects(categories) @@ -420,7 +419,7 @@ class CategoriesDirectory(Directory): else: return redirect('.') - html_top('categories', title=_('New Category')) + get_response().set_title(_('New Category')) r = TemplateIO(html=True) r += htmltext('

%s

') % _('New Category') r += form.render() diff --git a/wcs/admin/comment_templates.py b/wcs/admin/comment_templates.py index bf5bdb683..28dfe0cc8 100644 --- a/wcs/admin/comment_templates.py +++ b/wcs/admin/comment_templates.py @@ -25,7 +25,6 @@ from wcs.backoffice.snapshots import SnapshotsDirectory from wcs.categories import CommentTemplateCategory from wcs.comment_templates import CommentTemplate from wcs.qommon import _, errors, misc, template -from wcs.qommon.backoffice.menu import html_top from wcs.qommon.form import ( ComputedExpressionWidget, FileWidget, @@ -61,7 +60,7 @@ class CommentTemplatesDirectory(Directory): def _q_index(self): from wcs.applications import Application - html_top('comment_templates', title=_('Comment Templates')) + get_response().set_title(_('Comment Templates')) get_response().add_javascript(['popup.js']) comment_templates = CommentTemplate.select(order_by='name') Application.populate_objects(comment_templates) @@ -114,7 +113,7 @@ class CommentTemplatesDirectory(Directory): return redirect('%s/edit' % comment_template.id) get_response().breadcrumb.append(('new', _('New Comment Template'))) - html_top('comment_templates', title=_('New Comment Template')) + get_response().set_title(_('New Comment Template')) r = TemplateIO(html=True) r += htmltext('

%s

') % _('New Comment Template') r += form.render() @@ -138,7 +137,7 @@ class CommentTemplatesDirectory(Directory): pass get_response().breadcrumb.append(('import', _('Import'))) - html_top('comment_templates', title=import_title) + get_response().set_title(import_title) r = TemplateIO(html=True) r += htmltext('

%s

') % import_title r += htmltext('

%s

') % _('You can install a new comment template by uploading a file.') @@ -205,7 +204,7 @@ class CommentTemplatePage(Directory): return r.getvalue() def _q_index(self): - html_top('comment_templates', title=self.comment_template.name) + get_response().set_title(self.comment_template.name) get_response().filter['sidebar'] = self.get_sidebar() return template.QommonTemplateResponse( templates=['wcs/backoffice/comment-template.html'], @@ -309,7 +308,7 @@ class CommentTemplatePage(Directory): return redirect('.') get_response().breadcrumb.append(('edit', _('Edit'))) - html_top('comment_templates', title=_('Edit Comment Template')) + get_response().set_title(_('Edit Comment Template')) r = TemplateIO(html=True) r += htmltext('

%s

') % _('Edit Comment Template') r += form.render() @@ -333,7 +332,7 @@ class CommentTemplatePage(Directory): return redirect('.') if not form.is_submitted() or form.has_errors(): get_response().breadcrumb.append(('delete', _('Delete'))) - html_top('comment_templates', title=_('Delete Comment Template')) + get_response().set_title(_('Delete Comment Template')) r = TemplateIO(html=True) r += htmltext('

%s %s

') % (_('Deleting Comment Template:'), self.comment_template.name) r += form.render() @@ -368,7 +367,7 @@ class CommentTemplatePage(Directory): name_widget.set_value(new_name) if not form.is_submitted() or form.has_errors(): - html_top('comment_templates', title=_('Duplicate Comment Template')) + get_response().set_title(_('Duplicate Comment Template')) r = TemplateIO(html=True) get_response().breadcrumb.append(('duplicate', _('Duplicate'))) r += htmltext('

%s

') % _('Duplicate Comment Template') diff --git a/wcs/admin/data_sources.py b/wcs/admin/data_sources.py index bb890286a..4b3806f21 100644 --- a/wcs/admin/data_sources.py +++ b/wcs/admin/data_sources.py @@ -33,7 +33,6 @@ from wcs.data_sources import ( ) from wcs.formdef import get_formdefs_of_all_kinds from wcs.qommon import _, errors, misc, pgettext, template -from wcs.qommon.backoffice.menu import html_top from wcs.qommon.errors import AccessForbiddenError from wcs.qommon.form import ( CheckboxWidget, @@ -341,7 +340,7 @@ class NamedDataSourcePage(Directory): return r.getvalue() def _q_index(self): - html_top('datasources', title=self.datasource.name) + get_response().set_title(self.datasource.name) get_response().filter['sidebar'] = self.get_sidebar() url = None if self.datasource.data_source and self.datasource.data_source.get('type') in ( @@ -426,7 +425,7 @@ class NamedDataSourcePage(Directory): return redirect('.') get_response().breadcrumb.append(('edit', _('Edit'))) - html_top('datasources', title=_('Edit Data Source')) + get_response().set_title(_('Edit Data Source')) r = TemplateIO(html=True) r += htmltext('

%s

') % _('Edit Data Source') r += form.render() @@ -448,7 +447,7 @@ class NamedDataSourcePage(Directory): return redirect('..') if not form.is_submitted() or form.has_errors(): get_response().breadcrumb.append(('delete', _('Delete'))) - html_top('datasources', title=_('Delete Data Source')) + get_response().set_title(_('Delete Data Source')) r = TemplateIO(html=True) r += htmltext('

%s %s

') % (_('Deleting Data Source:'), self.datasource.name) r += form.render() @@ -475,7 +474,7 @@ class NamedDataSourcePage(Directory): return redirect('.') if not form.is_submitted() or form.has_errors(): get_response().breadcrumb.append(('duplicate', _('Duplicate'))) - html_top('datasources', title=_('Duplicate Data Source')) + get_response().set_title(_('Duplicate Data Source')) r = TemplateIO(html=True) r += htmltext('

%s %s

') % (_('Duplicating Data Source:'), self.datasource.name) r += form.render() @@ -520,7 +519,7 @@ class NamedDataSourcesDirectory(Directory): def _q_index(self): from wcs.applications import Application - html_top('datasources', title=_('Data Sources')) + get_response().set_title(_('Data Sources')) get_response().add_javascript(['popup.js']) context = { 'view': self, @@ -599,7 +598,7 @@ class NamedDataSourcesDirectory(Directory): else: return redirect('.') - html_top('datasources', title=title) + get_response().set_title(title) r = TemplateIO(html=True) r += htmltext('

%s

') % title r += form.render() @@ -637,7 +636,7 @@ class NamedDataSourcesDirectory(Directory): pass get_response().breadcrumb.append(('import', _('Import'))) - html_top('datasources', title=import_title) + get_response().set_title(import_title) r = TemplateIO(html=True) r += htmltext('

%s

') % import_title r += htmltext('

%s

') % _('You can install a new data source by uploading a file.') diff --git a/wcs/admin/fields.py b/wcs/admin/fields.py index c752b7813..7109be89a 100644 --- a/wcs/admin/fields.py +++ b/wcs/admin/fields.py @@ -28,7 +28,6 @@ from wcs.fields import BlockField, get_field_options from wcs.formdef import FormDef, UpdateStatisticsDataAfterJob from wcs.qommon import _, errors, get_cfg, misc from wcs.qommon.admin.menu import command_icon -from wcs.qommon.backoffice.menu import html_top from wcs.qommon.form import CheckboxWidget, Form, HtmlWidget, OptGroup, SingleSelectWidget, StringWidget from wcs.qommon.substitution import CompatibilityNamesDict @@ -89,7 +88,7 @@ class FieldDefPage(Directory): redo = True if redo or not form.get_submit() == 'submit': - self.html_top(self.objectdef.name) + get_response().set_title(self.objectdef.name) r = TemplateIO(html=True) r += htmltext('

%s

') % misc.ellipsize( self.field.unhtmled_label, 80 @@ -194,7 +193,7 @@ class FieldDefPage(Directory): return self.redirect_field_anchor(self.field) if not form.is_submitted() or form.has_errors(): get_response().breadcrumb.append(('delete', _('Delete'))) - self.html_top(title=remove_top_title) + get_response().set_title(title=remove_top_title) r = TemplateIO(html=True) r += htmltext('

%s

') % remove_title r += form.render() @@ -257,7 +256,7 @@ class FieldDefPage(Directory): return self.redirect_field_anchor(self.field) if not form.is_submitted() or form.has_errors(): get_response().breadcrumb.append(('duplicate', _('Duplicate'))) - self.html_top(title=duplicate_top_title) + get_response().set_title(title=duplicate_top_title) r = TemplateIO(html=True) r += htmltext('

%s

') % duplicate_title r += form.render() @@ -295,7 +294,6 @@ class FieldsPagesDirectory(Directory): def _q_lookup(self, component): directory = FieldsDirectory(self.parent.objectdef) directory.field_var_prefix = self.parent.field_var_prefix - directory.html_top = self.parent.html_top try: directory.page_id = str(component) except ValueError: @@ -317,9 +315,6 @@ class FieldsDirectory(Directory): fields_count_total_soft_limit = 200 fields_count_total_hard_limit = 400 - def html_top(self, title, *args, **kwargs): - html_top(self.section, title, *args, **kwargs) - def __init__(self, objectdef): self.objectdef = objectdef self.pages = FieldsPagesDirectory(self) @@ -333,12 +328,11 @@ class FieldsDirectory(Directory): def _q_lookup(self, component): d = self.field_def_page_class(self.objectdef, component) - d.html_top = self.html_top d.page_id = self.page_id return d def _q_index(self): - self.html_top(self.objectdef.name) + get_response().set_title(self.objectdef.name) get_response().add_javascript(['jquery.js', 'jquery-ui.js', 'biglist.js']) r = TemplateIO(html=True) diff --git a/wcs/admin/forms.py b/wcs/admin/forms.py index e8d9d8b59..053c5b5fb 100644 --- a/wcs/admin/forms.py +++ b/wcs/admin/forms.py @@ -36,7 +36,6 @@ from wcs.formdef import ( ) from wcs.forms.root import qrcode from wcs.qommon import _, force_str, misc, pgettext_lazy, template -from wcs.qommon.backoffice.menu import html_top from wcs.qommon.errors import AccessForbiddenError, TraversalError from wcs.qommon.form import ( CheckboxesWidget, @@ -535,7 +534,7 @@ class OptionsDirectory(Directory): self.formdef.store(comment=_('Changed "%s" parameters') % title) return redirect('..') - html_top('forms', title=self.formdef.name) + get_response().set_title(self.formdef.name) r = TemplateIO(html=True) r += htmltext('

%s

') % title r += form.render() @@ -587,7 +586,7 @@ class WorkflowRoleDirectory(Directory): if not form.is_submitted() or form.has_errors(): get_response().breadcrumb.append(('role/%s' % component, _('Workflow Role'))) - self.html_top(title=self.formdef.name) + get_response().set_title(title=self.formdef.name) r = TemplateIO(html=True) r += htmltext('

%s

') % _('Role') r += htmltext('

%s

') % self.formdef.workflow.roles.get(component) @@ -663,9 +662,7 @@ class FormDefPage(Directory): if component: get_response().breadcrumb.append((component + '/', self.formdef.name)) self.fields = self.fields_directory_class(self.formdef) - self.fields.html_top = self.html_top self.role = WorkflowRoleDirectory(self.formdef) - self.role.html_top = self.html_top self.options = self.options_directory_class(self.formdef, self.formdefui) self.tests = TestsDirectory(self.formdef) self.logged_errors_dir = LoggedErrorsDirectory( @@ -673,9 +670,6 @@ class FormDefPage(Directory): ) self.snapshots_dir = SnapshotsDirectory(self.formdef) - def html_top(self, title): - return html_top(self.section, title) - def add_option_line(self, link, label, current_value, popup=True): return htmltext( '
  • ' @@ -691,7 +685,7 @@ class FormDefPage(Directory): ) def _q_index(self): - self.html_top(title=self.formdef.name) + get_response().set_title(title=self.formdef.name) r = TemplateIO(html=True) get_response().filter['sidebar'] = self.get_sidebar() get_response().add_javascript( @@ -982,7 +976,7 @@ class FormDefPage(Directory): return r.getvalue() def public_url(self): - self.html_top(title=self.formdef.name) + get_response().set_title(title=self.formdef.name) get_response().breadcrumb.append(('public-url', _('Public URL'))) r = TemplateIO(html=True) r += htmltext('

    %s

    ' % _('Public URL')) @@ -994,7 +988,7 @@ class FormDefPage(Directory): return r.getvalue() def qrcode(self): - self.html_top(title=self.formdef.name) + get_response().set_title(title=self.formdef.name) get_response().breadcrumb.append(('qrcode', _('QR Code'))) r = TemplateIO(html=True) r += htmltext('

    %s

    ' % _('QR Code')) @@ -1035,7 +1029,7 @@ class FormDefPage(Directory): if not form.is_submitted() or form.has_errors(): get_response().breadcrumb.append(('roles', title)) - self.html_top(title=self.formdef.name) + get_response().set_title(title=self.formdef.name) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % title if description: @@ -1136,7 +1130,7 @@ class FormDefPage(Directory): ) get_response().breadcrumb.append(('title', _('Title'))) - self.html_top(title=self.formdef.name) + get_response().set_title(title=self.formdef.name) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('Title') r += form.render() @@ -1162,7 +1156,7 @@ class FormDefPage(Directory): if not form.is_submitted() or form.has_errors(): get_response().breadcrumb.append(('workflow', _('Workflow'))) - self.html_top(title=self.formdef.name) + get_response().set_title(title=self.formdef.name) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('Workflow') r += htmltext('

    %s

    ') % _('Select the workflow that will handle those forms.') @@ -1201,7 +1195,7 @@ class FormDefPage(Directory): if not form.is_submitted() or form.has_errors(): get_response().breadcrumb.append(('workflow-status-remapping', _('Workflow Status Remapping'))) - self.html_top(title=self.formdef.name) + get_response().set_title(title=self.formdef.name) r = TemplateIO(html=True) r += htmltext('

    ') r += str( @@ -1287,7 +1281,7 @@ class FormDefPage(Directory): name_widget.set_value(new_name) if not form.is_submitted() or form.has_errors(): - self.html_top(title=self.duplicate_title) + get_response().set_title(title=self.duplicate_title) r = TemplateIO(html=True) get_response().breadcrumb.append(('duplicate', _('Duplicate'))) r += htmltext('

    %s

    ') % self.duplicate_title @@ -1330,7 +1324,7 @@ class FormDefPage(Directory): return redirect('..') if not form.is_submitted() or form.has_errors(): get_response().breadcrumb.append(('delete', _('Delete'))) - self.html_top(title=self.delete_title) + get_response().set_title(title=self.delete_title) r = TemplateIO(html=True) r += htmltext('

    %s %s

    ') % (self.delete_title, self.formdef.name) r += form.render() @@ -1363,7 +1357,7 @@ class FormDefPage(Directory): pass get_response().breadcrumb.append(('overwrite', _('Overwrite'))) - self.html_top(title=_('Overwrite')) + get_response().set_title(title=_('Overwrite')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('Overwrite') r += htmltext('

    %s

    ') % self.overwrite_message @@ -1461,7 +1455,7 @@ class FormDefPage(Directory): return incompatible_field_ids def overwrite_warning_summary(self, new_formdef): - self.html_top(title=_('Overwrite')) + get_response().set_title(title=_('Overwrite')) get_response().breadcrumb.append(('overwrite', _('Overwrite'))) r = TemplateIO(html=True) @@ -1607,7 +1601,7 @@ class FormDefPage(Directory): def workflow_variables(self): if not self.formdef.workflow.variables_formdef: raise TraversalError() - self.html_top(title=_('Options')) + get_response().set_title(title=_('Options')) form = Form(enctype='multipart/form-data') self.formdef.workflow.variables_formdef.add_fields_to_form( @@ -1636,7 +1630,7 @@ class FormDefPage(Directory): if value: return value.build_response() - self.html_top(title=_('Workflow Options')) + get_response().set_title(title=_('Workflow Options')) form = Form(enctype='multipart/form-data') pristine_workflow = Workflow.get(self.formdef.workflow_id) for status in self.formdef.workflow.possible_status: @@ -1679,7 +1673,7 @@ class FormDefPage(Directory): self.formdef.store(comment=_('Change in workflow options')) def inspect(self): - self.html_top(self.formdef.name) + get_response().set_title(self.formdef.name) get_response().breadcrumb.append(('inspect', _('Inspector'))) return self.render_inspect() @@ -1725,7 +1719,7 @@ class FormsDirectory(AccessControlled, Directory): category_class = Category categories = CategoriesDirectory() - blocks = BlocksDirectory(section='forms') + blocks = BlocksDirectory() data_sources = NamedDataSourcesDirectoryInForms() formdef_class = FormDef formdef_page_class = FormDefPage @@ -1749,11 +1743,9 @@ class FormsDirectory(AccessControlled, Directory): super().__init__(*args, **kwargs) self.applications_dir = ApplicationsDirectory(self.formdef_class.xml_root_node) - def html_top(self, title): - return html_top(self.section, title) - def _q_traverse(self, path): get_response().breadcrumb.append(('%s/' % self.section, self.top_title)) + get_response().set_backoffice_section(self.section) return super()._q_traverse(path) def is_accessible(self, user): @@ -1772,7 +1764,7 @@ class FormsDirectory(AccessControlled, Directory): def _q_index(self): from wcs.applications import Application - self.html_top(title=self.top_title) + get_response().set_title(title=self.top_title) get_response().add_javascript(['widget_list.js', 'select2.js', 'popup.js']) context = { @@ -1848,7 +1840,7 @@ class FormsDirectory(AccessControlled, Directory): else: return redirect(str(formdef.id) + '/') - self.html_top(title=_('New Form')) + get_response().set_title(title=_('New Form')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('New Form') r += form.render() @@ -1878,7 +1870,7 @@ class FormsDirectory(AccessControlled, Directory): pass get_response().breadcrumb.append(('import', _('Import'))) - self.html_top(title=self.import_title) + get_response().set_title(title=self.import_title) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % self.import_title r += htmltext('

    %s

    ') % self.import_paragraph diff --git a/wcs/admin/logged_errors.py b/wcs/admin/logged_errors.py index e49c8688a..1bf4aacca 100644 --- a/wcs/admin/logged_errors.py +++ b/wcs/admin/logged_errors.py @@ -36,7 +36,7 @@ class LoggedErrorDirectory(Directory): def _q_index(self): get_response().breadcrumb.append(('%s/' % self.error.id, self.error.summary)) - self.parent_dir.html_top(_('Logged Errors - %s') % self.error.summary) + get_response().set_title(_('Logged Errors - %s') % self.error.summary) get_response().filter['sidebar'] = self.get_sidebar() return template.QommonTemplateResponse( @@ -208,7 +208,7 @@ class LoggedErrorsDirectory(Directory): raise errors.AccessForbiddenError() get_response().breadcrumb.append(('logged-errors/', _('Logged Errors'))) - self.parent_dir.html_top(_('Logged Errors')) + get_response().set_title(_('Logged Errors')) limit = misc.get_int_or_400( get_request().form.get('limit', get_publisher().get_site_option('default-page-size')) or 20 ) diff --git a/wcs/admin/mail_templates.py b/wcs/admin/mail_templates.py index c75fb6462..0047751e8 100644 --- a/wcs/admin/mail_templates.py +++ b/wcs/admin/mail_templates.py @@ -25,7 +25,6 @@ from wcs.backoffice.snapshots import SnapshotsDirectory from wcs.categories import MailTemplateCategory from wcs.mail_templates import MailTemplate from wcs.qommon import _, errors, misc, template -from wcs.qommon.backoffice.menu import html_top from wcs.qommon.form import ( ComputedExpressionWidget, FileWidget, @@ -61,7 +60,7 @@ class MailTemplatesDirectory(Directory): def _q_index(self): from wcs.applications import Application - html_top('mail_templates', title=_('Mail Templates')) + get_response().set_title(_('Mail Templates')) get_response().add_javascript(['popup.js']) mail_templates = MailTemplate.select(order_by='name') Application.populate_objects(mail_templates) @@ -114,7 +113,7 @@ class MailTemplatesDirectory(Directory): return redirect('%s/edit' % mail_template.id) get_response().breadcrumb.append(('new', _('New Mail Template'))) - html_top('mail_templates', title=_('New Mail Template')) + get_response().set_title(_('New Mail Template')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('New Mail Template') r += form.render() @@ -138,7 +137,7 @@ class MailTemplatesDirectory(Directory): pass get_response().breadcrumb.append(('import', _('Import'))) - html_top('mail_templates', title=import_title) + get_response().set_title(import_title) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % import_title r += htmltext('

    %s

    ') % _('You can install a new mail template by uploading a file.') @@ -203,7 +202,7 @@ class MailTemplatePage(Directory): return r.getvalue() def _q_index(self): - html_top('mail_templates', title=self.mail_template.name) + get_response().set_title(self.mail_template.name) get_response().filter['sidebar'] = self.get_sidebar() return template.QommonTemplateResponse( templates=['wcs/backoffice/mail-template.html'], @@ -315,7 +314,7 @@ class MailTemplatePage(Directory): return redirect('.') get_response().breadcrumb.append(('edit', _('Edit'))) - html_top('mail_templates', title=_('Edit Mail Template')) + get_response().set_title(_('Edit Mail Template')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('Edit Mail Template') r += form.render() @@ -339,7 +338,7 @@ class MailTemplatePage(Directory): return redirect('.') if not form.is_submitted() or form.has_errors(): get_response().breadcrumb.append(('delete', _('Delete'))) - html_top('mail_templates', title=_('Delete Mail Template')) + get_response().set_title(_('Delete Mail Template')) r = TemplateIO(html=True) r += htmltext('

    %s %s

    ') % (_('Deleting Mail Template:'), self.mail_template.name) r += form.render() @@ -374,7 +373,7 @@ class MailTemplatePage(Directory): name_widget.set_value(new_name) if not form.is_submitted() or form.has_errors(): - html_top('mail_templates', title=_('Duplicate Mail Template')) + get_response().set_title(_('Duplicate Mail Template')) r = TemplateIO(html=True) get_response().breadcrumb.append(('duplicate', _('Duplicate'))) r += htmltext('

    %s

    ') % _('Duplicate Mail Template') diff --git a/wcs/admin/roles.py b/wcs/admin/roles.py index 9baa6b5a0..ce1696485 100644 --- a/wcs/admin/roles.py +++ b/wcs/admin/roles.py @@ -20,7 +20,6 @@ from quixote.html import TemplateIO, htmltext from wcs.formdef import FormDef from wcs.qommon import _, errors, get_cfg -from wcs.qommon.backoffice.menu import html_top from wcs.qommon.form import CheckboxWidget, Form, HtmlWidget, StringWidget, TextWidget, WidgetList from wcs.roles import get_user_roles @@ -98,7 +97,7 @@ class RolePage(Directory): get_response().breadcrumb.append((component + '/', self.role.name)) def _q_index(self): - html_top('roles', title=self.role.name) + get_response().set_title(self.role.name) r = TemplateIO(html=True) r += htmltext('
    ') @@ -185,7 +184,7 @@ class RolePage(Directory): return redirect('.') get_response().breadcrumb.append(('edit', _('Edit'))) - html_top('roles', title=_('Edit Role')) + get_response().set_title(_('Edit Role')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('Edit Role') r += form.render() @@ -200,7 +199,7 @@ class RolePage(Directory): return redirect('.') if not form.is_submitted() or form.has_errors(): get_response().breadcrumb.append(('delete', _('Delete'))) - html_top('roles', title=_('Delete Role')) + get_response().set_title(_('Delete Role')) r = TemplateIO(html=True) r += htmltext('

    %s %s

    ') % (_('Deleting Role:'), self.role.name) r += form.render() @@ -213,12 +212,16 @@ class RolePage(Directory): class RolesDirectory(Directory): _q_exports = ["", "new"] + def _q_traverse(self, path): + get_response().breadcrumb.append(('roles/', _('Roles'))) + get_response().set_backoffice_section('roles') + return super()._q_traverse(path) + def is_visible(self, *args): return not (get_cfg('sp', {}).get('idp-manage-roles')) def _q_index(self): - get_response().breadcrumb.append(('roles/', _('Roles'))) - html_top('roles', title=_('Roles')) + get_response().set_title(_('Roles')) r = TemplateIO(html=True) r += htmltext('
    ') @@ -246,7 +249,6 @@ class RolesDirectory(Directory): return r.getvalue() def new(self): - get_response().breadcrumb.append(('roles/', _('Roles'))) get_response().breadcrumb.append(('new', _('New'))) role_ui = RoleUI(None) form = role_ui.get_form() @@ -261,12 +263,11 @@ class RolesDirectory(Directory): else: return redirect('.') - html_top('roles', title=_('New Role')) + get_response().set_title(_('New Role')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('New Role') r += form.render() return r.getvalue() def _q_lookup(self, component): - get_response().breadcrumb.append(('roles/', _('Roles'))) return RolePage(component) diff --git a/wcs/admin/settings.py b/wcs/admin/settings.py index d037285fc..3e84dace1 100644 --- a/wcs/admin/settings.py +++ b/wcs/admin/settings.py @@ -43,7 +43,6 @@ from wcs.qommon.admin.cfg import cfg_submit from wcs.qommon.admin.emails import EmailsDirectory from wcs.qommon.admin.texts import TextsDirectory from wcs.qommon.afterjobs import AfterJob -from wcs.qommon.backoffice.menu import html_top from wcs.qommon.form import ( CheckboxesTableWidget, CheckboxesWidget, @@ -104,7 +103,7 @@ class IdentificationDirectory(Directory): if not form.has_errors(): return redirect('..') - html_top('settings', title=_('Identification')) + get_response().set_title(_('Identification')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('Identification') if lasso is None: @@ -127,14 +126,12 @@ authentication is unavailable. Lasso must be installed to use it.' class UserFieldDefPage(FieldDefPage): - section = 'settings' blacklisted_attributes = ['condition'] class UserFieldsDirectory(FieldsDirectory): _q_exports = ['', 'update_order', 'new', 'mapping', 'templates'] - section = 'settings' field_def_page_class = UserFieldDefPage support_import = False blacklisted_types = ['page', 'computed'] @@ -378,7 +375,7 @@ class FileTypesDirectory(Directory): return ', '.join(l) + ellipsis def _q_index(self): - html_top('settings', title=_('File Types')) + get_response().set_title(_('File Types')) filetypes_cfg = get_cfg('filetypes', {}) form = self.get_form() @@ -451,7 +448,7 @@ class FileTypesDirectory(Directory): get_publisher().write_cfg() return redirect('.') - html_top('settings', title=_('File Types')) + get_response().set_title(_('File Types')) r = TemplateIO(html=True) r += htmltext('

    %s - %s

    ') % (_('File Type'), filetype['label']) r += form.render() @@ -494,6 +491,7 @@ class SettingsDirectory(AccessControlled, Directory): def _q_access(self): get_response().breadcrumb.append(('settings/', _('Settings'))) + get_response().set_backoffice_section('settings') disabled_screens_option = get_publisher().get_site_option('settings-disabled-screens') or '' self.disabled_screens = [x.strip() for x in disabled_screens_option.split(',') if x.strip()] @@ -514,7 +512,7 @@ class SettingsDirectory(AccessControlled, Directory): self._q_exports = q_exports def _q_index(self): - html_top('settings', title=_('Settings')) + get_response().set_title(_('Settings')) r = TemplateIO(html=True) hidden_screens_option = get_publisher().get_site_option('settings-hidden-screens') or '' @@ -724,7 +722,7 @@ class SettingsDirectory(AccessControlled, Directory): if not form.is_submitted() or form.has_errors(): get_response().breadcrumb.append(('admin-permissions', _('Admin Permissions'))) - html_top('settings', title=_('Admin Permissions')) + get_response().set_title(_('Admin Permissions')) r = TemplateIO(html=True) r += htmltext('
    ') r += htmltext('

    %s

    ') % _('Admin Permissions') @@ -781,7 +779,7 @@ class SettingsDirectory(AccessControlled, Directory): if not form.is_submitted(): get_response().breadcrumb.append(('export', _('Export'))) - html_top('settings', title=_('Export')) + get_response().set_title(_('Export')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('Export') r += form.render() @@ -951,7 +949,7 @@ class SettingsDirectory(AccessControlled, Directory): if not form.is_submitted() or form.has_errors(): get_response().breadcrumb.append(('import', _('Import'))) - html_top('settings', title=_('Import')) + get_response().set_title(_('Import')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('Import') if FormDef.count() or CardDef.count() or Workflow.count(): @@ -978,7 +976,7 @@ class SettingsDirectory(AccessControlled, Directory): if e.details: msg += ' [%s]' % e.details reason = _('Failed to import a workflow (%s); site import did not complete.') % (msg) - html_top('settings', title=_('Import')) + get_response().set_title(_('Import')) return template.QommonTemplateResponse( templates=['wcs/backoffice/settings/import.html'], context={'results': results, 'error': reason}, @@ -1013,7 +1011,7 @@ class SettingsDirectory(AccessControlled, Directory): if not form.is_submitted() or form.has_errors(): get_response().breadcrumb.append(('sitename', _('Site Name and Addresses'))) - html_top('settings', title=_('Site Name and Addresses')) + get_response().set_title(_('Site Name and Addresses')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('Site Name and Addresses') r += form.render() @@ -1024,7 +1022,7 @@ class SettingsDirectory(AccessControlled, Directory): def sms(self): get_response().breadcrumb.append(('sms', _('SMS'))) - html_top('settings', title=_('SMS')) + get_response().set_title(_('SMS')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('SMS Options') sms_cfg = get_cfg('sms', {}) @@ -1105,7 +1103,7 @@ class SettingsDirectory(AccessControlled, Directory): return redirect('.') get_response().breadcrumb.append(('postgresql', _('PostgreSQL Settings'))) - html_top('settings', title=_('PostgreSQL Settings')) + get_response().set_title(_('PostgreSQL Settings')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('PostgreSQL Settings') r += form.render() @@ -1143,7 +1141,7 @@ class SettingsDirectory(AccessControlled, Directory): return redirect('.') get_response().breadcrumb.append(('geolocation', _('Geolocation Settings'))) - html_top('settings', title=_('Geolocation Settings')) + get_response().set_title(_('Geolocation Settings')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('Geolocation Settings') r += form.render() @@ -1178,7 +1176,7 @@ $('#form_default-zoom-level').on('change', function() { return redirect('.') get_response().breadcrumb.append(('user-templates', _('Users'))) - html_top('settings', title=_('Users')) + get_response().set_title(_('Users')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('Users') r += form.render() @@ -1251,7 +1249,7 @@ $('#form_default-zoom-level').on('change', function() { if not form.is_submitted() or form.has_errors(): get_response().breadcrumb.append(('language', _('Language'))) - html_top('settings', title=_('Language')) + get_response().set_title(_('Language')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('Language') r += form.render() @@ -1297,7 +1295,7 @@ $('#form_default-zoom-level').on('change', function() { if not form.is_submitted() or form.has_errors(): get_response().breadcrumb.append(('debug_options', _('Debug Options'))) - html_top('settings', title=_('Debug Options')) + get_response().set_title(_('Debug Options')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('Debug Options') r += form.render() diff --git a/wcs/admin/tests.py b/wcs/admin/tests.py index 1aa8ca35f..e88984465 100644 --- a/wcs/admin/tests.py +++ b/wcs/admin/tests.py @@ -27,7 +27,6 @@ from wcs.backoffice.pagination import pagination_links from wcs.forms.common import FormStatusPage from wcs.qommon import _, misc, template from wcs.qommon.afterjobs import AfterJob -from wcs.qommon.backoffice.menu import html_top from wcs.qommon.errors import TraversalError from wcs.qommon.form import FileWidget, Form, SingleSelectWidget, StringWidget from wcs.sql_criterias import Equal @@ -127,9 +126,6 @@ class TestPage(FormBackOfficeStatusPage): get_response().breadcrumb.append((str(self.testdef.id) + '/', str(self.testdef))) return super(FormStatusPage, self)._q_traverse(path) - def html_top(self, title=None): - html_top('tests', '%s - %s' % (self.formdef.name, _('Tests'))) - def should_fold_summary(self, mine, request_user): return False @@ -237,7 +233,7 @@ class TestPage(FormBackOfficeStatusPage): name_widget.set_value(new_name) if not form.is_submitted() or form.has_errors(): - html_top('duplicate_test', title=_('Duplicate test')) + get_response().set_title(_('Duplicate test')) r = TemplateIO(html=True) get_response().breadcrumb.append(('duplicate', _('Duplicate'))) r += htmltext('

    %s

    ') % _('Duplicate test') @@ -261,7 +257,6 @@ class TestsDirectory(Directory): def _q_traverse(self, path): get_response().breadcrumb.append(('tests/', _('Tests'))) - html_top('tests', '%s - %s' % (self.objectdef.name, _('Tests'))) return super()._q_traverse(path) def _q_lookup(self, component): @@ -277,6 +272,7 @@ class TestsDirectory(Directory): 'has_sidebar': True, } get_response().add_javascript(['popup.js']) + get_response().set_title(_('Tests')) return template.QommonTemplateResponse( templates=['wcs/backoffice/tests.html'], context=context, is_django_native=True ) @@ -292,6 +288,7 @@ class TestsDirectory(Directory): if not form.is_submitted() or form.has_errors(): get_response().breadcrumb.append(('new', _('New'))) + get_response().set_title(_('New test')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('New test') r += form.render() @@ -321,6 +318,7 @@ class TestsDirectory(Directory): pass get_response().breadcrumb.append(('import', _('Import'))) + get_response().set_title(_('Import Test')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('Import Test') r += htmltext('

    %s

    ') % _( @@ -382,7 +380,7 @@ class TestResultsDirectory(Directory): def _q_traverse(self, path): get_response().breadcrumb.append(('results/', _('Test results'))) - html_top('test-results', '%s - %s' % (self.objectdef.name, _('Test results'))) + get_response().set_title('%s - %s' % (self.objectdef.name, _('Test results'))) return super()._q_traverse(path) def _q_lookup(self, component): diff --git a/wcs/admin/users.py b/wcs/admin/users.py index 5a9539881..8886dff50 100644 --- a/wcs/admin/users.py +++ b/wcs/admin/users.py @@ -22,7 +22,6 @@ import wcs.sql_criterias as st from wcs.backoffice.pagination import pagination_links from wcs.qommon import _, errors, force_str, get_cfg, ident, misc from wcs.qommon.admin.menu import error_page -from wcs.qommon.backoffice.menu import html_top from wcs.qommon.form import ( CheckboxWidget, EmailWidget, @@ -122,7 +121,7 @@ class UserPage(Directory): get_response().breadcrumb.append((component + '/', self.user.display_name)) def _q_index(self): - html_top('users', '%s - %s' % (_('User'), self.user.display_name)) + get_response().set_title('%s - %s' % (_('User'), self.user.display_name)) r = TemplateIO(html=True) r += htmltext('
    ') r += htmltext('

    %s

    ') % self.user.display_name @@ -269,7 +268,7 @@ class UserPage(Directory): if display_form: get_response().breadcrumb.append(('edit', _('Edit'))) - html_top('users', title=_('Edit User')) + get_response().set_title(_('Edit User')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('Edit User') r += form.render() @@ -287,7 +286,7 @@ class UserPage(Directory): return redirect('.') if not form.is_submitted() or form.has_errors(): get_response().breadcrumb.append(('delete', _('Delete'))) - html_top('users', title=_('Delete User')) + get_response().set_title(_('Delete User')) r = TemplateIO(html=True) r += htmltext('

    %s %s

    ') % (_('Deleting User:'), self.user.name) r += form.render() @@ -310,9 +309,13 @@ class UserPage(Directory): class UsersDirectory(Directory): _q_exports = ['', 'new'] - def _q_index(self): + def _q_traverse(self, path): get_response().breadcrumb.append(('users/', _('Users'))) - html_top('users', title=_('Users')) + get_response().set_backoffice_section('users') + return super()._q_traverse(path) + + def _q_index(self): + get_response().set_title(_('Users')) r = TemplateIO(html=True) limit = int( @@ -482,16 +485,13 @@ class UsersDirectory(Directory): return r.getvalue() def new(self): - get_response().breadcrumb.append(('users/', _('Users'))) get_response().breadcrumb.append(('new', _('New'))) ident_methods = get_cfg('identification', {}).get('methods', []) if not ident_methods: - return error_page( - 'users', _('An authentification system must be configured before creating users.') - ) + return error_page(_('An authentification system must be configured before creating users.')) if ident_methods == ['idp'] and len(get_cfg('idp', {}).items()) == 0: - return error_page('users', _('SAML support must be setup before creating users.')) + return error_page(_('SAML support must be setup before creating users.')) if is_idp_managing_user_attributes(): raise errors.TraversalError() @@ -506,7 +506,7 @@ class UsersDirectory(Directory): return redirect('.') if not form.is_submitted() or form.has_errors(): - html_top('users', title=_('New User')) + get_response().set_title(_('New User')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('New User') r += form.render() @@ -523,7 +523,6 @@ class UsersDirectory(Directory): return redirect('.') def _q_lookup(self, component): - get_response().breadcrumb.append(('users/', _('Users'))) try: return UserPage(component) except KeyError: diff --git a/wcs/admin/workflows.py b/wcs/admin/workflows.py index b233b1d72..fc2ab233f 100644 --- a/wcs/admin/workflows.py +++ b/wcs/admin/workflows.py @@ -36,7 +36,6 @@ from wcs.formdata import Evolution from wcs.formdef import FormDef, UpdateStatisticsDataAfterJob from wcs.qommon import _, errors, force_str, misc, template from wcs.qommon.admin.menu import command_icon -from wcs.qommon.backoffice.menu import html_top from wcs.qommon.form import ( CheckboxWidget, ColourWidget, @@ -381,14 +380,13 @@ class WorkflowUI: class WorkflowItemPage(Directory): _q_exports = ['', 'delete', 'copy'] - def __init__(self, workflow, parent, component, html_top): + def __init__(self, workflow, parent, component): try: self.item = [x for x in parent.items if x.id == component][0] except (IndexError, ValueError): raise errors.TraversalError() self.workflow = workflow self.parent = parent - self.html_top = html_top get_response().breadcrumb.append(('items/%s/' % component, self.item.description)) def _q_index(self): @@ -429,7 +427,7 @@ class WorkflowItemPage(Directory): return redirect(self.item.redirect_after_submit_url) return redirect('..') - self.html_top('%s - %s' % (_('Workflow'), self.workflow.name)) + get_response().set_title('%s - %s' % (_('Workflow'), self.workflow.name)) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % self.item.description r += form.render() @@ -446,7 +444,7 @@ class WorkflowItemPage(Directory): return redirect('../../') if not form.is_submitted() or form.has_errors(): get_response().breadcrumb.append(('delete', _('Delete'))) - self.html_top(title=_('Delete Item')) + get_response().set_title(_('Delete Item')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('Deleting Item') r += form.render() @@ -482,7 +480,7 @@ class WorkflowItemPage(Directory): pass get_response().breadcrumb.append(('copy', _('Copy'))) - self.html_top(title=_('Copy Item')) + get_response().set_title(_('Copy Item')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('Copy Item') r += form.render() @@ -520,7 +518,7 @@ class WorkflowItemPage(Directory): return redirect('../../') def _q_lookup(self, component): - t = self.item.q_admin_lookup(self.workflow, self.parent, component, self.html_top) + t = self.item.q_admin_lookup(self.workflow, self.parent, component) if t: return t return Directory._q_lookup(self, component) @@ -529,7 +527,7 @@ class WorkflowItemPage(Directory): class GlobalActionTriggerPage(Directory): _q_exports = ['', 'delete'] - def __init__(self, workflow, action, component, html_top): + def __init__(self, workflow, action, component): try: self.trigger = [x for x in action.triggers if x.id == component][0] except (IndexError, ValueError): @@ -537,7 +535,6 @@ class GlobalActionTriggerPage(Directory): self.workflow = workflow self.action = action self.status = action - self.html_top = html_top get_response().breadcrumb.append(('triggers/%s/' % component, _('Trigger'))) def _q_index(self): @@ -554,7 +551,7 @@ class GlobalActionTriggerPage(Directory): self.workflow.store(comment=_('Change in global action trigger')) return redirect('../../') - self.html_top('%s - %s' % (_('Workflow'), self.workflow.name)) + get_response().set_title('%s - %s' % (_('Workflow'), self.workflow.name)) r = TemplateIO(html=True) r += htmltext('

    %s - %s

    ') % (self.workflow.name, self.action.name) r += form.render() @@ -569,7 +566,7 @@ class GlobalActionTriggerPage(Directory): return redirect('../../') if not form.is_submitted() or form.has_errors(): get_response().breadcrumb.append(('delete', _('Delete'))) - self.html_top(title=_('Delete Trigger')) + get_response().set_title(_('Delete Trigger')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('Deleting Trigger') r += form.render() @@ -584,13 +581,12 @@ class ToChildDirectory(Directory): _q_exports = [''] klass = None - def __init__(self, workflow, status, html_top): + def __init__(self, workflow, status): self.workflow = workflow self.status = status - self.html_top = html_top def _q_lookup(self, component): - return self.klass(self.workflow, self.status, component, self.html_top) + return self.klass(self.workflow, self.status, component) def _q_index(self): return redirect('..') @@ -626,19 +622,18 @@ class WorkflowStatusPage(Directory): ] do_not_call_in_templates = True - def __init__(self, workflow, status_id, html_top): - self.html_top = html_top + def __init__(self, workflow, status_id): self.workflow = workflow try: self.status = [x for x in self.workflow.possible_status if x.id == status_id][0] except IndexError: raise errors.TraversalError() - self.items_dir = WorkflowItemsDir(workflow, self.status, html_top) + self.items_dir = WorkflowItemsDir(workflow, self.status) get_response().breadcrumb.append(('status/%s/' % status_id, self.status.name)) def _q_index(self): - self.html_top('%s - %s' % (_('Workflow'), self.workflow.name)) + get_response().set_title('%s - %s' % (_('Workflow'), self.workflow.name)) get_response().add_javascript( [ 'jquery.js', @@ -760,7 +755,7 @@ class WorkflowStatusPage(Directory): return redirect('.') if not form.is_submitted() or form.has_errors(): get_response().breadcrumb.append(('delete', _('Delete'))) - self.html_top(title=_('Delete Status')) + get_response().set_title(_('Delete Status')) r = TemplateIO(html=True) r += htmltext('

    %s %s

    ') % (_('Deleting Status:'), self.status.name) r += form.render() @@ -795,7 +790,7 @@ class WorkflowStatusPage(Directory): self.workflow.store(comment=_('Change name of status %s') % new_name) return redirect('.') - self.html_top(title=_('Edit Workflow Status')) + get_response().set_title(_('Edit Workflow Status')) get_response().breadcrumb.append(('edit', _('Edit'))) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('Edit Workflow Status') @@ -838,7 +833,7 @@ class WorkflowStatusPage(Directory): if not form.is_submitted() or form.has_errors(): get_response().breadcrumb.append(('reassign', _('Delete / Reassign'))) - self.html_top(title=_('Delete Status / Reassign')) + get_response().set_title(_('Delete Status / Reassign')) r = TemplateIO(html=True) r += htmltext('

    %s %s

    ') % (_('Deleting Status:'), self.status.name) r += htmltext('
    ') @@ -935,7 +930,7 @@ class WorkflowStatusPage(Directory): self.workflow.store(comment=_('Change in display options')) return redirect('.') - self.html_top(title=_('Change Display Settings')) + get_response().set_title(_('Change Display Settings')) get_response().breadcrumb.append(('display', _('Display Settings'))) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('Change Display Settings') @@ -960,7 +955,7 @@ class WorkflowStatusPage(Directory): self.workflow.store(comment=_('Change of terminal status option')) return redirect('.') - self.html_top(title=_('Edit Terminal Status')) + get_response().set_title(_('Edit Terminal Status')) get_response().breadcrumb.append(('endpoint', _('Terminal Status'))) return form.render() @@ -982,7 +977,7 @@ class WorkflowStatusPage(Directory): self.workflow.store(comment=_('Change in backoffice info text')) return redirect('.') - self.html_top(title=_('Edit Backoffice Information Text')) + get_response().set_title(_('Edit Backoffice Information Text')) get_response().breadcrumb.append(('backoffice_info_text', _('Backoffice Information Text'))) return form.render() @@ -990,12 +985,11 @@ class WorkflowStatusPage(Directory): class WorkflowStatusDirectory(Directory): _q_exports = [''] - def __init__(self, workflow, html_top): + def __init__(self, workflow): self.workflow = workflow - self.html_top = html_top def _q_lookup(self, component): - return WorkflowStatusPage(self.workflow, component, self.html_top) + return WorkflowStatusPage(self.workflow, component) def _q_index(self): return redirect('..') @@ -1214,7 +1208,7 @@ class FunctionsDirectory(Directory): return redirect('..') get_response().breadcrumb.append(('new', _('New Function'))) - html_top('workflows', title=_('New Function')) + get_response().set_title(_('New Function')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('New Function') r += form.render() @@ -1254,7 +1248,7 @@ class FunctionsDirectory(Directory): return redirect('..') get_response().breadcrumb.append(('new', _('Edit Function'))) - html_top('workflows', title=_('Edit Function')) + get_response().set_title(_('Edit Function')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('Edit Function') r += form.render() @@ -1300,7 +1294,7 @@ class CriticalityLevelsDirectory(Directory): return redirect('..') get_response().breadcrumb.append(('new', _('New Criticality Level'))) - html_top('workflows', title=_('New Criticality level')) + get_response().set_title(_('New Criticality level')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('New Criticality Level') r += form.render() @@ -1335,7 +1329,7 @@ class CriticalityLevelsDirectory(Directory): return redirect('..') get_response().breadcrumb.append(('new', _('Edit Criticality Level'))) - html_top('workflows', title=_('Edit Criticality Level')) + get_response().set_title(_('Edit Criticality Level')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('Edit Criticality Level') r += form.render() @@ -1360,16 +1354,15 @@ class GlobalActionPage(WorkflowStatusPage): ('backoffice-info-text', 'backoffice_info_text'), ] - def __init__(self, workflow, action_id, html_top): - self.html_top = html_top + def __init__(self, workflow, action_id): self.workflow = workflow try: self.action = [x for x in self.workflow.global_actions if x.id == action_id][0] except IndexError: raise errors.TraversalError() self.status = self.action - self.items_dir = GlobalActionItemsDir(workflow, self.action, html_top) - self.triggers_dir = GlobalActionTriggersDir(workflow, self.action, html_top) + self.items_dir = GlobalActionItemsDir(workflow, self.action) + self.triggers_dir = GlobalActionTriggersDir(workflow, self.action) def _q_traverse(self, path): get_response().breadcrumb.append( @@ -1381,7 +1374,7 @@ class GlobalActionPage(WorkflowStatusPage): return not item.is_disabled() and item.is_available(self.workflow) and item.ok_in_global_action def _q_index(self): - self.html_top('%s - %s' % (_('Workflow'), self.workflow.name)) + get_response().set_title('%s - %s' % (_('Workflow'), self.workflow.name)) r = TemplateIO(html=True) get_response().add_javascript(['jquery.js', 'jquery-ui.js', 'biglist.js', 'qommon.wysiwyg.js']) @@ -1453,7 +1446,7 @@ class GlobalActionPage(WorkflowStatusPage): return redirect('.') if not form.is_submitted() or form.has_errors(): get_response().breadcrumb.append(('delete', _('Delete'))) - self.html_top(title=_('Delete Action')) + get_response().set_title(_('Delete Action')) r = TemplateIO(html=True) r += htmltext('

    %s %s

    ') % (_('Deleting Action:'), self.action.name) r += form.render() @@ -1480,7 +1473,7 @@ class GlobalActionPage(WorkflowStatusPage): self.workflow.store(comment=_('Change in global action')) return redirect('.') - self.html_top(title=_('Edit Action Name')) + get_response().set_title(_('Edit Action Name')) get_response().breadcrumb.append(('edit', _('Edit'))) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('Edit Action Name') @@ -1562,12 +1555,11 @@ class GlobalActionPage(WorkflowStatusPage): class GlobalActionsDirectory(Directory): _q_exports = ['', 'new'] - def __init__(self, workflow, html_top): + def __init__(self, workflow): self.workflow = workflow - self.html_top = html_top def _q_lookup(self, component): - return GlobalActionPage(self.workflow, component, self.html_top) + return GlobalActionPage(self.workflow, component) def _q_index(self): return redirect('..') @@ -1591,7 +1583,7 @@ class GlobalActionsDirectory(Directory): return redirect('%s/' % action.id) get_response().breadcrumb.append(('new', _('New Global Action'))) - html_top('workflows', title=_('New Global Action')) + get_response().set_title(_('New Global Action')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('New Global Action') r += form.render() @@ -1636,20 +1628,17 @@ class WorkflowPage(Directory): except KeyError: raise errors.TraversalError() self.workflow_ui = WorkflowUI(self.workflow) - self.status_dir = WorkflowStatusDirectory(self.workflow, self.html_top) + self.status_dir = WorkflowStatusDirectory(self.workflow) self.variables_dir = VariablesDirectory(self.workflow) self.backoffice_fields_dir = BackofficeFieldsDirectory(self.workflow) self.functions_dir = FunctionsDirectory(self.workflow) - self.global_actions_dir = GlobalActionsDirectory(self.workflow, self.html_top) + self.global_actions_dir = GlobalActionsDirectory(self.workflow) self.criticality_levels_dir = CriticalityLevelsDirectory(self.workflow) self.logged_errors_dir = LoggedErrorsDirectory(parent_dir=self, workflow_id=self.workflow.id) self.snapshots_dir = SnapshotsDirectory(self.workflow) if component: get_response().breadcrumb.append((component + '/', self.workflow.name)) - def html_top(self, title): - return html_top('workflows', title) - def category(self): category_options = self.workflow_ui.get_categories() if is_global_accessible(): @@ -1680,7 +1669,7 @@ class WorkflowPage(Directory): self.workflow.store(comment=_('Change of category')) return redirect('.') - html_top('workflows', title=self.workflow.name) + get_response().set_title(self.workflow.name) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('Category') r += form.render() @@ -1705,7 +1694,7 @@ class WorkflowPage(Directory): ) def _q_index(self): - self.html_top(title=_('Workflow - %s') % self.workflow.name) + get_response().set_title(_('Workflow - %s') % self.workflow.name) get_response().filter['sidebar'] = self.get_sidebar() get_response().add_javascript( ['jquery.js', 'jquery-ui.js', 'biglist.js', 'svg-pan-zoom.js', 'jquery.colourpicker.js'] @@ -1748,7 +1737,7 @@ class WorkflowPage(Directory): return r.getvalue() def inspect(self): - self.html_top(self.workflow.name) + get_response().set_title(self.workflow.name) get_response().breadcrumb.append(('inspect', _('Inspector'))) return self.render_inspect() @@ -1847,7 +1836,7 @@ class WorkflowPage(Directory): else: return redirect('.') - self.html_top(title=_('Edit Workflow')) + get_response().set_title(_('Edit Workflow')) r = TemplateIO(html=True) get_response().breadcrumb.append(('edit', _('Edit'))) r += htmltext('

    %s

    ') % _('Edit Workflow') @@ -1875,7 +1864,7 @@ class WorkflowPage(Directory): return redirect('.') if not form.is_submitted() or form.has_errors(): get_response().breadcrumb.append(('delete', _('Delete'))) - self.html_top(title=_('Delete Workflow')) + get_response().set_title(_('Delete Workflow')) r = TemplateIO(html=True) r += htmltext('

    %s %s

    ') % (_('Deleting Workflow:'), self.workflow.name) r += form.render() @@ -1917,7 +1906,7 @@ class WorkflowPage(Directory): except ValueError: pass - self.html_top(title=_('Duplicate Workflow')) + get_response().set_title(_('Duplicate Workflow')) r = TemplateIO(html=True) get_response().breadcrumb.append(('duplicate', _('Duplicate'))) r += htmltext('

    %s

    ') % _('Duplicate Workflow') @@ -1975,11 +1964,9 @@ class WorkflowsDirectory(Directory): super().__init__(*args, **kwargs) self.applications_dir = ApplicationsDirectory(Workflow.xml_root_node) - def html_top(self, title): - return html_top('workflows', title) - def _q_traverse(self, path): get_response().breadcrumb.append(('workflows/', _('Workflows'))) + get_response().set_backoffice_section('workflows') return super()._q_traverse(path) def is_accessible(self, user): @@ -1998,7 +1985,7 @@ class WorkflowsDirectory(Directory): def _q_index(self): from wcs.applications import Application - self.html_top(title=_('Workflows')) + get_response().set_title(_('Workflows')) get_response().add_javascript(['popup.js']) context = { @@ -2119,7 +2106,7 @@ class WorkflowsDirectory(Directory): else: return redirect('%s/' % workflow.id) - self.html_top(title=_('New Workflow')) + get_response().set_title(_('New Workflow')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('New Workflow') r += form.render() @@ -2151,7 +2138,7 @@ class WorkflowsDirectory(Directory): pass get_response().breadcrumb.append(('import', _('Import'))) - self.html_top(title=_('Import Workflow')) + get_response().set_title(_('Import Workflow')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('Import Workflow') r += htmltext('

    %s

    ') % _( diff --git a/wcs/admin/wscalls.py b/wcs/admin/wscalls.py index cb5d90c10..53d5c796c 100644 --- a/wcs/admin/wscalls.py +++ b/wcs/admin/wscalls.py @@ -22,7 +22,6 @@ from wcs.admin import utils from wcs.backoffice.applications import ApplicationsDirectory from wcs.backoffice.snapshots import SnapshotsDirectory from wcs.qommon import _, errors, misc, template -from wcs.qommon.backoffice.menu import html_top from wcs.qommon.form import CheckboxWidget, FileWidget, Form, HtmlWidget, SlugWidget, StringWidget, TextWidget from wcs.wscalls import NamedWsCall, WsCallRequestWidget @@ -129,7 +128,7 @@ class NamedWsCallPage(Directory): return r.getvalue() def _q_index(self): - html_top('wscalls', title=self.wscall.name) + get_response().set_title(self.wscall.name) get_response().filter['sidebar'] = self.get_sidebar() return template.QommonTemplateResponse( templates=['wcs/backoffice/wscall.html'], context={'view': self, 'wscall': self.wscall} @@ -149,7 +148,7 @@ class NamedWsCallPage(Directory): return redirect('../%s/' % self.wscall.id) get_response().breadcrumb.append(('edit', _('Edit'))) - html_top('wscalls', title=_('Edit webservice call')) + get_response().set_title(_('Edit webservice call')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('Edit webservice call') r += form.render() @@ -166,7 +165,7 @@ class NamedWsCallPage(Directory): return redirect('..') if not form.is_submitted() or form.has_errors(): get_response().breadcrumb.append(('delete', _('Delete'))) - html_top('wscalls', title=_('Delete webservice call')) + get_response().set_title(_('Delete webservice call')) r = TemplateIO(html=True) r += htmltext('

    %s %s

    ') % (_('Deleting webservice call:'), self.wscall.name) r += form.render() @@ -195,7 +194,7 @@ class NamedWsCallsDirectory(Directory): def _q_index(self): from wcs.applications import Application - html_top('wscalls', title=_('Webservice Calls')) + get_response().set_title(_('Webservice Calls')) get_response().add_javascript(['popup.js']) wscalls = NamedWsCall.select(order_by='name') Application.populate_objects(wscalls) @@ -225,7 +224,7 @@ class NamedWsCallsDirectory(Directory): else: return redirect('.') - html_top('wscalls', title=_('New webservice call')) + get_response().set_title(_('New webservice call')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('New webservice call') r += form.render() @@ -252,7 +251,7 @@ class NamedWsCallsDirectory(Directory): pass get_response().breadcrumb.append(('import', _('Import'))) - html_top('wscalls', title=import_title) + get_response().set_title(import_title) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % import_title r += htmltext('

    %s

    ') % _('You can install a new webservice call by uploading a file.') diff --git a/wcs/backoffice/applications.py b/wcs/backoffice/applications.py index e211e7e56..2a118aade 100644 --- a/wcs/backoffice/applications.py +++ b/wcs/backoffice/applications.py @@ -18,7 +18,6 @@ from quixote import get_response, redirect from quixote.directory import Directory from wcs.qommon import errors, misc, template -from wcs.qommon.backoffice.menu import html_top class ApplicationsDirectory(Directory): @@ -60,7 +59,7 @@ class ApplicationDirectory(Directory): return super()._q_traverse(path) def _q_index(self): - html_top('', self.application.name) + get_response().set_title(self.application.name) return template.QommonTemplateResponse(templates=[self.get_template()], context=self.get_context()) def get_template(self): @@ -99,7 +98,7 @@ class ApplicationDirectory(Directory): def get_block_objects_context(self, objects): from wcs.admin.blocks import BlocksDirectory - return BlocksDirectory(None).get_list_context(objects) + return BlocksDirectory().get_list_context(objects) def get_mailtemplate_objects_context(self, objects): from wcs.admin.mail_templates import MailTemplatesDirectory diff --git a/wcs/backoffice/cards.py b/wcs/backoffice/cards.py index d5ba34e54..ecd366983 100644 --- a/wcs/backoffice/cards.py +++ b/wcs/backoffice/cards.py @@ -83,7 +83,7 @@ class CardDefPage(FormDefPage): management_view_label = _('List of cards') def _q_index(self): - self.html_top(title=self.formdef.name) + get_response().set_title(self.formdef.name) r = TemplateIO(html=True) get_response().filter['sidebar'] = self.get_sidebar() get_response().add_javascript(['jquery.js', 'widget_list.js', 'qommon.wysiwyg.js']) @@ -284,7 +284,7 @@ class CardsDirectory(FormsDirectory): else: return redirect(str(formdef.id) + '/') - self.html_top(title=_('New Card Model')) + get_response().set_title(_('New Card Model')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('New Card Model') r += form.render() diff --git a/wcs/backoffice/data_management.py b/wcs/backoffice/data_management.py index b43a0c922..08a6d7bbd 100644 --- a/wcs/backoffice/data_management.py +++ b/wcs/backoffice/data_management.py @@ -31,7 +31,6 @@ from wcs.workflows import ContentSnapshotPart from ..qommon import _, errors, ngettext, template from ..qommon.afterjobs import AfterJob -from ..qommon.backoffice.menu import html_top from ..qommon.form import CheckboxWidget, FileWidget, Form from .management import FormBackOfficeStatusPage, FormPage, ManagementDirectory from .submission import FormFillPage @@ -73,6 +72,7 @@ def get_import_csv_fields(carddef): class DataManagementDirectory(ManagementDirectory): do_not_call_in_templates = True _q_exports = [''] + section = 'data' def add_breadcrumb(self): get_response().breadcrumb.append(('data/', _('Cards'))) @@ -108,7 +108,7 @@ class DataManagementDirectory(ManagementDirectory): yield carddef def _q_index(self): - html_top('data_management', _('Cards')) + get_response().set_title(_('Cards')) if not (CardDef.exists()): return self.empty_site_message(_('Cards')) return template.QommonTemplateResponse( @@ -249,7 +249,7 @@ class CardPage(FormPage): form.set_error('file', e) get_response().breadcrumb.append(('import-file', _('Import File'))) - html_top('data_management', _('Import File')) + get_response().set_title(_('Import File')) context['html_form'] = form context['impossible_csv_fields'] = self.get_csv_impossible_fields() @@ -408,9 +408,6 @@ class CardBackOfficeStatusPage(FormBackOfficeStatusPage): 'The card has been recorded on %(date)s with the number %(number)s by %(agent)s.' ) - def html_top(self, title=None): - return html_top('data_management', title) - def should_fold_summary(self, mine, request_user): return False diff --git a/wcs/backoffice/deprecations.py b/wcs/backoffice/deprecations.py index c1743d562..4e7729f0a 100644 --- a/wcs/backoffice/deprecations.py +++ b/wcs/backoffice/deprecations.py @@ -26,7 +26,6 @@ from wcs.data_sources import NamedDataSource from wcs.formdef import get_formdefs_of_all_kinds from wcs.qommon import _, ezt, template from wcs.qommon.afterjobs import AfterJob -from wcs.qommon.backoffice.menu import html_top from wcs.wf.export_to_model import UploadValidationError from wcs.workflows import Workflow from wcs.wscalls import NamedWsCall @@ -42,7 +41,7 @@ class DeprecationsDirectory(Directory): # create report if necessary return self.scan() - html_top('studio', _('Deprecations Report')) + get_response().set_title(_('Deprecations Report')) get_response().breadcrumb.append(('deprecations/', _('Deprecations Report'))) context = {'has_sidebar': False, 'view': self} diff --git a/wcs/backoffice/i18n.py b/wcs/backoffice/i18n.py index 7ac22b335..1d626dba7 100644 --- a/wcs/backoffice/i18n.py +++ b/wcs/backoffice/i18n.py @@ -31,7 +31,6 @@ from wcs.formdef import FormDef, UpdateDigestAfterJob from wcs.mail_templates import MailTemplate from wcs.qommon import _, errors, get_cfg, misc, ods, template from wcs.qommon.afterjobs import AfterJob -from wcs.qommon.backoffice.menu import html_top from wcs.qommon.form import CheckboxWidget, FileWidget, Form, RadiobuttonsWidget, TextWidget from wcs.sql_criterias import Equal, FtsMatch, ILike, Or from wcs.workflows import Workflow @@ -65,7 +64,7 @@ class I18nDirectory(Directory): if TranslatableMessage.count() == 0: return self.scan() - html_top('i18n', title=_('Multilinguism')) + get_response().set_title(_('Multilinguism')) get_response().breadcrumb.append(('i18n/', _('Multilinguism'))) if not self.get_supported_languages(): @@ -241,7 +240,7 @@ class MessageDirectory(Directory): update_digests() return redirect('../../?' + get_request().get_query()) - html_top('i18n', title=_('Multilinguism')) + get_response().set_title(_('Multilinguism')) context = {'html_form': form, 'msg': self.msg} return template.QommonTemplateResponse( templates=['wcs/backoffice/i18n-message.html'], context=context diff --git a/wcs/backoffice/journal.py b/wcs/backoffice/journal.py index 3bd985afa..c37264356 100644 --- a/wcs/backoffice/journal.py +++ b/wcs/backoffice/journal.py @@ -22,7 +22,6 @@ from quixote.directory import Directory from wcs.carddef import CardDef from wcs.formdef import FormDef from wcs.qommon import _, template -from wcs.qommon.backoffice.menu import html_top from wcs.qommon.form import DateWidget, Form, OptGroup, SingleSelectWidget, StringWidget from wcs.qommon.misc import get_as_datetime from wcs.sql_criterias import Equal, Greater, GreaterOrEqual, Less, Nothing @@ -31,9 +30,6 @@ from wcs.sql_criterias import Equal, Greater, GreaterOrEqual, Less, Nothing class JournalDirectory(Directory): _q_exports = [''] - def html_top(self, title): - return html_top('journal', title) - def _q_traverse(self, path): get_response().breadcrumb.append(('journal/', _('Audit Journal'))) return super()._q_traverse(path) @@ -41,7 +37,7 @@ class JournalDirectory(Directory): def _q_index(self): from wcs.audit import Audit - self.html_top(_('Audit Journal')) + get_response().set_title(_('Audit Journal')) context = { 'has_sidebar': True, 'html_form': self.get_filter_form(), diff --git a/wcs/backoffice/management.py b/wcs/backoffice/management.py index d01855756..fc1d06434 100644 --- a/wcs/backoffice/management.py +++ b/wcs/backoffice/management.py @@ -70,7 +70,6 @@ from wcs.workflows import WorkflowStatusItem, item_classes, template_on_formdata from ..qommon import _, audit, errors, ezt, force_str, get_cfg, misc, ngettext, ods, pgettext_lazy, template from ..qommon.afterjobs import AfterJob -from ..qommon.backoffice.menu import html_top from ..qommon.evalutils import make_datetime from ..qommon.form import ( CheckboxWidget, @@ -163,6 +162,7 @@ def geojson_formdatas(formdatas, geoloc_key='base', fields=None): class ManagementDirectory(Directory): _q_exports = ['', 'forms', 'listing', 'statistics', 'lookup', 'count', 'geojson', 'map'] + section = 'management' def add_breadcrumb(self): get_response().breadcrumb.append(('management/', _('Management'))) @@ -172,6 +172,7 @@ class ManagementDirectory(Directory): def _q_traverse(self, path): self.add_breadcrumb() + get_response().set_backoffice_section(self.section) return super()._q_traverse(path) def _q_index(self): @@ -181,7 +182,7 @@ class ManagementDirectory(Directory): return redirect('forms') def forms(self): - html_top('management', _('Management')) + get_response().set_title(_('Management')) formdefs = FormDef.select(order_by='name', ignore_errors=True, lightweight=True) if len(formdefs) == 0: return self.empty_site_message(_('Forms')) @@ -404,7 +405,7 @@ class ManagementDirectory(Directory): return r.getvalue() def statistics(self): - html_top('management', _('Global statistics')) + get_response().set_title(_('Global statistics')) get_response().breadcrumb.append(('statistics', _('Global statistics'))) if not (FormDef.exists()): @@ -584,7 +585,7 @@ class ManagementDirectory(Directory): get_response().add_javascript(['wcs.listing.js']) from wcs import sql - html_top('management', _('Management')) + get_response().set_title(_('Management')) if not (FormDef.exists()): return self.empty_site_message(_('Global View')) @@ -736,7 +737,7 @@ class ManagementDirectory(Directory): def map(self): get_response().add_javascript(['wcs.listing.js', 'qommon.map.js']) - html_top('management', _('Global Map')) + get_response().set_title(_('Global Map')) r = TemplateIO(html=True) get_response().breadcrumb.append(('map', _('Global Map'))) attrs = { @@ -2213,10 +2214,10 @@ class FormPage(FormdefDirectoryBase): r += htmltext('
    ') if self.view: view_name = self.view.title - html_top('management', f'{self.view.title} - {self.formdef.name}') + get_response().set_title(f'{self.view.title} - {self.formdef.name}') r += htmltext('

    %s - %s

    ') % (self.formdef.name, view_name) else: - html_top('management', self.formdef.name) + get_response().set_title(self.formdef.name) r += htmltext('

    %s

    ') % self.formdef.name r += get_session().display_message() r += self.listing_top_actions() @@ -2708,7 +2709,7 @@ class FormPage(FormdefDirectoryBase): def map(self): self.view_type = 'map' get_response().add_javascript(['qommon.map.js']) - html_top('management', '%s - %s' % (_('Form'), self.formdef.name)) + get_response().set_title('%s - %s' % (_('Form'), self.formdef.name)) r = TemplateIO(html=True) get_response().breadcrumb.append(('map', _('Map'))) attrs = { @@ -2749,7 +2750,7 @@ class FormPage(FormdefDirectoryBase): 'statistics', get_request().user ): raise errors.AccessForbiddenError() - html_top('management', '%s - %s' % (_('Form'), self.formdef.name)) + get_response().set_title('%s - %s' % (_('Form'), self.formdef.name)) r = TemplateIO(html=True) get_response().breadcrumb.append(('stats', _('Statistics'))) @@ -3030,9 +3031,6 @@ class FormBackOfficeStatusPage(FormStatusPage): 'The form has been recorded on %(date)s with the number %(number)s by %(agent)s.' ) - def html_top(self, title=None): - return html_top('management', title) - def _q_index(self): if self.filled.status == 'draft': if self.filled.backoffice_submission and self.formdef.backoffice_submission_roles: @@ -3623,7 +3621,7 @@ class FormBackOfficeStatusPage(FormStatusPage): if self.filled.is_draft(): raise errors.AccessForbiddenError() get_response().breadcrumb.append(('inspect', _('Data Inspector'))) - self.html_top(self.formdef.name) + get_response().set_title(self.formdef.name) context = {} diff --git a/wcs/backoffice/root.py b/wcs/backoffice/root.py index af4cc9354..b0a251f23 100644 --- a/wcs/backoffice/root.py +++ b/wcs/backoffice/root.py @@ -30,7 +30,6 @@ from wcs.formdef import FormDef from ..qommon import _, errors, get_cfg, misc, template from ..qommon.afterjobs import AfterJob -from ..qommon.backoffice.menu import html_top from .cards import CardsDirectory from .data_management import DataManagementDirectory from .i18n import I18nDirectory @@ -85,6 +84,7 @@ class RootDirectory(AccessControlled, Directory): if path and path[0] == 'categories': # legacy /backoffice/categories/<...>, redirect. return redirect('/backoffice/forms/' + '/'.join(path)) + get_response().set_backoffice_section('studio') return super()._q_traverse(path) @classmethod @@ -263,7 +263,7 @@ class RootDirectory(AccessControlled, Directory): return redirect('.') get_response().add_javascript(['jquery.js', 'afterjob.js']) - html_top('/', title=job.label) + get_response().set_title(job.label) return template.QommonTemplateResponse( templates=['wcs/backoffice/processing.html'], context={'job': job} ) diff --git a/wcs/backoffice/snapshots.py b/wcs/backoffice/snapshots.py index 818ff7de9..0336be1dc 100644 --- a/wcs/backoffice/snapshots.py +++ b/wcs/backoffice/snapshots.py @@ -26,7 +26,6 @@ from quixote.html import TemplateIO, htmltext from wcs.formdef import FormdefImportError from wcs.qommon import _, errors, misc, template -from wcs.qommon.backoffice.menu import html_top from wcs.qommon.form import Form, RadiobuttonsWidget, StringWidget from wcs.sql_criterias import Equal from wcs.workflows import WorkflowImportError @@ -46,7 +45,7 @@ class SnapshotsDirectory(Directory): return super()._q_traverse(path) def _q_index(self): - html_top('', _('History')) + get_response().set_title(_('History')) return template.QommonTemplateResponse( templates=['wcs/backoffice/snapshots.html'], context={'view': self, 'enable_tests': get_publisher().has_site_option('enable-tests')}, @@ -65,7 +64,7 @@ class SnapshotsDirectory(Directory): get_publisher().snapshot_class.snap(instance=self.obj, label=label.parse()) return redirect('../') - html_top('', _('History')) + get_response().set_title(_('History')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('Save snapshot') r += form.render() @@ -73,7 +72,7 @@ class SnapshotsDirectory(Directory): def compare(self): get_response().breadcrumb.append(('compare/', _('Compare'))) - html_top('', _('Compare')) + get_response().set_title(_('Compare')) mode = get_request().form.get('mode') or 'xml' diff --git a/wcs/backoffice/studio.py b/wcs/backoffice/studio.py index 391450721..2a8de710f 100644 --- a/wcs/backoffice/studio.py +++ b/wcs/backoffice/studio.py @@ -27,7 +27,6 @@ from wcs.data_sources import NamedDataSource from wcs.formdef import FormDef from wcs.mail_templates import MailTemplate from wcs.qommon import _, misc, pgettext, template -from wcs.qommon.backoffice.menu import html_top from wcs.qommon.form import get_response from wcs.workflows import Workflow from wcs.wscalls import NamedWsCall @@ -38,7 +37,7 @@ class ChangesDirectory(Directory): def _q_index(self): get_response().breadcrumb.append(('all-changes/', pgettext('studio', 'All changes'))) - html_top(pgettext('studio', 'All Changes')) + get_response().set_title(pgettext('studio', 'All Changes')) limit = misc.get_int_or_400( get_request().form.get('limit', get_publisher().get_site_option('default-page-size')) or 20 ) @@ -88,15 +87,13 @@ class StudioDirectory(Directory): def __init__(self): self.logged_errors_dir = LoggedErrorsDirectory(parent_dir=self) - def html_top(self, title): - return html_top('studio', title) - def _q_traverse(self, path): get_response().breadcrumb.append(('studio/', _('Studio'))) + get_response().set_backoffice_section('studio') return super()._q_traverse(path) def _q_index(self): - self.html_top(_('Studio')) + get_response().set_title(_('Studio')) extra_links = [] backoffice_root = get_publisher().get_backoffice_root() object_types = [] diff --git a/wcs/backoffice/submission.py b/wcs/backoffice/submission.py index 0f07c9652..7749c5bde 100644 --- a/wcs/backoffice/submission.py +++ b/wcs/backoffice/submission.py @@ -30,7 +30,6 @@ from wcs.forms.root import FormPage as PublicFormFillPage from wcs.sql_criterias import Equal, StrictNotEqual from ..qommon import _, errors, misc -from ..qommon.backoffice.menu import html_top from ..qommon.form import Form, HtmlWidget @@ -53,7 +52,7 @@ class RemoveDraftDirectory(Directory): if self.parent_directory.edit_mode: raise errors.AccessForbiddenError() - self.parent_directory.html_top(title=_('Discard')) + get_response().set_title(_('Discard')) form = Form(enctype='multipart/form-data') form.widgets.append(HtmlWidget('

    %s

    ' % _('You are about to discard this form.'))) @@ -186,9 +185,6 @@ class FormFillPage(PublicFormFillPage): formdata.user_id = get_request().form['user_id'] return formdata - def html_top(self, *args, **kwargs): - return html_top('submission', *args, **kwargs) - @classmethod def get_status_page_class(cls): return SubmissionFormStatusPage @@ -407,6 +403,10 @@ class FormFillPage(PublicFormFillPage): class SubmissionDirectory(Directory): _q_exports = ['', 'count'] + def _q_traverse(self, path): + get_response().set_backoffice_section('submission') + return super()._q_traverse(path) + def is_accessible(self, user): if not user.can_go_in_backoffice(): return False @@ -437,7 +437,7 @@ class SubmissionDirectory(Directory): def _q_index(self): get_response().breadcrumb.append(('submission/', _('Submission'))) - html_top('submission', _('Submission')) + get_response().set_title(_('Submission')) list_forms = self.get_submittable_formdefs() cats = Category.select() diff --git a/wcs/forms/actions.py b/wcs/forms/actions.py index 96180faed..562c4de69 100644 --- a/wcs/forms/actions.py +++ b/wcs/forms/actions.py @@ -23,7 +23,6 @@ from wcs.formdef import FormDef from wcs.forms.common import FormTemplateMixin from wcs.qommon import _, errors, misc, template from wcs.qommon.afterjobs import AfterJob -from wcs.qommon.backoffice.menu import html_top as backoffice_html_top from wcs.qommon.form import Form from wcs.qommon.http_request import HTTPRequest from wcs.wf.jump import jump_and_perform @@ -84,7 +83,7 @@ class ActionDirectory(Directory, FormTemplateMixin): raise MissingOrExpiredToken() def _q_index(self): - template.html_top(title=self.formdef.name) + get_response().set_title(self.formdef.name) form = Form() form.add_submit('submit', misc.site_encode(self.token.context['label'])) if form.is_submitted() and not form.has_errors(): @@ -145,16 +144,11 @@ class GlobalInteractiveActionDirectory(Directory, FormTemplateMixin): raise MissingOrExpiredToken() def _q_index(self): + get_response().set_title(self.formdef.name) if get_request().is_in_backoffice(): - if isinstance(self.formdef, CardDef): - section = 'data_management' - else: - section = 'management' get_response().breadcrumb.append(('', self.action.name)) - backoffice_html_top(section, title=self.formdef.name) template_name = 'wcs/backoffice/global-interactive-action.html' else: - template.html_top(title=self.formdef.name) template_name = 'wcs/global-interactive-action.html' if len(self.token.context['form_ids']) == 1: diff --git a/wcs/forms/common.py b/wcs/forms/common.py index d6926ab2f..44b79f1f2 100644 --- a/wcs/forms/common.py +++ b/wcs/forms/common.py @@ -163,9 +163,6 @@ class FormStatusPage(Directory, FormTemplateMixin): history_templates = ['wcs/formdata_history.html'] status_templates = ['wcs/formdata_status.html'] - def html_top(self, title=None): - template.html_top(title=title, default_org=_('Forms')) - def __init__(self, formdef, filled, register_workflow_subdirs=True, custom_view=None, parent_view=None): get_publisher().substitutions.feed(filled) self.formdef = formdef @@ -340,7 +337,7 @@ class FormStatusPage(Directory, FormTemplateMixin): form.add_media() get_response().add_javascript(['jquery.js', 'qommon.forms.js', 'qommon.map.js']) - self.html_top(get_publisher().translate(self.formdef.name)) + get_response().set_title(get_publisher().translate(self.formdef.name)) get_response().filter['page_title'] = self.filled.get_display_label() context = { 'view': self, @@ -670,7 +667,7 @@ class FormStatusPage(Directory, FormTemplateMixin): get_response().add_javascript(['jquery.js', 'qommon.forms.js']) audit('view', obj=self.filled) - self.html_top('%s - %s' % (self.formdef.name, self.filled.id)) + get_response().set_title('%s - %s' % (self.formdef.name, self.filled.id)) r = TemplateIO(html=True) r += get_session().display_message() r += htmltext(self.workflow_messages()) diff --git a/wcs/forms/preview.py b/wcs/forms/preview.py index 2a3098033..1bded6855 100644 --- a/wcs/forms/preview.py +++ b/wcs/forms/preview.py @@ -14,7 +14,7 @@ # You should have received a copy of the GNU General Public License # along with this program; if not, see . -from quixote import get_publisher +from quixote import get_publisher, get_response from quixote.directory import AccessControlled, Directory from quixote.html import TemplateIO, htmltext @@ -38,7 +38,7 @@ class PreviewFormPage(FormPage): return form def submitted(self, *args, **kwargs): - self.html_top(self.formdef.name) + get_response().set_title(self.formdef.name) r = TemplateIO(html=True) r += htmltext('

    ') r += str(_('This was only a preview: form was not actually submitted.')) diff --git a/wcs/forms/root.py b/wcs/forms/root.py index fed70abbc..721231ce5 100644 --- a/wcs/forms/root.py +++ b/wcs/forms/root.py @@ -64,10 +64,6 @@ class SubmittedDraftException(Exception): pass -def html_top(title=None, page_title=None): - template.html_top(title=title, default_org=_('Forms'), page_title=page_title) - - def tryauth(url): # tries to log the user in before redirecting to the asked url; this won't # do anything for local logins but will use a passive SAML request when @@ -144,7 +140,6 @@ class TrackingCodeDirectory(Directory): emails.custom_template_email('tracking-code-reminder', data, email, fire_and_forget=True) return redirect('./load') - html_top() r = TemplateIO(html=True) try: tracking_code = get_publisher().tracking_code_class.get(self.code) @@ -223,7 +218,7 @@ class TrackingCodeDirectory(Directory): break if not form.is_submitted() or form.has_errors() or bad_content: - html_top(title=_('Access rights verification')) + get_response().set_title(_('Access rights verification')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('Access rights verification') r += htmltext('

    %s

    ') % ngettext( @@ -307,9 +302,6 @@ class FormPage(FormdefDirectoryBase, FormTemplateMixin): url += '?' + get_request().get_query() return redirect(url) - def html_top(self, *args, **kwargs): - html_top(*args, **kwargs) - def get_substitution_variables(self): return self.substvars @@ -536,7 +528,7 @@ class FormPage(FormdefDirectoryBase, FormTemplateMixin): def set_page_title(self): step_context = self.step_context() if len(step_context.get('page_labels')) > 1: - self.html_top( + get_response().set_title( title=get_publisher().translate(self.formdef.name), page_title='%s - %s/%s - %s' % ( @@ -547,7 +539,7 @@ class FormPage(FormdefDirectoryBase, FormTemplateMixin): ), ) else: - self.html_top( + get_response().set_title( title=get_publisher().translate(self.formdef.name), page_title='%s - %s' % ( @@ -964,7 +956,7 @@ class FormPage(FormdefDirectoryBase, FormTemplateMixin): if get_session().get_authentication_context() in self.formdef.required_authentication_contexts: return - self.html_top(get_publisher().translate(self.formdef.name)) + get_response().set_title(get_publisher().translate(self.formdef.name)) r = TemplateIO(html=True) r += self.form_side() auth_contexts = get_publisher().get_supported_authentication_contexts() @@ -2036,7 +2028,7 @@ class RootDirectory(AccessControlled, Directory): ) ) - template.html_top(default_org=_('Forms')) + get_response().set_title(_('Forms')) r = TemplateIO(html=True) session = get_session() @@ -2275,7 +2267,7 @@ class RootDirectory(AccessControlled, Directory): raise errors.TraversalError() if get_request().is_json(): return self.categories_json() - template.html_top(_('Categories')) + get_response().set_title(_('Categories')) r = TemplateIO(html=True) user = get_request().user for category in self.get_categories(user): diff --git a/wcs/qommon/admin/emails.py b/wcs/qommon/admin/emails.py index 351044b98..9d28b3e4b 100644 --- a/wcs/qommon/admin/emails.py +++ b/wcs/qommon/admin/emails.py @@ -20,7 +20,6 @@ from quixote.html import TemplateIO, htmltext from .. import _, get_cfg from ..admin.cfg import cfg_submit -from ..backoffice.menu import html_top from ..form import CheckboxWidget, Form, StringWidget, TextWidget, WidgetList @@ -145,7 +144,7 @@ class EmailsDirectory(Directory): return redirect('.') if not form.is_submitted() or form.has_errors(): - html_top('settings', title=_('Emails')) + get_response().set_title(_('Emails')) get_response().breadcrumb.append(('options', _('General Options'))) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('General Options') @@ -178,7 +177,7 @@ class EmailsDirectory(Directory): return redirect('.') def _q_index(self): - html_top('settings', title=_('Emails')) + get_response().set_title(_('Emails')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('Emails') @@ -255,7 +254,7 @@ class EmailsDirectory(Directory): form.set_error(cfg_key, _('Invalid template')) get_response().breadcrumb.append((email_key, email_label)) - html_top('settings', title=_('Emails')) + get_response().set_title(_('Emails')) r = TemplateIO(html=True) r += htmltext('

    %s - %s

    ') % (_('Email'), email_label) r += form.render() diff --git a/wcs/qommon/admin/menu.py b/wcs/qommon/admin/menu.py index 45f8106a4..abdd3493a 100644 --- a/wcs/qommon/admin/menu.py +++ b/wcs/qommon/admin/menu.py @@ -16,11 +16,10 @@ import re -from quixote import get_publisher, get_request +from quixote import get_publisher, get_request, get_response from quixote.html import TemplateIO, htmltext from .. import _ -from ..backoffice.menu import html_top def _find_vc_version(): @@ -137,8 +136,8 @@ def command_icon(url, type, label=None, popup=False): ) -def error_page(section, error): - html_top(section, title=_('Error')) +def error_page(error): + get_response().set_title(_('Error')) r = TemplateIO(html=True) r += htmltext('
    ') r += htmltext('

    %s

    ') % _('Error') diff --git a/wcs/qommon/admin/texts.py b/wcs/qommon/admin/texts.py index a7511a9fa..6579d9700 100644 --- a/wcs/qommon/admin/texts.py +++ b/wcs/qommon/admin/texts.py @@ -21,7 +21,6 @@ from quixote.directory import Directory from quixote.html import TemplateIO, htmltext from wcs.qommon import _, ezt, get_cfg -from wcs.qommon.backoffice.menu import html_top from wcs.qommon.form import Form, WysiwygTextWidget from wcs.qommon.template import Template @@ -69,11 +68,8 @@ class TextsDirectory(Directory): 'condition': condition, } - def html_top(self, title): - html_top('settings', title) - def _q_index(self): - self.html_top(title=_('Texts')) + get_response().set_title(_('Texts')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('Custom Texts') @@ -141,7 +137,7 @@ class TextsDirectory(Directory): form.set_error(cfg_key, _('Invalid template')) get_response().breadcrumb.append((text_key, text_label)) - self.html_top(title=_('Texts')) + get_response().set_title(_('Texts')) r = TemplateIO(html=True) r += htmltext('

    %s - %s

    ') % (_('Text'), text_label) r += form.render() diff --git a/wcs/qommon/backoffice/__init__.py b/wcs/qommon/backoffice/__init__.py deleted file mode 100644 index 7d271cd20..000000000 --- a/wcs/qommon/backoffice/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# w.c.s. - web application for online forms -# Copyright (C) 2005-2010 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 . - -from .root import BackofficeRootDirectory diff --git a/wcs/qommon/backoffice/menu.py b/wcs/qommon/backoffice/menu.py deleted file mode 100644 index 9e14f993b..000000000 --- a/wcs/qommon/backoffice/menu.py +++ /dev/null @@ -1,36 +0,0 @@ -# w.c.s. - web application for online forms -# Copyright (C) 2005-2010 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 . - -from quixote import get_publisher, get_response - -from .. import get_cfg - - -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, page_title=None): - header_menu = generate_header_menu(section) - if not scripts: - script = '' - else: - script = '\n'.join(['' % x for x in scripts]) - - org_name = get_cfg('sp', {}).get('organization_name', get_publisher().APP_NAME) - site_name = get_cfg('misc', {}).get('sitename', org_name) - - get_response().filter.update(locals()) diff --git a/wcs/qommon/errors.py b/wcs/qommon/errors.py index f7fd7c0f4..da2bee030 100644 --- a/wcs/qommon/errors.py +++ b/wcs/qommon/errors.py @@ -17,7 +17,7 @@ import urllib.parse import quixote -from quixote import get_publisher +from quixote import get_publisher, get_response from quixote.errors import AccessError, PublishError, TraversalError from quixote.html import TemplateIO, htmltext @@ -86,7 +86,7 @@ class InternalServerError(PublishError): def render(self): from . import _ - template.html_top(_('Technical error')) + get_response().set_title(_('Technical error')) r = TemplateIO(html=True) r += htmltext('

    ') diff --git a/wcs/qommon/http_response.py b/wcs/qommon/http_response.py index f93b2858c..e9896540c 100644 --- a/wcs/qommon/http_response.py +++ b/wcs/qommon/http_response.py @@ -33,6 +33,7 @@ class HTTPResponse(quixote.http_response.HTTPResponse): quixote.http_response.HTTPResponse.__init__(self, charset=charset, **kwargs) if not charset: self.charset = get_publisher().site_charset + self.filter = {} def _gen_cookie_headers(self): return [] @@ -189,3 +190,10 @@ class HTTPResponse(quixote.http_response.HTTPResponse): def process_after_jobs(self): for job in self.after_jobs or []: job.run(spool=True) + + def set_backoffice_section(self, section): + self.filter['backoffice_section'] = section + + def set_title(self, title, page_title=None): + self.filter['title'] = title + self.filter['page_title'] = page_title diff --git a/wcs/qommon/ident/franceconnect.py b/wcs/qommon/ident/franceconnect.py index d81b05816..78aa3f7f6 100644 --- a/wcs/qommon/ident/franceconnect.py +++ b/wcs/qommon/ident/franceconnect.py @@ -20,7 +20,7 @@ import urllib.parse import uuid from django.utils.encoding import force_bytes -from quixote import get_publisher, get_request, get_session, get_session_manager, redirect +from quixote import get_publisher, get_request, get_response, get_session, get_session_manager, redirect from quixote.directory import Directory from quixote.errors import QueryError from quixote.html import TemplateIO, htmltext @@ -29,7 +29,6 @@ from wcs.formdata import flatten_dict from wcs.workflows import WorkflowStatusItem from .. import _, get_cfg, template -from ..backoffice.menu import html_top from ..form import ( CompositeWidget, ComputedExpressionWidget, @@ -232,7 +231,7 @@ class MethodAdminDirectory(Directory): if 'submit' in get_request().form and form.is_submitted() and not form.has_errors(): return self.submit(form) - html_top('settings', title=self.title) + get_response().set_title(self.title) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % self.title fc_callback = pub.get_frontoffice_url() + '/ident/fc/callback' diff --git a/wcs/qommon/ident/idp.py b/wcs/qommon/ident/idp.py index 9c4a04499..ee1e56e87 100644 --- a/wcs/qommon/ident/idp.py +++ b/wcs/qommon/ident/idp.py @@ -31,7 +31,6 @@ from quixote.html import TemplateIO, htmltext from .. import _, errors, get_cfg, misc, saml2utils, template, x509utils from ..admin.menu import command_icon -from ..backoffice.menu import html_top from ..form import ( CheckboxWidget, EmailWidget, @@ -125,7 +124,7 @@ class MethodDirectory(Directory): saml = get_publisher().root_directory_class.saml return saml.perform_login(idp) - template.html_top(_('Login')) + get_response().set_title(_('Login')) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('Select the identity provider you want to use.') r += form.render() @@ -170,7 +169,7 @@ class MethodDirectory(Directory): return tmp get_response().breadcrumb.append(('register', _('New Account'))) - template.html_top(_('New Account')) + get_response().set_title(_('New Account')) r = TemplateIO(html=True) r += form.render() return r.getvalue() @@ -211,7 +210,7 @@ class AdminIDPDir(Directory): return Directory._q_traverse(self, path) def _q_index(self): - html_top('settings', title=self.title) + get_response().set_title(self.title) r = TemplateIO(html=True) r += htmltext('

    %s

    ') % _('Identity Providers') r += htmltext('