Fully working context hooks, both template/view and global level, with tests
Needs documentation though... that's coming next :) This commit sponsored by Luca Tius. Thanks Luca!
This commit is contained in:
parent
725404236e
commit
f7a5c7c78c
@ -188,6 +188,7 @@ class MediaGoblinApp(object):
|
|||||||
|
|
||||||
mg_request.setup_user_in_request(request)
|
mg_request.setup_user_in_request(request)
|
||||||
|
|
||||||
|
request.controller_name = None
|
||||||
try:
|
try:
|
||||||
found_rule, url_values = map_adapter.match(return_rule=True)
|
found_rule, url_values = map_adapter.match(return_rule=True)
|
||||||
request.matchdict = url_values
|
request.matchdict = url_values
|
||||||
|
@ -328,10 +328,24 @@ def test_plugin_config():
|
|||||||
|
|
||||||
@pytest.fixture()
|
@pytest.fixture()
|
||||||
def context_modified_app(request):
|
def context_modified_app(request):
|
||||||
get_app(
|
return get_app(
|
||||||
request,
|
request,
|
||||||
mgoblin_config=pkg_resources.resource_filename(
|
mgoblin_config=pkg_resources.resource_filename(
|
||||||
'mediagoblin.tests', 'appconfig_context_modified.ini'))
|
'mediagoblin.tests', 'appconfig_context_modified.ini'))
|
||||||
|
|
||||||
|
|
||||||
def test_modify_context(context_modified_app):
|
def test_modify_context(context_modified_app):
|
||||||
pytest.set_trace()
|
# Specific thing passed into a page
|
||||||
|
result = context_modified_app.get("/modify_context/specific/")
|
||||||
|
assert result.body.strip() == """Specific page!
|
||||||
|
|
||||||
|
specific thing: in yer specificpage
|
||||||
|
global thing: globally appended!
|
||||||
|
something: orother"""
|
||||||
|
|
||||||
|
# General test, should have global context variable only
|
||||||
|
result = context_modified_app.get("/modify_context/")
|
||||||
|
assert result.body.strip() == """General page!
|
||||||
|
|
||||||
|
global thing: globally appended!
|
||||||
|
lol: cats"""
|
||||||
|
49
mediagoblin/tests/testplugins/modify_context/__init__.py
Normal file
49
mediagoblin/tests/testplugins/modify_context/__init__.py
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
# GNU MediaGoblin -- federated, autonomous media hosting
|
||||||
|
# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Affero General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 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 Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
from mediagoblin.tools import pluginapi
|
||||||
|
import pkg_resources
|
||||||
|
|
||||||
|
|
||||||
|
def append_to_specific_context(context):
|
||||||
|
context['specific_page_append'] = 'in yer specificpage'
|
||||||
|
return context
|
||||||
|
|
||||||
|
def append_to_global_context(context):
|
||||||
|
context['global_append'] = 'globally appended!'
|
||||||
|
return context
|
||||||
|
|
||||||
|
|
||||||
|
def setup_plugin():
|
||||||
|
routes = [
|
||||||
|
('modify_context.specific_page',
|
||||||
|
'/modify_context/specific/',
|
||||||
|
'mediagoblin.tests.testplugins.modify_context.views:specific'),
|
||||||
|
('modify_context.general_page',
|
||||||
|
'/modify_context/',
|
||||||
|
'mediagoblin.tests.testplugins.modify_context.views:general')]
|
||||||
|
|
||||||
|
pluginapi.register_routes(routes)
|
||||||
|
pluginapi.register_template_path(
|
||||||
|
pkg_resources.resource_filename(
|
||||||
|
'mediagoblin.tests.testplugins.modify_context', 'templates'))
|
||||||
|
|
||||||
|
|
||||||
|
hooks = {
|
||||||
|
'setup': setup_plugin,
|
||||||
|
('modify_context.specific_page',
|
||||||
|
'contextplugin/specific.html'): append_to_specific_context,
|
||||||
|
'template_global_context': append_to_global_context}
|
@ -0,0 +1,4 @@
|
|||||||
|
General page!
|
||||||
|
|
||||||
|
global thing: {{ global_append }}
|
||||||
|
lol: {{ lol }}
|
@ -0,0 +1,5 @@
|
|||||||
|
Specific page!
|
||||||
|
|
||||||
|
specific thing: {{ specific_page_append }}
|
||||||
|
global thing: {{ global_append }}
|
||||||
|
something: {{ something }}
|
31
mediagoblin/tests/testplugins/modify_context/views.py
Normal file
31
mediagoblin/tests/testplugins/modify_context/views.py
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
# GNU MediaGoblin -- federated, autonomous media hosting
|
||||||
|
# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Affero General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 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 Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
from mediagoblin.tools.response import render_to_response
|
||||||
|
|
||||||
|
|
||||||
|
def specific(request):
|
||||||
|
return render_to_response(
|
||||||
|
request,
|
||||||
|
'contextplugin/specific.html',
|
||||||
|
{"something": "orother"})
|
||||||
|
|
||||||
|
|
||||||
|
def general(request):
|
||||||
|
return render_to_response(
|
||||||
|
request,
|
||||||
|
'contextplugin/general.html',
|
||||||
|
{"lol": "cats"})
|
@ -27,8 +27,7 @@ from mediagoblin import messages
|
|||||||
from mediagoblin import _version
|
from mediagoblin import _version
|
||||||
from mediagoblin.tools import common
|
from mediagoblin.tools import common
|
||||||
from mediagoblin.tools.translate import set_thread_locale
|
from mediagoblin.tools.translate import set_thread_locale
|
||||||
from mediagoblin.tools.pluginapi import (
|
from mediagoblin.tools.pluginapi import get_hook_templates, hook_transform
|
||||||
get_hook_templates, hook_transform)
|
|
||||||
from mediagoblin.tools.timesince import timesince
|
from mediagoblin.tools.timesince import timesince
|
||||||
from mediagoblin.meddleware.csrf import render_csrf_form_token
|
from mediagoblin.meddleware.csrf import render_csrf_form_token
|
||||||
|
|
||||||
@ -81,6 +80,9 @@ def get_jinja_env(template_loader, locale):
|
|||||||
# allow for hooking up plugin templates
|
# allow for hooking up plugin templates
|
||||||
template_env.globals['get_hook_templates'] = get_hook_templates
|
template_env.globals['get_hook_templates'] = get_hook_templates
|
||||||
|
|
||||||
|
template_env.globals = hook_transform(
|
||||||
|
'template_global_context', template_env.globals)
|
||||||
|
|
||||||
if exists(locale):
|
if exists(locale):
|
||||||
SETUP_JINJA_ENVS[locale] = template_env
|
SETUP_JINJA_ENVS[locale] = template_env
|
||||||
|
|
||||||
@ -106,9 +108,10 @@ def render_template(request, template_path, context):
|
|||||||
context['csrf_token'] = render_csrf_form_token(request)
|
context['csrf_token'] = render_csrf_form_token(request)
|
||||||
|
|
||||||
# allow plugins to do things to the context
|
# allow plugins to do things to the context
|
||||||
context = hook_transform(
|
if request.controller_name:
|
||||||
(request.controller_name, template_path),
|
context = hook_transform(
|
||||||
context)
|
(request.controller_name, template_path),
|
||||||
|
context)
|
||||||
|
|
||||||
rendered = template.render(context)
|
rendered = template.render(context)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user