The beginning of context hooks.
authorChristopher Allan Webber <cwebber@dustycloud.org>
Wed, 8 May 2013 19:35:31 +0000 (14:35 -0500)
committerChristopher Allan Webber <cwebber@dustycloud.org>
Wed, 8 May 2013 19:35:31 +0000 (14:35 -0500)
Not the working solution, but getting there conceptually.  Basically
we'll have a key with the view and the template as a tuple which is
the context hook that anyone can attach to.

However, some changes have still to be made:
 - The unit test doesn't work yet and contains a set_trace ;)
 - We'll probably switch the "view" component from being the callable
   to the "urlgen"'able name per Elrond's suggestion
 - Found a bug in unit tests related to running custom apps for
   different configs... hm.  I need to fix this!

Nonetheless, making progress.

This commit sponsored by... wait a minute... Christopher Webber?!

mediagoblin/app.py
mediagoblin/tests/test_pluginapi.py
mediagoblin/tools/template.py

index bf0e0f13b87349546332b7fb3862503a03448736..dc2900a9780b40889805f75d3ab865bded7cfa39 100644 (file)
@@ -201,6 +201,9 @@ class MediaGoblinApp(object):
                 exc.get_description(environ))(environ, start_response)
 
         controller = endpoint_to_controller(found_rule)
+        # Make a reference to the controller on the request...
+        # used for lazy context modification
+        request.controller = controller
 
         # pass the request through our meddleware classes
         try:
index 809b5ce922c7ef5932c9d9a19f560b9d0c2ad226..308151a7fd692215fd9c8a388ed73f718820bf60 100644 (file)
@@ -25,6 +25,7 @@ from mediagoblin import mg_globals
 from mediagoblin.init.plugins import setup_plugins
 from mediagoblin.init.config import read_mediagoblin_config
 from mediagoblin.tools import pluginapi
+from mediagoblin.tests.tools import get_app
 
 
 def with_cleanup(*modules_to_delete):
@@ -323,3 +324,14 @@ def test_plugin_config():
     # the callables thing shouldn't really have anything though.
     assert len(config['plugins'][
         'mediagoblin.tests.testplugins.callables1']) == 0
+
+
+@pytest.fixture()
+def context_modified_app(request):
+    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()
index 54aeac926971e4247f1dd52ee4b8fa3420b6d1ec..84fdabf2399d6ae49f0ffa4e105e4c2bd30f80dc 100644 (file)
@@ -27,7 +27,8 @@ 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
+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
 
@@ -103,6 +104,12 @@ def render_template(request, template_path, context):
     rendered_csrf_token = render_csrf_form_token(request)
     if rendered_csrf_token is not None:
         context['csrf_token'] = render_csrf_form_token(request)
+
+    # allow plugins to do things to the context
+    context = hook_transform(
+        (request.controller, template_path),
+        context)
+
     rendered = template.render(context)
 
     if common.TESTS_ENABLED: