general: use real gadjo for backoffice templates (#6735)

This commit is contained in:
Frédéric Péters 2017-08-09 08:28:14 +02:00
parent e9a2264c29
commit b595a2d22e
12 changed files with 120 additions and 67 deletions

View File

@ -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

View File

@ -386,7 +386,7 @@ class UsersDirectory(Directory):
r += htmltext('</div>')
if get_request().form.get('ajax') == 'true':
get_response().filter = None
get_response().filter = {'raw': True}
return r.getvalue()
r2 = TemplateIO(html=True)

View File

@ -363,7 +363,7 @@ class UsersViewDirectory(Directory):
r += htmltext('</div>')
r += htmltext('</div>')
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('</div>')
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('</div>') # 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)

View File

@ -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('<div class="popup-content">%s</div>' % 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():

View File

@ -63,6 +63,4 @@ def html_top(section, title = None, scripts = None):
if title:
sitetitle += ' - '
admin_ezt = True
get_response().filter.update(locals())

View File

@ -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 = []

View File

@ -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 = []

View File

@ -163,60 +163,12 @@ DEFAULT_IFRAME_EZT = """<!DOCTYPE html>
</body>
</html>"""
ADMIN_TEMPLATE_EZT = """<!DOCTYPE html>
<html lang="[site_lang]">
<head>
<title>[page_title]</title>
<link rel="stylesheet" type="text/css" href="[css]"/>
[script]
[if-any extra_css]
<link rel="stylesheet" type="text/css" href="[extra_css]"/>
[end]
[if-any extra_head]
[extra_head]
[end]
</head>
<body data-gadjo="true" [if-any admin_for_all]class="admin-for-all"[end]>
<div id="top">
<div id="sidepage">
<span id="applabel">[if-any app_label][app_label][end]</span>
[header_menu]
</div>
[user_info]
</div>
<div id="main">
<div id="header">
[if-any breadcrumb]
<h1 class="breadcrumbs">[breadcrumb]</h1>
[end]
</div>
<div id="main-content" [if-any sidebar]class="with-sidebar"[end]>
[body]
</div>
[if-any sidebar]
<div id="sidebar">
[sidebar]
</div>
[end]
[if-any footer]
<div id="footer">
[footer]
</div>
[end]
</div> <!-- #main -->
</body>
</html>"""
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:

View File

@ -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',

View File

@ -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 %}
<link rel="stylesheet" type="text/css" media="all" href="{{ STATIC_URL }}css/dc2/admin.css"/>
{{script|safe}}
{% endblock %}
{% block css %}
{% endblock %}
{% block user-links %}
{% if user_info %}{{ user_info|safe }}{% endif %}
{% endblock %}
{% block site-header %}
<h1 class="breadcrumbs">{% if breadcrumb %}{{ breadcrumb|safe }}{% endif %}</h1>
{% endblock %}
{% block breadcrumb %}
{% endblock %}
{% block sidepage %}
<div id="sidepage">
<span id="applabel">{{app_label}}</span>
{{ header_menu|safe }}
</div>
{% endblock %}
{% block main-content-attributes %}
{% if sidebar %}class="with-sidebar"{% endif %}
{% endblock %}
{% block main-content %}
{{ body|safe }}
{% endblock %}
{% block after-main-content %}
{% if sidebar %}
<div id="sidebar">
{{ sidebar|safe }}
</div>
{% endif %}
{% endblock %}

View File

@ -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

View File

@ -14,10 +14,11 @@
# 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_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()