Fully working context hooks, both template/view and global level, with tests
authorChristopher Allan Webber <cwebber@dustycloud.org>
Tue, 14 May 2013 19:24:27 +0000 (14:24 -0500)
committerChristopher Allan Webber <cwebber@dustycloud.org>
Tue, 14 May 2013 19:24:27 +0000 (14:24 -0500)
Needs documentation though... that's coming next :)

This commit sponsored by Luca Tius.  Thanks Luca!

mediagoblin/app.py
mediagoblin/tests/test_pluginapi.py
mediagoblin/tests/testplugins/modify_context/__init__.py [new file with mode: 0644]
mediagoblin/tests/testplugins/modify_context/templates/contextplugin/general.html [new file with mode: 0644]
mediagoblin/tests/testplugins/modify_context/templates/contextplugin/specific.html [new file with mode: 0644]
mediagoblin/tests/testplugins/modify_context/views.py [new file with mode: 0644]
mediagoblin/tools/template.py

index 3ebaa45bc501a4cff6f662c0138bc5a5d0aeb6eb..1984ce77da91dc2e0f065a7165a7ad347bdae090 100644 (file)
@@ -188,6 +188,7 @@ class MediaGoblinApp(object):
 
         mg_request.setup_user_in_request(request)
 
+        request.controller_name = None
         try:
             found_rule, url_values = map_adapter.match(return_rule=True)
             request.matchdict = url_values
index 308151a7fd692215fd9c8a388ed73f718820bf60..de43534fa487d62d27273d6a5643e6bda2b2cdc3 100644 (file)
@@ -328,10 +328,24 @@ def test_plugin_config():
 
 @pytest.fixture()
 def context_modified_app(request):
-    get_app(
+    return get_app(
         request,
         mgoblin_config=pkg_resources.resource_filename(
             'mediagoblin.tests', 'appconfig_context_modified.ini'))
 
+
 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"""
diff --git a/mediagoblin/tests/testplugins/modify_context/__init__.py b/mediagoblin/tests/testplugins/modify_context/__init__.py
new file mode 100644 (file)
index 0000000..6ddcd65
--- /dev/null
@@ -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}
diff --git a/mediagoblin/tests/testplugins/modify_context/templates/contextplugin/general.html b/mediagoblin/tests/testplugins/modify_context/templates/contextplugin/general.html
new file mode 100644 (file)
index 0000000..7b7261c
--- /dev/null
@@ -0,0 +1,4 @@
+General page!
+
+global thing: {{ global_append }}
+lol: {{ lol }}
diff --git a/mediagoblin/tests/testplugins/modify_context/templates/contextplugin/specific.html b/mediagoblin/tests/testplugins/modify_context/templates/contextplugin/specific.html
new file mode 100644 (file)
index 0000000..25bea3e
--- /dev/null
@@ -0,0 +1,5 @@
+Specific page!
+
+specific thing: {{ specific_page_append }}
+global thing: {{ global_append }}
+something: {{ something }}
diff --git a/mediagoblin/tests/testplugins/modify_context/views.py b/mediagoblin/tests/testplugins/modify_context/views.py
new file mode 100644 (file)
index 0000000..025c84d
--- /dev/null
@@ -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"})
index 950fb5daaa2d1ac97d1dfde99a63374b14be0563..aab571f0e41d0ef42b571ca3a59fc1673b523480 100644 (file)
@@ -27,8 +27,7 @@ from mediagoblin import messages
 from mediagoblin import _version
 from mediagoblin.tools import common
 from mediagoblin.tools.translate import set_thread_locale
-from mediagoblin.tools.pluginapi import (
-    get_hook_templates, hook_transform)
+from mediagoblin.tools.pluginapi import get_hook_templates, hook_transform
 from mediagoblin.tools.timesince import timesince
 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
     template_env.globals['get_hook_templates'] = get_hook_templates
 
+    template_env.globals = hook_transform(
+        'template_global_context', template_env.globals)
+
     if exists(locale):
         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)
 
     # allow plugins to do things to the context
-    context = hook_transform(
-        (request.controller_name, template_path),
-        context)
+    if request.controller_name:
+        context = hook_transform(
+            (request.controller_name, template_path),
+            context)
 
     rendered = template.render(context)