misc: replace html_top by response methods (#77144)
gitea/wcs/pipeline/head This commit looks good Details

This commit is contained in:
Frédéric Péters 2023-04-29 11:12:34 +02:00
parent 886225ffff
commit df35bc818f
48 changed files with 278 additions and 413 deletions

View File

@ -22,7 +22,6 @@ from quixote.html import TemplateIO, htmltext
from wcs.api_access import ApiAccess from wcs.api_access import ApiAccess
from wcs.qommon import _, errors, template from wcs.qommon import _, errors, template
from wcs.qommon.backoffice.menu import html_top
from wcs.qommon.form import ( from wcs.qommon.form import (
CheckboxWidget, CheckboxWidget,
Form, Form,
@ -130,7 +129,7 @@ class ApiAccessPage(Directory):
get_response().breadcrumb.append((component + '/', self.api_access.name)) get_response().breadcrumb.append((component + '/', self.api_access.name))
def _q_index(self): def _q_index(self):
html_top('api-accesss', title=self.api_access.name) get_response().set_title(self.api_access.name)
return template.QommonTemplateResponse( return template.QommonTemplateResponse(
templates=['wcs/backoffice/api_access.html'], templates=['wcs/backoffice/api_access.html'],
context={'view': self, 'api_access': self.api_access}, context={'view': self, 'api_access': self.api_access},
@ -150,7 +149,7 @@ class ApiAccessPage(Directory):
return redirect('../%s/' % self.api_access.id) return redirect('../%s/' % self.api_access.id)
get_response().breadcrumb.append(('edit', _('Edit'))) 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 = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Edit API access') r += htmltext('<h2>%s</h2>') % _('Edit API access')
r += form.render() r += form.render()
@ -167,7 +166,7 @@ class ApiAccessPage(Directory):
return redirect('..') return redirect('..')
if not form.is_submitted() or form.has_errors(): if not form.is_submitted() or form.has_errors():
get_response().breadcrumb.append(('delete', _('Delete'))) 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 = TemplateIO(html=True)
r += htmltext('<h2>%s %s</h2>') % (_('Deleting API access:'), self.api_access.name) r += htmltext('<h2>%s %s</h2>') % (_('Deleting API access:'), self.api_access.name)
r += form.render() r += form.render()
@ -182,10 +181,11 @@ class ApiAccessDirectory(Directory):
def _q_traverse(self, path): def _q_traverse(self, path):
get_response().breadcrumb.append(('api-access/', _('API access'))) get_response().breadcrumb.append(('api-access/', _('API access')))
get_response().set_backoffice_section('api-access')
return super()._q_traverse(path) return super()._q_traverse(path)
def _q_index(self): def _q_index(self):
html_top('api-access', title=_('API access')) get_response().set_title(_('API access'))
return template.QommonTemplateResponse( return template.QommonTemplateResponse(
templates=['wcs/backoffice/api_accesses.html'], templates=['wcs/backoffice/api_accesses.html'],
context={'view': self, 'api_accesses': ApiAccess.select(order_by='name')}, context={'view': self, 'api_accesses': ApiAccess.select(order_by='name')},
@ -206,7 +206,7 @@ class ApiAccessDirectory(Directory):
else: else:
return redirect('.') return redirect('.')
html_top('api-access', title=_('New API access')) get_response().set_title(_('New API access'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('New API access') r += htmltext('<h2>%s</h2>') % _('New API access')
r += form.render() r += form.render()

View File

@ -27,7 +27,6 @@ from wcs.blocks import BlockDef, BlockdefImportError
from wcs.categories import BlockCategory from wcs.categories import BlockCategory
from wcs.formdef import UpdateStatisticsDataAfterJob from wcs.formdef import UpdateStatisticsDataAfterJob
from wcs.qommon import _, misc, template from wcs.qommon import _, misc, template
from wcs.qommon.backoffice.menu import html_top
from wcs.qommon.errors import AccessForbiddenError, TraversalError from wcs.qommon.errors import AccessForbiddenError, TraversalError
from wcs.qommon.form import FileWidget, Form, HtmlWidget, SingleSelectWidget, SlugWidget, StringWidget 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_soft_limit = 30
fields_count_total_hard_limit = 60 fields_count_total_hard_limit = 60
def __init__(self, section='forms', *args, **kwargs): def __init__(self, *args, **kwargs):
kwargs.pop('component', None) # snapshot kwargs.pop('component', None) # snapshot
if 'instance' in kwargs: if 'instance' in kwargs:
kwargs['objectdef'] = kwargs.pop('instance') kwargs['objectdef'] = kwargs.pop('instance')
self.section = section
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.snapshots_dir = SnapshotsDirectory(self.objectdef) self.snapshots_dir = SnapshotsDirectory(self.objectdef)
@ -136,7 +134,7 @@ class BlockDirectory(FieldsDirectory):
return redirect('..') return redirect('..')
if not form.is_submitted() or form.has_errors(): if not form.is_submitted() or form.has_errors():
get_response().breadcrumb.append(('delete', _('Delete'))) get_response().breadcrumb.append(('delete', _('Delete')))
html_top(self.section, title=_('Delete Block')) get_response().set_title(_('Delete Block'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s %s</h2>') % (_('Deleting Block:'), self.objectdef.name) r += htmltext('<h2>%s %s</h2>') % (_('Deleting Block:'), self.objectdef.name)
r += form.render() r += form.render()
@ -164,7 +162,7 @@ class BlockDirectory(FieldsDirectory):
name_widget.set_value(new_name) name_widget.set_value(new_name)
if not form.is_submitted() or form.has_errors(): 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) r = TemplateIO(html=True)
get_response().breadcrumb.append(('duplicate', _('Duplicate'))) get_response().breadcrumb.append(('duplicate', _('Duplicate')))
r += htmltext('<h2>%s</h2>') % _('Duplicate Fields Block') r += htmltext('<h2>%s</h2>') % _('Duplicate Fields Block')
@ -244,14 +242,14 @@ class BlockDirectory(FieldsDirectory):
self.objectdef.store() self.objectdef.store()
return redirect('.') return redirect('.')
html_top(self.section, title=_('Settings')) get_response().set_title(_('Settings'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Settings') r += htmltext('<h2>%s</h2>') % _('Settings')
r += form.render() r += form.render()
return r.getvalue() return r.getvalue()
def inspect(self): def inspect(self):
self.html_top(self.objectdef.name) get_response().set_title(self.objectdef.name)
get_response().breadcrumb.append(('inspect', _('Inspector'))) get_response().breadcrumb.append(('inspect', _('Inspector')))
return self.render_inspect() return self.render_inspect()
@ -267,9 +265,8 @@ class BlocksDirectory(Directory):
do_not_call_in_templates = True do_not_call_in_templates = True
categories = BlockCategoriesDirectory() categories = BlockCategoriesDirectory()
def __init__(self, section): def __init__(self):
super().__init__() super().__init__()
self.section = section
self.applications_dir = ApplicationsDirectory(BlockDef.xml_root_node) self.applications_dir = ApplicationsDirectory(BlockDef.xml_root_node)
def _q_traverse(self, path): def _q_traverse(self, path):
@ -283,12 +280,12 @@ class BlocksDirectory(Directory):
block = BlockDef.get(component) block = BlockDef.get(component)
except KeyError: except KeyError:
raise TraversalError() raise TraversalError()
return BlockDirectory(self.section, block) return BlockDirectory(block)
def _q_index(self): def _q_index(self):
from wcs.applications import Application from wcs.applications import Application
html_top(self.section, title=_('Fields Blocks')) get_response().set_title(_('Fields Blocks'))
get_response().add_javascript(['popup.js']) get_response().add_javascript(['popup.js'])
context = { context = {
'view': self, 'view': self,
@ -341,7 +338,7 @@ class BlocksDirectory(Directory):
return redirect('%s/' % block.id) return redirect('%s/' % block.id)
get_response().breadcrumb.append(('new', _('New Fields Block'))) 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 = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('New Fields Block') r += htmltext('<h2>%s</h2>') % _('New Fields Block')
r += form.render() r += form.render()
@ -364,7 +361,7 @@ class BlocksDirectory(Directory):
pass pass
get_response().breadcrumb.append(('import', _('Import'))) 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 = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Import Fields Block') r += htmltext('<h2>%s</h2>') % _('Import Fields Block')
r += htmltext('<p>%s</p>') % _('You can install a new fields block by uploading a file.') r += htmltext('<p>%s</p>') % _('You can install a new fields block by uploading a file.')

View File

@ -37,7 +37,6 @@ from wcs.data_sources import NamedDataSource
from wcs.formdef import FormDef from wcs.formdef import FormDef
from wcs.mail_templates import MailTemplate from wcs.mail_templates import MailTemplate
from wcs.qommon import _, misc, template from wcs.qommon import _, misc, template
from wcs.qommon.backoffice.menu import html_top
from wcs.qommon.errors import AccessForbiddenError, TraversalError from wcs.qommon.errors import AccessForbiddenError, TraversalError
from wcs.qommon.form import Form, HtmlWidget, SingleSelectWidget, StringWidget, WidgetList, WysiwygTextWidget from wcs.qommon.form import Form, HtmlWidget, SingleSelectWidget, StringWidget, WidgetList, WysiwygTextWidget
from wcs.workflows import Workflow from wcs.workflows import Workflow
@ -215,7 +214,7 @@ class CategoryPage(Directory):
get_response().breadcrumb.append((component + '/', self.category.name)) get_response().breadcrumb.append((component + '/', self.category.name))
def _q_index(self): 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().add_javascript(['popup.js'])
get_response().filter['sidebar'] = self.get_sidebar() get_response().filter['sidebar'] = self.get_sidebar()
return template.QommonTemplateResponse( return template.QommonTemplateResponse(
@ -253,7 +252,7 @@ class CategoryPage(Directory):
return redirect('..') return redirect('..')
get_response().breadcrumb.append(('edit', _('Edit'))) get_response().breadcrumb.append(('edit', _('Edit')))
html_top('categories', title=_('Edit Category')) get_response().set_title(_('Edit Category'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Edit Category') r += htmltext('<h2>%s</h2>') % _('Edit Category')
r += form.render() r += form.render()
@ -268,7 +267,7 @@ class CategoryPage(Directory):
return redirect('.') return redirect('.')
if not form.is_submitted() or form.has_errors(): if not form.is_submitted() or form.has_errors():
get_response().breadcrumb.append(('delete', _('Delete'))) get_response().breadcrumb.append(('delete', _('Delete')))
html_top('categories', title=_('Delete Category')) get_response().set_title(_('Delete Category'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s %s</h2>') % (_('Deleting Category:'), self.category.name) r += htmltext('<h2>%s %s</h2>') % (_('Deleting Category:'), self.category.name)
r += form.render() r += form.render()
@ -296,7 +295,7 @@ class CategoryPage(Directory):
return redirect('.') return redirect('.')
get_response().breadcrumb.append(('description', _('Description'))) 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 = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Edit Category Description') r += htmltext('<h2>%s</h2>') % _('Edit Category Description')
r += form.render() r += form.render()
@ -377,7 +376,7 @@ class CategoriesDirectory(Directory):
from wcs.applications import Application from wcs.applications import Application
get_response().add_javascript(['biglist.js', 'qommon.wysiwyg.js', 'popup.js']) 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() categories = self.category_class.select()
self.category_class.sort_by_position(categories) self.category_class.sort_by_position(categories)
Application.populate_objects(categories) Application.populate_objects(categories)
@ -420,7 +419,7 @@ class CategoriesDirectory(Directory):
else: else:
return redirect('.') return redirect('.')
html_top('categories', title=_('New Category')) get_response().set_title(_('New Category'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('New Category') r += htmltext('<h2>%s</h2>') % _('New Category')
r += form.render() r += form.render()

View File

@ -25,7 +25,6 @@ from wcs.backoffice.snapshots import SnapshotsDirectory
from wcs.categories import CommentTemplateCategory from wcs.categories import CommentTemplateCategory
from wcs.comment_templates import CommentTemplate from wcs.comment_templates import CommentTemplate
from wcs.qommon import _, errors, misc, template from wcs.qommon import _, errors, misc, template
from wcs.qommon.backoffice.menu import html_top
from wcs.qommon.form import ( from wcs.qommon.form import (
ComputedExpressionWidget, ComputedExpressionWidget,
FileWidget, FileWidget,
@ -61,7 +60,7 @@ class CommentTemplatesDirectory(Directory):
def _q_index(self): def _q_index(self):
from wcs.applications import Application from wcs.applications import Application
html_top('comment_templates', title=_('Comment Templates')) get_response().set_title(_('Comment Templates'))
get_response().add_javascript(['popup.js']) get_response().add_javascript(['popup.js'])
comment_templates = CommentTemplate.select(order_by='name') comment_templates = CommentTemplate.select(order_by='name')
Application.populate_objects(comment_templates) Application.populate_objects(comment_templates)
@ -114,7 +113,7 @@ class CommentTemplatesDirectory(Directory):
return redirect('%s/edit' % comment_template.id) return redirect('%s/edit' % comment_template.id)
get_response().breadcrumb.append(('new', _('New Comment Template'))) 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 = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('New Comment Template') r += htmltext('<h2>%s</h2>') % _('New Comment Template')
r += form.render() r += form.render()
@ -138,7 +137,7 @@ class CommentTemplatesDirectory(Directory):
pass pass
get_response().breadcrumb.append(('import', _('Import'))) get_response().breadcrumb.append(('import', _('Import')))
html_top('comment_templates', title=import_title) get_response().set_title(import_title)
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % import_title r += htmltext('<h2>%s</h2>') % import_title
r += htmltext('<p>%s</p>') % _('You can install a new comment template by uploading a file.') r += htmltext('<p>%s</p>') % _('You can install a new comment template by uploading a file.')
@ -205,7 +204,7 @@ class CommentTemplatePage(Directory):
return r.getvalue() return r.getvalue()
def _q_index(self): 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() get_response().filter['sidebar'] = self.get_sidebar()
return template.QommonTemplateResponse( return template.QommonTemplateResponse(
templates=['wcs/backoffice/comment-template.html'], templates=['wcs/backoffice/comment-template.html'],
@ -309,7 +308,7 @@ class CommentTemplatePage(Directory):
return redirect('.') return redirect('.')
get_response().breadcrumb.append(('edit', _('Edit'))) 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 = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Edit Comment Template') r += htmltext('<h2>%s</h2>') % _('Edit Comment Template')
r += form.render() r += form.render()
@ -333,7 +332,7 @@ class CommentTemplatePage(Directory):
return redirect('.') return redirect('.')
if not form.is_submitted() or form.has_errors(): if not form.is_submitted() or form.has_errors():
get_response().breadcrumb.append(('delete', _('Delete'))) 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 = TemplateIO(html=True)
r += htmltext('<h2>%s %s</h2>') % (_('Deleting Comment Template:'), self.comment_template.name) r += htmltext('<h2>%s %s</h2>') % (_('Deleting Comment Template:'), self.comment_template.name)
r += form.render() r += form.render()
@ -368,7 +367,7 @@ class CommentTemplatePage(Directory):
name_widget.set_value(new_name) name_widget.set_value(new_name)
if not form.is_submitted() or form.has_errors(): 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) r = TemplateIO(html=True)
get_response().breadcrumb.append(('duplicate', _('Duplicate'))) get_response().breadcrumb.append(('duplicate', _('Duplicate')))
r += htmltext('<h2>%s</h2>') % _('Duplicate Comment Template') r += htmltext('<h2>%s</h2>') % _('Duplicate Comment Template')

View File

@ -33,7 +33,6 @@ from wcs.data_sources import (
) )
from wcs.formdef import get_formdefs_of_all_kinds from wcs.formdef import get_formdefs_of_all_kinds
from wcs.qommon import _, errors, misc, pgettext, template 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.errors import AccessForbiddenError
from wcs.qommon.form import ( from wcs.qommon.form import (
CheckboxWidget, CheckboxWidget,
@ -341,7 +340,7 @@ class NamedDataSourcePage(Directory):
return r.getvalue() return r.getvalue()
def _q_index(self): 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() get_response().filter['sidebar'] = self.get_sidebar()
url = None url = None
if self.datasource.data_source and self.datasource.data_source.get('type') in ( if self.datasource.data_source and self.datasource.data_source.get('type') in (
@ -426,7 +425,7 @@ class NamedDataSourcePage(Directory):
return redirect('.') return redirect('.')
get_response().breadcrumb.append(('edit', _('Edit'))) 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 = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Edit Data Source') r += htmltext('<h2>%s</h2>') % _('Edit Data Source')
r += form.render() r += form.render()
@ -448,7 +447,7 @@ class NamedDataSourcePage(Directory):
return redirect('..') return redirect('..')
if not form.is_submitted() or form.has_errors(): if not form.is_submitted() or form.has_errors():
get_response().breadcrumb.append(('delete', _('Delete'))) 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 = TemplateIO(html=True)
r += htmltext('<h2>%s %s</h2>') % (_('Deleting Data Source:'), self.datasource.name) r += htmltext('<h2>%s %s</h2>') % (_('Deleting Data Source:'), self.datasource.name)
r += form.render() r += form.render()
@ -475,7 +474,7 @@ class NamedDataSourcePage(Directory):
return redirect('.') return redirect('.')
if not form.is_submitted() or form.has_errors(): if not form.is_submitted() or form.has_errors():
get_response().breadcrumb.append(('duplicate', _('Duplicate'))) 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 = TemplateIO(html=True)
r += htmltext('<h2>%s %s</h2>') % (_('Duplicating Data Source:'), self.datasource.name) r += htmltext('<h2>%s %s</h2>') % (_('Duplicating Data Source:'), self.datasource.name)
r += form.render() r += form.render()
@ -520,7 +519,7 @@ class NamedDataSourcesDirectory(Directory):
def _q_index(self): def _q_index(self):
from wcs.applications import Application from wcs.applications import Application
html_top('datasources', title=_('Data Sources')) get_response().set_title(_('Data Sources'))
get_response().add_javascript(['popup.js']) get_response().add_javascript(['popup.js'])
context = { context = {
'view': self, 'view': self,
@ -599,7 +598,7 @@ class NamedDataSourcesDirectory(Directory):
else: else:
return redirect('.') return redirect('.')
html_top('datasources', title=title) get_response().set_title(title)
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % title r += htmltext('<h2>%s</h2>') % title
r += form.render() r += form.render()
@ -637,7 +636,7 @@ class NamedDataSourcesDirectory(Directory):
pass pass
get_response().breadcrumb.append(('import', _('Import'))) get_response().breadcrumb.append(('import', _('Import')))
html_top('datasources', title=import_title) get_response().set_title(import_title)
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % import_title r += htmltext('<h2>%s</h2>') % import_title
r += htmltext('<p>%s</p>') % _('You can install a new data source by uploading a file.') r += htmltext('<p>%s</p>') % _('You can install a new data source by uploading a file.')

View File

@ -28,7 +28,6 @@ from wcs.fields import BlockField, get_field_options
from wcs.formdef import FormDef, UpdateStatisticsDataAfterJob from wcs.formdef import FormDef, UpdateStatisticsDataAfterJob
from wcs.qommon import _, errors, get_cfg, misc from wcs.qommon import _, errors, get_cfg, misc
from wcs.qommon.admin.menu import command_icon 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.form import CheckboxWidget, Form, HtmlWidget, OptGroup, SingleSelectWidget, StringWidget
from wcs.qommon.substitution import CompatibilityNamesDict from wcs.qommon.substitution import CompatibilityNamesDict
@ -89,7 +88,7 @@ class FieldDefPage(Directory):
redo = True redo = True
if redo or not form.get_submit() == 'submit': 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 = TemplateIO(html=True)
r += htmltext('<h2 class="field-edit--title">%s</h2>') % misc.ellipsize( r += htmltext('<h2 class="field-edit--title">%s</h2>') % misc.ellipsize(
self.field.unhtmled_label, 80 self.field.unhtmled_label, 80
@ -194,7 +193,7 @@ class FieldDefPage(Directory):
return self.redirect_field_anchor(self.field) return self.redirect_field_anchor(self.field)
if not form.is_submitted() or form.has_errors(): if not form.is_submitted() or form.has_errors():
get_response().breadcrumb.append(('delete', _('Delete'))) 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 = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % remove_title r += htmltext('<h2>%s</h2>') % remove_title
r += form.render() r += form.render()
@ -257,7 +256,7 @@ class FieldDefPage(Directory):
return self.redirect_field_anchor(self.field) return self.redirect_field_anchor(self.field)
if not form.is_submitted() or form.has_errors(): if not form.is_submitted() or form.has_errors():
get_response().breadcrumb.append(('duplicate', _('Duplicate'))) 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 = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % duplicate_title r += htmltext('<h2>%s</h2>') % duplicate_title
r += form.render() r += form.render()
@ -295,7 +294,6 @@ class FieldsPagesDirectory(Directory):
def _q_lookup(self, component): def _q_lookup(self, component):
directory = FieldsDirectory(self.parent.objectdef) directory = FieldsDirectory(self.parent.objectdef)
directory.field_var_prefix = self.parent.field_var_prefix directory.field_var_prefix = self.parent.field_var_prefix
directory.html_top = self.parent.html_top
try: try:
directory.page_id = str(component) directory.page_id = str(component)
except ValueError: except ValueError:
@ -317,9 +315,6 @@ class FieldsDirectory(Directory):
fields_count_total_soft_limit = 200 fields_count_total_soft_limit = 200
fields_count_total_hard_limit = 400 fields_count_total_hard_limit = 400
def html_top(self, title, *args, **kwargs):
html_top(self.section, title, *args, **kwargs)
def __init__(self, objectdef): def __init__(self, objectdef):
self.objectdef = objectdef self.objectdef = objectdef
self.pages = FieldsPagesDirectory(self) self.pages = FieldsPagesDirectory(self)
@ -333,12 +328,11 @@ class FieldsDirectory(Directory):
def _q_lookup(self, component): def _q_lookup(self, component):
d = self.field_def_page_class(self.objectdef, component) d = self.field_def_page_class(self.objectdef, component)
d.html_top = self.html_top
d.page_id = self.page_id d.page_id = self.page_id
return d return d
def _q_index(self): 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']) get_response().add_javascript(['jquery.js', 'jquery-ui.js', 'biglist.js'])
r = TemplateIO(html=True) r = TemplateIO(html=True)

View File

@ -36,7 +36,6 @@ from wcs.formdef import (
) )
from wcs.forms.root import qrcode from wcs.forms.root import qrcode
from wcs.qommon import _, force_str, misc, pgettext_lazy, template 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.errors import AccessForbiddenError, TraversalError
from wcs.qommon.form import ( from wcs.qommon.form import (
CheckboxesWidget, CheckboxesWidget,
@ -535,7 +534,7 @@ class OptionsDirectory(Directory):
self.formdef.store(comment=_('Changed "%s" parameters') % title) self.formdef.store(comment=_('Changed "%s" parameters') % title)
return redirect('..') return redirect('..')
html_top('forms', title=self.formdef.name) get_response().set_title(self.formdef.name)
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % title r += htmltext('<h2>%s</h2>') % title
r += form.render() r += form.render()
@ -587,7 +586,7 @@ class WorkflowRoleDirectory(Directory):
if not form.is_submitted() or form.has_errors(): if not form.is_submitted() or form.has_errors():
get_response().breadcrumb.append(('role/%s' % component, _('Workflow Role'))) 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 = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Role') r += htmltext('<h2>%s</h2>') % _('Role')
r += htmltext('<p>%s</p>') % self.formdef.workflow.roles.get(component) r += htmltext('<p>%s</p>') % self.formdef.workflow.roles.get(component)
@ -663,9 +662,7 @@ class FormDefPage(Directory):
if component: if component:
get_response().breadcrumb.append((component + '/', self.formdef.name)) get_response().breadcrumb.append((component + '/', self.formdef.name))
self.fields = self.fields_directory_class(self.formdef) self.fields = self.fields_directory_class(self.formdef)
self.fields.html_top = self.html_top
self.role = WorkflowRoleDirectory(self.formdef) self.role = WorkflowRoleDirectory(self.formdef)
self.role.html_top = self.html_top
self.options = self.options_directory_class(self.formdef, self.formdefui) self.options = self.options_directory_class(self.formdef, self.formdefui)
self.tests = TestsDirectory(self.formdef) self.tests = TestsDirectory(self.formdef)
self.logged_errors_dir = LoggedErrorsDirectory( self.logged_errors_dir = LoggedErrorsDirectory(
@ -673,9 +670,6 @@ class FormDefPage(Directory):
) )
self.snapshots_dir = SnapshotsDirectory(self.formdef) 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): def add_option_line(self, link, label, current_value, popup=True):
return htmltext( return htmltext(
'<li><a rel="%(popup)s" href="%(link)s">' '<li><a rel="%(popup)s" href="%(link)s">'
@ -691,7 +685,7 @@ class FormDefPage(Directory):
) )
def _q_index(self): def _q_index(self):
self.html_top(title=self.formdef.name) get_response().set_title(title=self.formdef.name)
r = TemplateIO(html=True) r = TemplateIO(html=True)
get_response().filter['sidebar'] = self.get_sidebar() get_response().filter['sidebar'] = self.get_sidebar()
get_response().add_javascript( get_response().add_javascript(
@ -982,7 +976,7 @@ class FormDefPage(Directory):
return r.getvalue() return r.getvalue()
def public_url(self): 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'))) get_response().breadcrumb.append(('public-url', _('Public URL')))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>' % _('Public URL')) r += htmltext('<h2>%s</h2>' % _('Public URL'))
@ -994,7 +988,7 @@ class FormDefPage(Directory):
return r.getvalue() return r.getvalue()
def qrcode(self): 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'))) get_response().breadcrumb.append(('qrcode', _('QR Code')))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>' % _('QR Code')) r += htmltext('<h2>%s</h2>' % _('QR Code'))
@ -1035,7 +1029,7 @@ class FormDefPage(Directory):
if not form.is_submitted() or form.has_errors(): if not form.is_submitted() or form.has_errors():
get_response().breadcrumb.append(('roles', title)) 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 = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % title r += htmltext('<h2>%s</h2>') % title
if description: if description:
@ -1136,7 +1130,7 @@ class FormDefPage(Directory):
) )
get_response().breadcrumb.append(('title', _('Title'))) 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 = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Title') r += htmltext('<h2>%s</h2>') % _('Title')
r += form.render() r += form.render()
@ -1162,7 +1156,7 @@ class FormDefPage(Directory):
if not form.is_submitted() or form.has_errors(): if not form.is_submitted() or form.has_errors():
get_response().breadcrumb.append(('workflow', _('Workflow'))) 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 = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Workflow') r += htmltext('<h2>%s</h2>') % _('Workflow')
r += htmltext('<p>%s</p>') % _('Select the workflow that will handle those forms.') r += htmltext('<p>%s</p>') % _('Select the workflow that will handle those forms.')
@ -1201,7 +1195,7 @@ class FormDefPage(Directory):
if not form.is_submitted() or form.has_errors(): if not form.is_submitted() or form.has_errors():
get_response().breadcrumb.append(('workflow-status-remapping', _('Workflow Status Remapping'))) 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 = TemplateIO(html=True)
r += htmltext('<p>') r += htmltext('<p>')
r += str( r += str(
@ -1287,7 +1281,7 @@ class FormDefPage(Directory):
name_widget.set_value(new_name) name_widget.set_value(new_name)
if not form.is_submitted() or form.has_errors(): 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) r = TemplateIO(html=True)
get_response().breadcrumb.append(('duplicate', _('Duplicate'))) get_response().breadcrumb.append(('duplicate', _('Duplicate')))
r += htmltext('<h2>%s</h2>') % self.duplicate_title r += htmltext('<h2>%s</h2>') % self.duplicate_title
@ -1330,7 +1324,7 @@ class FormDefPage(Directory):
return redirect('..') return redirect('..')
if not form.is_submitted() or form.has_errors(): if not form.is_submitted() or form.has_errors():
get_response().breadcrumb.append(('delete', _('Delete'))) 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 = TemplateIO(html=True)
r += htmltext('<h2>%s %s</h2>') % (self.delete_title, self.formdef.name) r += htmltext('<h2>%s %s</h2>') % (self.delete_title, self.formdef.name)
r += form.render() r += form.render()
@ -1363,7 +1357,7 @@ class FormDefPage(Directory):
pass pass
get_response().breadcrumb.append(('overwrite', _('Overwrite'))) get_response().breadcrumb.append(('overwrite', _('Overwrite')))
self.html_top(title=_('Overwrite')) get_response().set_title(title=_('Overwrite'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Overwrite') r += htmltext('<h2>%s</h2>') % _('Overwrite')
r += htmltext('<p>%s</p>') % self.overwrite_message r += htmltext('<p>%s</p>') % self.overwrite_message
@ -1461,7 +1455,7 @@ class FormDefPage(Directory):
return incompatible_field_ids return incompatible_field_ids
def overwrite_warning_summary(self, new_formdef): def overwrite_warning_summary(self, new_formdef):
self.html_top(title=_('Overwrite')) get_response().set_title(title=_('Overwrite'))
get_response().breadcrumb.append(('overwrite', _('Overwrite'))) get_response().breadcrumb.append(('overwrite', _('Overwrite')))
r = TemplateIO(html=True) r = TemplateIO(html=True)
@ -1607,7 +1601,7 @@ class FormDefPage(Directory):
def workflow_variables(self): def workflow_variables(self):
if not self.formdef.workflow.variables_formdef: if not self.formdef.workflow.variables_formdef:
raise TraversalError() raise TraversalError()
self.html_top(title=_('Options')) get_response().set_title(title=_('Options'))
form = Form(enctype='multipart/form-data') form = Form(enctype='multipart/form-data')
self.formdef.workflow.variables_formdef.add_fields_to_form( self.formdef.workflow.variables_formdef.add_fields_to_form(
@ -1636,7 +1630,7 @@ class FormDefPage(Directory):
if value: if value:
return value.build_response() return value.build_response()
self.html_top(title=_('Workflow Options')) get_response().set_title(title=_('Workflow Options'))
form = Form(enctype='multipart/form-data') form = Form(enctype='multipart/form-data')
pristine_workflow = Workflow.get(self.formdef.workflow_id) pristine_workflow = Workflow.get(self.formdef.workflow_id)
for status in self.formdef.workflow.possible_status: for status in self.formdef.workflow.possible_status:
@ -1679,7 +1673,7 @@ class FormDefPage(Directory):
self.formdef.store(comment=_('Change in workflow options')) self.formdef.store(comment=_('Change in workflow options'))
def inspect(self): def inspect(self):
self.html_top(self.formdef.name) get_response().set_title(self.formdef.name)
get_response().breadcrumb.append(('inspect', _('Inspector'))) get_response().breadcrumb.append(('inspect', _('Inspector')))
return self.render_inspect() return self.render_inspect()
@ -1725,7 +1719,7 @@ class FormsDirectory(AccessControlled, Directory):
category_class = Category category_class = Category
categories = CategoriesDirectory() categories = CategoriesDirectory()
blocks = BlocksDirectory(section='forms') blocks = BlocksDirectory()
data_sources = NamedDataSourcesDirectoryInForms() data_sources = NamedDataSourcesDirectoryInForms()
formdef_class = FormDef formdef_class = FormDef
formdef_page_class = FormDefPage formdef_page_class = FormDefPage
@ -1749,11 +1743,9 @@ class FormsDirectory(AccessControlled, Directory):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.applications_dir = ApplicationsDirectory(self.formdef_class.xml_root_node) 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): def _q_traverse(self, path):
get_response().breadcrumb.append(('%s/' % self.section, self.top_title)) get_response().breadcrumb.append(('%s/' % self.section, self.top_title))
get_response().set_backoffice_section(self.section)
return super()._q_traverse(path) return super()._q_traverse(path)
def is_accessible(self, user): def is_accessible(self, user):
@ -1772,7 +1764,7 @@ class FormsDirectory(AccessControlled, Directory):
def _q_index(self): def _q_index(self):
from wcs.applications import Application 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']) get_response().add_javascript(['widget_list.js', 'select2.js', 'popup.js'])
context = { context = {
@ -1848,7 +1840,7 @@ class FormsDirectory(AccessControlled, Directory):
else: else:
return redirect(str(formdef.id) + '/') return redirect(str(formdef.id) + '/')
self.html_top(title=_('New Form')) get_response().set_title(title=_('New Form'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('New Form') r += htmltext('<h2>%s</h2>') % _('New Form')
r += form.render() r += form.render()
@ -1878,7 +1870,7 @@ class FormsDirectory(AccessControlled, Directory):
pass pass
get_response().breadcrumb.append(('import', _('Import'))) 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 = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % self.import_title r += htmltext('<h2>%s</h2>') % self.import_title
r += htmltext('<p>%s</p>') % self.import_paragraph r += htmltext('<p>%s</p>') % self.import_paragraph

View File

@ -36,7 +36,7 @@ class LoggedErrorDirectory(Directory):
def _q_index(self): def _q_index(self):
get_response().breadcrumb.append(('%s/' % self.error.id, self.error.summary)) 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() get_response().filter['sidebar'] = self.get_sidebar()
return template.QommonTemplateResponse( return template.QommonTemplateResponse(
@ -208,7 +208,7 @@ class LoggedErrorsDirectory(Directory):
raise errors.AccessForbiddenError() raise errors.AccessForbiddenError()
get_response().breadcrumb.append(('logged-errors/', _('Logged Errors'))) 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( limit = misc.get_int_or_400(
get_request().form.get('limit', get_publisher().get_site_option('default-page-size')) or 20 get_request().form.get('limit', get_publisher().get_site_option('default-page-size')) or 20
) )

View File

@ -25,7 +25,6 @@ from wcs.backoffice.snapshots import SnapshotsDirectory
from wcs.categories import MailTemplateCategory from wcs.categories import MailTemplateCategory
from wcs.mail_templates import MailTemplate from wcs.mail_templates import MailTemplate
from wcs.qommon import _, errors, misc, template from wcs.qommon import _, errors, misc, template
from wcs.qommon.backoffice.menu import html_top
from wcs.qommon.form import ( from wcs.qommon.form import (
ComputedExpressionWidget, ComputedExpressionWidget,
FileWidget, FileWidget,
@ -61,7 +60,7 @@ class MailTemplatesDirectory(Directory):
def _q_index(self): def _q_index(self):
from wcs.applications import Application from wcs.applications import Application
html_top('mail_templates', title=_('Mail Templates')) get_response().set_title(_('Mail Templates'))
get_response().add_javascript(['popup.js']) get_response().add_javascript(['popup.js'])
mail_templates = MailTemplate.select(order_by='name') mail_templates = MailTemplate.select(order_by='name')
Application.populate_objects(mail_templates) Application.populate_objects(mail_templates)
@ -114,7 +113,7 @@ class MailTemplatesDirectory(Directory):
return redirect('%s/edit' % mail_template.id) return redirect('%s/edit' % mail_template.id)
get_response().breadcrumb.append(('new', _('New Mail Template'))) 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 = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('New Mail Template') r += htmltext('<h2>%s</h2>') % _('New Mail Template')
r += form.render() r += form.render()
@ -138,7 +137,7 @@ class MailTemplatesDirectory(Directory):
pass pass
get_response().breadcrumb.append(('import', _('Import'))) get_response().breadcrumb.append(('import', _('Import')))
html_top('mail_templates', title=import_title) get_response().set_title(import_title)
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % import_title r += htmltext('<h2>%s</h2>') % import_title
r += htmltext('<p>%s</p>') % _('You can install a new mail template by uploading a file.') r += htmltext('<p>%s</p>') % _('You can install a new mail template by uploading a file.')
@ -203,7 +202,7 @@ class MailTemplatePage(Directory):
return r.getvalue() return r.getvalue()
def _q_index(self): 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() get_response().filter['sidebar'] = self.get_sidebar()
return template.QommonTemplateResponse( return template.QommonTemplateResponse(
templates=['wcs/backoffice/mail-template.html'], templates=['wcs/backoffice/mail-template.html'],
@ -315,7 +314,7 @@ class MailTemplatePage(Directory):
return redirect('.') return redirect('.')
get_response().breadcrumb.append(('edit', _('Edit'))) 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 = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Edit Mail Template') r += htmltext('<h2>%s</h2>') % _('Edit Mail Template')
r += form.render() r += form.render()
@ -339,7 +338,7 @@ class MailTemplatePage(Directory):
return redirect('.') return redirect('.')
if not form.is_submitted() or form.has_errors(): if not form.is_submitted() or form.has_errors():
get_response().breadcrumb.append(('delete', _('Delete'))) 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 = TemplateIO(html=True)
r += htmltext('<h2>%s %s</h2>') % (_('Deleting Mail Template:'), self.mail_template.name) r += htmltext('<h2>%s %s</h2>') % (_('Deleting Mail Template:'), self.mail_template.name)
r += form.render() r += form.render()
@ -374,7 +373,7 @@ class MailTemplatePage(Directory):
name_widget.set_value(new_name) name_widget.set_value(new_name)
if not form.is_submitted() or form.has_errors(): 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) r = TemplateIO(html=True)
get_response().breadcrumb.append(('duplicate', _('Duplicate'))) get_response().breadcrumb.append(('duplicate', _('Duplicate')))
r += htmltext('<h2>%s</h2>') % _('Duplicate Mail Template') r += htmltext('<h2>%s</h2>') % _('Duplicate Mail Template')

View File

@ -20,7 +20,6 @@ from quixote.html import TemplateIO, htmltext
from wcs.formdef import FormDef from wcs.formdef import FormDef
from wcs.qommon import _, errors, get_cfg 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.qommon.form import CheckboxWidget, Form, HtmlWidget, StringWidget, TextWidget, WidgetList
from wcs.roles import get_user_roles from wcs.roles import get_user_roles
@ -98,7 +97,7 @@ class RolePage(Directory):
get_response().breadcrumb.append((component + '/', self.role.name)) get_response().breadcrumb.append((component + '/', self.role.name))
def _q_index(self): def _q_index(self):
html_top('roles', title=self.role.name) get_response().set_title(self.role.name)
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<div id="appbar">') r += htmltext('<div id="appbar">')
@ -185,7 +184,7 @@ class RolePage(Directory):
return redirect('.') return redirect('.')
get_response().breadcrumb.append(('edit', _('Edit'))) get_response().breadcrumb.append(('edit', _('Edit')))
html_top('roles', title=_('Edit Role')) get_response().set_title(_('Edit Role'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Edit Role') r += htmltext('<h2>%s</h2>') % _('Edit Role')
r += form.render() r += form.render()
@ -200,7 +199,7 @@ class RolePage(Directory):
return redirect('.') return redirect('.')
if not form.is_submitted() or form.has_errors(): if not form.is_submitted() or form.has_errors():
get_response().breadcrumb.append(('delete', _('Delete'))) get_response().breadcrumb.append(('delete', _('Delete')))
html_top('roles', title=_('Delete Role')) get_response().set_title(_('Delete Role'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s %s</h2>') % (_('Deleting Role:'), self.role.name) r += htmltext('<h2>%s %s</h2>') % (_('Deleting Role:'), self.role.name)
r += form.render() r += form.render()
@ -213,12 +212,16 @@ class RolePage(Directory):
class RolesDirectory(Directory): class RolesDirectory(Directory):
_q_exports = ["", "new"] _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): def is_visible(self, *args):
return not (get_cfg('sp', {}).get('idp-manage-roles')) return not (get_cfg('sp', {}).get('idp-manage-roles'))
def _q_index(self): def _q_index(self):
get_response().breadcrumb.append(('roles/', _('Roles'))) get_response().set_title(_('Roles'))
html_top('roles', title=_('Roles'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<div id="appbar">') r += htmltext('<div id="appbar">')
@ -246,7 +249,6 @@ class RolesDirectory(Directory):
return r.getvalue() return r.getvalue()
def new(self): def new(self):
get_response().breadcrumb.append(('roles/', _('Roles')))
get_response().breadcrumb.append(('new', _('New'))) get_response().breadcrumb.append(('new', _('New')))
role_ui = RoleUI(None) role_ui = RoleUI(None)
form = role_ui.get_form() form = role_ui.get_form()
@ -261,12 +263,11 @@ class RolesDirectory(Directory):
else: else:
return redirect('.') return redirect('.')
html_top('roles', title=_('New Role')) get_response().set_title(_('New Role'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('New Role') r += htmltext('<h2>%s</h2>') % _('New Role')
r += form.render() r += form.render()
return r.getvalue() return r.getvalue()
def _q_lookup(self, component): def _q_lookup(self, component):
get_response().breadcrumb.append(('roles/', _('Roles')))
return RolePage(component) return RolePage(component)

View File

@ -43,7 +43,6 @@ from wcs.qommon.admin.cfg import cfg_submit
from wcs.qommon.admin.emails import EmailsDirectory from wcs.qommon.admin.emails import EmailsDirectory
from wcs.qommon.admin.texts import TextsDirectory from wcs.qommon.admin.texts import TextsDirectory
from wcs.qommon.afterjobs import AfterJob from wcs.qommon.afterjobs import AfterJob
from wcs.qommon.backoffice.menu import html_top
from wcs.qommon.form import ( from wcs.qommon.form import (
CheckboxesTableWidget, CheckboxesTableWidget,
CheckboxesWidget, CheckboxesWidget,
@ -104,7 +103,7 @@ class IdentificationDirectory(Directory):
if not form.has_errors(): if not form.has_errors():
return redirect('..') return redirect('..')
html_top('settings', title=_('Identification')) get_response().set_title(_('Identification'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Identification') r += htmltext('<h2>%s</h2>') % _('Identification')
if lasso is None: if lasso is None:
@ -127,14 +126,12 @@ authentication is unavailable. Lasso must be installed to use it.'
class UserFieldDefPage(FieldDefPage): class UserFieldDefPage(FieldDefPage):
section = 'settings'
blacklisted_attributes = ['condition'] blacklisted_attributes = ['condition']
class UserFieldsDirectory(FieldsDirectory): class UserFieldsDirectory(FieldsDirectory):
_q_exports = ['', 'update_order', 'new', 'mapping', 'templates'] _q_exports = ['', 'update_order', 'new', 'mapping', 'templates']
section = 'settings'
field_def_page_class = UserFieldDefPage field_def_page_class = UserFieldDefPage
support_import = False support_import = False
blacklisted_types = ['page', 'computed'] blacklisted_types = ['page', 'computed']
@ -378,7 +375,7 @@ class FileTypesDirectory(Directory):
return ', '.join(l) + ellipsis return ', '.join(l) + ellipsis
def _q_index(self): def _q_index(self):
html_top('settings', title=_('File Types')) get_response().set_title(_('File Types'))
filetypes_cfg = get_cfg('filetypes', {}) filetypes_cfg = get_cfg('filetypes', {})
form = self.get_form() form = self.get_form()
@ -451,7 +448,7 @@ class FileTypesDirectory(Directory):
get_publisher().write_cfg() get_publisher().write_cfg()
return redirect('.') return redirect('.')
html_top('settings', title=_('File Types')) get_response().set_title(_('File Types'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s - %s</h2>') % (_('File Type'), filetype['label']) r += htmltext('<h2>%s - %s</h2>') % (_('File Type'), filetype['label'])
r += form.render() r += form.render()
@ -494,6 +491,7 @@ class SettingsDirectory(AccessControlled, Directory):
def _q_access(self): def _q_access(self):
get_response().breadcrumb.append(('settings/', _('Settings'))) get_response().breadcrumb.append(('settings/', _('Settings')))
get_response().set_backoffice_section('settings')
disabled_screens_option = get_publisher().get_site_option('settings-disabled-screens') or '' 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()] 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 self._q_exports = q_exports
def _q_index(self): def _q_index(self):
html_top('settings', title=_('Settings')) get_response().set_title(_('Settings'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
hidden_screens_option = get_publisher().get_site_option('settings-hidden-screens') or '' 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(): if not form.is_submitted() or form.has_errors():
get_response().breadcrumb.append(('admin-permissions', _('Admin Permissions'))) 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 = TemplateIO(html=True)
r += htmltext('<div class="admin-permissions">') r += htmltext('<div class="admin-permissions">')
r += htmltext('<h2>%s</h2>') % _('Admin Permissions') r += htmltext('<h2>%s</h2>') % _('Admin Permissions')
@ -781,7 +779,7 @@ class SettingsDirectory(AccessControlled, Directory):
if not form.is_submitted(): if not form.is_submitted():
get_response().breadcrumb.append(('export', _('Export'))) get_response().breadcrumb.append(('export', _('Export')))
html_top('settings', title=_('Export')) get_response().set_title(_('Export'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Export') r += htmltext('<h2>%s</h2>') % _('Export')
r += form.render() r += form.render()
@ -951,7 +949,7 @@ class SettingsDirectory(AccessControlled, Directory):
if not form.is_submitted() or form.has_errors(): if not form.is_submitted() or form.has_errors():
get_response().breadcrumb.append(('import', _('Import'))) get_response().breadcrumb.append(('import', _('Import')))
html_top('settings', title=_('Import')) get_response().set_title(_('Import'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Import') r += htmltext('<h2>%s</h2>') % _('Import')
if FormDef.count() or CardDef.count() or Workflow.count(): if FormDef.count() or CardDef.count() or Workflow.count():
@ -978,7 +976,7 @@ class SettingsDirectory(AccessControlled, Directory):
if e.details: if e.details:
msg += ' [%s]' % e.details msg += ' [%s]' % e.details
reason = _('Failed to import a workflow (%s); site import did not complete.') % (msg) 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( return template.QommonTemplateResponse(
templates=['wcs/backoffice/settings/import.html'], templates=['wcs/backoffice/settings/import.html'],
context={'results': results, 'error': reason}, context={'results': results, 'error': reason},
@ -1013,7 +1011,7 @@ class SettingsDirectory(AccessControlled, Directory):
if not form.is_submitted() or form.has_errors(): if not form.is_submitted() or form.has_errors():
get_response().breadcrumb.append(('sitename', _('Site Name and Addresses'))) 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 = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Site Name and Addresses') r += htmltext('<h2>%s</h2>') % _('Site Name and Addresses')
r += form.render() r += form.render()
@ -1024,7 +1022,7 @@ class SettingsDirectory(AccessControlled, Directory):
def sms(self): def sms(self):
get_response().breadcrumb.append(('sms', _('SMS'))) get_response().breadcrumb.append(('sms', _('SMS')))
html_top('settings', title=_('SMS')) get_response().set_title(_('SMS'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('SMS Options') r += htmltext('<h2>%s</h2>') % _('SMS Options')
sms_cfg = get_cfg('sms', {}) sms_cfg = get_cfg('sms', {})
@ -1105,7 +1103,7 @@ class SettingsDirectory(AccessControlled, Directory):
return redirect('.') return redirect('.')
get_response().breadcrumb.append(('postgresql', _('PostgreSQL Settings'))) get_response().breadcrumb.append(('postgresql', _('PostgreSQL Settings')))
html_top('settings', title=_('PostgreSQL Settings')) get_response().set_title(_('PostgreSQL Settings'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('PostgreSQL Settings') r += htmltext('<h2>%s</h2>') % _('PostgreSQL Settings')
r += form.render() r += form.render()
@ -1143,7 +1141,7 @@ class SettingsDirectory(AccessControlled, Directory):
return redirect('.') return redirect('.')
get_response().breadcrumb.append(('geolocation', _('Geolocation Settings'))) get_response().breadcrumb.append(('geolocation', _('Geolocation Settings')))
html_top('settings', title=_('Geolocation Settings')) get_response().set_title(_('Geolocation Settings'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Geolocation Settings') r += htmltext('<h2>%s</h2>') % _('Geolocation Settings')
r += form.render() r += form.render()
@ -1178,7 +1176,7 @@ $('#form_default-zoom-level').on('change', function() {
return redirect('.') return redirect('.')
get_response().breadcrumb.append(('user-templates', _('Users'))) get_response().breadcrumb.append(('user-templates', _('Users')))
html_top('settings', title=_('Users')) get_response().set_title(_('Users'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Users') r += htmltext('<h2>%s</h2>') % _('Users')
r += form.render() r += form.render()
@ -1251,7 +1249,7 @@ $('#form_default-zoom-level').on('change', function() {
if not form.is_submitted() or form.has_errors(): if not form.is_submitted() or form.has_errors():
get_response().breadcrumb.append(('language', _('Language'))) get_response().breadcrumb.append(('language', _('Language')))
html_top('settings', title=_('Language')) get_response().set_title(_('Language'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Language') r += htmltext('<h2>%s</h2>') % _('Language')
r += form.render() r += form.render()
@ -1297,7 +1295,7 @@ $('#form_default-zoom-level').on('change', function() {
if not form.is_submitted() or form.has_errors(): if not form.is_submitted() or form.has_errors():
get_response().breadcrumb.append(('debug_options', _('Debug Options'))) 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 = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Debug Options') r += htmltext('<h2>%s</h2>') % _('Debug Options')
r += form.render() r += form.render()

View File

@ -27,7 +27,6 @@ from wcs.backoffice.pagination import pagination_links
from wcs.forms.common import FormStatusPage from wcs.forms.common import FormStatusPage
from wcs.qommon import _, misc, template from wcs.qommon import _, misc, template
from wcs.qommon.afterjobs import AfterJob from wcs.qommon.afterjobs import AfterJob
from wcs.qommon.backoffice.menu import html_top
from wcs.qommon.errors import TraversalError from wcs.qommon.errors import TraversalError
from wcs.qommon.form import FileWidget, Form, SingleSelectWidget, StringWidget from wcs.qommon.form import FileWidget, Form, SingleSelectWidget, StringWidget
from wcs.sql_criterias import Equal from wcs.sql_criterias import Equal
@ -127,9 +126,6 @@ class TestPage(FormBackOfficeStatusPage):
get_response().breadcrumb.append((str(self.testdef.id) + '/', str(self.testdef))) get_response().breadcrumb.append((str(self.testdef.id) + '/', str(self.testdef)))
return super(FormStatusPage, self)._q_traverse(path) 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): def should_fold_summary(self, mine, request_user):
return False return False
@ -237,7 +233,7 @@ class TestPage(FormBackOfficeStatusPage):
name_widget.set_value(new_name) name_widget.set_value(new_name)
if not form.is_submitted() or form.has_errors(): 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) r = TemplateIO(html=True)
get_response().breadcrumb.append(('duplicate', _('Duplicate'))) get_response().breadcrumb.append(('duplicate', _('Duplicate')))
r += htmltext('<h2>%s</h2>') % _('Duplicate test') r += htmltext('<h2>%s</h2>') % _('Duplicate test')
@ -261,7 +257,6 @@ class TestsDirectory(Directory):
def _q_traverse(self, path): def _q_traverse(self, path):
get_response().breadcrumb.append(('tests/', _('Tests'))) get_response().breadcrumb.append(('tests/', _('Tests')))
html_top('tests', '%s - %s' % (self.objectdef.name, _('Tests')))
return super()._q_traverse(path) return super()._q_traverse(path)
def _q_lookup(self, component): def _q_lookup(self, component):
@ -277,6 +272,7 @@ class TestsDirectory(Directory):
'has_sidebar': True, 'has_sidebar': True,
} }
get_response().add_javascript(['popup.js']) get_response().add_javascript(['popup.js'])
get_response().set_title(_('Tests'))
return template.QommonTemplateResponse( return template.QommonTemplateResponse(
templates=['wcs/backoffice/tests.html'], context=context, is_django_native=True 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(): if not form.is_submitted() or form.has_errors():
get_response().breadcrumb.append(('new', _('New'))) get_response().breadcrumb.append(('new', _('New')))
get_response().set_title(_('New test'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('New test') r += htmltext('<h2>%s</h2>') % _('New test')
r += form.render() r += form.render()
@ -321,6 +318,7 @@ class TestsDirectory(Directory):
pass pass
get_response().breadcrumb.append(('import', _('Import'))) get_response().breadcrumb.append(('import', _('Import')))
get_response().set_title(_('Import Test'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Import Test') r += htmltext('<h2>%s</h2>') % _('Import Test')
r += htmltext('<p>%s</p>') % _( r += htmltext('<p>%s</p>') % _(
@ -382,7 +380,7 @@ class TestResultsDirectory(Directory):
def _q_traverse(self, path): def _q_traverse(self, path):
get_response().breadcrumb.append(('results/', _('Test results'))) 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) return super()._q_traverse(path)
def _q_lookup(self, component): def _q_lookup(self, component):

View File

@ -22,7 +22,6 @@ import wcs.sql_criterias as st
from wcs.backoffice.pagination import pagination_links from wcs.backoffice.pagination import pagination_links
from wcs.qommon import _, errors, force_str, get_cfg, ident, misc from wcs.qommon import _, errors, force_str, get_cfg, ident, misc
from wcs.qommon.admin.menu import error_page from wcs.qommon.admin.menu import error_page
from wcs.qommon.backoffice.menu import html_top
from wcs.qommon.form import ( from wcs.qommon.form import (
CheckboxWidget, CheckboxWidget,
EmailWidget, EmailWidget,
@ -122,7 +121,7 @@ class UserPage(Directory):
get_response().breadcrumb.append((component + '/', self.user.display_name)) get_response().breadcrumb.append((component + '/', self.user.display_name))
def _q_index(self): 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 = TemplateIO(html=True)
r += htmltext('<div id="appbar">') r += htmltext('<div id="appbar">')
r += htmltext('<h2>%s</h2>') % self.user.display_name r += htmltext('<h2>%s</h2>') % self.user.display_name
@ -269,7 +268,7 @@ class UserPage(Directory):
if display_form: if display_form:
get_response().breadcrumb.append(('edit', _('Edit'))) get_response().breadcrumb.append(('edit', _('Edit')))
html_top('users', title=_('Edit User')) get_response().set_title(_('Edit User'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Edit User') r += htmltext('<h2>%s</h2>') % _('Edit User')
r += form.render() r += form.render()
@ -287,7 +286,7 @@ class UserPage(Directory):
return redirect('.') return redirect('.')
if not form.is_submitted() or form.has_errors(): if not form.is_submitted() or form.has_errors():
get_response().breadcrumb.append(('delete', _('Delete'))) get_response().breadcrumb.append(('delete', _('Delete')))
html_top('users', title=_('Delete User')) get_response().set_title(_('Delete User'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s %s</h2>') % (_('Deleting User:'), self.user.name) r += htmltext('<h2>%s %s</h2>') % (_('Deleting User:'), self.user.name)
r += form.render() r += form.render()
@ -310,9 +309,13 @@ class UserPage(Directory):
class UsersDirectory(Directory): class UsersDirectory(Directory):
_q_exports = ['', 'new'] _q_exports = ['', 'new']
def _q_index(self): def _q_traverse(self, path):
get_response().breadcrumb.append(('users/', _('Users'))) 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) r = TemplateIO(html=True)
limit = int( limit = int(
@ -482,16 +485,13 @@ class UsersDirectory(Directory):
return r.getvalue() return r.getvalue()
def new(self): def new(self):
get_response().breadcrumb.append(('users/', _('Users')))
get_response().breadcrumb.append(('new', _('New'))) get_response().breadcrumb.append(('new', _('New')))
ident_methods = get_cfg('identification', {}).get('methods', []) ident_methods = get_cfg('identification', {}).get('methods', [])
if not ident_methods: if not ident_methods:
return error_page( return error_page(_('An authentification system must be configured before creating users.'))
'users', _('An authentification system must be configured before creating users.')
)
if ident_methods == ['idp'] and len(get_cfg('idp', {}).items()) == 0: 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(): if is_idp_managing_user_attributes():
raise errors.TraversalError() raise errors.TraversalError()
@ -506,7 +506,7 @@ class UsersDirectory(Directory):
return redirect('.') return redirect('.')
if not form.is_submitted() or form.has_errors(): 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 = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('New User') r += htmltext('<h2>%s</h2>') % _('New User')
r += form.render() r += form.render()
@ -523,7 +523,6 @@ class UsersDirectory(Directory):
return redirect('.') return redirect('.')
def _q_lookup(self, component): def _q_lookup(self, component):
get_response().breadcrumb.append(('users/', _('Users')))
try: try:
return UserPage(component) return UserPage(component)
except KeyError: except KeyError:

View File

@ -36,7 +36,6 @@ from wcs.formdata import Evolution
from wcs.formdef import FormDef, UpdateStatisticsDataAfterJob from wcs.formdef import FormDef, UpdateStatisticsDataAfterJob
from wcs.qommon import _, errors, force_str, misc, template from wcs.qommon import _, errors, force_str, misc, template
from wcs.qommon.admin.menu import command_icon from wcs.qommon.admin.menu import command_icon
from wcs.qommon.backoffice.menu import html_top
from wcs.qommon.form import ( from wcs.qommon.form import (
CheckboxWidget, CheckboxWidget,
ColourWidget, ColourWidget,
@ -381,14 +380,13 @@ class WorkflowUI:
class WorkflowItemPage(Directory): class WorkflowItemPage(Directory):
_q_exports = ['', 'delete', 'copy'] _q_exports = ['', 'delete', 'copy']
def __init__(self, workflow, parent, component, html_top): def __init__(self, workflow, parent, component):
try: try:
self.item = [x for x in parent.items if x.id == component][0] self.item = [x for x in parent.items if x.id == component][0]
except (IndexError, ValueError): except (IndexError, ValueError):
raise errors.TraversalError() raise errors.TraversalError()
self.workflow = workflow self.workflow = workflow
self.parent = parent self.parent = parent
self.html_top = html_top
get_response().breadcrumb.append(('items/%s/' % component, self.item.description)) get_response().breadcrumb.append(('items/%s/' % component, self.item.description))
def _q_index(self): def _q_index(self):
@ -429,7 +427,7 @@ class WorkflowItemPage(Directory):
return redirect(self.item.redirect_after_submit_url) return redirect(self.item.redirect_after_submit_url)
return redirect('..') 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 = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % self.item.description r += htmltext('<h2>%s</h2>') % self.item.description
r += form.render() r += form.render()
@ -446,7 +444,7 @@ class WorkflowItemPage(Directory):
return redirect('../../') return redirect('../../')
if not form.is_submitted() or form.has_errors(): if not form.is_submitted() or form.has_errors():
get_response().breadcrumb.append(('delete', _('Delete'))) get_response().breadcrumb.append(('delete', _('Delete')))
self.html_top(title=_('Delete Item')) get_response().set_title(_('Delete Item'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Deleting Item') r += htmltext('<h2>%s</h2>') % _('Deleting Item')
r += form.render() r += form.render()
@ -482,7 +480,7 @@ class WorkflowItemPage(Directory):
pass pass
get_response().breadcrumb.append(('copy', _('Copy'))) get_response().breadcrumb.append(('copy', _('Copy')))
self.html_top(title=_('Copy Item')) get_response().set_title(_('Copy Item'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Copy Item') r += htmltext('<h2>%s</h2>') % _('Copy Item')
r += form.render() r += form.render()
@ -520,7 +518,7 @@ class WorkflowItemPage(Directory):
return redirect('../../') return redirect('../../')
def _q_lookup(self, component): 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: if t:
return t return t
return Directory._q_lookup(self, component) return Directory._q_lookup(self, component)
@ -529,7 +527,7 @@ class WorkflowItemPage(Directory):
class GlobalActionTriggerPage(Directory): class GlobalActionTriggerPage(Directory):
_q_exports = ['', 'delete'] _q_exports = ['', 'delete']
def __init__(self, workflow, action, component, html_top): def __init__(self, workflow, action, component):
try: try:
self.trigger = [x for x in action.triggers if x.id == component][0] self.trigger = [x for x in action.triggers if x.id == component][0]
except (IndexError, ValueError): except (IndexError, ValueError):
@ -537,7 +535,6 @@ class GlobalActionTriggerPage(Directory):
self.workflow = workflow self.workflow = workflow
self.action = action self.action = action
self.status = action self.status = action
self.html_top = html_top
get_response().breadcrumb.append(('triggers/%s/' % component, _('Trigger'))) get_response().breadcrumb.append(('triggers/%s/' % component, _('Trigger')))
def _q_index(self): def _q_index(self):
@ -554,7 +551,7 @@ class GlobalActionTriggerPage(Directory):
self.workflow.store(comment=_('Change in global action trigger')) self.workflow.store(comment=_('Change in global action trigger'))
return redirect('../../') 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 = TemplateIO(html=True)
r += htmltext('<h2>%s - %s</h2>') % (self.workflow.name, self.action.name) r += htmltext('<h2>%s - %s</h2>') % (self.workflow.name, self.action.name)
r += form.render() r += form.render()
@ -569,7 +566,7 @@ class GlobalActionTriggerPage(Directory):
return redirect('../../') return redirect('../../')
if not form.is_submitted() or form.has_errors(): if not form.is_submitted() or form.has_errors():
get_response().breadcrumb.append(('delete', _('Delete'))) get_response().breadcrumb.append(('delete', _('Delete')))
self.html_top(title=_('Delete Trigger')) get_response().set_title(_('Delete Trigger'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Deleting Trigger') r += htmltext('<h2>%s</h2>') % _('Deleting Trigger')
r += form.render() r += form.render()
@ -584,13 +581,12 @@ class ToChildDirectory(Directory):
_q_exports = [''] _q_exports = ['']
klass = None klass = None
def __init__(self, workflow, status, html_top): def __init__(self, workflow, status):
self.workflow = workflow self.workflow = workflow
self.status = status self.status = status
self.html_top = html_top
def _q_lookup(self, component): 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): def _q_index(self):
return redirect('..') return redirect('..')
@ -626,19 +622,18 @@ class WorkflowStatusPage(Directory):
] ]
do_not_call_in_templates = True do_not_call_in_templates = True
def __init__(self, workflow, status_id, html_top): def __init__(self, workflow, status_id):
self.html_top = html_top
self.workflow = workflow self.workflow = workflow
try: try:
self.status = [x for x in self.workflow.possible_status if x.id == status_id][0] self.status = [x for x in self.workflow.possible_status if x.id == status_id][0]
except IndexError: except IndexError:
raise errors.TraversalError() 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)) get_response().breadcrumb.append(('status/%s/' % status_id, self.status.name))
def _q_index(self): 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( get_response().add_javascript(
[ [
'jquery.js', 'jquery.js',
@ -760,7 +755,7 @@ class WorkflowStatusPage(Directory):
return redirect('.') return redirect('.')
if not form.is_submitted() or form.has_errors(): if not form.is_submitted() or form.has_errors():
get_response().breadcrumb.append(('delete', _('Delete'))) get_response().breadcrumb.append(('delete', _('Delete')))
self.html_top(title=_('Delete Status')) get_response().set_title(_('Delete Status'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s %s</h2>') % (_('Deleting Status:'), self.status.name) r += htmltext('<h2>%s %s</h2>') % (_('Deleting Status:'), self.status.name)
r += form.render() r += form.render()
@ -795,7 +790,7 @@ class WorkflowStatusPage(Directory):
self.workflow.store(comment=_('Change name of status %s') % new_name) self.workflow.store(comment=_('Change name of status %s') % new_name)
return redirect('.') return redirect('.')
self.html_top(title=_('Edit Workflow Status')) get_response().set_title(_('Edit Workflow Status'))
get_response().breadcrumb.append(('edit', _('Edit'))) get_response().breadcrumb.append(('edit', _('Edit')))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Edit Workflow Status') r += htmltext('<h2>%s</h2>') % _('Edit Workflow Status')
@ -838,7 +833,7 @@ class WorkflowStatusPage(Directory):
if not form.is_submitted() or form.has_errors(): if not form.is_submitted() or form.has_errors():
get_response().breadcrumb.append(('reassign', _('Delete / Reassign'))) 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 = TemplateIO(html=True)
r += htmltext('<h2>%s %s</h2>') % (_('Deleting Status:'), self.status.name) r += htmltext('<h2>%s %s</h2>') % (_('Deleting Status:'), self.status.name)
r += htmltext('<div class="remove-status-form">') r += htmltext('<div class="remove-status-form">')
@ -935,7 +930,7 @@ class WorkflowStatusPage(Directory):
self.workflow.store(comment=_('Change in display options')) self.workflow.store(comment=_('Change in display options'))
return redirect('.') return redirect('.')
self.html_top(title=_('Change Display Settings')) get_response().set_title(_('Change Display Settings'))
get_response().breadcrumb.append(('display', _('Display Settings'))) get_response().breadcrumb.append(('display', _('Display Settings')))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Change Display Settings') r += htmltext('<h2>%s</h2>') % _('Change Display Settings')
@ -960,7 +955,7 @@ class WorkflowStatusPage(Directory):
self.workflow.store(comment=_('Change of terminal status option')) self.workflow.store(comment=_('Change of terminal status option'))
return redirect('.') return redirect('.')
self.html_top(title=_('Edit Terminal Status')) get_response().set_title(_('Edit Terminal Status'))
get_response().breadcrumb.append(('endpoint', _('Terminal Status'))) get_response().breadcrumb.append(('endpoint', _('Terminal Status')))
return form.render() return form.render()
@ -982,7 +977,7 @@ class WorkflowStatusPage(Directory):
self.workflow.store(comment=_('Change in backoffice info text')) self.workflow.store(comment=_('Change in backoffice info text'))
return redirect('.') 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'))) get_response().breadcrumb.append(('backoffice_info_text', _('Backoffice Information Text')))
return form.render() return form.render()
@ -990,12 +985,11 @@ class WorkflowStatusPage(Directory):
class WorkflowStatusDirectory(Directory): class WorkflowStatusDirectory(Directory):
_q_exports = [''] _q_exports = ['']
def __init__(self, workflow, html_top): def __init__(self, workflow):
self.workflow = workflow self.workflow = workflow
self.html_top = html_top
def _q_lookup(self, component): def _q_lookup(self, component):
return WorkflowStatusPage(self.workflow, component, self.html_top) return WorkflowStatusPage(self.workflow, component)
def _q_index(self): def _q_index(self):
return redirect('..') return redirect('..')
@ -1214,7 +1208,7 @@ class FunctionsDirectory(Directory):
return redirect('..') return redirect('..')
get_response().breadcrumb.append(('new', _('New Function'))) get_response().breadcrumb.append(('new', _('New Function')))
html_top('workflows', title=_('New Function')) get_response().set_title(_('New Function'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('New Function') r += htmltext('<h2>%s</h2>') % _('New Function')
r += form.render() r += form.render()
@ -1254,7 +1248,7 @@ class FunctionsDirectory(Directory):
return redirect('..') return redirect('..')
get_response().breadcrumb.append(('new', _('Edit Function'))) get_response().breadcrumb.append(('new', _('Edit Function')))
html_top('workflows', title=_('Edit Function')) get_response().set_title(_('Edit Function'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Edit Function') r += htmltext('<h2>%s</h2>') % _('Edit Function')
r += form.render() r += form.render()
@ -1300,7 +1294,7 @@ class CriticalityLevelsDirectory(Directory):
return redirect('..') return redirect('..')
get_response().breadcrumb.append(('new', _('New Criticality Level'))) 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 = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('New Criticality Level') r += htmltext('<h2>%s</h2>') % _('New Criticality Level')
r += form.render() r += form.render()
@ -1335,7 +1329,7 @@ class CriticalityLevelsDirectory(Directory):
return redirect('..') return redirect('..')
get_response().breadcrumb.append(('new', _('Edit Criticality Level'))) 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 = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Edit Criticality Level') r += htmltext('<h2>%s</h2>') % _('Edit Criticality Level')
r += form.render() r += form.render()
@ -1360,16 +1354,15 @@ class GlobalActionPage(WorkflowStatusPage):
('backoffice-info-text', 'backoffice_info_text'), ('backoffice-info-text', 'backoffice_info_text'),
] ]
def __init__(self, workflow, action_id, html_top): def __init__(self, workflow, action_id):
self.html_top = html_top
self.workflow = workflow self.workflow = workflow
try: try:
self.action = [x for x in self.workflow.global_actions if x.id == action_id][0] self.action = [x for x in self.workflow.global_actions if x.id == action_id][0]
except IndexError: except IndexError:
raise errors.TraversalError() raise errors.TraversalError()
self.status = self.action self.status = self.action
self.items_dir = GlobalActionItemsDir(workflow, self.action, html_top) self.items_dir = GlobalActionItemsDir(workflow, self.action)
self.triggers_dir = GlobalActionTriggersDir(workflow, self.action, html_top) self.triggers_dir = GlobalActionTriggersDir(workflow, self.action)
def _q_traverse(self, path): def _q_traverse(self, path):
get_response().breadcrumb.append( 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 return not item.is_disabled() and item.is_available(self.workflow) and item.ok_in_global_action
def _q_index(self): 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) r = TemplateIO(html=True)
get_response().add_javascript(['jquery.js', 'jquery-ui.js', 'biglist.js', 'qommon.wysiwyg.js']) get_response().add_javascript(['jquery.js', 'jquery-ui.js', 'biglist.js', 'qommon.wysiwyg.js'])
@ -1453,7 +1446,7 @@ class GlobalActionPage(WorkflowStatusPage):
return redirect('.') return redirect('.')
if not form.is_submitted() or form.has_errors(): if not form.is_submitted() or form.has_errors():
get_response().breadcrumb.append(('delete', _('Delete'))) get_response().breadcrumb.append(('delete', _('Delete')))
self.html_top(title=_('Delete Action')) get_response().set_title(_('Delete Action'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s %s</h2>') % (_('Deleting Action:'), self.action.name) r += htmltext('<h2>%s %s</h2>') % (_('Deleting Action:'), self.action.name)
r += form.render() r += form.render()
@ -1480,7 +1473,7 @@ class GlobalActionPage(WorkflowStatusPage):
self.workflow.store(comment=_('Change in global action')) self.workflow.store(comment=_('Change in global action'))
return redirect('.') return redirect('.')
self.html_top(title=_('Edit Action Name')) get_response().set_title(_('Edit Action Name'))
get_response().breadcrumb.append(('edit', _('Edit'))) get_response().breadcrumb.append(('edit', _('Edit')))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Edit Action Name') r += htmltext('<h2>%s</h2>') % _('Edit Action Name')
@ -1562,12 +1555,11 @@ class GlobalActionPage(WorkflowStatusPage):
class GlobalActionsDirectory(Directory): class GlobalActionsDirectory(Directory):
_q_exports = ['', 'new'] _q_exports = ['', 'new']
def __init__(self, workflow, html_top): def __init__(self, workflow):
self.workflow = workflow self.workflow = workflow
self.html_top = html_top
def _q_lookup(self, component): def _q_lookup(self, component):
return GlobalActionPage(self.workflow, component, self.html_top) return GlobalActionPage(self.workflow, component)
def _q_index(self): def _q_index(self):
return redirect('..') return redirect('..')
@ -1591,7 +1583,7 @@ class GlobalActionsDirectory(Directory):
return redirect('%s/' % action.id) return redirect('%s/' % action.id)
get_response().breadcrumb.append(('new', _('New Global Action'))) 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 = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('New Global Action') r += htmltext('<h2>%s</h2>') % _('New Global Action')
r += form.render() r += form.render()
@ -1636,20 +1628,17 @@ class WorkflowPage(Directory):
except KeyError: except KeyError:
raise errors.TraversalError() raise errors.TraversalError()
self.workflow_ui = WorkflowUI(self.workflow) 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.variables_dir = VariablesDirectory(self.workflow)
self.backoffice_fields_dir = BackofficeFieldsDirectory(self.workflow) self.backoffice_fields_dir = BackofficeFieldsDirectory(self.workflow)
self.functions_dir = FunctionsDirectory(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.criticality_levels_dir = CriticalityLevelsDirectory(self.workflow)
self.logged_errors_dir = LoggedErrorsDirectory(parent_dir=self, workflow_id=self.workflow.id) self.logged_errors_dir = LoggedErrorsDirectory(parent_dir=self, workflow_id=self.workflow.id)
self.snapshots_dir = SnapshotsDirectory(self.workflow) self.snapshots_dir = SnapshotsDirectory(self.workflow)
if component: if component:
get_response().breadcrumb.append((component + '/', self.workflow.name)) get_response().breadcrumb.append((component + '/', self.workflow.name))
def html_top(self, title):
return html_top('workflows', title)
def category(self): def category(self):
category_options = self.workflow_ui.get_categories() category_options = self.workflow_ui.get_categories()
if is_global_accessible(): if is_global_accessible():
@ -1680,7 +1669,7 @@ class WorkflowPage(Directory):
self.workflow.store(comment=_('Change of category')) self.workflow.store(comment=_('Change of category'))
return redirect('.') return redirect('.')
html_top('workflows', title=self.workflow.name) get_response().set_title(self.workflow.name)
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Category') r += htmltext('<h2>%s</h2>') % _('Category')
r += form.render() r += form.render()
@ -1705,7 +1694,7 @@ class WorkflowPage(Directory):
) )
def _q_index(self): 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().filter['sidebar'] = self.get_sidebar()
get_response().add_javascript( get_response().add_javascript(
['jquery.js', 'jquery-ui.js', 'biglist.js', 'svg-pan-zoom.js', 'jquery.colourpicker.js'] ['jquery.js', 'jquery-ui.js', 'biglist.js', 'svg-pan-zoom.js', 'jquery.colourpicker.js']
@ -1748,7 +1737,7 @@ class WorkflowPage(Directory):
return r.getvalue() return r.getvalue()
def inspect(self): def inspect(self):
self.html_top(self.workflow.name) get_response().set_title(self.workflow.name)
get_response().breadcrumb.append(('inspect', _('Inspector'))) get_response().breadcrumb.append(('inspect', _('Inspector')))
return self.render_inspect() return self.render_inspect()
@ -1847,7 +1836,7 @@ class WorkflowPage(Directory):
else: else:
return redirect('.') return redirect('.')
self.html_top(title=_('Edit Workflow')) get_response().set_title(_('Edit Workflow'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
get_response().breadcrumb.append(('edit', _('Edit'))) get_response().breadcrumb.append(('edit', _('Edit')))
r += htmltext('<h2>%s</h2>') % _('Edit Workflow') r += htmltext('<h2>%s</h2>') % _('Edit Workflow')
@ -1875,7 +1864,7 @@ class WorkflowPage(Directory):
return redirect('.') return redirect('.')
if not form.is_submitted() or form.has_errors(): if not form.is_submitted() or form.has_errors():
get_response().breadcrumb.append(('delete', _('Delete'))) get_response().breadcrumb.append(('delete', _('Delete')))
self.html_top(title=_('Delete Workflow')) get_response().set_title(_('Delete Workflow'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s %s</h2>') % (_('Deleting Workflow:'), self.workflow.name) r += htmltext('<h2>%s %s</h2>') % (_('Deleting Workflow:'), self.workflow.name)
r += form.render() r += form.render()
@ -1917,7 +1906,7 @@ class WorkflowPage(Directory):
except ValueError: except ValueError:
pass pass
self.html_top(title=_('Duplicate Workflow')) get_response().set_title(_('Duplicate Workflow'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
get_response().breadcrumb.append(('duplicate', _('Duplicate'))) get_response().breadcrumb.append(('duplicate', _('Duplicate')))
r += htmltext('<h2>%s</h2>') % _('Duplicate Workflow') r += htmltext('<h2>%s</h2>') % _('Duplicate Workflow')
@ -1975,11 +1964,9 @@ class WorkflowsDirectory(Directory):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.applications_dir = ApplicationsDirectory(Workflow.xml_root_node) self.applications_dir = ApplicationsDirectory(Workflow.xml_root_node)
def html_top(self, title):
return html_top('workflows', title)
def _q_traverse(self, path): def _q_traverse(self, path):
get_response().breadcrumb.append(('workflows/', _('Workflows'))) get_response().breadcrumb.append(('workflows/', _('Workflows')))
get_response().set_backoffice_section('workflows')
return super()._q_traverse(path) return super()._q_traverse(path)
def is_accessible(self, user): def is_accessible(self, user):
@ -1998,7 +1985,7 @@ class WorkflowsDirectory(Directory):
def _q_index(self): def _q_index(self):
from wcs.applications import Application from wcs.applications import Application
self.html_top(title=_('Workflows')) get_response().set_title(_('Workflows'))
get_response().add_javascript(['popup.js']) get_response().add_javascript(['popup.js'])
context = { context = {
@ -2119,7 +2106,7 @@ class WorkflowsDirectory(Directory):
else: else:
return redirect('%s/' % workflow.id) return redirect('%s/' % workflow.id)
self.html_top(title=_('New Workflow')) get_response().set_title(_('New Workflow'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('New Workflow') r += htmltext('<h2>%s</h2>') % _('New Workflow')
r += form.render() r += form.render()
@ -2151,7 +2138,7 @@ class WorkflowsDirectory(Directory):
pass pass
get_response().breadcrumb.append(('import', _('Import'))) get_response().breadcrumb.append(('import', _('Import')))
self.html_top(title=_('Import Workflow')) get_response().set_title(_('Import Workflow'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Import Workflow') r += htmltext('<h2>%s</h2>') % _('Import Workflow')
r += htmltext('<p>%s</p>') % _( r += htmltext('<p>%s</p>') % _(

View File

@ -22,7 +22,6 @@ from wcs.admin import utils
from wcs.backoffice.applications import ApplicationsDirectory from wcs.backoffice.applications import ApplicationsDirectory
from wcs.backoffice.snapshots import SnapshotsDirectory from wcs.backoffice.snapshots import SnapshotsDirectory
from wcs.qommon import _, errors, misc, template 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.qommon.form import CheckboxWidget, FileWidget, Form, HtmlWidget, SlugWidget, StringWidget, TextWidget
from wcs.wscalls import NamedWsCall, WsCallRequestWidget from wcs.wscalls import NamedWsCall, WsCallRequestWidget
@ -129,7 +128,7 @@ class NamedWsCallPage(Directory):
return r.getvalue() return r.getvalue()
def _q_index(self): 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() get_response().filter['sidebar'] = self.get_sidebar()
return template.QommonTemplateResponse( return template.QommonTemplateResponse(
templates=['wcs/backoffice/wscall.html'], context={'view': self, 'wscall': self.wscall} templates=['wcs/backoffice/wscall.html'], context={'view': self, 'wscall': self.wscall}
@ -149,7 +148,7 @@ class NamedWsCallPage(Directory):
return redirect('../%s/' % self.wscall.id) return redirect('../%s/' % self.wscall.id)
get_response().breadcrumb.append(('edit', _('Edit'))) 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 = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Edit webservice call') r += htmltext('<h2>%s</h2>') % _('Edit webservice call')
r += form.render() r += form.render()
@ -166,7 +165,7 @@ class NamedWsCallPage(Directory):
return redirect('..') return redirect('..')
if not form.is_submitted() or form.has_errors(): if not form.is_submitted() or form.has_errors():
get_response().breadcrumb.append(('delete', _('Delete'))) 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 = TemplateIO(html=True)
r += htmltext('<h2>%s %s</h2>') % (_('Deleting webservice call:'), self.wscall.name) r += htmltext('<h2>%s %s</h2>') % (_('Deleting webservice call:'), self.wscall.name)
r += form.render() r += form.render()
@ -195,7 +194,7 @@ class NamedWsCallsDirectory(Directory):
def _q_index(self): def _q_index(self):
from wcs.applications import Application from wcs.applications import Application
html_top('wscalls', title=_('Webservice Calls')) get_response().set_title(_('Webservice Calls'))
get_response().add_javascript(['popup.js']) get_response().add_javascript(['popup.js'])
wscalls = NamedWsCall.select(order_by='name') wscalls = NamedWsCall.select(order_by='name')
Application.populate_objects(wscalls) Application.populate_objects(wscalls)
@ -225,7 +224,7 @@ class NamedWsCallsDirectory(Directory):
else: else:
return redirect('.') return redirect('.')
html_top('wscalls', title=_('New webservice call')) get_response().set_title(_('New webservice call'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('New webservice call') r += htmltext('<h2>%s</h2>') % _('New webservice call')
r += form.render() r += form.render()
@ -252,7 +251,7 @@ class NamedWsCallsDirectory(Directory):
pass pass
get_response().breadcrumb.append(('import', _('Import'))) get_response().breadcrumb.append(('import', _('Import')))
html_top('wscalls', title=import_title) get_response().set_title(import_title)
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % import_title r += htmltext('<h2>%s</h2>') % import_title
r += htmltext('<p>%s</p>') % _('You can install a new webservice call by uploading a file.') r += htmltext('<p>%s</p>') % _('You can install a new webservice call by uploading a file.')

View File

@ -18,7 +18,6 @@ from quixote import get_response, redirect
from quixote.directory import Directory from quixote.directory import Directory
from wcs.qommon import errors, misc, template from wcs.qommon import errors, misc, template
from wcs.qommon.backoffice.menu import html_top
class ApplicationsDirectory(Directory): class ApplicationsDirectory(Directory):
@ -60,7 +59,7 @@ class ApplicationDirectory(Directory):
return super()._q_traverse(path) return super()._q_traverse(path)
def _q_index(self): 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()) return template.QommonTemplateResponse(templates=[self.get_template()], context=self.get_context())
def get_template(self): def get_template(self):
@ -99,7 +98,7 @@ class ApplicationDirectory(Directory):
def get_block_objects_context(self, objects): def get_block_objects_context(self, objects):
from wcs.admin.blocks import BlocksDirectory 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): def get_mailtemplate_objects_context(self, objects):
from wcs.admin.mail_templates import MailTemplatesDirectory from wcs.admin.mail_templates import MailTemplatesDirectory

View File

@ -83,7 +83,7 @@ class CardDefPage(FormDefPage):
management_view_label = _('List of cards') management_view_label = _('List of cards')
def _q_index(self): def _q_index(self):
self.html_top(title=self.formdef.name) get_response().set_title(self.formdef.name)
r = TemplateIO(html=True) r = TemplateIO(html=True)
get_response().filter['sidebar'] = self.get_sidebar() get_response().filter['sidebar'] = self.get_sidebar()
get_response().add_javascript(['jquery.js', 'widget_list.js', 'qommon.wysiwyg.js']) get_response().add_javascript(['jquery.js', 'widget_list.js', 'qommon.wysiwyg.js'])
@ -284,7 +284,7 @@ class CardsDirectory(FormsDirectory):
else: else:
return redirect(str(formdef.id) + '/') return redirect(str(formdef.id) + '/')
self.html_top(title=_('New Card Model')) get_response().set_title(_('New Card Model'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('New Card Model') r += htmltext('<h2>%s</h2>') % _('New Card Model')
r += form.render() r += form.render()

View File

@ -31,7 +31,6 @@ from wcs.workflows import ContentSnapshotPart
from ..qommon import _, errors, ngettext, template from ..qommon import _, errors, ngettext, template
from ..qommon.afterjobs import AfterJob from ..qommon.afterjobs import AfterJob
from ..qommon.backoffice.menu import html_top
from ..qommon.form import CheckboxWidget, FileWidget, Form from ..qommon.form import CheckboxWidget, FileWidget, Form
from .management import FormBackOfficeStatusPage, FormPage, ManagementDirectory from .management import FormBackOfficeStatusPage, FormPage, ManagementDirectory
from .submission import FormFillPage from .submission import FormFillPage
@ -73,6 +72,7 @@ def get_import_csv_fields(carddef):
class DataManagementDirectory(ManagementDirectory): class DataManagementDirectory(ManagementDirectory):
do_not_call_in_templates = True do_not_call_in_templates = True
_q_exports = [''] _q_exports = ['']
section = 'data'
def add_breadcrumb(self): def add_breadcrumb(self):
get_response().breadcrumb.append(('data/', _('Cards'))) get_response().breadcrumb.append(('data/', _('Cards')))
@ -108,7 +108,7 @@ class DataManagementDirectory(ManagementDirectory):
yield carddef yield carddef
def _q_index(self): def _q_index(self):
html_top('data_management', _('Cards')) get_response().set_title(_('Cards'))
if not (CardDef.exists()): if not (CardDef.exists()):
return self.empty_site_message(_('Cards')) return self.empty_site_message(_('Cards'))
return template.QommonTemplateResponse( return template.QommonTemplateResponse(
@ -249,7 +249,7 @@ class CardPage(FormPage):
form.set_error('file', e) form.set_error('file', e)
get_response().breadcrumb.append(('import-file', _('Import File'))) 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['html_form'] = form
context['impossible_csv_fields'] = self.get_csv_impossible_fields() 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.' '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): def should_fold_summary(self, mine, request_user):
return False return False

View File

@ -26,7 +26,6 @@ from wcs.data_sources import NamedDataSource
from wcs.formdef import get_formdefs_of_all_kinds from wcs.formdef import get_formdefs_of_all_kinds
from wcs.qommon import _, ezt, template from wcs.qommon import _, ezt, template
from wcs.qommon.afterjobs import AfterJob from wcs.qommon.afterjobs import AfterJob
from wcs.qommon.backoffice.menu import html_top
from wcs.wf.export_to_model import UploadValidationError from wcs.wf.export_to_model import UploadValidationError
from wcs.workflows import Workflow from wcs.workflows import Workflow
from wcs.wscalls import NamedWsCall from wcs.wscalls import NamedWsCall
@ -42,7 +41,7 @@ class DeprecationsDirectory(Directory):
# create report if necessary # create report if necessary
return self.scan() return self.scan()
html_top('studio', _('Deprecations Report')) get_response().set_title(_('Deprecations Report'))
get_response().breadcrumb.append(('deprecations/', _('Deprecations Report'))) get_response().breadcrumb.append(('deprecations/', _('Deprecations Report')))
context = {'has_sidebar': False, 'view': self} context = {'has_sidebar': False, 'view': self}

View File

@ -31,7 +31,6 @@ from wcs.formdef import FormDef, UpdateDigestAfterJob
from wcs.mail_templates import MailTemplate from wcs.mail_templates import MailTemplate
from wcs.qommon import _, errors, get_cfg, misc, ods, template from wcs.qommon import _, errors, get_cfg, misc, ods, template
from wcs.qommon.afterjobs import AfterJob 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.qommon.form import CheckboxWidget, FileWidget, Form, RadiobuttonsWidget, TextWidget
from wcs.sql_criterias import Equal, FtsMatch, ILike, Or from wcs.sql_criterias import Equal, FtsMatch, ILike, Or
from wcs.workflows import Workflow from wcs.workflows import Workflow
@ -65,7 +64,7 @@ class I18nDirectory(Directory):
if TranslatableMessage.count() == 0: if TranslatableMessage.count() == 0:
return self.scan() return self.scan()
html_top('i18n', title=_('Multilinguism')) get_response().set_title(_('Multilinguism'))
get_response().breadcrumb.append(('i18n/', _('Multilinguism'))) get_response().breadcrumb.append(('i18n/', _('Multilinguism')))
if not self.get_supported_languages(): if not self.get_supported_languages():
@ -241,7 +240,7 @@ class MessageDirectory(Directory):
update_digests() update_digests()
return redirect('../../?' + get_request().get_query()) return redirect('../../?' + get_request().get_query())
html_top('i18n', title=_('Multilinguism')) get_response().set_title(_('Multilinguism'))
context = {'html_form': form, 'msg': self.msg} context = {'html_form': form, 'msg': self.msg}
return template.QommonTemplateResponse( return template.QommonTemplateResponse(
templates=['wcs/backoffice/i18n-message.html'], context=context templates=['wcs/backoffice/i18n-message.html'], context=context

View File

@ -22,7 +22,6 @@ from quixote.directory import Directory
from wcs.carddef import CardDef from wcs.carddef import CardDef
from wcs.formdef import FormDef from wcs.formdef import FormDef
from wcs.qommon import _, template 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.form import DateWidget, Form, OptGroup, SingleSelectWidget, StringWidget
from wcs.qommon.misc import get_as_datetime from wcs.qommon.misc import get_as_datetime
from wcs.sql_criterias import Equal, Greater, GreaterOrEqual, Less, Nothing 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): class JournalDirectory(Directory):
_q_exports = [''] _q_exports = ['']
def html_top(self, title):
return html_top('journal', title)
def _q_traverse(self, path): def _q_traverse(self, path):
get_response().breadcrumb.append(('journal/', _('Audit Journal'))) get_response().breadcrumb.append(('journal/', _('Audit Journal')))
return super()._q_traverse(path) return super()._q_traverse(path)
@ -41,7 +37,7 @@ class JournalDirectory(Directory):
def _q_index(self): def _q_index(self):
from wcs.audit import Audit from wcs.audit import Audit
self.html_top(_('Audit Journal')) get_response().set_title(_('Audit Journal'))
context = { context = {
'has_sidebar': True, 'has_sidebar': True,
'html_form': self.get_filter_form(), 'html_form': self.get_filter_form(),

View File

@ -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 import _, audit, errors, ezt, force_str, get_cfg, misc, ngettext, ods, pgettext_lazy, template
from ..qommon.afterjobs import AfterJob from ..qommon.afterjobs import AfterJob
from ..qommon.backoffice.menu import html_top
from ..qommon.evalutils import make_datetime from ..qommon.evalutils import make_datetime
from ..qommon.form import ( from ..qommon.form import (
CheckboxWidget, CheckboxWidget,
@ -163,6 +162,7 @@ def geojson_formdatas(formdatas, geoloc_key='base', fields=None):
class ManagementDirectory(Directory): class ManagementDirectory(Directory):
_q_exports = ['', 'forms', 'listing', 'statistics', 'lookup', 'count', 'geojson', 'map'] _q_exports = ['', 'forms', 'listing', 'statistics', 'lookup', 'count', 'geojson', 'map']
section = 'management'
def add_breadcrumb(self): def add_breadcrumb(self):
get_response().breadcrumb.append(('management/', _('Management'))) get_response().breadcrumb.append(('management/', _('Management')))
@ -172,6 +172,7 @@ class ManagementDirectory(Directory):
def _q_traverse(self, path): def _q_traverse(self, path):
self.add_breadcrumb() self.add_breadcrumb()
get_response().set_backoffice_section(self.section)
return super()._q_traverse(path) return super()._q_traverse(path)
def _q_index(self): def _q_index(self):
@ -181,7 +182,7 @@ class ManagementDirectory(Directory):
return redirect('forms') return redirect('forms')
def forms(self): def forms(self):
html_top('management', _('Management')) get_response().set_title(_('Management'))
formdefs = FormDef.select(order_by='name', ignore_errors=True, lightweight=True) formdefs = FormDef.select(order_by='name', ignore_errors=True, lightweight=True)
if len(formdefs) == 0: if len(formdefs) == 0:
return self.empty_site_message(_('Forms')) return self.empty_site_message(_('Forms'))
@ -404,7 +405,7 @@ class ManagementDirectory(Directory):
return r.getvalue() return r.getvalue()
def statistics(self): def statistics(self):
html_top('management', _('Global statistics')) get_response().set_title(_('Global statistics'))
get_response().breadcrumb.append(('statistics', _('Global statistics'))) get_response().breadcrumb.append(('statistics', _('Global statistics')))
if not (FormDef.exists()): if not (FormDef.exists()):
@ -584,7 +585,7 @@ class ManagementDirectory(Directory):
get_response().add_javascript(['wcs.listing.js']) get_response().add_javascript(['wcs.listing.js'])
from wcs import sql from wcs import sql
html_top('management', _('Management')) get_response().set_title(_('Management'))
if not (FormDef.exists()): if not (FormDef.exists()):
return self.empty_site_message(_('Global View')) return self.empty_site_message(_('Global View'))
@ -736,7 +737,7 @@ class ManagementDirectory(Directory):
def map(self): def map(self):
get_response().add_javascript(['wcs.listing.js', 'qommon.map.js']) 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) r = TemplateIO(html=True)
get_response().breadcrumb.append(('map', _('Global Map'))) get_response().breadcrumb.append(('map', _('Global Map')))
attrs = { attrs = {
@ -2213,10 +2214,10 @@ class FormPage(FormdefDirectoryBase):
r += htmltext('<div id="appbar">') r += htmltext('<div id="appbar">')
if self.view: if self.view:
view_name = self.view.title 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('<h2>%s - %s</h2>') % (self.formdef.name, view_name) r += htmltext('<h2>%s - %s</h2>') % (self.formdef.name, view_name)
else: else:
html_top('management', self.formdef.name) get_response().set_title(self.formdef.name)
r += htmltext('<h2>%s</h2>') % self.formdef.name r += htmltext('<h2>%s</h2>') % self.formdef.name
r += get_session().display_message() r += get_session().display_message()
r += self.listing_top_actions() r += self.listing_top_actions()
@ -2708,7 +2709,7 @@ class FormPage(FormdefDirectoryBase):
def map(self): def map(self):
self.view_type = 'map' self.view_type = 'map'
get_response().add_javascript(['qommon.map.js']) 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) r = TemplateIO(html=True)
get_response().breadcrumb.append(('map', _('Map'))) get_response().breadcrumb.append(('map', _('Map')))
attrs = { attrs = {
@ -2749,7 +2750,7 @@ class FormPage(FormdefDirectoryBase):
'statistics', get_request().user 'statistics', get_request().user
): ):
raise errors.AccessForbiddenError() 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) r = TemplateIO(html=True)
get_response().breadcrumb.append(('stats', _('Statistics'))) 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.' '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): def _q_index(self):
if self.filled.status == 'draft': if self.filled.status == 'draft':
if self.filled.backoffice_submission and self.formdef.backoffice_submission_roles: if self.filled.backoffice_submission and self.formdef.backoffice_submission_roles:
@ -3623,7 +3621,7 @@ class FormBackOfficeStatusPage(FormStatusPage):
if self.filled.is_draft(): if self.filled.is_draft():
raise errors.AccessForbiddenError() raise errors.AccessForbiddenError()
get_response().breadcrumb.append(('inspect', _('Data Inspector'))) get_response().breadcrumb.append(('inspect', _('Data Inspector')))
self.html_top(self.formdef.name) get_response().set_title(self.formdef.name)
context = {} context = {}

View File

@ -30,7 +30,6 @@ from wcs.formdef import FormDef
from ..qommon import _, errors, get_cfg, misc, template from ..qommon import _, errors, get_cfg, misc, template
from ..qommon.afterjobs import AfterJob from ..qommon.afterjobs import AfterJob
from ..qommon.backoffice.menu import html_top
from .cards import CardsDirectory from .cards import CardsDirectory
from .data_management import DataManagementDirectory from .data_management import DataManagementDirectory
from .i18n import I18nDirectory from .i18n import I18nDirectory
@ -85,6 +84,7 @@ class RootDirectory(AccessControlled, Directory):
if path and path[0] == 'categories': if path and path[0] == 'categories':
# legacy /backoffice/categories/<...>, redirect. # legacy /backoffice/categories/<...>, redirect.
return redirect('/backoffice/forms/' + '/'.join(path)) return redirect('/backoffice/forms/' + '/'.join(path))
get_response().set_backoffice_section('studio')
return super()._q_traverse(path) return super()._q_traverse(path)
@classmethod @classmethod
@ -263,7 +263,7 @@ class RootDirectory(AccessControlled, Directory):
return redirect('.') return redirect('.')
get_response().add_javascript(['jquery.js', 'afterjob.js']) get_response().add_javascript(['jquery.js', 'afterjob.js'])
html_top('/', title=job.label) get_response().set_title(job.label)
return template.QommonTemplateResponse( return template.QommonTemplateResponse(
templates=['wcs/backoffice/processing.html'], context={'job': job} templates=['wcs/backoffice/processing.html'], context={'job': job}
) )

View File

@ -26,7 +26,6 @@ from quixote.html import TemplateIO, htmltext
from wcs.formdef import FormdefImportError from wcs.formdef import FormdefImportError
from wcs.qommon import _, errors, misc, template 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.qommon.form import Form, RadiobuttonsWidget, StringWidget
from wcs.sql_criterias import Equal from wcs.sql_criterias import Equal
from wcs.workflows import WorkflowImportError from wcs.workflows import WorkflowImportError
@ -46,7 +45,7 @@ class SnapshotsDirectory(Directory):
return super()._q_traverse(path) return super()._q_traverse(path)
def _q_index(self): def _q_index(self):
html_top('', _('History')) get_response().set_title(_('History'))
return template.QommonTemplateResponse( return template.QommonTemplateResponse(
templates=['wcs/backoffice/snapshots.html'], templates=['wcs/backoffice/snapshots.html'],
context={'view': self, 'enable_tests': get_publisher().has_site_option('enable-tests')}, 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()) get_publisher().snapshot_class.snap(instance=self.obj, label=label.parse())
return redirect('../') return redirect('../')
html_top('', _('History')) get_response().set_title(_('History'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Save snapshot') r += htmltext('<h2>%s</h2>') % _('Save snapshot')
r += form.render() r += form.render()
@ -73,7 +72,7 @@ class SnapshotsDirectory(Directory):
def compare(self): def compare(self):
get_response().breadcrumb.append(('compare/', _('Compare'))) get_response().breadcrumb.append(('compare/', _('Compare')))
html_top('', _('Compare')) get_response().set_title(_('Compare'))
mode = get_request().form.get('mode') or 'xml' mode = get_request().form.get('mode') or 'xml'

View File

@ -27,7 +27,6 @@ from wcs.data_sources import NamedDataSource
from wcs.formdef import FormDef from wcs.formdef import FormDef
from wcs.mail_templates import MailTemplate from wcs.mail_templates import MailTemplate
from wcs.qommon import _, misc, pgettext, template from wcs.qommon import _, misc, pgettext, template
from wcs.qommon.backoffice.menu import html_top
from wcs.qommon.form import get_response from wcs.qommon.form import get_response
from wcs.workflows import Workflow from wcs.workflows import Workflow
from wcs.wscalls import NamedWsCall from wcs.wscalls import NamedWsCall
@ -38,7 +37,7 @@ class ChangesDirectory(Directory):
def _q_index(self): def _q_index(self):
get_response().breadcrumb.append(('all-changes/', pgettext('studio', 'All changes'))) 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( limit = misc.get_int_or_400(
get_request().form.get('limit', get_publisher().get_site_option('default-page-size')) or 20 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): def __init__(self):
self.logged_errors_dir = LoggedErrorsDirectory(parent_dir=self) self.logged_errors_dir = LoggedErrorsDirectory(parent_dir=self)
def html_top(self, title):
return html_top('studio', title)
def _q_traverse(self, path): def _q_traverse(self, path):
get_response().breadcrumb.append(('studio/', _('Studio'))) get_response().breadcrumb.append(('studio/', _('Studio')))
get_response().set_backoffice_section('studio')
return super()._q_traverse(path) return super()._q_traverse(path)
def _q_index(self): def _q_index(self):
self.html_top(_('Studio')) get_response().set_title(_('Studio'))
extra_links = [] extra_links = []
backoffice_root = get_publisher().get_backoffice_root() backoffice_root = get_publisher().get_backoffice_root()
object_types = [] object_types = []

View File

@ -30,7 +30,6 @@ from wcs.forms.root import FormPage as PublicFormFillPage
from wcs.sql_criterias import Equal, StrictNotEqual from wcs.sql_criterias import Equal, StrictNotEqual
from ..qommon import _, errors, misc from ..qommon import _, errors, misc
from ..qommon.backoffice.menu import html_top
from ..qommon.form import Form, HtmlWidget from ..qommon.form import Form, HtmlWidget
@ -53,7 +52,7 @@ class RemoveDraftDirectory(Directory):
if self.parent_directory.edit_mode: if self.parent_directory.edit_mode:
raise errors.AccessForbiddenError() raise errors.AccessForbiddenError()
self.parent_directory.html_top(title=_('Discard')) get_response().set_title(_('Discard'))
form = Form(enctype='multipart/form-data') form = Form(enctype='multipart/form-data')
form.widgets.append(HtmlWidget('<p>%s</p>' % _('You are about to discard this form.'))) form.widgets.append(HtmlWidget('<p>%s</p>' % _('You are about to discard this form.')))
@ -186,9 +185,6 @@ class FormFillPage(PublicFormFillPage):
formdata.user_id = get_request().form['user_id'] formdata.user_id = get_request().form['user_id']
return formdata return formdata
def html_top(self, *args, **kwargs):
return html_top('submission', *args, **kwargs)
@classmethod @classmethod
def get_status_page_class(cls): def get_status_page_class(cls):
return SubmissionFormStatusPage return SubmissionFormStatusPage
@ -407,6 +403,10 @@ class FormFillPage(PublicFormFillPage):
class SubmissionDirectory(Directory): class SubmissionDirectory(Directory):
_q_exports = ['', 'count'] _q_exports = ['', 'count']
def _q_traverse(self, path):
get_response().set_backoffice_section('submission')
return super()._q_traverse(path)
def is_accessible(self, user): def is_accessible(self, user):
if not user.can_go_in_backoffice(): if not user.can_go_in_backoffice():
return False return False
@ -437,7 +437,7 @@ class SubmissionDirectory(Directory):
def _q_index(self): def _q_index(self):
get_response().breadcrumb.append(('submission/', _('Submission'))) get_response().breadcrumb.append(('submission/', _('Submission')))
html_top('submission', _('Submission')) get_response().set_title(_('Submission'))
list_forms = self.get_submittable_formdefs() list_forms = self.get_submittable_formdefs()
cats = Category.select() cats = Category.select()

View File

@ -23,7 +23,6 @@ from wcs.formdef import FormDef
from wcs.forms.common import FormTemplateMixin from wcs.forms.common import FormTemplateMixin
from wcs.qommon import _, errors, misc, template from wcs.qommon import _, errors, misc, template
from wcs.qommon.afterjobs import AfterJob 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.form import Form
from wcs.qommon.http_request import HTTPRequest from wcs.qommon.http_request import HTTPRequest
from wcs.wf.jump import jump_and_perform from wcs.wf.jump import jump_and_perform
@ -84,7 +83,7 @@ class ActionDirectory(Directory, FormTemplateMixin):
raise MissingOrExpiredToken() raise MissingOrExpiredToken()
def _q_index(self): def _q_index(self):
template.html_top(title=self.formdef.name) get_response().set_title(self.formdef.name)
form = Form() form = Form()
form.add_submit('submit', misc.site_encode(self.token.context['label'])) form.add_submit('submit', misc.site_encode(self.token.context['label']))
if form.is_submitted() and not form.has_errors(): if form.is_submitted() and not form.has_errors():
@ -145,16 +144,11 @@ class GlobalInteractiveActionDirectory(Directory, FormTemplateMixin):
raise MissingOrExpiredToken() raise MissingOrExpiredToken()
def _q_index(self): def _q_index(self):
get_response().set_title(self.formdef.name)
if get_request().is_in_backoffice(): if get_request().is_in_backoffice():
if isinstance(self.formdef, CardDef):
section = 'data_management'
else:
section = 'management'
get_response().breadcrumb.append(('', self.action.name)) get_response().breadcrumb.append(('', self.action.name))
backoffice_html_top(section, title=self.formdef.name)
template_name = 'wcs/backoffice/global-interactive-action.html' template_name = 'wcs/backoffice/global-interactive-action.html'
else: else:
template.html_top(title=self.formdef.name)
template_name = 'wcs/global-interactive-action.html' template_name = 'wcs/global-interactive-action.html'
if len(self.token.context['form_ids']) == 1: if len(self.token.context['form_ids']) == 1:

View File

@ -163,9 +163,6 @@ class FormStatusPage(Directory, FormTemplateMixin):
history_templates = ['wcs/formdata_history.html'] history_templates = ['wcs/formdata_history.html']
status_templates = ['wcs/formdata_status.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): def __init__(self, formdef, filled, register_workflow_subdirs=True, custom_view=None, parent_view=None):
get_publisher().substitutions.feed(filled) get_publisher().substitutions.feed(filled)
self.formdef = formdef self.formdef = formdef
@ -340,7 +337,7 @@ class FormStatusPage(Directory, FormTemplateMixin):
form.add_media() form.add_media()
get_response().add_javascript(['jquery.js', 'qommon.forms.js', 'qommon.map.js']) 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() get_response().filter['page_title'] = self.filled.get_display_label()
context = { context = {
'view': self, 'view': self,
@ -670,7 +667,7 @@ class FormStatusPage(Directory, FormTemplateMixin):
get_response().add_javascript(['jquery.js', 'qommon.forms.js']) get_response().add_javascript(['jquery.js', 'qommon.forms.js'])
audit('view', obj=self.filled) 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 = TemplateIO(html=True)
r += get_session().display_message() r += get_session().display_message()
r += htmltext(self.workflow_messages()) r += htmltext(self.workflow_messages())

View File

@ -14,7 +14,7 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, see <http://www.gnu.org/licenses/>. # along with this program; if not, see <http://www.gnu.org/licenses/>.
from quixote import get_publisher from quixote import get_publisher, get_response
from quixote.directory import AccessControlled, Directory from quixote.directory import AccessControlled, Directory
from quixote.html import TemplateIO, htmltext from quixote.html import TemplateIO, htmltext
@ -38,7 +38,7 @@ class PreviewFormPage(FormPage):
return form return form
def submitted(self, *args, **kwargs): def submitted(self, *args, **kwargs):
self.html_top(self.formdef.name) get_response().set_title(self.formdef.name)
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<div class="warningnotice"><p>') r += htmltext('<div class="warningnotice"><p>')
r += str(_('This was only a preview: form was not actually submitted.')) r += str(_('This was only a preview: form was not actually submitted.'))

View File

@ -64,10 +64,6 @@ class SubmittedDraftException(Exception):
pass pass
def html_top(title=None, page_title=None):
template.html_top(title=title, default_org=_('Forms'), page_title=page_title)
def tryauth(url): def tryauth(url):
# tries to log the user in before redirecting to the asked url; this won't # 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 # 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) emails.custom_template_email('tracking-code-reminder', data, email, fire_and_forget=True)
return redirect('./load') return redirect('./load')
html_top()
r = TemplateIO(html=True) r = TemplateIO(html=True)
try: try:
tracking_code = get_publisher().tracking_code_class.get(self.code) tracking_code = get_publisher().tracking_code_class.get(self.code)
@ -223,7 +218,7 @@ class TrackingCodeDirectory(Directory):
break break
if not form.is_submitted() or form.has_errors() or bad_content: 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 = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Access rights verification') r += htmltext('<h2>%s</h2>') % _('Access rights verification')
r += htmltext('<p>%s</p>') % ngettext( r += htmltext('<p>%s</p>') % ngettext(
@ -307,9 +302,6 @@ class FormPage(FormdefDirectoryBase, FormTemplateMixin):
url += '?' + get_request().get_query() url += '?' + get_request().get_query()
return redirect(url) return redirect(url)
def html_top(self, *args, **kwargs):
html_top(*args, **kwargs)
def get_substitution_variables(self): def get_substitution_variables(self):
return self.substvars return self.substvars
@ -536,7 +528,7 @@ class FormPage(FormdefDirectoryBase, FormTemplateMixin):
def set_page_title(self): def set_page_title(self):
step_context = self.step_context() step_context = self.step_context()
if len(step_context.get('page_labels')) > 1: if len(step_context.get('page_labels')) > 1:
self.html_top( get_response().set_title(
title=get_publisher().translate(self.formdef.name), title=get_publisher().translate(self.formdef.name),
page_title='%s - %s/%s - %s' page_title='%s - %s/%s - %s'
% ( % (
@ -547,7 +539,7 @@ class FormPage(FormdefDirectoryBase, FormTemplateMixin):
), ),
) )
else: else:
self.html_top( get_response().set_title(
title=get_publisher().translate(self.formdef.name), title=get_publisher().translate(self.formdef.name),
page_title='%s - %s' page_title='%s - %s'
% ( % (
@ -964,7 +956,7 @@ class FormPage(FormdefDirectoryBase, FormTemplateMixin):
if get_session().get_authentication_context() in self.formdef.required_authentication_contexts: if get_session().get_authentication_context() in self.formdef.required_authentication_contexts:
return 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 = TemplateIO(html=True)
r += self.form_side() r += self.form_side()
auth_contexts = get_publisher().get_supported_authentication_contexts() 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) r = TemplateIO(html=True)
session = get_session() session = get_session()
@ -2275,7 +2267,7 @@ class RootDirectory(AccessControlled, Directory):
raise errors.TraversalError() raise errors.TraversalError()
if get_request().is_json(): if get_request().is_json():
return self.categories_json() return self.categories_json()
template.html_top(_('Categories')) get_response().set_title(_('Categories'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
user = get_request().user user = get_request().user
for category in self.get_categories(user): for category in self.get_categories(user):

View File

@ -20,7 +20,6 @@ from quixote.html import TemplateIO, htmltext
from .. import _, get_cfg from .. import _, get_cfg
from ..admin.cfg import cfg_submit from ..admin.cfg import cfg_submit
from ..backoffice.menu import html_top
from ..form import CheckboxWidget, Form, StringWidget, TextWidget, WidgetList from ..form import CheckboxWidget, Form, StringWidget, TextWidget, WidgetList
@ -145,7 +144,7 @@ class EmailsDirectory(Directory):
return redirect('.') return redirect('.')
if not form.is_submitted() or form.has_errors(): 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'))) get_response().breadcrumb.append(('options', _('General Options')))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('General Options') r += htmltext('<h2>%s</h2>') % _('General Options')
@ -178,7 +177,7 @@ class EmailsDirectory(Directory):
return redirect('.') return redirect('.')
def _q_index(self): def _q_index(self):
html_top('settings', title=_('Emails')) get_response().set_title(_('Emails'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Emails') r += htmltext('<h2>%s</h2>') % _('Emails')
@ -255,7 +254,7 @@ class EmailsDirectory(Directory):
form.set_error(cfg_key, _('Invalid template')) form.set_error(cfg_key, _('Invalid template'))
get_response().breadcrumb.append((email_key, email_label)) get_response().breadcrumb.append((email_key, email_label))
html_top('settings', title=_('Emails')) get_response().set_title(_('Emails'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s - %s</h2>') % (_('Email'), email_label) r += htmltext('<h2>%s - %s</h2>') % (_('Email'), email_label)
r += form.render() r += form.render()

View File

@ -16,11 +16,10 @@
import re 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 quixote.html import TemplateIO, htmltext
from .. import _ from .. import _
from ..backoffice.menu import html_top
def _find_vc_version(): def _find_vc_version():
@ -137,8 +136,8 @@ def command_icon(url, type, label=None, popup=False):
) )
def error_page(section, error): def error_page(error):
html_top(section, title=_('Error')) get_response().set_title(_('Error'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<div id="error-page">') r += htmltext('<div id="error-page">')
r += htmltext('<h2>%s</h2>') % _('Error') r += htmltext('<h2>%s</h2>') % _('Error')

View File

@ -21,7 +21,6 @@ from quixote.directory import Directory
from quixote.html import TemplateIO, htmltext from quixote.html import TemplateIO, htmltext
from wcs.qommon import _, ezt, get_cfg 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.form import Form, WysiwygTextWidget
from wcs.qommon.template import Template from wcs.qommon.template import Template
@ -69,11 +68,8 @@ class TextsDirectory(Directory):
'condition': condition, 'condition': condition,
} }
def html_top(self, title):
html_top('settings', title)
def _q_index(self): def _q_index(self):
self.html_top(title=_('Texts')) get_response().set_title(_('Texts'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Custom Texts') r += htmltext('<h2>%s</h2>') % _('Custom Texts')
@ -141,7 +137,7 @@ class TextsDirectory(Directory):
form.set_error(cfg_key, _('Invalid template')) form.set_error(cfg_key, _('Invalid template'))
get_response().breadcrumb.append((text_key, text_label)) get_response().breadcrumb.append((text_key, text_label))
self.html_top(title=_('Texts')) get_response().set_title(_('Texts'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s - %s</h2>') % (_('Text'), text_label) r += htmltext('<h2>%s - %s</h2>') % (_('Text'), text_label)
r += form.render() r += form.render()

View File

@ -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 <http://www.gnu.org/licenses/>.
from .root import BackofficeRootDirectory

View File

@ -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 <http://www.gnu.org/licenses/>.
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(['<script src="%s" type="text/javascript"></script>' % 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())

View File

@ -17,7 +17,7 @@
import urllib.parse import urllib.parse
import quixote import quixote
from quixote import get_publisher from quixote import get_publisher, get_response
from quixote.errors import AccessError, PublishError, TraversalError from quixote.errors import AccessError, PublishError, TraversalError
from quixote.html import TemplateIO, htmltext from quixote.html import TemplateIO, htmltext
@ -86,7 +86,7 @@ class InternalServerError(PublishError):
def render(self): def render(self):
from . import _ from . import _
template.html_top(_('Technical error')) get_response().set_title(_('Technical error'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<p>') r += htmltext('<p>')

View File

@ -33,6 +33,7 @@ class HTTPResponse(quixote.http_response.HTTPResponse):
quixote.http_response.HTTPResponse.__init__(self, charset=charset, **kwargs) quixote.http_response.HTTPResponse.__init__(self, charset=charset, **kwargs)
if not charset: if not charset:
self.charset = get_publisher().site_charset self.charset = get_publisher().site_charset
self.filter = {}
def _gen_cookie_headers(self): def _gen_cookie_headers(self):
return [] return []
@ -189,3 +190,10 @@ class HTTPResponse(quixote.http_response.HTTPResponse):
def process_after_jobs(self): def process_after_jobs(self):
for job in self.after_jobs or []: for job in self.after_jobs or []:
job.run(spool=True) 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

View File

@ -20,7 +20,7 @@ import urllib.parse
import uuid import uuid
from django.utils.encoding import force_bytes 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.directory import Directory
from quixote.errors import QueryError from quixote.errors import QueryError
from quixote.html import TemplateIO, htmltext from quixote.html import TemplateIO, htmltext
@ -29,7 +29,6 @@ from wcs.formdata import flatten_dict
from wcs.workflows import WorkflowStatusItem from wcs.workflows import WorkflowStatusItem
from .. import _, get_cfg, template from .. import _, get_cfg, template
from ..backoffice.menu import html_top
from ..form import ( from ..form import (
CompositeWidget, CompositeWidget,
ComputedExpressionWidget, ComputedExpressionWidget,
@ -232,7 +231,7 @@ class MethodAdminDirectory(Directory):
if 'submit' in get_request().form and form.is_submitted() and not form.has_errors(): if 'submit' in get_request().form and form.is_submitted() and not form.has_errors():
return self.submit(form) return self.submit(form)
html_top('settings', title=self.title) get_response().set_title(self.title)
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % self.title r += htmltext('<h2>%s</h2>') % self.title
fc_callback = pub.get_frontoffice_url() + '/ident/fc/callback' fc_callback = pub.get_frontoffice_url() + '/ident/fc/callback'

View File

@ -31,7 +31,6 @@ from quixote.html import TemplateIO, htmltext
from .. import _, errors, get_cfg, misc, saml2utils, template, x509utils from .. import _, errors, get_cfg, misc, saml2utils, template, x509utils
from ..admin.menu import command_icon from ..admin.menu import command_icon
from ..backoffice.menu import html_top
from ..form import ( from ..form import (
CheckboxWidget, CheckboxWidget,
EmailWidget, EmailWidget,
@ -125,7 +124,7 @@ class MethodDirectory(Directory):
saml = get_publisher().root_directory_class.saml saml = get_publisher().root_directory_class.saml
return saml.perform_login(idp) return saml.perform_login(idp)
template.html_top(_('Login')) get_response().set_title(_('Login'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<p>%s</p>') % _('Select the identity provider you want to use.') r += htmltext('<p>%s</p>') % _('Select the identity provider you want to use.')
r += form.render() r += form.render()
@ -170,7 +169,7 @@ class MethodDirectory(Directory):
return tmp return tmp
get_response().breadcrumb.append(('register', _('New Account'))) get_response().breadcrumb.append(('register', _('New Account')))
template.html_top(_('New Account')) get_response().set_title(_('New Account'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += form.render() r += form.render()
return r.getvalue() return r.getvalue()
@ -211,7 +210,7 @@ class AdminIDPDir(Directory):
return Directory._q_traverse(self, path) return Directory._q_traverse(self, path)
def _q_index(self): def _q_index(self):
html_top('settings', title=self.title) get_response().set_title(self.title)
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Identity Providers') r += htmltext('<h2>%s</h2>') % _('Identity Providers')
r += htmltext('<ul id="nav-idp-admin">\n') r += htmltext('<ul id="nav-idp-admin">\n')
@ -328,7 +327,7 @@ class AdminIDPDir(Directory):
form = self.get_form() form = self.get_form()
if not ('submit' in get_request().form and form.is_submitted()) or form.has_errors(): if not ('submit' in get_request().form and form.is_submitted()) or form.has_errors():
html_top('settings', title=_('New Identity Provider')) get_response().set_title(_('New Identity Provider'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('New Identity Provider') r += htmltext('<h2>%s</h2>') % _('New Identity Provider')
r += form.render() r += form.render()
@ -507,7 +506,7 @@ class AdminIDPDir(Directory):
os.unlink(metadata_pathname) os.unlink(metadata_pathname)
get_response().breadcrumb.append(('new_remote', _('New'))) get_response().breadcrumb.append(('new_remote', _('New')))
html_top('settings', title=_('New Identity Provider')) get_response().set_title(_('New Identity Provider'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('New Identity Provider') r += htmltext('<h2>%s</h2>') % _('New Identity Provider')
r += form.render() r += form.render()
@ -597,7 +596,7 @@ class AdminIDPUI(Directory):
misc.get_abs_path(self.idp.get('publickey')), misc.get_abs_path(self.idp.get('publickey')),
misc.get_abs_path(self.idp.get('cacertchain', None)), misc.get_abs_path(self.idp.get('cacertchain', None)),
) )
html_top('settings', title=_('Identity Provider')) get_response().set_title(_('Identity Provider'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s - %s</h2>') % (_('Identity Provider'), p.providerId) r += htmltext('<h2>%s - %s</h2>') % (_('Identity Provider'), p.providerId)
r += htmltext('<div class="form">') r += htmltext('<div class="form">')
@ -624,7 +623,7 @@ class AdminIDPUI(Directory):
form = AdminIDPDir.get_form(self.idp) form = AdminIDPDir.get_form(self.idp)
if not ('submit' in get_request().form and form.is_submitted()) or form.has_errors(): if not ('submit' in get_request().form and form.is_submitted()) or form.has_errors():
html_top('settings', title=_('Edit Identity Provider')) get_response().set_title(_('Edit Identity Provider'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Edit Identity Provider') r += htmltext('<h2>%s</h2>') % _('Edit Identity Provider')
r += form.render() r += form.render()
@ -655,7 +654,7 @@ class AdminIDPUI(Directory):
if form.get_widget('cancel').parse(): if form.get_widget('cancel').parse():
return redirect('..') return redirect('..')
if not form.is_submitted() or form.has_errors(): if not form.is_submitted() or form.has_errors():
html_top('settings', title=_('Identity Provider')) get_response().set_title(_('Identity Provider'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
if p: if p:
r += htmltext('<h2>%s %s</h2>') % (_('Deleting'), p.providerId) r += htmltext('<h2>%s %s</h2>') % (_('Deleting'), p.providerId)
@ -792,7 +791,7 @@ class MethodAdminDirectory(Directory):
return Directory._q_traverse(self, path) return Directory._q_traverse(self, path)
def _q_index(self): def _q_index(self):
html_top('settings', title=self.title) get_response().set_title(self.title)
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>SAML 2.0</h2>') r += htmltext('<h2>SAML 2.0</h2>')
r += htmltext('<dl> <dt><a href="sp">%s</a></dt> <dd>%s</dd>') % ( r += htmltext('<dl> <dt><a href="sp">%s</a></dt> <dd>%s</dd>') % (
@ -935,7 +934,7 @@ class MethodAdminDirectory(Directory):
else: else:
return redirect('.') return redirect('.')
html_top('settings', title=_('Service Provider Configuration')) get_response().set_title(_('Service Provider Configuration'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Service Provider Configuration') r += htmltext('<h2>%s</h2>') % _('Service Provider Configuration')
r += form.render() r += form.render()
@ -1083,7 +1082,7 @@ class MethodAdminDirectory(Directory):
return redirect('.') return redirect('.')
get_response().breadcrumb.append(('identities', _('Identities Interface'))) get_response().breadcrumb.append(('identities', _('Identities Interface')))
html_top('settings', title=_('Identities Interface')) get_response().set_title(_('Identities Interface'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Identities Interface') r += htmltext('<h2>%s</h2>') % _('Identities Interface')
r += form.render() r += form.render()

View File

@ -26,7 +26,6 @@ from .. import _, emails, errors, get_cfg, misc, ngettext
from .. import storage as st from .. import storage as st
from .. import template from .. import template
from ..admin.emails import EmailsDirectory from ..admin.emails import EmailsDirectory
from ..backoffice.menu import html_top
from ..form import ( from ..form import (
CheckboxWidget, CheckboxWidget,
CompositeWidget, CompositeWidget,
@ -165,11 +164,11 @@ class TokenDirectory(Directory):
r = TemplateIO(html=True) r = TemplateIO(html=True)
if self.token.type is None: if self.token.type is None:
template.html_top(_('Invalid Token')) get_response().set_title(_('Invalid Token'))
r += TextsDirectory.get_html_text('invalid-password-token') r += TextsDirectory.get_html_text('invalid-password-token')
elif self.token.type == 'account-confirmation': elif self.token.type == 'account-confirmation':
template.html_top(_('Account Creation Confirmed')) get_response().set_title(_('Account Creation Confirmed'))
account = PasswordAccount.get(self.token.context['username']) account = PasswordAccount.get(self.token.context['username'])
account.awaiting_confirmation = False account.awaiting_confirmation = False
account.store() account.store()
@ -229,7 +228,7 @@ class MethodDirectory(Directory):
return tmp return tmp
get_response().breadcrumb.append(('login', _('Login'))) get_response().breadcrumb.append(('login', _('Login')))
template.html_top(_('Login')) get_response().set_title(_('Login'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<div class="ident-content">') r += htmltext('<div class="ident-content">')
r += htmltext('<div id="login">') r += htmltext('<div id="login">')
@ -326,7 +325,7 @@ class MethodDirectory(Directory):
r = TemplateIO(html=True) r = TemplateIO(html=True)
if not include_mode: if not include_mode:
get_response().breadcrumb.append(('forgotten', _('Forgotten password'))) get_response().breadcrumb.append(('forgotten', _('Forgotten password')))
template.html_top(_('Forgotten password')) get_response().set_title(_('Forgotten password'))
r += htmltext('<div class="ident-content">') r += htmltext('<div class="ident-content">')
r += TextsDirectory.get_html_text('password-forgotten-enter-username') r += TextsDirectory.get_html_text('password-forgotten-enter-username')
@ -372,7 +371,7 @@ class MethodDirectory(Directory):
return None return None
def forgotten_token_sent(): def forgotten_token_sent():
template.html_top(_('Forgotten Password')) get_response().set_title(_('Forgotten Password'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<div class="ident-content">') r += htmltext('<div class="ident-content">')
r += TextsDirectory.get_html_text('password-forgotten-token-sent') r += TextsDirectory.get_html_text('password-forgotten-token-sent')
@ -398,7 +397,7 @@ class MethodDirectory(Directory):
) )
if action == 'cxlpw': if action == 'cxlpw':
template.html_top(_('Password Change')) get_response().set_title(_('Password Change'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<div class="ident-content">') r += htmltext('<div class="ident-content">')
r += htmltext('<h1>%s</h1>') % _('Request Cancelled') r += htmltext('<h1>%s</h1>') % _('Request Cancelled')
@ -445,7 +444,7 @@ class MethodDirectory(Directory):
return tmp return tmp
return redirect('login/') return redirect('login/')
template.html_top(_('Password Change')) get_response().set_title(_('Password Change'))
get_request().form = {} get_request().form = {}
return form.render() return form.render()
@ -481,7 +480,7 @@ class MethodDirectory(Directory):
def forgotten_token_end_page(self): def forgotten_token_end_page(self):
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<div class="ident-content">') r += htmltext('<div class="ident-content">')
r += template.html_top(_('New password sent by email')) r += str(_('New password sent by email'))
r += htmltext('</div>') r += htmltext('</div>')
return r.getvalue() return r.getvalue()
@ -536,7 +535,7 @@ class MethodDirectory(Directory):
return tmp return tmp
get_response().breadcrumb.append(('register', _('New Account'))) get_response().breadcrumb.append(('register', _('New Account')))
template.html_top(_('New Account')) get_response().set_title(_('New Account'))
r += htmltext('<div class="ident-content">') r += htmltext('<div class="ident-content">')
r += TextsDirectory.get_html_text('new-account') r += TextsDirectory.get_html_text('new-account')
r += form.render() r += form.render()
@ -638,7 +637,7 @@ class MethodDirectory(Directory):
def confirmation_notification(self, account, user, password): def confirmation_notification(self, account, user, password):
self.email_confirmation_notification(account, user, password) self.email_confirmation_notification(account, user, password)
template.html_top(_('Email sent')) get_response().set_title(_('Email sent'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<div class="ident-content">') r += htmltext('<div class="ident-content">')
r += TextsDirectory.get_html_text('email-sent-confirm-creation') r += TextsDirectory.get_html_text('email-sent-confirm-creation')
@ -680,7 +679,7 @@ class MethodAdminDirectory(Directory):
_q_exports = ['', 'passwords', 'identities'] _q_exports = ['', 'passwords', 'identities']
def _q_index(self): def _q_index(self):
html_top('settings', title=ADMIN_TITLE) get_response().set_title(ADMIN_TITLE)
get_response().breadcrumb.append(('password/', ADMIN_TITLE)) get_response().breadcrumb.append(('password/', ADMIN_TITLE))
r = TemplateIO(html=True) r = TemplateIO(html=True)
@ -778,7 +777,7 @@ class MethodAdminDirectory(Directory):
self.passwords_submit(form) self.passwords_submit(form)
return redirect('.') return redirect('.')
html_top('settings', title=_('Passwords')) get_response().set_title(_('Passwords'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Passwords') r += htmltext('<h2>%s</h2>') % _('Passwords')
r += form.render() r += form.render()
@ -847,7 +846,7 @@ class MethodAdminDirectory(Directory):
self.identities_submit(form) self.identities_submit(form)
return redirect('.') return redirect('.')
html_top('settings', title=_('Identities Interface')) get_response().set_title(_('Identities Interface'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Identities Interface') r += htmltext('<h2>%s</h2>') % _('Identities Interface')
r += form.render() r += form.render()
@ -932,7 +931,7 @@ class MethodUserDirectory(Directory):
return actions return actions
def email(self): def email(self):
html_top('users', title=ADMIN_TITLE) get_response().set_title(title=ADMIN_TITLE)
r = TemplateIO(html=True) r = TemplateIO(html=True)
get_response().breadcrumb.append(('email', 'Email Password')) get_response().breadcrumb.append(('email', 'Email Password'))
r += htmltext('<h2>%s</h2>') % _('Email Password') r += htmltext('<h2>%s</h2>') % _('Email Password')

View File

@ -20,7 +20,7 @@ from quixote.html import TemplateIO, htmltext
from wcs.qommon.admin.texts import TextsDirectory from wcs.qommon.admin.texts import TextsDirectory
from . import _, errors, get_cfg, template from . import _, errors, get_cfg
from .form import Form, HtmlWidget, PasswordWidget from .form import Form, HtmlWidget, PasswordWidget
from .ident.password import check_password from .ident.password import check_password
from .ident.password_accounts import PasswordAccount from .ident.password_accounts import PasswordAccount
@ -55,7 +55,7 @@ class MyspaceDirectory(Directory):
if not user: if not user:
raise errors.AccessUnauthorizedError() raise errors.AccessUnauthorizedError()
template.html_top(_('My Space')) get_response().set_title(_('My Space'))
r = TemplateIO(html=True) r = TemplateIO(html=True)
if user.can_go_in_admin() or user.can_go_in_backoffice(): if user.can_go_in_admin() or user.can_go_in_backoffice():
@ -118,7 +118,7 @@ class MyspaceDirectory(Directory):
self.profile_submit(form, formdef) self.profile_submit(form, formdef)
return redirect('.') return redirect('.')
template.html_top(_('Edit Profile')) get_response().set_title(_('Edit Profile'))
return form.render() return form.render()
def profile_submit(self, form, formdef): def profile_submit(self, form, formdef):
@ -164,7 +164,7 @@ class MyspaceDirectory(Directory):
account.store() account.store()
return redirect('.') return redirect('.')
template.html_top(_('Change Password')) get_response().set_title(_('Change Password'))
return form.render() return form.render()
def remove(self): def remove(self):
@ -192,7 +192,7 @@ class MyspaceDirectory(Directory):
get_session_manager().expire_session() get_session_manager().expire_session()
return redirect(get_publisher().get_root_url()) return redirect(get_publisher().get_root_url())
template.html_top(_('Removing Account')) get_response().set_title(_('Removing Account'))
return form.render() return form.render()

View File

@ -40,7 +40,7 @@ from quixote.http_request import parse_header
from . import _, errors, force_str, misc from . import _, errors, force_str, misc
from .publisher import get_cfg, get_logger from .publisher import get_cfg, get_logger
from .template import QommonTemplateResponse, error_page, html_top from .template import QommonTemplateResponse, error_page
class SOAPException(Exception): class SOAPException(Exception):
@ -807,7 +807,7 @@ class Saml2Directory(Directory):
request = get_request() request = get_request()
if request.get_method() == 'POST': if request.get_method() == 'POST':
return self.perform_login(relay_state=request.form.get('RelayState')) return self.perform_login(relay_state=request.form.get('RelayState'))
html_top(title=_('Authentication error')) get_response().set_title(_('Authentication error'))
return QommonTemplateResponse(templates=['qommon/saml-error.html'], context={}) return QommonTemplateResponse(templates=['qommon/saml-error.html'], context={})
# retain compatibility with old metadatas # retain compatibility with old metadatas

View File

@ -49,27 +49,16 @@ def get_theme_directory(theme_id):
return location return location
def html_top(title=None, default_org=None, page_title=None):
if not hasattr(get_response(), 'filter'):
get_response().filter = {}
get_response().filter['title'] = title
get_response().filter['default_org'] = default_org
get_response().filter['page_title'] = page_title
def error_page(error_message, error_title=None, location_hint=None): def error_page(error_message, error_title=None, location_hint=None):
from . import _ from . import _
if not error_title: if not error_title:
error_title = _('Error') error_title = _('Error')
kwargs = {'title': error_title} get_response().set_title(error_title)
if get_request().is_in_backoffice() and get_request().user and get_request().user.can_go_in_backoffice(): if get_request().is_in_backoffice() and get_request().user and get_request().user.can_go_in_backoffice():
from wcs.qommon.backoffice.menu import html_top as backoffice_html_top
get_response().add_javascript(['jquery.js', 'qommon.js', 'gadjo.js']) get_response().add_javascript(['jquery.js', 'qommon.js', 'gadjo.js'])
backoffice_html_top(section='', **kwargs)
context = get_decorate_vars('', get_response()) context = get_decorate_vars('', get_response())
context['error_message'] = error_message context['error_message'] = error_message
@ -78,7 +67,6 @@ def error_page(error_message, error_title=None, location_hint=None):
) )
r = TemplateIO(html=True) r = TemplateIO(html=True)
html_top(**kwargs)
r += htmltext('<div class="error-page">') r += htmltext('<div class="error-page">')
r += htmltext('<p>%s</p>') % error_message r += htmltext('<p>%s</p>') % error_message
continue_link = htmltext('<a href="%s">%s</a>') % (get_publisher().get_root_url(), _('the homepage')) continue_link = htmltext('<a href="%s">%s</a>') % (get_publisher().get_root_url(), _('the homepage'))
@ -142,10 +130,14 @@ def get_decorate_vars(body, response, generate_breadcrumb=True, **kwargs):
theme_url = '%sthemes/%s' % (root_url, current_theme) theme_url = '%sthemes/%s' % (root_url, current_theme)
is_in_backoffice = response.filter.get('admin_ezt') is_in_backoffice = response.filter.get('backoffice_page')
if is_in_backoffice: if is_in_backoffice:
header_menu = kwargs.get('header_menu') header_menu = (
get_publisher()
.get_backoffice_root()
.generate_header_menu(selected=kwargs.get('backoffice_section'))
)
user_info = kwargs.get('user_info') user_info = kwargs.get('user_info')
page_title = kwargs.get('title', '') page_title = kwargs.get('title', '')
subtitle = kwargs.get('subtitle') subtitle = kwargs.get('subtitle')

View File

@ -291,8 +291,8 @@ class RootDirectory(Directory):
return output return output
response = get_response() response = get_response()
if not hasattr(response, 'filter'): if not response.filter:
response.filter = {} response.filter = {'default_org': _('Forms')}
if not hasattr(response, 'breadcrumb'): if not hasattr(response, 'breadcrumb'):
response.breadcrumb = [('', _('Home'))] response.breadcrumb = [('', _('Home'))]

View File

@ -15,7 +15,7 @@
<link rel="stylesheet" type="text/css" media="all" href="{{ STATIC_URL }}css/dc2/admin.css?{% version_hash %}"/> <link rel="stylesheet" type="text/css" media="all" href="{{ STATIC_URL }}css/dc2/admin.css?{% version_hash %}"/>
{% endblock %} {% endblock %}
{% block bodyargs %}class="section-{{section}} {% if admin_for_all %}admin-for-all{% endif %}"{% endblock %} {% block bodyargs %}class="section-{{backoffice_section}} {% if admin_for_all %}admin-for-all{% endif %}"{% endblock %}
{% block logout-url %}{{ publisher.get_root_url }}logout{% endblock %} {% block logout-url %}{{ publisher.get_root_url }}logout{% endblock %}

View File

@ -35,7 +35,7 @@ class Backoffice(compat.TemplateWithFallbackView):
_request = None _request = None
with compat.request(self.request): with compat.request(self.request):
get_request().response.filter = {'admin_ezt': True} get_request().response.filter = {'backoffice_page': True}
body = get_publisher().try_publish(get_request()) body = get_publisher().try_publish(get_request())
if isinstance(body, template.QommonTemplateResponse): if isinstance(body, template.QommonTemplateResponse):
body.add_media() body.add_media()

View File

@ -251,7 +251,7 @@ class FormWorkflowStatusItem(WorkflowStatusItem):
if self.formdef.max_field_id is None and self.formdef.fields: if self.formdef.max_field_id is None and self.formdef.fields:
self.formdef.max_field_id = max(lax_int(x.id) for x in self.formdef.fields) self.formdef.max_field_id = max(lax_int(x.id) for x in self.formdef.fields)
def q_admin_lookup(self, workflow, status, component, html_top): def q_admin_lookup(self, workflow, status, component):
if component == 'fields': if component == 'fields':
if not self.formdef: if not self.formdef:
self.formdef = WorkflowFormFieldsFormDef(item=self) self.formdef = WorkflowFormFieldsFormDef(item=self)
@ -260,7 +260,6 @@ class FormWorkflowStatusItem(WorkflowStatusItem):
fields_directory = WorkflowFormFieldsDirectory(self.formdef) fields_directory = WorkflowFormFieldsDirectory(self.formdef)
if self.varname: if self.varname:
fields_directory.field_var_prefix = 'form_workflow_form_%s_var_' % self.varname fields_directory.field_var_prefix = 'form_workflow_form_%s_var_' % self.varname
fields_directory.html_top = html_top
return fields_directory return fields_directory
return None return None

View File

@ -2942,7 +2942,7 @@ class WorkflowStatusItem(XmlSerialisable):
# backward compatibility # backward compatibility
self.condition = {'type': 'python', 'value': xml_node_text(node)} self.condition = {'type': 'python', 'value': xml_node_text(node)}
def q_admin_lookup(self, workflow, status, component, html_top): def q_admin_lookup(self, workflow, status, component):
return None return None
def __getstate__(self): def __getstate__(self):