misc: replace html_top by response methods (#77144)
gitea/wcs/pipeline/head This commit looks good
Details
gitea/wcs/pipeline/head This commit looks good
Details
This commit is contained in:
parent
886225ffff
commit
df35bc818f
|
@ -22,7 +22,6 @@ from quixote.html import TemplateIO, htmltext
|
|||
|
||||
from wcs.api_access import ApiAccess
|
||||
from wcs.qommon import _, errors, template
|
||||
from wcs.qommon.backoffice.menu import html_top
|
||||
from wcs.qommon.form import (
|
||||
CheckboxWidget,
|
||||
Form,
|
||||
|
@ -130,7 +129,7 @@ class ApiAccessPage(Directory):
|
|||
get_response().breadcrumb.append((component + '/', self.api_access.name))
|
||||
|
||||
def _q_index(self):
|
||||
html_top('api-accesss', title=self.api_access.name)
|
||||
get_response().set_title(self.api_access.name)
|
||||
return template.QommonTemplateResponse(
|
||||
templates=['wcs/backoffice/api_access.html'],
|
||||
context={'view': self, 'api_access': self.api_access},
|
||||
|
@ -150,7 +149,7 @@ class ApiAccessPage(Directory):
|
|||
return redirect('../%s/' % self.api_access.id)
|
||||
|
||||
get_response().breadcrumb.append(('edit', _('Edit')))
|
||||
html_top('api-access', title=_('Edit API access'))
|
||||
get_response().set_title(_('Edit API access'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Edit API access')
|
||||
r += form.render()
|
||||
|
@ -167,7 +166,7 @@ class ApiAccessPage(Directory):
|
|||
return redirect('..')
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
get_response().breadcrumb.append(('delete', _('Delete')))
|
||||
html_top('api_accesss', title=_('Delete API access'))
|
||||
get_response().set_title(_('Delete API access'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s %s</h2>') % (_('Deleting API access:'), self.api_access.name)
|
||||
r += form.render()
|
||||
|
@ -182,10 +181,11 @@ class ApiAccessDirectory(Directory):
|
|||
|
||||
def _q_traverse(self, path):
|
||||
get_response().breadcrumb.append(('api-access/', _('API access')))
|
||||
get_response().set_backoffice_section('api-access')
|
||||
return super()._q_traverse(path)
|
||||
|
||||
def _q_index(self):
|
||||
html_top('api-access', title=_('API access'))
|
||||
get_response().set_title(_('API access'))
|
||||
return template.QommonTemplateResponse(
|
||||
templates=['wcs/backoffice/api_accesses.html'],
|
||||
context={'view': self, 'api_accesses': ApiAccess.select(order_by='name')},
|
||||
|
@ -206,7 +206,7 @@ class ApiAccessDirectory(Directory):
|
|||
else:
|
||||
return redirect('.')
|
||||
|
||||
html_top('api-access', title=_('New API access'))
|
||||
get_response().set_title(_('New API access'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('New API access')
|
||||
r += form.render()
|
||||
|
|
|
@ -27,7 +27,6 @@ from wcs.blocks import BlockDef, BlockdefImportError
|
|||
from wcs.categories import BlockCategory
|
||||
from wcs.formdef import UpdateStatisticsDataAfterJob
|
||||
from wcs.qommon import _, misc, template
|
||||
from wcs.qommon.backoffice.menu import html_top
|
||||
from wcs.qommon.errors import AccessForbiddenError, TraversalError
|
||||
from wcs.qommon.form import FileWidget, Form, HtmlWidget, SingleSelectWidget, SlugWidget, StringWidget
|
||||
|
||||
|
@ -65,11 +64,10 @@ class BlockDirectory(FieldsDirectory):
|
|||
fields_count_total_soft_limit = 30
|
||||
fields_count_total_hard_limit = 60
|
||||
|
||||
def __init__(self, section='forms', *args, **kwargs):
|
||||
def __init__(self, *args, **kwargs):
|
||||
kwargs.pop('component', None) # snapshot
|
||||
if 'instance' in kwargs:
|
||||
kwargs['objectdef'] = kwargs.pop('instance')
|
||||
self.section = section
|
||||
super().__init__(*args, **kwargs)
|
||||
self.snapshots_dir = SnapshotsDirectory(self.objectdef)
|
||||
|
||||
|
@ -136,7 +134,7 @@ class BlockDirectory(FieldsDirectory):
|
|||
return redirect('..')
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
get_response().breadcrumb.append(('delete', _('Delete')))
|
||||
html_top(self.section, title=_('Delete Block'))
|
||||
get_response().set_title(_('Delete Block'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s %s</h2>') % (_('Deleting Block:'), self.objectdef.name)
|
||||
r += form.render()
|
||||
|
@ -164,7 +162,7 @@ class BlockDirectory(FieldsDirectory):
|
|||
name_widget.set_value(new_name)
|
||||
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
html_top(self.section, title=_('Duplicate Fields Block'))
|
||||
get_response().set_title(_('Duplicate Fields Block'))
|
||||
r = TemplateIO(html=True)
|
||||
get_response().breadcrumb.append(('duplicate', _('Duplicate')))
|
||||
r += htmltext('<h2>%s</h2>') % _('Duplicate Fields Block')
|
||||
|
@ -244,14 +242,14 @@ class BlockDirectory(FieldsDirectory):
|
|||
self.objectdef.store()
|
||||
return redirect('.')
|
||||
|
||||
html_top(self.section, title=_('Settings'))
|
||||
get_response().set_title(_('Settings'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Settings')
|
||||
r += form.render()
|
||||
return r.getvalue()
|
||||
|
||||
def inspect(self):
|
||||
self.html_top(self.objectdef.name)
|
||||
get_response().set_title(self.objectdef.name)
|
||||
get_response().breadcrumb.append(('inspect', _('Inspector')))
|
||||
return self.render_inspect()
|
||||
|
||||
|
@ -267,9 +265,8 @@ class BlocksDirectory(Directory):
|
|||
do_not_call_in_templates = True
|
||||
categories = BlockCategoriesDirectory()
|
||||
|
||||
def __init__(self, section):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.section = section
|
||||
self.applications_dir = ApplicationsDirectory(BlockDef.xml_root_node)
|
||||
|
||||
def _q_traverse(self, path):
|
||||
|
@ -283,12 +280,12 @@ class BlocksDirectory(Directory):
|
|||
block = BlockDef.get(component)
|
||||
except KeyError:
|
||||
raise TraversalError()
|
||||
return BlockDirectory(self.section, block)
|
||||
return BlockDirectory(block)
|
||||
|
||||
def _q_index(self):
|
||||
from wcs.applications import Application
|
||||
|
||||
html_top(self.section, title=_('Fields Blocks'))
|
||||
get_response().set_title(_('Fields Blocks'))
|
||||
get_response().add_javascript(['popup.js'])
|
||||
context = {
|
||||
'view': self,
|
||||
|
@ -341,7 +338,7 @@ class BlocksDirectory(Directory):
|
|||
return redirect('%s/' % block.id)
|
||||
|
||||
get_response().breadcrumb.append(('new', _('New Fields Block')))
|
||||
html_top(self.section, title=_('New Fields Block'))
|
||||
get_response().set_title(_('New Fields Block'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('New Fields Block')
|
||||
r += form.render()
|
||||
|
@ -364,7 +361,7 @@ class BlocksDirectory(Directory):
|
|||
pass
|
||||
|
||||
get_response().breadcrumb.append(('import', _('Import')))
|
||||
html_top(self.section, title=_('Import Fields Block'))
|
||||
get_response().set_title(_('Import Fields Block'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Import Fields Block')
|
||||
r += htmltext('<p>%s</p>') % _('You can install a new fields block by uploading a file.')
|
||||
|
|
|
@ -37,7 +37,6 @@ from wcs.data_sources import NamedDataSource
|
|||
from wcs.formdef import FormDef
|
||||
from wcs.mail_templates import MailTemplate
|
||||
from wcs.qommon import _, misc, template
|
||||
from wcs.qommon.backoffice.menu import html_top
|
||||
from wcs.qommon.errors import AccessForbiddenError, TraversalError
|
||||
from wcs.qommon.form import Form, HtmlWidget, SingleSelectWidget, StringWidget, WidgetList, WysiwygTextWidget
|
||||
from wcs.workflows import Workflow
|
||||
|
@ -215,7 +214,7 @@ class CategoryPage(Directory):
|
|||
get_response().breadcrumb.append((component + '/', self.category.name))
|
||||
|
||||
def _q_index(self):
|
||||
html_top('categories', title=self.category.name)
|
||||
get_response().set_title(self.category.name)
|
||||
get_response().add_javascript(['popup.js'])
|
||||
get_response().filter['sidebar'] = self.get_sidebar()
|
||||
return template.QommonTemplateResponse(
|
||||
|
@ -253,7 +252,7 @@ class CategoryPage(Directory):
|
|||
return redirect('..')
|
||||
|
||||
get_response().breadcrumb.append(('edit', _('Edit')))
|
||||
html_top('categories', title=_('Edit Category'))
|
||||
get_response().set_title(_('Edit Category'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Edit Category')
|
||||
r += form.render()
|
||||
|
@ -268,7 +267,7 @@ class CategoryPage(Directory):
|
|||
return redirect('.')
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
get_response().breadcrumb.append(('delete', _('Delete')))
|
||||
html_top('categories', title=_('Delete Category'))
|
||||
get_response().set_title(_('Delete Category'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s %s</h2>') % (_('Deleting Category:'), self.category.name)
|
||||
r += form.render()
|
||||
|
@ -296,7 +295,7 @@ class CategoryPage(Directory):
|
|||
return redirect('.')
|
||||
|
||||
get_response().breadcrumb.append(('description', _('Description')))
|
||||
html_top('categories', title=_('Edit Category Description'))
|
||||
get_response().set_title(_('Edit Category Description'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Edit Category Description')
|
||||
r += form.render()
|
||||
|
@ -377,7 +376,7 @@ class CategoriesDirectory(Directory):
|
|||
from wcs.applications import Application
|
||||
|
||||
get_response().add_javascript(['biglist.js', 'qommon.wysiwyg.js', 'popup.js'])
|
||||
html_top('categories', title=_('Categories'))
|
||||
get_response().set_title(_('Categories'))
|
||||
categories = self.category_class.select()
|
||||
self.category_class.sort_by_position(categories)
|
||||
Application.populate_objects(categories)
|
||||
|
@ -420,7 +419,7 @@ class CategoriesDirectory(Directory):
|
|||
else:
|
||||
return redirect('.')
|
||||
|
||||
html_top('categories', title=_('New Category'))
|
||||
get_response().set_title(_('New Category'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('New Category')
|
||||
r += form.render()
|
||||
|
|
|
@ -25,7 +25,6 @@ from wcs.backoffice.snapshots import SnapshotsDirectory
|
|||
from wcs.categories import CommentTemplateCategory
|
||||
from wcs.comment_templates import CommentTemplate
|
||||
from wcs.qommon import _, errors, misc, template
|
||||
from wcs.qommon.backoffice.menu import html_top
|
||||
from wcs.qommon.form import (
|
||||
ComputedExpressionWidget,
|
||||
FileWidget,
|
||||
|
@ -61,7 +60,7 @@ class CommentTemplatesDirectory(Directory):
|
|||
def _q_index(self):
|
||||
from wcs.applications import Application
|
||||
|
||||
html_top('comment_templates', title=_('Comment Templates'))
|
||||
get_response().set_title(_('Comment Templates'))
|
||||
get_response().add_javascript(['popup.js'])
|
||||
comment_templates = CommentTemplate.select(order_by='name')
|
||||
Application.populate_objects(comment_templates)
|
||||
|
@ -114,7 +113,7 @@ class CommentTemplatesDirectory(Directory):
|
|||
return redirect('%s/edit' % comment_template.id)
|
||||
|
||||
get_response().breadcrumb.append(('new', _('New Comment Template')))
|
||||
html_top('comment_templates', title=_('New Comment Template'))
|
||||
get_response().set_title(_('New Comment Template'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('New Comment Template')
|
||||
r += form.render()
|
||||
|
@ -138,7 +137,7 @@ class CommentTemplatesDirectory(Directory):
|
|||
pass
|
||||
|
||||
get_response().breadcrumb.append(('import', _('Import')))
|
||||
html_top('comment_templates', title=import_title)
|
||||
get_response().set_title(import_title)
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % import_title
|
||||
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()
|
||||
|
||||
def _q_index(self):
|
||||
html_top('comment_templates', title=self.comment_template.name)
|
||||
get_response().set_title(self.comment_template.name)
|
||||
get_response().filter['sidebar'] = self.get_sidebar()
|
||||
return template.QommonTemplateResponse(
|
||||
templates=['wcs/backoffice/comment-template.html'],
|
||||
|
@ -309,7 +308,7 @@ class CommentTemplatePage(Directory):
|
|||
return redirect('.')
|
||||
|
||||
get_response().breadcrumb.append(('edit', _('Edit')))
|
||||
html_top('comment_templates', title=_('Edit Comment Template'))
|
||||
get_response().set_title(_('Edit Comment Template'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Edit Comment Template')
|
||||
r += form.render()
|
||||
|
@ -333,7 +332,7 @@ class CommentTemplatePage(Directory):
|
|||
return redirect('.')
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
get_response().breadcrumb.append(('delete', _('Delete')))
|
||||
html_top('comment_templates', title=_('Delete Comment Template'))
|
||||
get_response().set_title(_('Delete Comment Template'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s %s</h2>') % (_('Deleting Comment Template:'), self.comment_template.name)
|
||||
r += form.render()
|
||||
|
@ -368,7 +367,7 @@ class CommentTemplatePage(Directory):
|
|||
name_widget.set_value(new_name)
|
||||
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
html_top('comment_templates', title=_('Duplicate Comment Template'))
|
||||
get_response().set_title(_('Duplicate Comment Template'))
|
||||
r = TemplateIO(html=True)
|
||||
get_response().breadcrumb.append(('duplicate', _('Duplicate')))
|
||||
r += htmltext('<h2>%s</h2>') % _('Duplicate Comment Template')
|
||||
|
|
|
@ -33,7 +33,6 @@ from wcs.data_sources import (
|
|||
)
|
||||
from wcs.formdef import get_formdefs_of_all_kinds
|
||||
from wcs.qommon import _, errors, misc, pgettext, template
|
||||
from wcs.qommon.backoffice.menu import html_top
|
||||
from wcs.qommon.errors import AccessForbiddenError
|
||||
from wcs.qommon.form import (
|
||||
CheckboxWidget,
|
||||
|
@ -341,7 +340,7 @@ class NamedDataSourcePage(Directory):
|
|||
return r.getvalue()
|
||||
|
||||
def _q_index(self):
|
||||
html_top('datasources', title=self.datasource.name)
|
||||
get_response().set_title(self.datasource.name)
|
||||
get_response().filter['sidebar'] = self.get_sidebar()
|
||||
url = None
|
||||
if self.datasource.data_source and self.datasource.data_source.get('type') in (
|
||||
|
@ -426,7 +425,7 @@ class NamedDataSourcePage(Directory):
|
|||
return redirect('.')
|
||||
|
||||
get_response().breadcrumb.append(('edit', _('Edit')))
|
||||
html_top('datasources', title=_('Edit Data Source'))
|
||||
get_response().set_title(_('Edit Data Source'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Edit Data Source')
|
||||
r += form.render()
|
||||
|
@ -448,7 +447,7 @@ class NamedDataSourcePage(Directory):
|
|||
return redirect('..')
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
get_response().breadcrumb.append(('delete', _('Delete')))
|
||||
html_top('datasources', title=_('Delete Data Source'))
|
||||
get_response().set_title(_('Delete Data Source'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s %s</h2>') % (_('Deleting Data Source:'), self.datasource.name)
|
||||
r += form.render()
|
||||
|
@ -475,7 +474,7 @@ class NamedDataSourcePage(Directory):
|
|||
return redirect('.')
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
get_response().breadcrumb.append(('duplicate', _('Duplicate')))
|
||||
html_top('datasources', title=_('Duplicate Data Source'))
|
||||
get_response().set_title(_('Duplicate Data Source'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s %s</h2>') % (_('Duplicating Data Source:'), self.datasource.name)
|
||||
r += form.render()
|
||||
|
@ -520,7 +519,7 @@ class NamedDataSourcesDirectory(Directory):
|
|||
def _q_index(self):
|
||||
from wcs.applications import Application
|
||||
|
||||
html_top('datasources', title=_('Data Sources'))
|
||||
get_response().set_title(_('Data Sources'))
|
||||
get_response().add_javascript(['popup.js'])
|
||||
context = {
|
||||
'view': self,
|
||||
|
@ -599,7 +598,7 @@ class NamedDataSourcesDirectory(Directory):
|
|||
else:
|
||||
return redirect('.')
|
||||
|
||||
html_top('datasources', title=title)
|
||||
get_response().set_title(title)
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % title
|
||||
r += form.render()
|
||||
|
@ -637,7 +636,7 @@ class NamedDataSourcesDirectory(Directory):
|
|||
pass
|
||||
|
||||
get_response().breadcrumb.append(('import', _('Import')))
|
||||
html_top('datasources', title=import_title)
|
||||
get_response().set_title(import_title)
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % import_title
|
||||
r += htmltext('<p>%s</p>') % _('You can install a new data source by uploading a file.')
|
||||
|
|
|
@ -28,7 +28,6 @@ from wcs.fields import BlockField, get_field_options
|
|||
from wcs.formdef import FormDef, UpdateStatisticsDataAfterJob
|
||||
from wcs.qommon import _, errors, get_cfg, misc
|
||||
from wcs.qommon.admin.menu import command_icon
|
||||
from wcs.qommon.backoffice.menu import html_top
|
||||
from wcs.qommon.form import CheckboxWidget, Form, HtmlWidget, OptGroup, SingleSelectWidget, StringWidget
|
||||
from wcs.qommon.substitution import CompatibilityNamesDict
|
||||
|
||||
|
@ -89,7 +88,7 @@ class FieldDefPage(Directory):
|
|||
redo = True
|
||||
|
||||
if redo or not form.get_submit() == 'submit':
|
||||
self.html_top(self.objectdef.name)
|
||||
get_response().set_title(self.objectdef.name)
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2 class="field-edit--title">%s</h2>') % misc.ellipsize(
|
||||
self.field.unhtmled_label, 80
|
||||
|
@ -194,7 +193,7 @@ class FieldDefPage(Directory):
|
|||
return self.redirect_field_anchor(self.field)
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
get_response().breadcrumb.append(('delete', _('Delete')))
|
||||
self.html_top(title=remove_top_title)
|
||||
get_response().set_title(title=remove_top_title)
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % remove_title
|
||||
r += form.render()
|
||||
|
@ -257,7 +256,7 @@ class FieldDefPage(Directory):
|
|||
return self.redirect_field_anchor(self.field)
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
get_response().breadcrumb.append(('duplicate', _('Duplicate')))
|
||||
self.html_top(title=duplicate_top_title)
|
||||
get_response().set_title(title=duplicate_top_title)
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % duplicate_title
|
||||
r += form.render()
|
||||
|
@ -295,7 +294,6 @@ class FieldsPagesDirectory(Directory):
|
|||
def _q_lookup(self, component):
|
||||
directory = FieldsDirectory(self.parent.objectdef)
|
||||
directory.field_var_prefix = self.parent.field_var_prefix
|
||||
directory.html_top = self.parent.html_top
|
||||
try:
|
||||
directory.page_id = str(component)
|
||||
except ValueError:
|
||||
|
@ -317,9 +315,6 @@ class FieldsDirectory(Directory):
|
|||
fields_count_total_soft_limit = 200
|
||||
fields_count_total_hard_limit = 400
|
||||
|
||||
def html_top(self, title, *args, **kwargs):
|
||||
html_top(self.section, title, *args, **kwargs)
|
||||
|
||||
def __init__(self, objectdef):
|
||||
self.objectdef = objectdef
|
||||
self.pages = FieldsPagesDirectory(self)
|
||||
|
@ -333,12 +328,11 @@ class FieldsDirectory(Directory):
|
|||
|
||||
def _q_lookup(self, component):
|
||||
d = self.field_def_page_class(self.objectdef, component)
|
||||
d.html_top = self.html_top
|
||||
d.page_id = self.page_id
|
||||
return d
|
||||
|
||||
def _q_index(self):
|
||||
self.html_top(self.objectdef.name)
|
||||
get_response().set_title(self.objectdef.name)
|
||||
get_response().add_javascript(['jquery.js', 'jquery-ui.js', 'biglist.js'])
|
||||
|
||||
r = TemplateIO(html=True)
|
||||
|
|
|
@ -36,7 +36,6 @@ from wcs.formdef import (
|
|||
)
|
||||
from wcs.forms.root import qrcode
|
||||
from wcs.qommon import _, force_str, misc, pgettext_lazy, template
|
||||
from wcs.qommon.backoffice.menu import html_top
|
||||
from wcs.qommon.errors import AccessForbiddenError, TraversalError
|
||||
from wcs.qommon.form import (
|
||||
CheckboxesWidget,
|
||||
|
@ -535,7 +534,7 @@ class OptionsDirectory(Directory):
|
|||
self.formdef.store(comment=_('Changed "%s" parameters') % title)
|
||||
return redirect('..')
|
||||
|
||||
html_top('forms', title=self.formdef.name)
|
||||
get_response().set_title(self.formdef.name)
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % title
|
||||
r += form.render()
|
||||
|
@ -587,7 +586,7 @@ class WorkflowRoleDirectory(Directory):
|
|||
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
get_response().breadcrumb.append(('role/%s' % component, _('Workflow Role')))
|
||||
self.html_top(title=self.formdef.name)
|
||||
get_response().set_title(title=self.formdef.name)
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Role')
|
||||
r += htmltext('<p>%s</p>') % self.formdef.workflow.roles.get(component)
|
||||
|
@ -663,9 +662,7 @@ class FormDefPage(Directory):
|
|||
if component:
|
||||
get_response().breadcrumb.append((component + '/', self.formdef.name))
|
||||
self.fields = self.fields_directory_class(self.formdef)
|
||||
self.fields.html_top = self.html_top
|
||||
self.role = WorkflowRoleDirectory(self.formdef)
|
||||
self.role.html_top = self.html_top
|
||||
self.options = self.options_directory_class(self.formdef, self.formdefui)
|
||||
self.tests = TestsDirectory(self.formdef)
|
||||
self.logged_errors_dir = LoggedErrorsDirectory(
|
||||
|
@ -673,9 +670,6 @@ class FormDefPage(Directory):
|
|||
)
|
||||
self.snapshots_dir = SnapshotsDirectory(self.formdef)
|
||||
|
||||
def html_top(self, title):
|
||||
return html_top(self.section, title)
|
||||
|
||||
def add_option_line(self, link, label, current_value, popup=True):
|
||||
return htmltext(
|
||||
'<li><a rel="%(popup)s" href="%(link)s">'
|
||||
|
@ -691,7 +685,7 @@ class FormDefPage(Directory):
|
|||
)
|
||||
|
||||
def _q_index(self):
|
||||
self.html_top(title=self.formdef.name)
|
||||
get_response().set_title(title=self.formdef.name)
|
||||
r = TemplateIO(html=True)
|
||||
get_response().filter['sidebar'] = self.get_sidebar()
|
||||
get_response().add_javascript(
|
||||
|
@ -982,7 +976,7 @@ class FormDefPage(Directory):
|
|||
return r.getvalue()
|
||||
|
||||
def public_url(self):
|
||||
self.html_top(title=self.formdef.name)
|
||||
get_response().set_title(title=self.formdef.name)
|
||||
get_response().breadcrumb.append(('public-url', _('Public URL')))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>' % _('Public URL'))
|
||||
|
@ -994,7 +988,7 @@ class FormDefPage(Directory):
|
|||
return r.getvalue()
|
||||
|
||||
def qrcode(self):
|
||||
self.html_top(title=self.formdef.name)
|
||||
get_response().set_title(title=self.formdef.name)
|
||||
get_response().breadcrumb.append(('qrcode', _('QR Code')))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>' % _('QR Code'))
|
||||
|
@ -1035,7 +1029,7 @@ class FormDefPage(Directory):
|
|||
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
get_response().breadcrumb.append(('roles', title))
|
||||
self.html_top(title=self.formdef.name)
|
||||
get_response().set_title(title=self.formdef.name)
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % title
|
||||
if description:
|
||||
|
@ -1136,7 +1130,7 @@ class FormDefPage(Directory):
|
|||
)
|
||||
|
||||
get_response().breadcrumb.append(('title', _('Title')))
|
||||
self.html_top(title=self.formdef.name)
|
||||
get_response().set_title(title=self.formdef.name)
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Title')
|
||||
r += form.render()
|
||||
|
@ -1162,7 +1156,7 @@ class FormDefPage(Directory):
|
|||
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
get_response().breadcrumb.append(('workflow', _('Workflow')))
|
||||
self.html_top(title=self.formdef.name)
|
||||
get_response().set_title(title=self.formdef.name)
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Workflow')
|
||||
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():
|
||||
get_response().breadcrumb.append(('workflow-status-remapping', _('Workflow Status Remapping')))
|
||||
self.html_top(title=self.formdef.name)
|
||||
get_response().set_title(title=self.formdef.name)
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<p>')
|
||||
r += str(
|
||||
|
@ -1287,7 +1281,7 @@ class FormDefPage(Directory):
|
|||
name_widget.set_value(new_name)
|
||||
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
self.html_top(title=self.duplicate_title)
|
||||
get_response().set_title(title=self.duplicate_title)
|
||||
r = TemplateIO(html=True)
|
||||
get_response().breadcrumb.append(('duplicate', _('Duplicate')))
|
||||
r += htmltext('<h2>%s</h2>') % self.duplicate_title
|
||||
|
@ -1330,7 +1324,7 @@ class FormDefPage(Directory):
|
|||
return redirect('..')
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
get_response().breadcrumb.append(('delete', _('Delete')))
|
||||
self.html_top(title=self.delete_title)
|
||||
get_response().set_title(title=self.delete_title)
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s %s</h2>') % (self.delete_title, self.formdef.name)
|
||||
r += form.render()
|
||||
|
@ -1363,7 +1357,7 @@ class FormDefPage(Directory):
|
|||
pass
|
||||
|
||||
get_response().breadcrumb.append(('overwrite', _('Overwrite')))
|
||||
self.html_top(title=_('Overwrite'))
|
||||
get_response().set_title(title=_('Overwrite'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Overwrite')
|
||||
r += htmltext('<p>%s</p>') % self.overwrite_message
|
||||
|
@ -1461,7 +1455,7 @@ class FormDefPage(Directory):
|
|||
return incompatible_field_ids
|
||||
|
||||
def overwrite_warning_summary(self, new_formdef):
|
||||
self.html_top(title=_('Overwrite'))
|
||||
get_response().set_title(title=_('Overwrite'))
|
||||
get_response().breadcrumb.append(('overwrite', _('Overwrite')))
|
||||
r = TemplateIO(html=True)
|
||||
|
||||
|
@ -1607,7 +1601,7 @@ class FormDefPage(Directory):
|
|||
def workflow_variables(self):
|
||||
if not self.formdef.workflow.variables_formdef:
|
||||
raise TraversalError()
|
||||
self.html_top(title=_('Options'))
|
||||
get_response().set_title(title=_('Options'))
|
||||
|
||||
form = Form(enctype='multipart/form-data')
|
||||
self.formdef.workflow.variables_formdef.add_fields_to_form(
|
||||
|
@ -1636,7 +1630,7 @@ class FormDefPage(Directory):
|
|||
if value:
|
||||
return value.build_response()
|
||||
|
||||
self.html_top(title=_('Workflow Options'))
|
||||
get_response().set_title(title=_('Workflow Options'))
|
||||
form = Form(enctype='multipart/form-data')
|
||||
pristine_workflow = Workflow.get(self.formdef.workflow_id)
|
||||
for status in self.formdef.workflow.possible_status:
|
||||
|
@ -1679,7 +1673,7 @@ class FormDefPage(Directory):
|
|||
self.formdef.store(comment=_('Change in workflow options'))
|
||||
|
||||
def inspect(self):
|
||||
self.html_top(self.formdef.name)
|
||||
get_response().set_title(self.formdef.name)
|
||||
get_response().breadcrumb.append(('inspect', _('Inspector')))
|
||||
return self.render_inspect()
|
||||
|
||||
|
@ -1725,7 +1719,7 @@ class FormsDirectory(AccessControlled, Directory):
|
|||
|
||||
category_class = Category
|
||||
categories = CategoriesDirectory()
|
||||
blocks = BlocksDirectory(section='forms')
|
||||
blocks = BlocksDirectory()
|
||||
data_sources = NamedDataSourcesDirectoryInForms()
|
||||
formdef_class = FormDef
|
||||
formdef_page_class = FormDefPage
|
||||
|
@ -1749,11 +1743,9 @@ class FormsDirectory(AccessControlled, Directory):
|
|||
super().__init__(*args, **kwargs)
|
||||
self.applications_dir = ApplicationsDirectory(self.formdef_class.xml_root_node)
|
||||
|
||||
def html_top(self, title):
|
||||
return html_top(self.section, title)
|
||||
|
||||
def _q_traverse(self, path):
|
||||
get_response().breadcrumb.append(('%s/' % self.section, self.top_title))
|
||||
get_response().set_backoffice_section(self.section)
|
||||
return super()._q_traverse(path)
|
||||
|
||||
def is_accessible(self, user):
|
||||
|
@ -1772,7 +1764,7 @@ class FormsDirectory(AccessControlled, Directory):
|
|||
def _q_index(self):
|
||||
from wcs.applications import Application
|
||||
|
||||
self.html_top(title=self.top_title)
|
||||
get_response().set_title(title=self.top_title)
|
||||
get_response().add_javascript(['widget_list.js', 'select2.js', 'popup.js'])
|
||||
|
||||
context = {
|
||||
|
@ -1848,7 +1840,7 @@ class FormsDirectory(AccessControlled, Directory):
|
|||
else:
|
||||
return redirect(str(formdef.id) + '/')
|
||||
|
||||
self.html_top(title=_('New Form'))
|
||||
get_response().set_title(title=_('New Form'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('New Form')
|
||||
r += form.render()
|
||||
|
@ -1878,7 +1870,7 @@ class FormsDirectory(AccessControlled, Directory):
|
|||
pass
|
||||
|
||||
get_response().breadcrumb.append(('import', _('Import')))
|
||||
self.html_top(title=self.import_title)
|
||||
get_response().set_title(title=self.import_title)
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % self.import_title
|
||||
r += htmltext('<p>%s</p>') % self.import_paragraph
|
||||
|
|
|
@ -36,7 +36,7 @@ class LoggedErrorDirectory(Directory):
|
|||
|
||||
def _q_index(self):
|
||||
get_response().breadcrumb.append(('%s/' % self.error.id, self.error.summary))
|
||||
self.parent_dir.html_top(_('Logged Errors - %s') % self.error.summary)
|
||||
get_response().set_title(_('Logged Errors - %s') % self.error.summary)
|
||||
get_response().filter['sidebar'] = self.get_sidebar()
|
||||
|
||||
return template.QommonTemplateResponse(
|
||||
|
@ -208,7 +208,7 @@ class LoggedErrorsDirectory(Directory):
|
|||
raise errors.AccessForbiddenError()
|
||||
|
||||
get_response().breadcrumb.append(('logged-errors/', _('Logged Errors')))
|
||||
self.parent_dir.html_top(_('Logged Errors'))
|
||||
get_response().set_title(_('Logged Errors'))
|
||||
limit = misc.get_int_or_400(
|
||||
get_request().form.get('limit', get_publisher().get_site_option('default-page-size')) or 20
|
||||
)
|
||||
|
|
|
@ -25,7 +25,6 @@ from wcs.backoffice.snapshots import SnapshotsDirectory
|
|||
from wcs.categories import MailTemplateCategory
|
||||
from wcs.mail_templates import MailTemplate
|
||||
from wcs.qommon import _, errors, misc, template
|
||||
from wcs.qommon.backoffice.menu import html_top
|
||||
from wcs.qommon.form import (
|
||||
ComputedExpressionWidget,
|
||||
FileWidget,
|
||||
|
@ -61,7 +60,7 @@ class MailTemplatesDirectory(Directory):
|
|||
def _q_index(self):
|
||||
from wcs.applications import Application
|
||||
|
||||
html_top('mail_templates', title=_('Mail Templates'))
|
||||
get_response().set_title(_('Mail Templates'))
|
||||
get_response().add_javascript(['popup.js'])
|
||||
mail_templates = MailTemplate.select(order_by='name')
|
||||
Application.populate_objects(mail_templates)
|
||||
|
@ -114,7 +113,7 @@ class MailTemplatesDirectory(Directory):
|
|||
return redirect('%s/edit' % mail_template.id)
|
||||
|
||||
get_response().breadcrumb.append(('new', _('New Mail Template')))
|
||||
html_top('mail_templates', title=_('New Mail Template'))
|
||||
get_response().set_title(_('New Mail Template'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('New Mail Template')
|
||||
r += form.render()
|
||||
|
@ -138,7 +137,7 @@ class MailTemplatesDirectory(Directory):
|
|||
pass
|
||||
|
||||
get_response().breadcrumb.append(('import', _('Import')))
|
||||
html_top('mail_templates', title=import_title)
|
||||
get_response().set_title(import_title)
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % import_title
|
||||
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()
|
||||
|
||||
def _q_index(self):
|
||||
html_top('mail_templates', title=self.mail_template.name)
|
||||
get_response().set_title(self.mail_template.name)
|
||||
get_response().filter['sidebar'] = self.get_sidebar()
|
||||
return template.QommonTemplateResponse(
|
||||
templates=['wcs/backoffice/mail-template.html'],
|
||||
|
@ -315,7 +314,7 @@ class MailTemplatePage(Directory):
|
|||
return redirect('.')
|
||||
|
||||
get_response().breadcrumb.append(('edit', _('Edit')))
|
||||
html_top('mail_templates', title=_('Edit Mail Template'))
|
||||
get_response().set_title(_('Edit Mail Template'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Edit Mail Template')
|
||||
r += form.render()
|
||||
|
@ -339,7 +338,7 @@ class MailTemplatePage(Directory):
|
|||
return redirect('.')
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
get_response().breadcrumb.append(('delete', _('Delete')))
|
||||
html_top('mail_templates', title=_('Delete Mail Template'))
|
||||
get_response().set_title(_('Delete Mail Template'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s %s</h2>') % (_('Deleting Mail Template:'), self.mail_template.name)
|
||||
r += form.render()
|
||||
|
@ -374,7 +373,7 @@ class MailTemplatePage(Directory):
|
|||
name_widget.set_value(new_name)
|
||||
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
html_top('mail_templates', title=_('Duplicate Mail Template'))
|
||||
get_response().set_title(_('Duplicate Mail Template'))
|
||||
r = TemplateIO(html=True)
|
||||
get_response().breadcrumb.append(('duplicate', _('Duplicate')))
|
||||
r += htmltext('<h2>%s</h2>') % _('Duplicate Mail Template')
|
||||
|
|
|
@ -20,7 +20,6 @@ from quixote.html import TemplateIO, htmltext
|
|||
|
||||
from wcs.formdef import FormDef
|
||||
from wcs.qommon import _, errors, get_cfg
|
||||
from wcs.qommon.backoffice.menu import html_top
|
||||
from wcs.qommon.form import CheckboxWidget, Form, HtmlWidget, StringWidget, TextWidget, WidgetList
|
||||
from wcs.roles import get_user_roles
|
||||
|
||||
|
@ -98,7 +97,7 @@ class RolePage(Directory):
|
|||
get_response().breadcrumb.append((component + '/', self.role.name))
|
||||
|
||||
def _q_index(self):
|
||||
html_top('roles', title=self.role.name)
|
||||
get_response().set_title(self.role.name)
|
||||
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<div id="appbar">')
|
||||
|
@ -185,7 +184,7 @@ class RolePage(Directory):
|
|||
return redirect('.')
|
||||
|
||||
get_response().breadcrumb.append(('edit', _('Edit')))
|
||||
html_top('roles', title=_('Edit Role'))
|
||||
get_response().set_title(_('Edit Role'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Edit Role')
|
||||
r += form.render()
|
||||
|
@ -200,7 +199,7 @@ class RolePage(Directory):
|
|||
return redirect('.')
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
get_response().breadcrumb.append(('delete', _('Delete')))
|
||||
html_top('roles', title=_('Delete Role'))
|
||||
get_response().set_title(_('Delete Role'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s %s</h2>') % (_('Deleting Role:'), self.role.name)
|
||||
r += form.render()
|
||||
|
@ -213,12 +212,16 @@ class RolePage(Directory):
|
|||
class RolesDirectory(Directory):
|
||||
_q_exports = ["", "new"]
|
||||
|
||||
def _q_traverse(self, path):
|
||||
get_response().breadcrumb.append(('roles/', _('Roles')))
|
||||
get_response().set_backoffice_section('roles')
|
||||
return super()._q_traverse(path)
|
||||
|
||||
def is_visible(self, *args):
|
||||
return not (get_cfg('sp', {}).get('idp-manage-roles'))
|
||||
|
||||
def _q_index(self):
|
||||
get_response().breadcrumb.append(('roles/', _('Roles')))
|
||||
html_top('roles', title=_('Roles'))
|
||||
get_response().set_title(_('Roles'))
|
||||
r = TemplateIO(html=True)
|
||||
|
||||
r += htmltext('<div id="appbar">')
|
||||
|
@ -246,7 +249,6 @@ class RolesDirectory(Directory):
|
|||
return r.getvalue()
|
||||
|
||||
def new(self):
|
||||
get_response().breadcrumb.append(('roles/', _('Roles')))
|
||||
get_response().breadcrumb.append(('new', _('New')))
|
||||
role_ui = RoleUI(None)
|
||||
form = role_ui.get_form()
|
||||
|
@ -261,12 +263,11 @@ class RolesDirectory(Directory):
|
|||
else:
|
||||
return redirect('.')
|
||||
|
||||
html_top('roles', title=_('New Role'))
|
||||
get_response().set_title(_('New Role'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('New Role')
|
||||
r += form.render()
|
||||
return r.getvalue()
|
||||
|
||||
def _q_lookup(self, component):
|
||||
get_response().breadcrumb.append(('roles/', _('Roles')))
|
||||
return RolePage(component)
|
||||
|
|
|
@ -43,7 +43,6 @@ from wcs.qommon.admin.cfg import cfg_submit
|
|||
from wcs.qommon.admin.emails import EmailsDirectory
|
||||
from wcs.qommon.admin.texts import TextsDirectory
|
||||
from wcs.qommon.afterjobs import AfterJob
|
||||
from wcs.qommon.backoffice.menu import html_top
|
||||
from wcs.qommon.form import (
|
||||
CheckboxesTableWidget,
|
||||
CheckboxesWidget,
|
||||
|
@ -104,7 +103,7 @@ class IdentificationDirectory(Directory):
|
|||
if not form.has_errors():
|
||||
return redirect('..')
|
||||
|
||||
html_top('settings', title=_('Identification'))
|
||||
get_response().set_title(_('Identification'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Identification')
|
||||
if lasso is None:
|
||||
|
@ -127,14 +126,12 @@ authentication is unavailable. Lasso must be installed to use it.'
|
|||
|
||||
|
||||
class UserFieldDefPage(FieldDefPage):
|
||||
section = 'settings'
|
||||
blacklisted_attributes = ['condition']
|
||||
|
||||
|
||||
class UserFieldsDirectory(FieldsDirectory):
|
||||
_q_exports = ['', 'update_order', 'new', 'mapping', 'templates']
|
||||
|
||||
section = 'settings'
|
||||
field_def_page_class = UserFieldDefPage
|
||||
support_import = False
|
||||
blacklisted_types = ['page', 'computed']
|
||||
|
@ -378,7 +375,7 @@ class FileTypesDirectory(Directory):
|
|||
return ', '.join(l) + ellipsis
|
||||
|
||||
def _q_index(self):
|
||||
html_top('settings', title=_('File Types'))
|
||||
get_response().set_title(_('File Types'))
|
||||
filetypes_cfg = get_cfg('filetypes', {})
|
||||
|
||||
form = self.get_form()
|
||||
|
@ -451,7 +448,7 @@ class FileTypesDirectory(Directory):
|
|||
get_publisher().write_cfg()
|
||||
return redirect('.')
|
||||
|
||||
html_top('settings', title=_('File Types'))
|
||||
get_response().set_title(_('File Types'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s - %s</h2>') % (_('File Type'), filetype['label'])
|
||||
r += form.render()
|
||||
|
@ -494,6 +491,7 @@ class SettingsDirectory(AccessControlled, Directory):
|
|||
|
||||
def _q_access(self):
|
||||
get_response().breadcrumb.append(('settings/', _('Settings')))
|
||||
get_response().set_backoffice_section('settings')
|
||||
|
||||
disabled_screens_option = get_publisher().get_site_option('settings-disabled-screens') or ''
|
||||
self.disabled_screens = [x.strip() for x in disabled_screens_option.split(',') if x.strip()]
|
||||
|
@ -514,7 +512,7 @@ class SettingsDirectory(AccessControlled, Directory):
|
|||
self._q_exports = q_exports
|
||||
|
||||
def _q_index(self):
|
||||
html_top('settings', title=_('Settings'))
|
||||
get_response().set_title(_('Settings'))
|
||||
r = TemplateIO(html=True)
|
||||
|
||||
hidden_screens_option = get_publisher().get_site_option('settings-hidden-screens') or ''
|
||||
|
@ -724,7 +722,7 @@ class SettingsDirectory(AccessControlled, Directory):
|
|||
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
get_response().breadcrumb.append(('admin-permissions', _('Admin Permissions')))
|
||||
html_top('settings', title=_('Admin Permissions'))
|
||||
get_response().set_title(_('Admin Permissions'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<div class="admin-permissions">')
|
||||
r += htmltext('<h2>%s</h2>') % _('Admin Permissions')
|
||||
|
@ -781,7 +779,7 @@ class SettingsDirectory(AccessControlled, Directory):
|
|||
|
||||
if not form.is_submitted():
|
||||
get_response().breadcrumb.append(('export', _('Export')))
|
||||
html_top('settings', title=_('Export'))
|
||||
get_response().set_title(_('Export'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Export')
|
||||
r += form.render()
|
||||
|
@ -951,7 +949,7 @@ class SettingsDirectory(AccessControlled, Directory):
|
|||
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
get_response().breadcrumb.append(('import', _('Import')))
|
||||
html_top('settings', title=_('Import'))
|
||||
get_response().set_title(_('Import'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Import')
|
||||
if FormDef.count() or CardDef.count() or Workflow.count():
|
||||
|
@ -978,7 +976,7 @@ class SettingsDirectory(AccessControlled, Directory):
|
|||
if e.details:
|
||||
msg += ' [%s]' % e.details
|
||||
reason = _('Failed to import a workflow (%s); site import did not complete.') % (msg)
|
||||
html_top('settings', title=_('Import'))
|
||||
get_response().set_title(_('Import'))
|
||||
return template.QommonTemplateResponse(
|
||||
templates=['wcs/backoffice/settings/import.html'],
|
||||
context={'results': results, 'error': reason},
|
||||
|
@ -1013,7 +1011,7 @@ class SettingsDirectory(AccessControlled, Directory):
|
|||
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
get_response().breadcrumb.append(('sitename', _('Site Name and Addresses')))
|
||||
html_top('settings', title=_('Site Name and Addresses'))
|
||||
get_response().set_title(_('Site Name and Addresses'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Site Name and Addresses')
|
||||
r += form.render()
|
||||
|
@ -1024,7 +1022,7 @@ class SettingsDirectory(AccessControlled, Directory):
|
|||
|
||||
def sms(self):
|
||||
get_response().breadcrumb.append(('sms', _('SMS')))
|
||||
html_top('settings', title=_('SMS'))
|
||||
get_response().set_title(_('SMS'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('SMS Options')
|
||||
sms_cfg = get_cfg('sms', {})
|
||||
|
@ -1105,7 +1103,7 @@ class SettingsDirectory(AccessControlled, Directory):
|
|||
return redirect('.')
|
||||
|
||||
get_response().breadcrumb.append(('postgresql', _('PostgreSQL Settings')))
|
||||
html_top('settings', title=_('PostgreSQL Settings'))
|
||||
get_response().set_title(_('PostgreSQL Settings'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('PostgreSQL Settings')
|
||||
r += form.render()
|
||||
|
@ -1143,7 +1141,7 @@ class SettingsDirectory(AccessControlled, Directory):
|
|||
return redirect('.')
|
||||
|
||||
get_response().breadcrumb.append(('geolocation', _('Geolocation Settings')))
|
||||
html_top('settings', title=_('Geolocation Settings'))
|
||||
get_response().set_title(_('Geolocation Settings'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Geolocation Settings')
|
||||
r += form.render()
|
||||
|
@ -1178,7 +1176,7 @@ $('#form_default-zoom-level').on('change', function() {
|
|||
return redirect('.')
|
||||
|
||||
get_response().breadcrumb.append(('user-templates', _('Users')))
|
||||
html_top('settings', title=_('Users'))
|
||||
get_response().set_title(_('Users'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Users')
|
||||
r += form.render()
|
||||
|
@ -1251,7 +1249,7 @@ $('#form_default-zoom-level').on('change', function() {
|
|||
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
get_response().breadcrumb.append(('language', _('Language')))
|
||||
html_top('settings', title=_('Language'))
|
||||
get_response().set_title(_('Language'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Language')
|
||||
r += form.render()
|
||||
|
@ -1297,7 +1295,7 @@ $('#form_default-zoom-level').on('change', function() {
|
|||
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
get_response().breadcrumb.append(('debug_options', _('Debug Options')))
|
||||
html_top('settings', title=_('Debug Options'))
|
||||
get_response().set_title(_('Debug Options'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Debug Options')
|
||||
r += form.render()
|
||||
|
|
|
@ -27,7 +27,6 @@ from wcs.backoffice.pagination import pagination_links
|
|||
from wcs.forms.common import FormStatusPage
|
||||
from wcs.qommon import _, misc, template
|
||||
from wcs.qommon.afterjobs import AfterJob
|
||||
from wcs.qommon.backoffice.menu import html_top
|
||||
from wcs.qommon.errors import TraversalError
|
||||
from wcs.qommon.form import FileWidget, Form, SingleSelectWidget, StringWidget
|
||||
from wcs.sql_criterias import Equal
|
||||
|
@ -127,9 +126,6 @@ class TestPage(FormBackOfficeStatusPage):
|
|||
get_response().breadcrumb.append((str(self.testdef.id) + '/', str(self.testdef)))
|
||||
return super(FormStatusPage, self)._q_traverse(path)
|
||||
|
||||
def html_top(self, title=None):
|
||||
html_top('tests', '%s - %s' % (self.formdef.name, _('Tests')))
|
||||
|
||||
def should_fold_summary(self, mine, request_user):
|
||||
return False
|
||||
|
||||
|
@ -237,7 +233,7 @@ class TestPage(FormBackOfficeStatusPage):
|
|||
name_widget.set_value(new_name)
|
||||
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
html_top('duplicate_test', title=_('Duplicate test'))
|
||||
get_response().set_title(_('Duplicate test'))
|
||||
r = TemplateIO(html=True)
|
||||
get_response().breadcrumb.append(('duplicate', _('Duplicate')))
|
||||
r += htmltext('<h2>%s</h2>') % _('Duplicate test')
|
||||
|
@ -261,7 +257,6 @@ class TestsDirectory(Directory):
|
|||
|
||||
def _q_traverse(self, path):
|
||||
get_response().breadcrumb.append(('tests/', _('Tests')))
|
||||
html_top('tests', '%s - %s' % (self.objectdef.name, _('Tests')))
|
||||
return super()._q_traverse(path)
|
||||
|
||||
def _q_lookup(self, component):
|
||||
|
@ -277,6 +272,7 @@ class TestsDirectory(Directory):
|
|||
'has_sidebar': True,
|
||||
}
|
||||
get_response().add_javascript(['popup.js'])
|
||||
get_response().set_title(_('Tests'))
|
||||
return template.QommonTemplateResponse(
|
||||
templates=['wcs/backoffice/tests.html'], context=context, is_django_native=True
|
||||
)
|
||||
|
@ -292,6 +288,7 @@ class TestsDirectory(Directory):
|
|||
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
get_response().breadcrumb.append(('new', _('New')))
|
||||
get_response().set_title(_('New test'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('New test')
|
||||
r += form.render()
|
||||
|
@ -321,6 +318,7 @@ class TestsDirectory(Directory):
|
|||
pass
|
||||
|
||||
get_response().breadcrumb.append(('import', _('Import')))
|
||||
get_response().set_title(_('Import Test'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Import Test')
|
||||
r += htmltext('<p>%s</p>') % _(
|
||||
|
@ -382,7 +380,7 @@ class TestResultsDirectory(Directory):
|
|||
|
||||
def _q_traverse(self, path):
|
||||
get_response().breadcrumb.append(('results/', _('Test results')))
|
||||
html_top('test-results', '%s - %s' % (self.objectdef.name, _('Test results')))
|
||||
get_response().set_title('%s - %s' % (self.objectdef.name, _('Test results')))
|
||||
return super()._q_traverse(path)
|
||||
|
||||
def _q_lookup(self, component):
|
||||
|
|
|
@ -22,7 +22,6 @@ import wcs.sql_criterias as st
|
|||
from wcs.backoffice.pagination import pagination_links
|
||||
from wcs.qommon import _, errors, force_str, get_cfg, ident, misc
|
||||
from wcs.qommon.admin.menu import error_page
|
||||
from wcs.qommon.backoffice.menu import html_top
|
||||
from wcs.qommon.form import (
|
||||
CheckboxWidget,
|
||||
EmailWidget,
|
||||
|
@ -122,7 +121,7 @@ class UserPage(Directory):
|
|||
get_response().breadcrumb.append((component + '/', self.user.display_name))
|
||||
|
||||
def _q_index(self):
|
||||
html_top('users', '%s - %s' % (_('User'), self.user.display_name))
|
||||
get_response().set_title('%s - %s' % (_('User'), self.user.display_name))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<div id="appbar">')
|
||||
r += htmltext('<h2>%s</h2>') % self.user.display_name
|
||||
|
@ -269,7 +268,7 @@ class UserPage(Directory):
|
|||
|
||||
if display_form:
|
||||
get_response().breadcrumb.append(('edit', _('Edit')))
|
||||
html_top('users', title=_('Edit User'))
|
||||
get_response().set_title(_('Edit User'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Edit User')
|
||||
r += form.render()
|
||||
|
@ -287,7 +286,7 @@ class UserPage(Directory):
|
|||
return redirect('.')
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
get_response().breadcrumb.append(('delete', _('Delete')))
|
||||
html_top('users', title=_('Delete User'))
|
||||
get_response().set_title(_('Delete User'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s %s</h2>') % (_('Deleting User:'), self.user.name)
|
||||
r += form.render()
|
||||
|
@ -310,9 +309,13 @@ class UserPage(Directory):
|
|||
class UsersDirectory(Directory):
|
||||
_q_exports = ['', 'new']
|
||||
|
||||
def _q_index(self):
|
||||
def _q_traverse(self, path):
|
||||
get_response().breadcrumb.append(('users/', _('Users')))
|
||||
html_top('users', title=_('Users'))
|
||||
get_response().set_backoffice_section('users')
|
||||
return super()._q_traverse(path)
|
||||
|
||||
def _q_index(self):
|
||||
get_response().set_title(_('Users'))
|
||||
r = TemplateIO(html=True)
|
||||
|
||||
limit = int(
|
||||
|
@ -482,16 +485,13 @@ class UsersDirectory(Directory):
|
|||
return r.getvalue()
|
||||
|
||||
def new(self):
|
||||
get_response().breadcrumb.append(('users/', _('Users')))
|
||||
get_response().breadcrumb.append(('new', _('New')))
|
||||
|
||||
ident_methods = get_cfg('identification', {}).get('methods', [])
|
||||
if not ident_methods:
|
||||
return error_page(
|
||||
'users', _('An authentification system must be configured before creating users.')
|
||||
)
|
||||
return error_page(_('An authentification system must be configured before creating users.'))
|
||||
if ident_methods == ['idp'] and len(get_cfg('idp', {}).items()) == 0:
|
||||
return error_page('users', _('SAML support must be setup before creating users.'))
|
||||
return error_page(_('SAML support must be setup before creating users.'))
|
||||
if is_idp_managing_user_attributes():
|
||||
raise errors.TraversalError()
|
||||
|
||||
|
@ -506,7 +506,7 @@ class UsersDirectory(Directory):
|
|||
return redirect('.')
|
||||
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
html_top('users', title=_('New User'))
|
||||
get_response().set_title(_('New User'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('New User')
|
||||
r += form.render()
|
||||
|
@ -523,7 +523,6 @@ class UsersDirectory(Directory):
|
|||
return redirect('.')
|
||||
|
||||
def _q_lookup(self, component):
|
||||
get_response().breadcrumb.append(('users/', _('Users')))
|
||||
try:
|
||||
return UserPage(component)
|
||||
except KeyError:
|
||||
|
|
|
@ -36,7 +36,6 @@ from wcs.formdata import Evolution
|
|||
from wcs.formdef import FormDef, UpdateStatisticsDataAfterJob
|
||||
from wcs.qommon import _, errors, force_str, misc, template
|
||||
from wcs.qommon.admin.menu import command_icon
|
||||
from wcs.qommon.backoffice.menu import html_top
|
||||
from wcs.qommon.form import (
|
||||
CheckboxWidget,
|
||||
ColourWidget,
|
||||
|
@ -381,14 +380,13 @@ class WorkflowUI:
|
|||
class WorkflowItemPage(Directory):
|
||||
_q_exports = ['', 'delete', 'copy']
|
||||
|
||||
def __init__(self, workflow, parent, component, html_top):
|
||||
def __init__(self, workflow, parent, component):
|
||||
try:
|
||||
self.item = [x for x in parent.items if x.id == component][0]
|
||||
except (IndexError, ValueError):
|
||||
raise errors.TraversalError()
|
||||
self.workflow = workflow
|
||||
self.parent = parent
|
||||
self.html_top = html_top
|
||||
get_response().breadcrumb.append(('items/%s/' % component, self.item.description))
|
||||
|
||||
def _q_index(self):
|
||||
|
@ -429,7 +427,7 @@ class WorkflowItemPage(Directory):
|
|||
return redirect(self.item.redirect_after_submit_url)
|
||||
return redirect('..')
|
||||
|
||||
self.html_top('%s - %s' % (_('Workflow'), self.workflow.name))
|
||||
get_response().set_title('%s - %s' % (_('Workflow'), self.workflow.name))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % self.item.description
|
||||
r += form.render()
|
||||
|
@ -446,7 +444,7 @@ class WorkflowItemPage(Directory):
|
|||
return redirect('../../')
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
get_response().breadcrumb.append(('delete', _('Delete')))
|
||||
self.html_top(title=_('Delete Item'))
|
||||
get_response().set_title(_('Delete Item'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Deleting Item')
|
||||
r += form.render()
|
||||
|
@ -482,7 +480,7 @@ class WorkflowItemPage(Directory):
|
|||
pass
|
||||
|
||||
get_response().breadcrumb.append(('copy', _('Copy')))
|
||||
self.html_top(title=_('Copy Item'))
|
||||
get_response().set_title(_('Copy Item'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Copy Item')
|
||||
r += form.render()
|
||||
|
@ -520,7 +518,7 @@ class WorkflowItemPage(Directory):
|
|||
return redirect('../../')
|
||||
|
||||
def _q_lookup(self, component):
|
||||
t = self.item.q_admin_lookup(self.workflow, self.parent, component, self.html_top)
|
||||
t = self.item.q_admin_lookup(self.workflow, self.parent, component)
|
||||
if t:
|
||||
return t
|
||||
return Directory._q_lookup(self, component)
|
||||
|
@ -529,7 +527,7 @@ class WorkflowItemPage(Directory):
|
|||
class GlobalActionTriggerPage(Directory):
|
||||
_q_exports = ['', 'delete']
|
||||
|
||||
def __init__(self, workflow, action, component, html_top):
|
||||
def __init__(self, workflow, action, component):
|
||||
try:
|
||||
self.trigger = [x for x in action.triggers if x.id == component][0]
|
||||
except (IndexError, ValueError):
|
||||
|
@ -537,7 +535,6 @@ class GlobalActionTriggerPage(Directory):
|
|||
self.workflow = workflow
|
||||
self.action = action
|
||||
self.status = action
|
||||
self.html_top = html_top
|
||||
get_response().breadcrumb.append(('triggers/%s/' % component, _('Trigger')))
|
||||
|
||||
def _q_index(self):
|
||||
|
@ -554,7 +551,7 @@ class GlobalActionTriggerPage(Directory):
|
|||
self.workflow.store(comment=_('Change in global action trigger'))
|
||||
return redirect('../../')
|
||||
|
||||
self.html_top('%s - %s' % (_('Workflow'), self.workflow.name))
|
||||
get_response().set_title('%s - %s' % (_('Workflow'), self.workflow.name))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s - %s</h2>') % (self.workflow.name, self.action.name)
|
||||
r += form.render()
|
||||
|
@ -569,7 +566,7 @@ class GlobalActionTriggerPage(Directory):
|
|||
return redirect('../../')
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
get_response().breadcrumb.append(('delete', _('Delete')))
|
||||
self.html_top(title=_('Delete Trigger'))
|
||||
get_response().set_title(_('Delete Trigger'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Deleting Trigger')
|
||||
r += form.render()
|
||||
|
@ -584,13 +581,12 @@ class ToChildDirectory(Directory):
|
|||
_q_exports = ['']
|
||||
klass = None
|
||||
|
||||
def __init__(self, workflow, status, html_top):
|
||||
def __init__(self, workflow, status):
|
||||
self.workflow = workflow
|
||||
self.status = status
|
||||
self.html_top = html_top
|
||||
|
||||
def _q_lookup(self, component):
|
||||
return self.klass(self.workflow, self.status, component, self.html_top)
|
||||
return self.klass(self.workflow, self.status, component)
|
||||
|
||||
def _q_index(self):
|
||||
return redirect('..')
|
||||
|
@ -626,19 +622,18 @@ class WorkflowStatusPage(Directory):
|
|||
]
|
||||
do_not_call_in_templates = True
|
||||
|
||||
def __init__(self, workflow, status_id, html_top):
|
||||
self.html_top = html_top
|
||||
def __init__(self, workflow, status_id):
|
||||
self.workflow = workflow
|
||||
try:
|
||||
self.status = [x for x in self.workflow.possible_status if x.id == status_id][0]
|
||||
except IndexError:
|
||||
raise errors.TraversalError()
|
||||
|
||||
self.items_dir = WorkflowItemsDir(workflow, self.status, html_top)
|
||||
self.items_dir = WorkflowItemsDir(workflow, self.status)
|
||||
get_response().breadcrumb.append(('status/%s/' % status_id, self.status.name))
|
||||
|
||||
def _q_index(self):
|
||||
self.html_top('%s - %s' % (_('Workflow'), self.workflow.name))
|
||||
get_response().set_title('%s - %s' % (_('Workflow'), self.workflow.name))
|
||||
get_response().add_javascript(
|
||||
[
|
||||
'jquery.js',
|
||||
|
@ -760,7 +755,7 @@ class WorkflowStatusPage(Directory):
|
|||
return redirect('.')
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
get_response().breadcrumb.append(('delete', _('Delete')))
|
||||
self.html_top(title=_('Delete Status'))
|
||||
get_response().set_title(_('Delete Status'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s %s</h2>') % (_('Deleting Status:'), self.status.name)
|
||||
r += form.render()
|
||||
|
@ -795,7 +790,7 @@ class WorkflowStatusPage(Directory):
|
|||
self.workflow.store(comment=_('Change name of status %s') % new_name)
|
||||
return redirect('.')
|
||||
|
||||
self.html_top(title=_('Edit Workflow Status'))
|
||||
get_response().set_title(_('Edit Workflow Status'))
|
||||
get_response().breadcrumb.append(('edit', _('Edit')))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Edit Workflow Status')
|
||||
|
@ -838,7 +833,7 @@ class WorkflowStatusPage(Directory):
|
|||
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
get_response().breadcrumb.append(('reassign', _('Delete / Reassign')))
|
||||
self.html_top(title=_('Delete Status / Reassign'))
|
||||
get_response().set_title(_('Delete Status / Reassign'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s %s</h2>') % (_('Deleting Status:'), self.status.name)
|
||||
r += htmltext('<div class="remove-status-form">')
|
||||
|
@ -935,7 +930,7 @@ class WorkflowStatusPage(Directory):
|
|||
self.workflow.store(comment=_('Change in display options'))
|
||||
return redirect('.')
|
||||
|
||||
self.html_top(title=_('Change Display Settings'))
|
||||
get_response().set_title(_('Change Display Settings'))
|
||||
get_response().breadcrumb.append(('display', _('Display Settings')))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Change Display Settings')
|
||||
|
@ -960,7 +955,7 @@ class WorkflowStatusPage(Directory):
|
|||
self.workflow.store(comment=_('Change of terminal status option'))
|
||||
return redirect('.')
|
||||
|
||||
self.html_top(title=_('Edit Terminal Status'))
|
||||
get_response().set_title(_('Edit Terminal Status'))
|
||||
get_response().breadcrumb.append(('endpoint', _('Terminal Status')))
|
||||
return form.render()
|
||||
|
||||
|
@ -982,7 +977,7 @@ class WorkflowStatusPage(Directory):
|
|||
self.workflow.store(comment=_('Change in backoffice info text'))
|
||||
return redirect('.')
|
||||
|
||||
self.html_top(title=_('Edit Backoffice Information Text'))
|
||||
get_response().set_title(_('Edit Backoffice Information Text'))
|
||||
get_response().breadcrumb.append(('backoffice_info_text', _('Backoffice Information Text')))
|
||||
return form.render()
|
||||
|
||||
|
@ -990,12 +985,11 @@ class WorkflowStatusPage(Directory):
|
|||
class WorkflowStatusDirectory(Directory):
|
||||
_q_exports = ['']
|
||||
|
||||
def __init__(self, workflow, html_top):
|
||||
def __init__(self, workflow):
|
||||
self.workflow = workflow
|
||||
self.html_top = html_top
|
||||
|
||||
def _q_lookup(self, component):
|
||||
return WorkflowStatusPage(self.workflow, component, self.html_top)
|
||||
return WorkflowStatusPage(self.workflow, component)
|
||||
|
||||
def _q_index(self):
|
||||
return redirect('..')
|
||||
|
@ -1214,7 +1208,7 @@ class FunctionsDirectory(Directory):
|
|||
return redirect('..')
|
||||
|
||||
get_response().breadcrumb.append(('new', _('New Function')))
|
||||
html_top('workflows', title=_('New Function'))
|
||||
get_response().set_title(_('New Function'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('New Function')
|
||||
r += form.render()
|
||||
|
@ -1254,7 +1248,7 @@ class FunctionsDirectory(Directory):
|
|||
return redirect('..')
|
||||
|
||||
get_response().breadcrumb.append(('new', _('Edit Function')))
|
||||
html_top('workflows', title=_('Edit Function'))
|
||||
get_response().set_title(_('Edit Function'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Edit Function')
|
||||
r += form.render()
|
||||
|
@ -1300,7 +1294,7 @@ class CriticalityLevelsDirectory(Directory):
|
|||
return redirect('..')
|
||||
|
||||
get_response().breadcrumb.append(('new', _('New Criticality Level')))
|
||||
html_top('workflows', title=_('New Criticality level'))
|
||||
get_response().set_title(_('New Criticality level'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('New Criticality Level')
|
||||
r += form.render()
|
||||
|
@ -1335,7 +1329,7 @@ class CriticalityLevelsDirectory(Directory):
|
|||
return redirect('..')
|
||||
|
||||
get_response().breadcrumb.append(('new', _('Edit Criticality Level')))
|
||||
html_top('workflows', title=_('Edit Criticality Level'))
|
||||
get_response().set_title(_('Edit Criticality Level'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Edit Criticality Level')
|
||||
r += form.render()
|
||||
|
@ -1360,16 +1354,15 @@ class GlobalActionPage(WorkflowStatusPage):
|
|||
('backoffice-info-text', 'backoffice_info_text'),
|
||||
]
|
||||
|
||||
def __init__(self, workflow, action_id, html_top):
|
||||
self.html_top = html_top
|
||||
def __init__(self, workflow, action_id):
|
||||
self.workflow = workflow
|
||||
try:
|
||||
self.action = [x for x in self.workflow.global_actions if x.id == action_id][0]
|
||||
except IndexError:
|
||||
raise errors.TraversalError()
|
||||
self.status = self.action
|
||||
self.items_dir = GlobalActionItemsDir(workflow, self.action, html_top)
|
||||
self.triggers_dir = GlobalActionTriggersDir(workflow, self.action, html_top)
|
||||
self.items_dir = GlobalActionItemsDir(workflow, self.action)
|
||||
self.triggers_dir = GlobalActionTriggersDir(workflow, self.action)
|
||||
|
||||
def _q_traverse(self, path):
|
||||
get_response().breadcrumb.append(
|
||||
|
@ -1381,7 +1374,7 @@ class GlobalActionPage(WorkflowStatusPage):
|
|||
return not item.is_disabled() and item.is_available(self.workflow) and item.ok_in_global_action
|
||||
|
||||
def _q_index(self):
|
||||
self.html_top('%s - %s' % (_('Workflow'), self.workflow.name))
|
||||
get_response().set_title('%s - %s' % (_('Workflow'), self.workflow.name))
|
||||
r = TemplateIO(html=True)
|
||||
get_response().add_javascript(['jquery.js', 'jquery-ui.js', 'biglist.js', 'qommon.wysiwyg.js'])
|
||||
|
||||
|
@ -1453,7 +1446,7 @@ class GlobalActionPage(WorkflowStatusPage):
|
|||
return redirect('.')
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
get_response().breadcrumb.append(('delete', _('Delete')))
|
||||
self.html_top(title=_('Delete Action'))
|
||||
get_response().set_title(_('Delete Action'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s %s</h2>') % (_('Deleting Action:'), self.action.name)
|
||||
r += form.render()
|
||||
|
@ -1480,7 +1473,7 @@ class GlobalActionPage(WorkflowStatusPage):
|
|||
self.workflow.store(comment=_('Change in global action'))
|
||||
return redirect('.')
|
||||
|
||||
self.html_top(title=_('Edit Action Name'))
|
||||
get_response().set_title(_('Edit Action Name'))
|
||||
get_response().breadcrumb.append(('edit', _('Edit')))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Edit Action Name')
|
||||
|
@ -1562,12 +1555,11 @@ class GlobalActionPage(WorkflowStatusPage):
|
|||
class GlobalActionsDirectory(Directory):
|
||||
_q_exports = ['', 'new']
|
||||
|
||||
def __init__(self, workflow, html_top):
|
||||
def __init__(self, workflow):
|
||||
self.workflow = workflow
|
||||
self.html_top = html_top
|
||||
|
||||
def _q_lookup(self, component):
|
||||
return GlobalActionPage(self.workflow, component, self.html_top)
|
||||
return GlobalActionPage(self.workflow, component)
|
||||
|
||||
def _q_index(self):
|
||||
return redirect('..')
|
||||
|
@ -1591,7 +1583,7 @@ class GlobalActionsDirectory(Directory):
|
|||
return redirect('%s/' % action.id)
|
||||
|
||||
get_response().breadcrumb.append(('new', _('New Global Action')))
|
||||
html_top('workflows', title=_('New Global Action'))
|
||||
get_response().set_title(_('New Global Action'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('New Global Action')
|
||||
r += form.render()
|
||||
|
@ -1636,20 +1628,17 @@ class WorkflowPage(Directory):
|
|||
except KeyError:
|
||||
raise errors.TraversalError()
|
||||
self.workflow_ui = WorkflowUI(self.workflow)
|
||||
self.status_dir = WorkflowStatusDirectory(self.workflow, self.html_top)
|
||||
self.status_dir = WorkflowStatusDirectory(self.workflow)
|
||||
self.variables_dir = VariablesDirectory(self.workflow)
|
||||
self.backoffice_fields_dir = BackofficeFieldsDirectory(self.workflow)
|
||||
self.functions_dir = FunctionsDirectory(self.workflow)
|
||||
self.global_actions_dir = GlobalActionsDirectory(self.workflow, self.html_top)
|
||||
self.global_actions_dir = GlobalActionsDirectory(self.workflow)
|
||||
self.criticality_levels_dir = CriticalityLevelsDirectory(self.workflow)
|
||||
self.logged_errors_dir = LoggedErrorsDirectory(parent_dir=self, workflow_id=self.workflow.id)
|
||||
self.snapshots_dir = SnapshotsDirectory(self.workflow)
|
||||
if component:
|
||||
get_response().breadcrumb.append((component + '/', self.workflow.name))
|
||||
|
||||
def html_top(self, title):
|
||||
return html_top('workflows', title)
|
||||
|
||||
def category(self):
|
||||
category_options = self.workflow_ui.get_categories()
|
||||
if is_global_accessible():
|
||||
|
@ -1680,7 +1669,7 @@ class WorkflowPage(Directory):
|
|||
self.workflow.store(comment=_('Change of category'))
|
||||
return redirect('.')
|
||||
|
||||
html_top('workflows', title=self.workflow.name)
|
||||
get_response().set_title(self.workflow.name)
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Category')
|
||||
r += form.render()
|
||||
|
@ -1705,7 +1694,7 @@ class WorkflowPage(Directory):
|
|||
)
|
||||
|
||||
def _q_index(self):
|
||||
self.html_top(title=_('Workflow - %s') % self.workflow.name)
|
||||
get_response().set_title(_('Workflow - %s') % self.workflow.name)
|
||||
get_response().filter['sidebar'] = self.get_sidebar()
|
||||
get_response().add_javascript(
|
||||
['jquery.js', 'jquery-ui.js', 'biglist.js', 'svg-pan-zoom.js', 'jquery.colourpicker.js']
|
||||
|
@ -1748,7 +1737,7 @@ class WorkflowPage(Directory):
|
|||
return r.getvalue()
|
||||
|
||||
def inspect(self):
|
||||
self.html_top(self.workflow.name)
|
||||
get_response().set_title(self.workflow.name)
|
||||
get_response().breadcrumb.append(('inspect', _('Inspector')))
|
||||
return self.render_inspect()
|
||||
|
||||
|
@ -1847,7 +1836,7 @@ class WorkflowPage(Directory):
|
|||
else:
|
||||
return redirect('.')
|
||||
|
||||
self.html_top(title=_('Edit Workflow'))
|
||||
get_response().set_title(_('Edit Workflow'))
|
||||
r = TemplateIO(html=True)
|
||||
get_response().breadcrumb.append(('edit', _('Edit')))
|
||||
r += htmltext('<h2>%s</h2>') % _('Edit Workflow')
|
||||
|
@ -1875,7 +1864,7 @@ class WorkflowPage(Directory):
|
|||
return redirect('.')
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
get_response().breadcrumb.append(('delete', _('Delete')))
|
||||
self.html_top(title=_('Delete Workflow'))
|
||||
get_response().set_title(_('Delete Workflow'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s %s</h2>') % (_('Deleting Workflow:'), self.workflow.name)
|
||||
r += form.render()
|
||||
|
@ -1917,7 +1906,7 @@ class WorkflowPage(Directory):
|
|||
except ValueError:
|
||||
pass
|
||||
|
||||
self.html_top(title=_('Duplicate Workflow'))
|
||||
get_response().set_title(_('Duplicate Workflow'))
|
||||
r = TemplateIO(html=True)
|
||||
get_response().breadcrumb.append(('duplicate', _('Duplicate')))
|
||||
r += htmltext('<h2>%s</h2>') % _('Duplicate Workflow')
|
||||
|
@ -1975,11 +1964,9 @@ class WorkflowsDirectory(Directory):
|
|||
super().__init__(*args, **kwargs)
|
||||
self.applications_dir = ApplicationsDirectory(Workflow.xml_root_node)
|
||||
|
||||
def html_top(self, title):
|
||||
return html_top('workflows', title)
|
||||
|
||||
def _q_traverse(self, path):
|
||||
get_response().breadcrumb.append(('workflows/', _('Workflows')))
|
||||
get_response().set_backoffice_section('workflows')
|
||||
return super()._q_traverse(path)
|
||||
|
||||
def is_accessible(self, user):
|
||||
|
@ -1998,7 +1985,7 @@ class WorkflowsDirectory(Directory):
|
|||
def _q_index(self):
|
||||
from wcs.applications import Application
|
||||
|
||||
self.html_top(title=_('Workflows'))
|
||||
get_response().set_title(_('Workflows'))
|
||||
get_response().add_javascript(['popup.js'])
|
||||
|
||||
context = {
|
||||
|
@ -2119,7 +2106,7 @@ class WorkflowsDirectory(Directory):
|
|||
else:
|
||||
return redirect('%s/' % workflow.id)
|
||||
|
||||
self.html_top(title=_('New Workflow'))
|
||||
get_response().set_title(_('New Workflow'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('New Workflow')
|
||||
r += form.render()
|
||||
|
@ -2151,7 +2138,7 @@ class WorkflowsDirectory(Directory):
|
|||
pass
|
||||
|
||||
get_response().breadcrumb.append(('import', _('Import')))
|
||||
self.html_top(title=_('Import Workflow'))
|
||||
get_response().set_title(_('Import Workflow'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Import Workflow')
|
||||
r += htmltext('<p>%s</p>') % _(
|
||||
|
|
|
@ -22,7 +22,6 @@ from wcs.admin import utils
|
|||
from wcs.backoffice.applications import ApplicationsDirectory
|
||||
from wcs.backoffice.snapshots import SnapshotsDirectory
|
||||
from wcs.qommon import _, errors, misc, template
|
||||
from wcs.qommon.backoffice.menu import html_top
|
||||
from wcs.qommon.form import CheckboxWidget, FileWidget, Form, HtmlWidget, SlugWidget, StringWidget, TextWidget
|
||||
from wcs.wscalls import NamedWsCall, WsCallRequestWidget
|
||||
|
||||
|
@ -129,7 +128,7 @@ class NamedWsCallPage(Directory):
|
|||
return r.getvalue()
|
||||
|
||||
def _q_index(self):
|
||||
html_top('wscalls', title=self.wscall.name)
|
||||
get_response().set_title(self.wscall.name)
|
||||
get_response().filter['sidebar'] = self.get_sidebar()
|
||||
return template.QommonTemplateResponse(
|
||||
templates=['wcs/backoffice/wscall.html'], context={'view': self, 'wscall': self.wscall}
|
||||
|
@ -149,7 +148,7 @@ class NamedWsCallPage(Directory):
|
|||
return redirect('../%s/' % self.wscall.id)
|
||||
|
||||
get_response().breadcrumb.append(('edit', _('Edit')))
|
||||
html_top('wscalls', title=_('Edit webservice call'))
|
||||
get_response().set_title(_('Edit webservice call'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Edit webservice call')
|
||||
r += form.render()
|
||||
|
@ -166,7 +165,7 @@ class NamedWsCallPage(Directory):
|
|||
return redirect('..')
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
get_response().breadcrumb.append(('delete', _('Delete')))
|
||||
html_top('wscalls', title=_('Delete webservice call'))
|
||||
get_response().set_title(_('Delete webservice call'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s %s</h2>') % (_('Deleting webservice call:'), self.wscall.name)
|
||||
r += form.render()
|
||||
|
@ -195,7 +194,7 @@ class NamedWsCallsDirectory(Directory):
|
|||
def _q_index(self):
|
||||
from wcs.applications import Application
|
||||
|
||||
html_top('wscalls', title=_('Webservice Calls'))
|
||||
get_response().set_title(_('Webservice Calls'))
|
||||
get_response().add_javascript(['popup.js'])
|
||||
wscalls = NamedWsCall.select(order_by='name')
|
||||
Application.populate_objects(wscalls)
|
||||
|
@ -225,7 +224,7 @@ class NamedWsCallsDirectory(Directory):
|
|||
else:
|
||||
return redirect('.')
|
||||
|
||||
html_top('wscalls', title=_('New webservice call'))
|
||||
get_response().set_title(_('New webservice call'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('New webservice call')
|
||||
r += form.render()
|
||||
|
@ -252,7 +251,7 @@ class NamedWsCallsDirectory(Directory):
|
|||
pass
|
||||
|
||||
get_response().breadcrumb.append(('import', _('Import')))
|
||||
html_top('wscalls', title=import_title)
|
||||
get_response().set_title(import_title)
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % import_title
|
||||
r += htmltext('<p>%s</p>') % _('You can install a new webservice call by uploading a file.')
|
||||
|
|
|
@ -18,7 +18,6 @@ from quixote import get_response, redirect
|
|||
from quixote.directory import Directory
|
||||
|
||||
from wcs.qommon import errors, misc, template
|
||||
from wcs.qommon.backoffice.menu import html_top
|
||||
|
||||
|
||||
class ApplicationsDirectory(Directory):
|
||||
|
@ -60,7 +59,7 @@ class ApplicationDirectory(Directory):
|
|||
return super()._q_traverse(path)
|
||||
|
||||
def _q_index(self):
|
||||
html_top('', self.application.name)
|
||||
get_response().set_title(self.application.name)
|
||||
return template.QommonTemplateResponse(templates=[self.get_template()], context=self.get_context())
|
||||
|
||||
def get_template(self):
|
||||
|
@ -99,7 +98,7 @@ class ApplicationDirectory(Directory):
|
|||
def get_block_objects_context(self, objects):
|
||||
from wcs.admin.blocks import BlocksDirectory
|
||||
|
||||
return BlocksDirectory(None).get_list_context(objects)
|
||||
return BlocksDirectory().get_list_context(objects)
|
||||
|
||||
def get_mailtemplate_objects_context(self, objects):
|
||||
from wcs.admin.mail_templates import MailTemplatesDirectory
|
||||
|
|
|
@ -83,7 +83,7 @@ class CardDefPage(FormDefPage):
|
|||
management_view_label = _('List of cards')
|
||||
|
||||
def _q_index(self):
|
||||
self.html_top(title=self.formdef.name)
|
||||
get_response().set_title(self.formdef.name)
|
||||
r = TemplateIO(html=True)
|
||||
get_response().filter['sidebar'] = self.get_sidebar()
|
||||
get_response().add_javascript(['jquery.js', 'widget_list.js', 'qommon.wysiwyg.js'])
|
||||
|
@ -284,7 +284,7 @@ class CardsDirectory(FormsDirectory):
|
|||
else:
|
||||
return redirect(str(formdef.id) + '/')
|
||||
|
||||
self.html_top(title=_('New Card Model'))
|
||||
get_response().set_title(_('New Card Model'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('New Card Model')
|
||||
r += form.render()
|
||||
|
|
|
@ -31,7 +31,6 @@ from wcs.workflows import ContentSnapshotPart
|
|||
|
||||
from ..qommon import _, errors, ngettext, template
|
||||
from ..qommon.afterjobs import AfterJob
|
||||
from ..qommon.backoffice.menu import html_top
|
||||
from ..qommon.form import CheckboxWidget, FileWidget, Form
|
||||
from .management import FormBackOfficeStatusPage, FormPage, ManagementDirectory
|
||||
from .submission import FormFillPage
|
||||
|
@ -73,6 +72,7 @@ def get_import_csv_fields(carddef):
|
|||
class DataManagementDirectory(ManagementDirectory):
|
||||
do_not_call_in_templates = True
|
||||
_q_exports = ['']
|
||||
section = 'data'
|
||||
|
||||
def add_breadcrumb(self):
|
||||
get_response().breadcrumb.append(('data/', _('Cards')))
|
||||
|
@ -108,7 +108,7 @@ class DataManagementDirectory(ManagementDirectory):
|
|||
yield carddef
|
||||
|
||||
def _q_index(self):
|
||||
html_top('data_management', _('Cards'))
|
||||
get_response().set_title(_('Cards'))
|
||||
if not (CardDef.exists()):
|
||||
return self.empty_site_message(_('Cards'))
|
||||
return template.QommonTemplateResponse(
|
||||
|
@ -249,7 +249,7 @@ class CardPage(FormPage):
|
|||
form.set_error('file', e)
|
||||
|
||||
get_response().breadcrumb.append(('import-file', _('Import File')))
|
||||
html_top('data_management', _('Import File'))
|
||||
get_response().set_title(_('Import File'))
|
||||
context['html_form'] = form
|
||||
context['impossible_csv_fields'] = self.get_csv_impossible_fields()
|
||||
|
||||
|
@ -408,9 +408,6 @@ class CardBackOfficeStatusPage(FormBackOfficeStatusPage):
|
|||
'The card has been recorded on %(date)s with the number %(number)s by %(agent)s.'
|
||||
)
|
||||
|
||||
def html_top(self, title=None):
|
||||
return html_top('data_management', title)
|
||||
|
||||
def should_fold_summary(self, mine, request_user):
|
||||
return False
|
||||
|
||||
|
|
|
@ -26,7 +26,6 @@ from wcs.data_sources import NamedDataSource
|
|||
from wcs.formdef import get_formdefs_of_all_kinds
|
||||
from wcs.qommon import _, ezt, template
|
||||
from wcs.qommon.afterjobs import AfterJob
|
||||
from wcs.qommon.backoffice.menu import html_top
|
||||
from wcs.wf.export_to_model import UploadValidationError
|
||||
from wcs.workflows import Workflow
|
||||
from wcs.wscalls import NamedWsCall
|
||||
|
@ -42,7 +41,7 @@ class DeprecationsDirectory(Directory):
|
|||
# create report if necessary
|
||||
return self.scan()
|
||||
|
||||
html_top('studio', _('Deprecations Report'))
|
||||
get_response().set_title(_('Deprecations Report'))
|
||||
get_response().breadcrumb.append(('deprecations/', _('Deprecations Report')))
|
||||
|
||||
context = {'has_sidebar': False, 'view': self}
|
||||
|
|
|
@ -31,7 +31,6 @@ from wcs.formdef import FormDef, UpdateDigestAfterJob
|
|||
from wcs.mail_templates import MailTemplate
|
||||
from wcs.qommon import _, errors, get_cfg, misc, ods, template
|
||||
from wcs.qommon.afterjobs import AfterJob
|
||||
from wcs.qommon.backoffice.menu import html_top
|
||||
from wcs.qommon.form import CheckboxWidget, FileWidget, Form, RadiobuttonsWidget, TextWidget
|
||||
from wcs.sql_criterias import Equal, FtsMatch, ILike, Or
|
||||
from wcs.workflows import Workflow
|
||||
|
@ -65,7 +64,7 @@ class I18nDirectory(Directory):
|
|||
|
||||
if TranslatableMessage.count() == 0:
|
||||
return self.scan()
|
||||
html_top('i18n', title=_('Multilinguism'))
|
||||
get_response().set_title(_('Multilinguism'))
|
||||
get_response().breadcrumb.append(('i18n/', _('Multilinguism')))
|
||||
|
||||
if not self.get_supported_languages():
|
||||
|
@ -241,7 +240,7 @@ class MessageDirectory(Directory):
|
|||
update_digests()
|
||||
return redirect('../../?' + get_request().get_query())
|
||||
|
||||
html_top('i18n', title=_('Multilinguism'))
|
||||
get_response().set_title(_('Multilinguism'))
|
||||
context = {'html_form': form, 'msg': self.msg}
|
||||
return template.QommonTemplateResponse(
|
||||
templates=['wcs/backoffice/i18n-message.html'], context=context
|
||||
|
|
|
@ -22,7 +22,6 @@ from quixote.directory import Directory
|
|||
from wcs.carddef import CardDef
|
||||
from wcs.formdef import FormDef
|
||||
from wcs.qommon import _, template
|
||||
from wcs.qommon.backoffice.menu import html_top
|
||||
from wcs.qommon.form import DateWidget, Form, OptGroup, SingleSelectWidget, StringWidget
|
||||
from wcs.qommon.misc import get_as_datetime
|
||||
from wcs.sql_criterias import Equal, Greater, GreaterOrEqual, Less, Nothing
|
||||
|
@ -31,9 +30,6 @@ from wcs.sql_criterias import Equal, Greater, GreaterOrEqual, Less, Nothing
|
|||
class JournalDirectory(Directory):
|
||||
_q_exports = ['']
|
||||
|
||||
def html_top(self, title):
|
||||
return html_top('journal', title)
|
||||
|
||||
def _q_traverse(self, path):
|
||||
get_response().breadcrumb.append(('journal/', _('Audit Journal')))
|
||||
return super()._q_traverse(path)
|
||||
|
@ -41,7 +37,7 @@ class JournalDirectory(Directory):
|
|||
def _q_index(self):
|
||||
from wcs.audit import Audit
|
||||
|
||||
self.html_top(_('Audit Journal'))
|
||||
get_response().set_title(_('Audit Journal'))
|
||||
context = {
|
||||
'has_sidebar': True,
|
||||
'html_form': self.get_filter_form(),
|
||||
|
|
|
@ -70,7 +70,6 @@ from wcs.workflows import WorkflowStatusItem, item_classes, template_on_formdata
|
|||
|
||||
from ..qommon import _, audit, errors, ezt, force_str, get_cfg, misc, ngettext, ods, pgettext_lazy, template
|
||||
from ..qommon.afterjobs import AfterJob
|
||||
from ..qommon.backoffice.menu import html_top
|
||||
from ..qommon.evalutils import make_datetime
|
||||
from ..qommon.form import (
|
||||
CheckboxWidget,
|
||||
|
@ -163,6 +162,7 @@ def geojson_formdatas(formdatas, geoloc_key='base', fields=None):
|
|||
|
||||
class ManagementDirectory(Directory):
|
||||
_q_exports = ['', 'forms', 'listing', 'statistics', 'lookup', 'count', 'geojson', 'map']
|
||||
section = 'management'
|
||||
|
||||
def add_breadcrumb(self):
|
||||
get_response().breadcrumb.append(('management/', _('Management')))
|
||||
|
@ -172,6 +172,7 @@ class ManagementDirectory(Directory):
|
|||
|
||||
def _q_traverse(self, path):
|
||||
self.add_breadcrumb()
|
||||
get_response().set_backoffice_section(self.section)
|
||||
return super()._q_traverse(path)
|
||||
|
||||
def _q_index(self):
|
||||
|
@ -181,7 +182,7 @@ class ManagementDirectory(Directory):
|
|||
return redirect('forms')
|
||||
|
||||
def forms(self):
|
||||
html_top('management', _('Management'))
|
||||
get_response().set_title(_('Management'))
|
||||
formdefs = FormDef.select(order_by='name', ignore_errors=True, lightweight=True)
|
||||
if len(formdefs) == 0:
|
||||
return self.empty_site_message(_('Forms'))
|
||||
|
@ -404,7 +405,7 @@ class ManagementDirectory(Directory):
|
|||
return r.getvalue()
|
||||
|
||||
def statistics(self):
|
||||
html_top('management', _('Global statistics'))
|
||||
get_response().set_title(_('Global statistics'))
|
||||
get_response().breadcrumb.append(('statistics', _('Global statistics')))
|
||||
|
||||
if not (FormDef.exists()):
|
||||
|
@ -584,7 +585,7 @@ class ManagementDirectory(Directory):
|
|||
get_response().add_javascript(['wcs.listing.js'])
|
||||
from wcs import sql
|
||||
|
||||
html_top('management', _('Management'))
|
||||
get_response().set_title(_('Management'))
|
||||
|
||||
if not (FormDef.exists()):
|
||||
return self.empty_site_message(_('Global View'))
|
||||
|
@ -736,7 +737,7 @@ class ManagementDirectory(Directory):
|
|||
|
||||
def map(self):
|
||||
get_response().add_javascript(['wcs.listing.js', 'qommon.map.js'])
|
||||
html_top('management', _('Global Map'))
|
||||
get_response().set_title(_('Global Map'))
|
||||
r = TemplateIO(html=True)
|
||||
get_response().breadcrumb.append(('map', _('Global Map')))
|
||||
attrs = {
|
||||
|
@ -2213,10 +2214,10 @@ class FormPage(FormdefDirectoryBase):
|
|||
r += htmltext('<div id="appbar">')
|
||||
if self.view:
|
||||
view_name = self.view.title
|
||||
html_top('management', f'{self.view.title} - {self.formdef.name}')
|
||||
get_response().set_title(f'{self.view.title} - {self.formdef.name}')
|
||||
r += htmltext('<h2>%s - %s</h2>') % (self.formdef.name, view_name)
|
||||
else:
|
||||
html_top('management', self.formdef.name)
|
||||
get_response().set_title(self.formdef.name)
|
||||
r += htmltext('<h2>%s</h2>') % self.formdef.name
|
||||
r += get_session().display_message()
|
||||
r += self.listing_top_actions()
|
||||
|
@ -2708,7 +2709,7 @@ class FormPage(FormdefDirectoryBase):
|
|||
def map(self):
|
||||
self.view_type = 'map'
|
||||
get_response().add_javascript(['qommon.map.js'])
|
||||
html_top('management', '%s - %s' % (_('Form'), self.formdef.name))
|
||||
get_response().set_title('%s - %s' % (_('Form'), self.formdef.name))
|
||||
r = TemplateIO(html=True)
|
||||
get_response().breadcrumb.append(('map', _('Map')))
|
||||
attrs = {
|
||||
|
@ -2749,7 +2750,7 @@ class FormPage(FormdefDirectoryBase):
|
|||
'statistics', get_request().user
|
||||
):
|
||||
raise errors.AccessForbiddenError()
|
||||
html_top('management', '%s - %s' % (_('Form'), self.formdef.name))
|
||||
get_response().set_title('%s - %s' % (_('Form'), self.formdef.name))
|
||||
r = TemplateIO(html=True)
|
||||
get_response().breadcrumb.append(('stats', _('Statistics')))
|
||||
|
||||
|
@ -3030,9 +3031,6 @@ class FormBackOfficeStatusPage(FormStatusPage):
|
|||
'The form has been recorded on %(date)s with the number %(number)s by %(agent)s.'
|
||||
)
|
||||
|
||||
def html_top(self, title=None):
|
||||
return html_top('management', title)
|
||||
|
||||
def _q_index(self):
|
||||
if self.filled.status == 'draft':
|
||||
if self.filled.backoffice_submission and self.formdef.backoffice_submission_roles:
|
||||
|
@ -3623,7 +3621,7 @@ class FormBackOfficeStatusPage(FormStatusPage):
|
|||
if self.filled.is_draft():
|
||||
raise errors.AccessForbiddenError()
|
||||
get_response().breadcrumb.append(('inspect', _('Data Inspector')))
|
||||
self.html_top(self.formdef.name)
|
||||
get_response().set_title(self.formdef.name)
|
||||
|
||||
context = {}
|
||||
|
||||
|
|
|
@ -30,7 +30,6 @@ from wcs.formdef import FormDef
|
|||
|
||||
from ..qommon import _, errors, get_cfg, misc, template
|
||||
from ..qommon.afterjobs import AfterJob
|
||||
from ..qommon.backoffice.menu import html_top
|
||||
from .cards import CardsDirectory
|
||||
from .data_management import DataManagementDirectory
|
||||
from .i18n import I18nDirectory
|
||||
|
@ -85,6 +84,7 @@ class RootDirectory(AccessControlled, Directory):
|
|||
if path and path[0] == 'categories':
|
||||
# legacy /backoffice/categories/<...>, redirect.
|
||||
return redirect('/backoffice/forms/' + '/'.join(path))
|
||||
get_response().set_backoffice_section('studio')
|
||||
return super()._q_traverse(path)
|
||||
|
||||
@classmethod
|
||||
|
@ -263,7 +263,7 @@ class RootDirectory(AccessControlled, Directory):
|
|||
return redirect('.')
|
||||
|
||||
get_response().add_javascript(['jquery.js', 'afterjob.js'])
|
||||
html_top('/', title=job.label)
|
||||
get_response().set_title(job.label)
|
||||
return template.QommonTemplateResponse(
|
||||
templates=['wcs/backoffice/processing.html'], context={'job': job}
|
||||
)
|
||||
|
|
|
@ -26,7 +26,6 @@ from quixote.html import TemplateIO, htmltext
|
|||
|
||||
from wcs.formdef import FormdefImportError
|
||||
from wcs.qommon import _, errors, misc, template
|
||||
from wcs.qommon.backoffice.menu import html_top
|
||||
from wcs.qommon.form import Form, RadiobuttonsWidget, StringWidget
|
||||
from wcs.sql_criterias import Equal
|
||||
from wcs.workflows import WorkflowImportError
|
||||
|
@ -46,7 +45,7 @@ class SnapshotsDirectory(Directory):
|
|||
return super()._q_traverse(path)
|
||||
|
||||
def _q_index(self):
|
||||
html_top('', _('History'))
|
||||
get_response().set_title(_('History'))
|
||||
return template.QommonTemplateResponse(
|
||||
templates=['wcs/backoffice/snapshots.html'],
|
||||
context={'view': self, 'enable_tests': get_publisher().has_site_option('enable-tests')},
|
||||
|
@ -65,7 +64,7 @@ class SnapshotsDirectory(Directory):
|
|||
get_publisher().snapshot_class.snap(instance=self.obj, label=label.parse())
|
||||
return redirect('../')
|
||||
|
||||
html_top('', _('History'))
|
||||
get_response().set_title(_('History'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Save snapshot')
|
||||
r += form.render()
|
||||
|
@ -73,7 +72,7 @@ class SnapshotsDirectory(Directory):
|
|||
|
||||
def compare(self):
|
||||
get_response().breadcrumb.append(('compare/', _('Compare')))
|
||||
html_top('', _('Compare'))
|
||||
get_response().set_title(_('Compare'))
|
||||
|
||||
mode = get_request().form.get('mode') or 'xml'
|
||||
|
||||
|
|
|
@ -27,7 +27,6 @@ from wcs.data_sources import NamedDataSource
|
|||
from wcs.formdef import FormDef
|
||||
from wcs.mail_templates import MailTemplate
|
||||
from wcs.qommon import _, misc, pgettext, template
|
||||
from wcs.qommon.backoffice.menu import html_top
|
||||
from wcs.qommon.form import get_response
|
||||
from wcs.workflows import Workflow
|
||||
from wcs.wscalls import NamedWsCall
|
||||
|
@ -38,7 +37,7 @@ class ChangesDirectory(Directory):
|
|||
|
||||
def _q_index(self):
|
||||
get_response().breadcrumb.append(('all-changes/', pgettext('studio', 'All changes')))
|
||||
html_top(pgettext('studio', 'All Changes'))
|
||||
get_response().set_title(pgettext('studio', 'All Changes'))
|
||||
limit = misc.get_int_or_400(
|
||||
get_request().form.get('limit', get_publisher().get_site_option('default-page-size')) or 20
|
||||
)
|
||||
|
@ -88,15 +87,13 @@ class StudioDirectory(Directory):
|
|||
def __init__(self):
|
||||
self.logged_errors_dir = LoggedErrorsDirectory(parent_dir=self)
|
||||
|
||||
def html_top(self, title):
|
||||
return html_top('studio', title)
|
||||
|
||||
def _q_traverse(self, path):
|
||||
get_response().breadcrumb.append(('studio/', _('Studio')))
|
||||
get_response().set_backoffice_section('studio')
|
||||
return super()._q_traverse(path)
|
||||
|
||||
def _q_index(self):
|
||||
self.html_top(_('Studio'))
|
||||
get_response().set_title(_('Studio'))
|
||||
extra_links = []
|
||||
backoffice_root = get_publisher().get_backoffice_root()
|
||||
object_types = []
|
||||
|
|
|
@ -30,7 +30,6 @@ from wcs.forms.root import FormPage as PublicFormFillPage
|
|||
from wcs.sql_criterias import Equal, StrictNotEqual
|
||||
|
||||
from ..qommon import _, errors, misc
|
||||
from ..qommon.backoffice.menu import html_top
|
||||
from ..qommon.form import Form, HtmlWidget
|
||||
|
||||
|
||||
|
@ -53,7 +52,7 @@ class RemoveDraftDirectory(Directory):
|
|||
if self.parent_directory.edit_mode:
|
||||
raise errors.AccessForbiddenError()
|
||||
|
||||
self.parent_directory.html_top(title=_('Discard'))
|
||||
get_response().set_title(_('Discard'))
|
||||
|
||||
form = Form(enctype='multipart/form-data')
|
||||
form.widgets.append(HtmlWidget('<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']
|
||||
return formdata
|
||||
|
||||
def html_top(self, *args, **kwargs):
|
||||
return html_top('submission', *args, **kwargs)
|
||||
|
||||
@classmethod
|
||||
def get_status_page_class(cls):
|
||||
return SubmissionFormStatusPage
|
||||
|
@ -407,6 +403,10 @@ class FormFillPage(PublicFormFillPage):
|
|||
class SubmissionDirectory(Directory):
|
||||
_q_exports = ['', 'count']
|
||||
|
||||
def _q_traverse(self, path):
|
||||
get_response().set_backoffice_section('submission')
|
||||
return super()._q_traverse(path)
|
||||
|
||||
def is_accessible(self, user):
|
||||
if not user.can_go_in_backoffice():
|
||||
return False
|
||||
|
@ -437,7 +437,7 @@ class SubmissionDirectory(Directory):
|
|||
|
||||
def _q_index(self):
|
||||
get_response().breadcrumb.append(('submission/', _('Submission')))
|
||||
html_top('submission', _('Submission'))
|
||||
get_response().set_title(_('Submission'))
|
||||
|
||||
list_forms = self.get_submittable_formdefs()
|
||||
cats = Category.select()
|
||||
|
|
|
@ -23,7 +23,6 @@ from wcs.formdef import FormDef
|
|||
from wcs.forms.common import FormTemplateMixin
|
||||
from wcs.qommon import _, errors, misc, template
|
||||
from wcs.qommon.afterjobs import AfterJob
|
||||
from wcs.qommon.backoffice.menu import html_top as backoffice_html_top
|
||||
from wcs.qommon.form import Form
|
||||
from wcs.qommon.http_request import HTTPRequest
|
||||
from wcs.wf.jump import jump_and_perform
|
||||
|
@ -84,7 +83,7 @@ class ActionDirectory(Directory, FormTemplateMixin):
|
|||
raise MissingOrExpiredToken()
|
||||
|
||||
def _q_index(self):
|
||||
template.html_top(title=self.formdef.name)
|
||||
get_response().set_title(self.formdef.name)
|
||||
form = Form()
|
||||
form.add_submit('submit', misc.site_encode(self.token.context['label']))
|
||||
if form.is_submitted() and not form.has_errors():
|
||||
|
@ -145,16 +144,11 @@ class GlobalInteractiveActionDirectory(Directory, FormTemplateMixin):
|
|||
raise MissingOrExpiredToken()
|
||||
|
||||
def _q_index(self):
|
||||
get_response().set_title(self.formdef.name)
|
||||
if get_request().is_in_backoffice():
|
||||
if isinstance(self.formdef, CardDef):
|
||||
section = 'data_management'
|
||||
else:
|
||||
section = 'management'
|
||||
get_response().breadcrumb.append(('', self.action.name))
|
||||
backoffice_html_top(section, title=self.formdef.name)
|
||||
template_name = 'wcs/backoffice/global-interactive-action.html'
|
||||
else:
|
||||
template.html_top(title=self.formdef.name)
|
||||
template_name = 'wcs/global-interactive-action.html'
|
||||
|
||||
if len(self.token.context['form_ids']) == 1:
|
||||
|
|
|
@ -163,9 +163,6 @@ class FormStatusPage(Directory, FormTemplateMixin):
|
|||
history_templates = ['wcs/formdata_history.html']
|
||||
status_templates = ['wcs/formdata_status.html']
|
||||
|
||||
def html_top(self, title=None):
|
||||
template.html_top(title=title, default_org=_('Forms'))
|
||||
|
||||
def __init__(self, formdef, filled, register_workflow_subdirs=True, custom_view=None, parent_view=None):
|
||||
get_publisher().substitutions.feed(filled)
|
||||
self.formdef = formdef
|
||||
|
@ -340,7 +337,7 @@ class FormStatusPage(Directory, FormTemplateMixin):
|
|||
form.add_media()
|
||||
|
||||
get_response().add_javascript(['jquery.js', 'qommon.forms.js', 'qommon.map.js'])
|
||||
self.html_top(get_publisher().translate(self.formdef.name))
|
||||
get_response().set_title(get_publisher().translate(self.formdef.name))
|
||||
get_response().filter['page_title'] = self.filled.get_display_label()
|
||||
context = {
|
||||
'view': self,
|
||||
|
@ -670,7 +667,7 @@ class FormStatusPage(Directory, FormTemplateMixin):
|
|||
|
||||
get_response().add_javascript(['jquery.js', 'qommon.forms.js'])
|
||||
audit('view', obj=self.filled)
|
||||
self.html_top('%s - %s' % (self.formdef.name, self.filled.id))
|
||||
get_response().set_title('%s - %s' % (self.formdef.name, self.filled.id))
|
||||
r = TemplateIO(html=True)
|
||||
r += get_session().display_message()
|
||||
r += htmltext(self.workflow_messages())
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
# 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
|
||||
from quixote import get_publisher, get_response
|
||||
from quixote.directory import AccessControlled, Directory
|
||||
from quixote.html import TemplateIO, htmltext
|
||||
|
||||
|
@ -38,7 +38,7 @@ class PreviewFormPage(FormPage):
|
|||
return form
|
||||
|
||||
def submitted(self, *args, **kwargs):
|
||||
self.html_top(self.formdef.name)
|
||||
get_response().set_title(self.formdef.name)
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<div class="warningnotice"><p>')
|
||||
r += str(_('This was only a preview: form was not actually submitted.'))
|
||||
|
|
|
@ -64,10 +64,6 @@ class SubmittedDraftException(Exception):
|
|||
pass
|
||||
|
||||
|
||||
def html_top(title=None, page_title=None):
|
||||
template.html_top(title=title, default_org=_('Forms'), page_title=page_title)
|
||||
|
||||
|
||||
def tryauth(url):
|
||||
# tries to log the user in before redirecting to the asked url; this won't
|
||||
# do anything for local logins but will use a passive SAML request when
|
||||
|
@ -144,7 +140,6 @@ class TrackingCodeDirectory(Directory):
|
|||
emails.custom_template_email('tracking-code-reminder', data, email, fire_and_forget=True)
|
||||
return redirect('./load')
|
||||
|
||||
html_top()
|
||||
r = TemplateIO(html=True)
|
||||
try:
|
||||
tracking_code = get_publisher().tracking_code_class.get(self.code)
|
||||
|
@ -223,7 +218,7 @@ class TrackingCodeDirectory(Directory):
|
|||
break
|
||||
|
||||
if not form.is_submitted() or form.has_errors() or bad_content:
|
||||
html_top(title=_('Access rights verification'))
|
||||
get_response().set_title(_('Access rights verification'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Access rights verification')
|
||||
r += htmltext('<p>%s</p>') % ngettext(
|
||||
|
@ -307,9 +302,6 @@ class FormPage(FormdefDirectoryBase, FormTemplateMixin):
|
|||
url += '?' + get_request().get_query()
|
||||
return redirect(url)
|
||||
|
||||
def html_top(self, *args, **kwargs):
|
||||
html_top(*args, **kwargs)
|
||||
|
||||
def get_substitution_variables(self):
|
||||
return self.substvars
|
||||
|
||||
|
@ -536,7 +528,7 @@ class FormPage(FormdefDirectoryBase, FormTemplateMixin):
|
|||
def set_page_title(self):
|
||||
step_context = self.step_context()
|
||||
if len(step_context.get('page_labels')) > 1:
|
||||
self.html_top(
|
||||
get_response().set_title(
|
||||
title=get_publisher().translate(self.formdef.name),
|
||||
page_title='%s - %s/%s - %s'
|
||||
% (
|
||||
|
@ -547,7 +539,7 @@ class FormPage(FormdefDirectoryBase, FormTemplateMixin):
|
|||
),
|
||||
)
|
||||
else:
|
||||
self.html_top(
|
||||
get_response().set_title(
|
||||
title=get_publisher().translate(self.formdef.name),
|
||||
page_title='%s - %s'
|
||||
% (
|
||||
|
@ -964,7 +956,7 @@ class FormPage(FormdefDirectoryBase, FormTemplateMixin):
|
|||
if get_session().get_authentication_context() in self.formdef.required_authentication_contexts:
|
||||
return
|
||||
|
||||
self.html_top(get_publisher().translate(self.formdef.name))
|
||||
get_response().set_title(get_publisher().translate(self.formdef.name))
|
||||
r = TemplateIO(html=True)
|
||||
r += self.form_side()
|
||||
auth_contexts = get_publisher().get_supported_authentication_contexts()
|
||||
|
@ -2036,7 +2028,7 @@ class RootDirectory(AccessControlled, Directory):
|
|||
)
|
||||
)
|
||||
|
||||
template.html_top(default_org=_('Forms'))
|
||||
get_response().set_title(_('Forms'))
|
||||
r = TemplateIO(html=True)
|
||||
|
||||
session = get_session()
|
||||
|
@ -2275,7 +2267,7 @@ class RootDirectory(AccessControlled, Directory):
|
|||
raise errors.TraversalError()
|
||||
if get_request().is_json():
|
||||
return self.categories_json()
|
||||
template.html_top(_('Categories'))
|
||||
get_response().set_title(_('Categories'))
|
||||
r = TemplateIO(html=True)
|
||||
user = get_request().user
|
||||
for category in self.get_categories(user):
|
||||
|
|
|
@ -20,7 +20,6 @@ from quixote.html import TemplateIO, htmltext
|
|||
|
||||
from .. import _, get_cfg
|
||||
from ..admin.cfg import cfg_submit
|
||||
from ..backoffice.menu import html_top
|
||||
from ..form import CheckboxWidget, Form, StringWidget, TextWidget, WidgetList
|
||||
|
||||
|
||||
|
@ -145,7 +144,7 @@ class EmailsDirectory(Directory):
|
|||
return redirect('.')
|
||||
|
||||
if not form.is_submitted() or form.has_errors():
|
||||
html_top('settings', title=_('Emails'))
|
||||
get_response().set_title(_('Emails'))
|
||||
get_response().breadcrumb.append(('options', _('General Options')))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('General Options')
|
||||
|
@ -178,7 +177,7 @@ class EmailsDirectory(Directory):
|
|||
return redirect('.')
|
||||
|
||||
def _q_index(self):
|
||||
html_top('settings', title=_('Emails'))
|
||||
get_response().set_title(_('Emails'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Emails')
|
||||
|
||||
|
@ -255,7 +254,7 @@ class EmailsDirectory(Directory):
|
|||
form.set_error(cfg_key, _('Invalid template'))
|
||||
|
||||
get_response().breadcrumb.append((email_key, email_label))
|
||||
html_top('settings', title=_('Emails'))
|
||||
get_response().set_title(_('Emails'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s - %s</h2>') % (_('Email'), email_label)
|
||||
r += form.render()
|
||||
|
|
|
@ -16,11 +16,10 @@
|
|||
|
||||
import re
|
||||
|
||||
from quixote import get_publisher, get_request
|
||||
from quixote import get_publisher, get_request, get_response
|
||||
from quixote.html import TemplateIO, htmltext
|
||||
|
||||
from .. import _
|
||||
from ..backoffice.menu import html_top
|
||||
|
||||
|
||||
def _find_vc_version():
|
||||
|
@ -137,8 +136,8 @@ def command_icon(url, type, label=None, popup=False):
|
|||
)
|
||||
|
||||
|
||||
def error_page(section, error):
|
||||
html_top(section, title=_('Error'))
|
||||
def error_page(error):
|
||||
get_response().set_title(_('Error'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<div id="error-page">')
|
||||
r += htmltext('<h2>%s</h2>') % _('Error')
|
||||
|
|
|
@ -21,7 +21,6 @@ from quixote.directory import Directory
|
|||
from quixote.html import TemplateIO, htmltext
|
||||
|
||||
from wcs.qommon import _, ezt, get_cfg
|
||||
from wcs.qommon.backoffice.menu import html_top
|
||||
from wcs.qommon.form import Form, WysiwygTextWidget
|
||||
from wcs.qommon.template import Template
|
||||
|
||||
|
@ -69,11 +68,8 @@ class TextsDirectory(Directory):
|
|||
'condition': condition,
|
||||
}
|
||||
|
||||
def html_top(self, title):
|
||||
html_top('settings', title)
|
||||
|
||||
def _q_index(self):
|
||||
self.html_top(title=_('Texts'))
|
||||
get_response().set_title(_('Texts'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Custom Texts')
|
||||
|
||||
|
@ -141,7 +137,7 @@ class TextsDirectory(Directory):
|
|||
form.set_error(cfg_key, _('Invalid template'))
|
||||
|
||||
get_response().breadcrumb.append((text_key, text_label))
|
||||
self.html_top(title=_('Texts'))
|
||||
get_response().set_title(_('Texts'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s - %s</h2>') % (_('Text'), text_label)
|
||||
r += form.render()
|
||||
|
|
|
@ -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
|
|
@ -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())
|
|
@ -17,7 +17,7 @@
|
|||
import urllib.parse
|
||||
|
||||
import quixote
|
||||
from quixote import get_publisher
|
||||
from quixote import get_publisher, get_response
|
||||
from quixote.errors import AccessError, PublishError, TraversalError
|
||||
from quixote.html import TemplateIO, htmltext
|
||||
|
||||
|
@ -86,7 +86,7 @@ class InternalServerError(PublishError):
|
|||
def render(self):
|
||||
from . import _
|
||||
|
||||
template.html_top(_('Technical error'))
|
||||
get_response().set_title(_('Technical error'))
|
||||
r = TemplateIO(html=True)
|
||||
|
||||
r += htmltext('<p>')
|
||||
|
|
|
@ -33,6 +33,7 @@ class HTTPResponse(quixote.http_response.HTTPResponse):
|
|||
quixote.http_response.HTTPResponse.__init__(self, charset=charset, **kwargs)
|
||||
if not charset:
|
||||
self.charset = get_publisher().site_charset
|
||||
self.filter = {}
|
||||
|
||||
def _gen_cookie_headers(self):
|
||||
return []
|
||||
|
@ -189,3 +190,10 @@ class HTTPResponse(quixote.http_response.HTTPResponse):
|
|||
def process_after_jobs(self):
|
||||
for job in self.after_jobs or []:
|
||||
job.run(spool=True)
|
||||
|
||||
def set_backoffice_section(self, section):
|
||||
self.filter['backoffice_section'] = section
|
||||
|
||||
def set_title(self, title, page_title=None):
|
||||
self.filter['title'] = title
|
||||
self.filter['page_title'] = page_title
|
||||
|
|
|
@ -20,7 +20,7 @@ import urllib.parse
|
|||
import uuid
|
||||
|
||||
from django.utils.encoding import force_bytes
|
||||
from quixote import get_publisher, get_request, get_session, get_session_manager, redirect
|
||||
from quixote import get_publisher, get_request, get_response, get_session, get_session_manager, redirect
|
||||
from quixote.directory import Directory
|
||||
from quixote.errors import QueryError
|
||||
from quixote.html import TemplateIO, htmltext
|
||||
|
@ -29,7 +29,6 @@ from wcs.formdata import flatten_dict
|
|||
from wcs.workflows import WorkflowStatusItem
|
||||
|
||||
from .. import _, get_cfg, template
|
||||
from ..backoffice.menu import html_top
|
||||
from ..form import (
|
||||
CompositeWidget,
|
||||
ComputedExpressionWidget,
|
||||
|
@ -232,7 +231,7 @@ class MethodAdminDirectory(Directory):
|
|||
if 'submit' in get_request().form and form.is_submitted() and not form.has_errors():
|
||||
return self.submit(form)
|
||||
|
||||
html_top('settings', title=self.title)
|
||||
get_response().set_title(self.title)
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % self.title
|
||||
fc_callback = pub.get_frontoffice_url() + '/ident/fc/callback'
|
||||
|
|
|
@ -31,7 +31,6 @@ from quixote.html import TemplateIO, htmltext
|
|||
|
||||
from .. import _, errors, get_cfg, misc, saml2utils, template, x509utils
|
||||
from ..admin.menu import command_icon
|
||||
from ..backoffice.menu import html_top
|
||||
from ..form import (
|
||||
CheckboxWidget,
|
||||
EmailWidget,
|
||||
|
@ -125,7 +124,7 @@ class MethodDirectory(Directory):
|
|||
saml = get_publisher().root_directory_class.saml
|
||||
return saml.perform_login(idp)
|
||||
|
||||
template.html_top(_('Login'))
|
||||
get_response().set_title(_('Login'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<p>%s</p>') % _('Select the identity provider you want to use.')
|
||||
r += form.render()
|
||||
|
@ -170,7 +169,7 @@ class MethodDirectory(Directory):
|
|||
return tmp
|
||||
|
||||
get_response().breadcrumb.append(('register', _('New Account')))
|
||||
template.html_top(_('New Account'))
|
||||
get_response().set_title(_('New Account'))
|
||||
r = TemplateIO(html=True)
|
||||
r += form.render()
|
||||
return r.getvalue()
|
||||
|
@ -211,7 +210,7 @@ class AdminIDPDir(Directory):
|
|||
return Directory._q_traverse(self, path)
|
||||
|
||||
def _q_index(self):
|
||||
html_top('settings', title=self.title)
|
||||
get_response().set_title(self.title)
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Identity Providers')
|
||||
r += htmltext('<ul id="nav-idp-admin">\n')
|
||||
|
@ -328,7 +327,7 @@ class AdminIDPDir(Directory):
|
|||
form = self.get_form()
|
||||
|
||||
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 += htmltext('<h2>%s</h2>') % _('New Identity Provider')
|
||||
r += form.render()
|
||||
|
@ -507,7 +506,7 @@ class AdminIDPDir(Directory):
|
|||
os.unlink(metadata_pathname)
|
||||
|
||||
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 += htmltext('<h2>%s</h2>') % _('New Identity Provider')
|
||||
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('cacertchain', None)),
|
||||
)
|
||||
html_top('settings', title=_('Identity Provider'))
|
||||
get_response().set_title(_('Identity Provider'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s - %s</h2>') % (_('Identity Provider'), p.providerId)
|
||||
r += htmltext('<div class="form">')
|
||||
|
@ -624,7 +623,7 @@ class AdminIDPUI(Directory):
|
|||
form = AdminIDPDir.get_form(self.idp)
|
||||
|
||||
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 += htmltext('<h2>%s</h2>') % _('Edit Identity Provider')
|
||||
r += form.render()
|
||||
|
@ -655,7 +654,7 @@ class AdminIDPUI(Directory):
|
|||
if form.get_widget('cancel').parse():
|
||||
return redirect('..')
|
||||
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)
|
||||
if p:
|
||||
r += htmltext('<h2>%s %s</h2>') % (_('Deleting'), p.providerId)
|
||||
|
@ -792,7 +791,7 @@ class MethodAdminDirectory(Directory):
|
|||
return Directory._q_traverse(self, path)
|
||||
|
||||
def _q_index(self):
|
||||
html_top('settings', title=self.title)
|
||||
get_response().set_title(self.title)
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>SAML 2.0</h2>')
|
||||
r += htmltext('<dl> <dt><a href="sp">%s</a></dt> <dd>%s</dd>') % (
|
||||
|
@ -935,7 +934,7 @@ class MethodAdminDirectory(Directory):
|
|||
else:
|
||||
return redirect('.')
|
||||
|
||||
html_top('settings', title=_('Service Provider Configuration'))
|
||||
get_response().set_title(_('Service Provider Configuration'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Service Provider Configuration')
|
||||
r += form.render()
|
||||
|
@ -1083,7 +1082,7 @@ class MethodAdminDirectory(Directory):
|
|||
return redirect('.')
|
||||
|
||||
get_response().breadcrumb.append(('identities', _('Identities Interface')))
|
||||
html_top('settings', title=_('Identities Interface'))
|
||||
get_response().set_title(_('Identities Interface'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Identities Interface')
|
||||
r += form.render()
|
||||
|
|
|
@ -26,7 +26,6 @@ from .. import _, emails, errors, get_cfg, misc, ngettext
|
|||
from .. import storage as st
|
||||
from .. import template
|
||||
from ..admin.emails import EmailsDirectory
|
||||
from ..backoffice.menu import html_top
|
||||
from ..form import (
|
||||
CheckboxWidget,
|
||||
CompositeWidget,
|
||||
|
@ -165,11 +164,11 @@ class TokenDirectory(Directory):
|
|||
|
||||
r = TemplateIO(html=True)
|
||||
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')
|
||||
|
||||
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.awaiting_confirmation = False
|
||||
account.store()
|
||||
|
@ -229,7 +228,7 @@ class MethodDirectory(Directory):
|
|||
return tmp
|
||||
|
||||
get_response().breadcrumb.append(('login', _('Login')))
|
||||
template.html_top(_('Login'))
|
||||
get_response().set_title(_('Login'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<div class="ident-content">')
|
||||
r += htmltext('<div id="login">')
|
||||
|
@ -326,7 +325,7 @@ class MethodDirectory(Directory):
|
|||
r = TemplateIO(html=True)
|
||||
if not include_mode:
|
||||
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 += TextsDirectory.get_html_text('password-forgotten-enter-username')
|
||||
|
@ -372,7 +371,7 @@ class MethodDirectory(Directory):
|
|||
return None
|
||||
|
||||
def forgotten_token_sent():
|
||||
template.html_top(_('Forgotten Password'))
|
||||
get_response().set_title(_('Forgotten Password'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<div class="ident-content">')
|
||||
r += TextsDirectory.get_html_text('password-forgotten-token-sent')
|
||||
|
@ -398,7 +397,7 @@ class MethodDirectory(Directory):
|
|||
)
|
||||
|
||||
if action == 'cxlpw':
|
||||
template.html_top(_('Password Change'))
|
||||
get_response().set_title(_('Password Change'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<div class="ident-content">')
|
||||
r += htmltext('<h1>%s</h1>') % _('Request Cancelled')
|
||||
|
@ -445,7 +444,7 @@ class MethodDirectory(Directory):
|
|||
return tmp
|
||||
return redirect('login/')
|
||||
|
||||
template.html_top(_('Password Change'))
|
||||
get_response().set_title(_('Password Change'))
|
||||
get_request().form = {}
|
||||
return form.render()
|
||||
|
||||
|
@ -481,7 +480,7 @@ class MethodDirectory(Directory):
|
|||
def forgotten_token_end_page(self):
|
||||
r = TemplateIO(html=True)
|
||||
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>')
|
||||
return r.getvalue()
|
||||
|
||||
|
@ -536,7 +535,7 @@ class MethodDirectory(Directory):
|
|||
return tmp
|
||||
|
||||
get_response().breadcrumb.append(('register', _('New Account')))
|
||||
template.html_top(_('New Account'))
|
||||
get_response().set_title(_('New Account'))
|
||||
r += htmltext('<div class="ident-content">')
|
||||
r += TextsDirectory.get_html_text('new-account')
|
||||
r += form.render()
|
||||
|
@ -638,7 +637,7 @@ class MethodDirectory(Directory):
|
|||
def confirmation_notification(self, 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 += htmltext('<div class="ident-content">')
|
||||
r += TextsDirectory.get_html_text('email-sent-confirm-creation')
|
||||
|
@ -680,7 +679,7 @@ class MethodAdminDirectory(Directory):
|
|||
_q_exports = ['', 'passwords', 'identities']
|
||||
|
||||
def _q_index(self):
|
||||
html_top('settings', title=ADMIN_TITLE)
|
||||
get_response().set_title(ADMIN_TITLE)
|
||||
get_response().breadcrumb.append(('password/', ADMIN_TITLE))
|
||||
r = TemplateIO(html=True)
|
||||
|
||||
|
@ -778,7 +777,7 @@ class MethodAdminDirectory(Directory):
|
|||
self.passwords_submit(form)
|
||||
return redirect('.')
|
||||
|
||||
html_top('settings', title=_('Passwords'))
|
||||
get_response().set_title(_('Passwords'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Passwords')
|
||||
r += form.render()
|
||||
|
@ -847,7 +846,7 @@ class MethodAdminDirectory(Directory):
|
|||
self.identities_submit(form)
|
||||
return redirect('.')
|
||||
|
||||
html_top('settings', title=_('Identities Interface'))
|
||||
get_response().set_title(_('Identities Interface'))
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<h2>%s</h2>') % _('Identities Interface')
|
||||
r += form.render()
|
||||
|
@ -932,7 +931,7 @@ class MethodUserDirectory(Directory):
|
|||
return actions
|
||||
|
||||
def email(self):
|
||||
html_top('users', title=ADMIN_TITLE)
|
||||
get_response().set_title(title=ADMIN_TITLE)
|
||||
r = TemplateIO(html=True)
|
||||
get_response().breadcrumb.append(('email', 'Email Password'))
|
||||
r += htmltext('<h2>%s</h2>') % _('Email Password')
|
||||
|
|
|
@ -20,7 +20,7 @@ from quixote.html import TemplateIO, htmltext
|
|||
|
||||
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 .ident.password import check_password
|
||||
from .ident.password_accounts import PasswordAccount
|
||||
|
@ -55,7 +55,7 @@ class MyspaceDirectory(Directory):
|
|||
if not user:
|
||||
raise errors.AccessUnauthorizedError()
|
||||
|
||||
template.html_top(_('My Space'))
|
||||
get_response().set_title(_('My Space'))
|
||||
r = TemplateIO(html=True)
|
||||
|
||||
if user.can_go_in_admin() or user.can_go_in_backoffice():
|
||||
|
@ -118,7 +118,7 @@ class MyspaceDirectory(Directory):
|
|||
self.profile_submit(form, formdef)
|
||||
return redirect('.')
|
||||
|
||||
template.html_top(_('Edit Profile'))
|
||||
get_response().set_title(_('Edit Profile'))
|
||||
return form.render()
|
||||
|
||||
def profile_submit(self, form, formdef):
|
||||
|
@ -164,7 +164,7 @@ class MyspaceDirectory(Directory):
|
|||
account.store()
|
||||
return redirect('.')
|
||||
|
||||
template.html_top(_('Change Password'))
|
||||
get_response().set_title(_('Change Password'))
|
||||
return form.render()
|
||||
|
||||
def remove(self):
|
||||
|
@ -192,7 +192,7 @@ class MyspaceDirectory(Directory):
|
|||
get_session_manager().expire_session()
|
||||
return redirect(get_publisher().get_root_url())
|
||||
|
||||
template.html_top(_('Removing Account'))
|
||||
get_response().set_title(_('Removing Account'))
|
||||
return form.render()
|
||||
|
||||
|
||||
|
|
|
@ -40,7 +40,7 @@ from quixote.http_request import parse_header
|
|||
|
||||
from . import _, errors, force_str, misc
|
||||
from .publisher import get_cfg, get_logger
|
||||
from .template import QommonTemplateResponse, error_page, html_top
|
||||
from .template import QommonTemplateResponse, error_page
|
||||
|
||||
|
||||
class SOAPException(Exception):
|
||||
|
@ -807,7 +807,7 @@ class Saml2Directory(Directory):
|
|||
request = get_request()
|
||||
if request.get_method() == 'POST':
|
||||
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={})
|
||||
|
||||
# retain compatibility with old metadatas
|
||||
|
|
|
@ -49,27 +49,16 @@ def get_theme_directory(theme_id):
|
|||
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):
|
||||
from . import _
|
||||
|
||||
if not error_title:
|
||||
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():
|
||||
from wcs.qommon.backoffice.menu import html_top as backoffice_html_top
|
||||
|
||||
get_response().add_javascript(['jquery.js', 'qommon.js', 'gadjo.js'])
|
||||
backoffice_html_top(section='', **kwargs)
|
||||
|
||||
context = get_decorate_vars('', get_response())
|
||||
context['error_message'] = error_message
|
||||
|
@ -78,7 +67,6 @@ def error_page(error_message, error_title=None, location_hint=None):
|
|||
)
|
||||
|
||||
r = TemplateIO(html=True)
|
||||
html_top(**kwargs)
|
||||
r += htmltext('<div class="error-page">')
|
||||
r += htmltext('<p>%s</p>') % error_message
|
||||
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)
|
||||
|
||||
is_in_backoffice = response.filter.get('admin_ezt')
|
||||
is_in_backoffice = response.filter.get('backoffice_page')
|
||||
|
||||
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')
|
||||
page_title = kwargs.get('title', '')
|
||||
subtitle = kwargs.get('subtitle')
|
||||
|
|
|
@ -291,8 +291,8 @@ class RootDirectory(Directory):
|
|||
return output
|
||||
|
||||
response = get_response()
|
||||
if not hasattr(response, 'filter'):
|
||||
response.filter = {}
|
||||
if not response.filter:
|
||||
response.filter = {'default_org': _('Forms')}
|
||||
if not hasattr(response, 'breadcrumb'):
|
||||
response.breadcrumb = [('', _('Home'))]
|
||||
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
<link rel="stylesheet" type="text/css" media="all" href="{{ STATIC_URL }}css/dc2/admin.css?{% version_hash %}"/>
|
||||
{% 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 %}
|
||||
|
||||
|
|
|
@ -35,7 +35,7 @@ class Backoffice(compat.TemplateWithFallbackView):
|
|||
|
||||
_request = None
|
||||
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())
|
||||
if isinstance(body, template.QommonTemplateResponse):
|
||||
body.add_media()
|
||||
|
|
|
@ -251,7 +251,7 @@ class FormWorkflowStatusItem(WorkflowStatusItem):
|
|||
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)
|
||||
|
||||
def q_admin_lookup(self, workflow, status, component, html_top):
|
||||
def q_admin_lookup(self, workflow, status, component):
|
||||
if component == 'fields':
|
||||
if not self.formdef:
|
||||
self.formdef = WorkflowFormFieldsFormDef(item=self)
|
||||
|
@ -260,7 +260,6 @@ class FormWorkflowStatusItem(WorkflowStatusItem):
|
|||
fields_directory = WorkflowFormFieldsDirectory(self.formdef)
|
||||
if self.varname:
|
||||
fields_directory.field_var_prefix = 'form_workflow_form_%s_var_' % self.varname
|
||||
fields_directory.html_top = html_top
|
||||
return fields_directory
|
||||
return None
|
||||
|
||||
|
|
|
@ -2942,7 +2942,7 @@ class WorkflowStatusItem(XmlSerialisable):
|
|||
# backward compatibility
|
||||
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
|
||||
|
||||
def __getstate__(self):
|
||||
|
|
Loading…
Reference in New Issue