From b595a2d22edffe76d7109d3e2cb7ab084c2b0d9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Wed, 9 Aug 2017 08:28:14 +0200 Subject: [PATCH] general: use real gadjo for backoffice templates (#6735) --- wcs/admin/settings.py | 4 ++- wcs/admin/users.py | 2 +- wcs/backoffice/management.py | 10 +++--- wcs/compat.py | 34 +++++++++++++++++-- wcs/qommon/backoffice/menu.py | 2 -- wcs/qommon/http_response.py | 5 +++ wcs/qommon/publisher.py | 2 ++ wcs/qommon/template.py | 56 ++----------------------------- wcs/settings.py | 2 +- wcs/templates/wcs/backoffice.html | 46 +++++++++++++++++++++++++ wcs/urls.py | 1 + wcs/views.py | 23 ++++++++++++- 12 files changed, 120 insertions(+), 67 deletions(-) create mode 100644 wcs/templates/wcs/backoffice.html diff --git a/wcs/admin/settings.py b/wcs/admin/settings.py index 596cea18e..a534662ff 100644 --- a/wcs/admin/settings.py +++ b/wcs/admin/settings.py @@ -352,6 +352,8 @@ class ThemePreviewDirectory(Directory): root_directory = get_publisher().root_directory_class() response = get_response() + response.reset_includes() + response.filter = {} del(response.breadcrumb) if path[1] in ('backoffice', 'admin') or \ @@ -363,11 +365,11 @@ class ThemePreviewDirectory(Directory): from qommon.template import decorate theme_preview = decorate(output, response) - response.filter = None # restore original branding in case it has been changed get_publisher().cfg['branding'] = original_branding get_publisher().write_cfg() + response.filter['raw'] = True return theme_preview diff --git a/wcs/admin/users.py b/wcs/admin/users.py index bceeab3c9..c25825d65 100644 --- a/wcs/admin/users.py +++ b/wcs/admin/users.py @@ -386,7 +386,7 @@ class UsersDirectory(Directory): r += htmltext('') if get_request().form.get('ajax') == 'true': - get_response().filter = None + get_response().filter = {'raw': True} return r.getvalue() r2 = TemplateIO(html=True) diff --git a/wcs/backoffice/management.py b/wcs/backoffice/management.py index 564cad1ff..b5e3b2999 100644 --- a/wcs/backoffice/management.py +++ b/wcs/backoffice/management.py @@ -363,7 +363,7 @@ class UsersViewDirectory(Directory): r += htmltext('') r += htmltext('') if get_request().form.get('ajax') == 'true': - get_response().filter = None + get_response().filter = {'raw': True} return r.getvalue() formdef = UserFieldsFormDef() @@ -420,7 +420,7 @@ class UsersViewDirectory(Directory): r += htmltext('') if get_request().form.get('ajax') == 'true': - get_response().filter = None + get_response().filter = {'raw': True} return r.getvalue() return r.getvalue() @@ -880,7 +880,7 @@ class ManagementDirectory(Directory): r += pagination_links(offset, limit, total_count) if get_request().form.get('ajax') == 'true': - get_response().filter = None + get_response().filter = {'raw': True} return r.getvalue() get_response().filter['sidebar'] = self.get_global_listing_sidebar( @@ -1293,7 +1293,7 @@ class FormPage(Directory): return table if get_request().form.get('ajax') == 'true': - get_response().filter = None + get_response().filter = {'raw': True} return table html_top('management', '%s - %s' % (_('Listing'), self.formdef.name)) @@ -1777,7 +1777,7 @@ class FormPage(Directory): r += htmltext('') # id="statistics" if get_request().form.get('ajax') == 'true': - get_response().filter = None + get_response().filter = {'raw': True} return r.getvalue() page = TemplateIO(html=True) diff --git a/wcs/compat.py b/wcs/compat.py index 01d8e3e00..5eccc9d36 100644 --- a/wcs/compat.py +++ b/wcs/compat.py @@ -45,12 +45,40 @@ class TemplateWithFallbackView(TemplateView): loader.get_template(self.template_name) except TemplateDoesNotExist: return quixote(self.request) - context = self.get_context_data(**kwargs) - return self.render_to_response(context) + + try: + context = self.get_context_data(**kwargs) + except PublishError as exc: + context = {'body': get_publisher().finish_interrupted_request(exc)} + self.quixote_response = get_request().response + except Exception as exc: + context = {'body': get_publisher().finish_failed_request()} + self.quixote_response = get_request().response + + if self.quixote_response.content_type != 'text/html' or self.quixote_response.status_code != 200: + response = HttpResponse(context['body']) + response.status_code = self.quixote_response.status_code + response.reason_phrase = self.quixote_response.reason_phrase + elif request.META.get('HTTP_X_POPUP') == 'true': + response = HttpResponse('' % context['body']) + elif 'raw' in (getattr(self.quixote_response, 'filter') or {}): + # used for theme preview (generated in /backoffice/ but cannot + # obviously receive the admin template. + response = HttpResponse(context['body']) + else: + response = self.render_to_response(context) + + for name, value in self.quixote_response.generate_headers(): + if name == 'Content-Length': + continue + response[name] = value + response.after_jobs = self.quixote_response.after_jobs + + return response def render_to_response(self, context, **response_kwargs): django_response = super(TemplateWithFallbackView, self).render_to_response(context, **response_kwargs) - if self.quixote_response and self.quixote_response.status_code != '200': + if self.quixote_response and self.quixote_response.status_code != 200: django_response.status_code = self.quixote_response.status_code django_response.reason_phrase = self.quixote_response.reason_phrase for name, value in self.quixote_response.generate_headers(): diff --git a/wcs/qommon/backoffice/menu.py b/wcs/qommon/backoffice/menu.py index fb62f8adb..cc5dce0ea 100644 --- a/wcs/qommon/backoffice/menu.py +++ b/wcs/qommon/backoffice/menu.py @@ -63,6 +63,4 @@ def html_top(section, title = None, scripts = None): if title: sitetitle += ' - ' - admin_ezt = True get_response().filter.update(locals()) - diff --git a/wcs/qommon/http_response.py b/wcs/qommon/http_response.py index 860eed625..3788c3e9b 100644 --- a/wcs/qommon/http_response.py +++ b/wcs/qommon/http_response.py @@ -57,6 +57,11 @@ class HTTPResponse(quixote.http_response.HTTPResponse): location = iframe_server_url + location[len(server_url):] return quixote.http_response.HTTPResponse.redirect(self, location, permanent) + def reset_includes(self): + self.javascript_scripts = None + self.javascript_code_parts = None + self.css_includes = None + def add_javascript(self, script_names): if not self.javascript_scripts: self.javascript_scripts = [] diff --git a/wcs/qommon/publisher.py b/wcs/qommon/publisher.py index 23bddbfa5..564cbfbc3 100644 --- a/wcs/qommon/publisher.py +++ b/wcs/qommon/publisher.py @@ -1052,6 +1052,8 @@ class QommonPublisher(Publisher, object): d.update(dict(self.site_options.items('variables'))) except ConfigParser.NoSectionError: pass + d['manager_homepage_url'] = d.get('portal_agent_url') + d['manager_homepage_title'] = d.get('portal_agent_title') return d extra_sources = [] diff --git a/wcs/qommon/template.py b/wcs/qommon/template.py index 9a07ecd90..cd02358ec 100644 --- a/wcs/qommon/template.py +++ b/wcs/qommon/template.py @@ -163,60 +163,12 @@ DEFAULT_IFRAME_EZT = """ """ -ADMIN_TEMPLATE_EZT = """ - - - [page_title] - - [script] - [if-any extra_css] - - [end] - [if-any extra_head] - [extra_head] - [end] - - -
-
- [if-any app_label][app_label][end] - [header_menu] -
- [user_info] -
-
- -
- [body] -
- [if-any sidebar] - - [end] - [if-any footer] - - [end] -
- -""" - - default_template = ezt.Template() default_template.parse(DEFAULT_TEMPLATE_EZT) default_iframe_template = ezt.Template() default_iframe_template.parse(DEFAULT_IFRAME_EZT) -admin_template = ezt.Template() -admin_template.parse(ADMIN_TEMPLATE_EZT) - def html_top(title=None, default_org=None): if not hasattr(get_response(), 'filter'): @@ -290,7 +242,7 @@ def get_decorate_vars(body, response, generate_breadcrumb=True): body = str(body) if get_request().get_header('x-popup') == 'true': - return {} + return {'body': body} kwargs = {} for k, v in response.filter.items(): @@ -343,7 +295,7 @@ def get_decorate_vars(body, response, generate_breadcrumb=True): if is_in_backoffice: header_menu = kwargs.get('header_menu') user_info = kwargs.get('user_info') - page_title = kwargs.get('sitetitle') + kwargs.get('title', '') + page_title = kwargs.get('sitetitle', '') + kwargs.get('title', '') subtitle = kwargs.get('subtitle') sidebar = kwargs.get('sidebar') css = root_url + get_publisher().qommon_static_dir + get_publisher().qommon_admin_css @@ -406,9 +358,7 @@ def decorate(body, response): from publisher import get_cfg generate_breadcrumb = True - if response.filter.get('admin_ezt'): - template = admin_template - else: + if True: template_ezt = get_cfg('branding', {}).get('template') current_theme = get_cfg('branding', {}).get('theme', 'default') if response.page_template_key or not template_ezt: diff --git a/wcs/settings.py b/wcs/settings.py index f0945f955..ffbc99959 100644 --- a/wcs/settings.py +++ b/wcs/settings.py @@ -131,7 +131,7 @@ INSTALLED_APPS = ( #'django.contrib.sessions', #'django.contrib.sites', #'django.contrib.messages', - #'django.contrib.staticfiles', + 'django.contrib.staticfiles', #'django.contrib.admin', 'gadjo', 'wcs.qommon', diff --git a/wcs/templates/wcs/backoffice.html b/wcs/templates/wcs/backoffice.html new file mode 100644 index 000000000..261239f6d --- /dev/null +++ b/wcs/templates/wcs/backoffice.html @@ -0,0 +1,46 @@ +{% extends "gadjo/base.html" %} +{% block page-title %}{{ page_title }}{% endblock %} +{% block site-title %}{{ site_name }}{% endblock %} +{% block footer %}w.c.s. &emdash; Copyright © Entr'ouvert{% endblock %} + +{% block gadjo-js %} + +{{script|safe}} +{% endblock %} + +{% block css %} +{% endblock %} + +{% block user-links %} + {% if user_info %}{{ user_info|safe }}{% endif %} +{% endblock %} + +{% block site-header %} +

{% if breadcrumb %}{{ breadcrumb|safe }}{% endif %}

+{% endblock %} + +{% block breadcrumb %} +{% endblock %} + +{% block sidepage %} +
+ {{app_label}} + {{ header_menu|safe }} +
+{% endblock %} + +{% block main-content-attributes %} +{% if sidebar %}class="with-sidebar"{% endif %} +{% endblock %} + +{% block main-content %} +{{ body|safe }} +{% endblock %} + +{% block after-main-content %} +{% if sidebar %} + +{% endif %} +{% endblock %} diff --git a/wcs/urls.py b/wcs/urls.py index 1c96d509d..84383268f 100644 --- a/wcs/urls.py +++ b/wcs/urls.py @@ -19,6 +19,7 @@ from django.conf.urls import patterns, url urlpatterns = patterns('', url(r'^$', 'wcs.views.home', name='home'), + url(r'^backoffice/', 'wcs.views.backoffice'), ) # other URLs are handled by the quixote handler diff --git a/wcs/views.py b/wcs/views.py index ecb6da052..6c8b3843d 100644 --- a/wcs/views.py +++ b/wcs/views.py @@ -14,10 +14,11 @@ # You should have received a copy of the GNU General Public License # along with this program; if not, see . -from quixote import get_request +from quixote import get_publisher, get_request, get_response from .forms.root import RootDirectory as FormsRootDirectory from .qommon.admin.texts import TextsDirectory +from .qommon.template import get_decorate_vars from . import compat @@ -40,3 +41,23 @@ class Home(compat.TemplateWithFallbackView): return context home = Home.as_view() + + +class Backoffice(compat.TemplateWithFallbackView): + template_name = 'wcs/backoffice.html' + + def post(self, request, *args, **kwargs): + return self.get(request, *args, **kwargs) + + def get_context_data(self, **kwargs): + context = super(Backoffice, self).get_context_data(**kwargs) + + with compat.request(self.request): + get_request().response.filter = {'admin_ezt': True} + body = get_publisher().try_publish(get_request()) + self.quixote_response = get_request().response + context.update(get_decorate_vars(body, get_response(), generate_breadcrumb=True)) + + return context + +backoffice = Backoffice.as_view()