Skip to content

Commit

Permalink
Merge branch 'aodag-master'
Browse files Browse the repository at this point in the history
  • Loading branch information
mcdonc committed Dec 16, 2010
2 parents 25e619b + 17efd12 commit e0adb52
Show file tree
Hide file tree
Showing 3 changed files with 117 additions and 0 deletions.
29 changes: 29 additions & 0 deletions docs/index.rst
Expand Up @@ -126,6 +126,35 @@ developing::
See the generated ``pyramid_jinja2_starter`` paster template for an
example of using the renderer facility.

Jinja2 Filters
-------------------

``pyramid_jinja2`` provides two filters.


.. currentmodule:: pyramid_jinja2.filters
.. autofunction:: model_url_filter
.. autofunction:: route_url_filter

To use these filters, configure the settings of ``jinja2.filters``:

.. code-block:: ini
:linenos:
[app:yourapp]
# ... other stuff ...
jinja2.filters =
model_url = pyramid_jinja2.filters:model_url_filter
route_url = pyramid_jinja2.filters:route_url_filter
And use the filters in template.

.. code-block:: html

<a href="{{context|model_url('edit')}}">Edit</a>

<a href="{{'top'|route_url}}">Top</a>

Installation
------------

Expand Down
22 changes: 22 additions & 0 deletions pyramid_jinja2/filters.py
@@ -0,0 +1,22 @@
from pyramid.url import model_url, route_url
from pyramid.threadlocal import get_current_request

__all__ = [
'model_url_filter',
'route_url_filter',
]

def model_url_filter(model, *elements, **kw):
"""A filter from ``model`` to a string representing the absolute URL.
this filter call `pyramid.url.model_url`.
"""
request = get_current_request()
return model_url(model, request, *elements, **kw)

def route_url_filter(route_name, *elements, **kw):
"""A filter from ``route_name`` to a string representing the absolute URL.
this filter call `pyramid.url.route_url`.
"""
request = get_current_request()
return route_url(route_name, request, *elements, **kw)

66 changes: 66 additions & 0 deletions pyramid_jinja2/tests/test_filters.py
@@ -0,0 +1,66 @@
# -*- coding: utf-8 -*-

import unittest
from jinja2 import Environment
from pyramid.configuration import Configurator

class DummyRequest(object):
application_url = ''
environ = {}
class DummyRoot(object):
__name__ = __parent__ = None

class DummyModel(object):
__name__ = 'dummy'
__parent__ = DummyRoot()

class Test_model_url_filter(unittest.TestCase):
def setUp(self):
self.environment = Environment()
from pyramid_jinja2.filters import model_url_filter
self.environment.filters['model_url'] = model_url_filter
self.config = Configurator()
self.config.begin(request=DummyRequest())

def tearDown(self):
self.config.end()

def _callFUT(self, context, tmpl):
tmpl = self.environment.from_string(tmpl)
return tmpl.render(**context)


def test_filter(self):
model = DummyModel()
rendered = self._callFUT({'model':model}, '{{model|model_url}}')
self.assertEqual(rendered, '/dummy/')

def test_filter_with_elements(self):
model = DummyModel()
rendered = self._callFUT({'model':model}, "{{model|model_url('edit')}}")
self.assertEqual(rendered, '/dummy/edit')

class Test_route_url_filter(unittest.TestCase):
def setUp(self):
self.environment = Environment()
from pyramid_jinja2.filters import route_url_filter
self.environment.filters['route_url'] = route_url_filter
self.config = Configurator()
self.config.begin(request=DummyRequest())
self.config.add_route('dummy_route1', '/dummy/')
self.config.add_route('dummy_route2', '/dummy/:name/')

def tearDown(self):
self.config.end()

def _callFUT(self, context, tmpl):
tmpl = self.environment.from_string(tmpl)
return tmpl.render(**context)

def test_filter(self):
rendered = self._callFUT({}, "{{'dummy_route1' | route_url }}")
self.assertEqual(rendered, '/dummy/')

def test_filter_with_arguments(self):
rendered = self._callFUT({}, "{{'dummy_route2' | route_url('x', name='test') }}")
self.assertEqual(rendered, '/dummy/test/x')

0 comments on commit e0adb52

Please sign in to comment.