Use new context hook to pass name argument from tag to compressor to signal.
This commit is contained in:
parent
dc316b2322
commit
8afbd9d7cf
|
@ -40,7 +40,6 @@ class Compressor(object):
|
|||
self.extra_context = {}
|
||||
self.all_mimetypes = dict(settings.COMPRESS_PRECOMPILERS)
|
||||
self.finders = staticfiles.finders
|
||||
self.block_name = block_name
|
||||
|
||||
def split_contents(self):
|
||||
"""
|
||||
|
@ -262,6 +261,6 @@ class Compressor(object):
|
|||
final_context.update(context)
|
||||
final_context.update(self.context)
|
||||
final_context.update(self.extra_context)
|
||||
post_compress.send(sender='django-compressor', name=self.block_name, type=self.type, mode=mode, context=final_context)
|
||||
post_compress.send(sender='django-compressor', type=self.type, mode=mode, context=final_context)
|
||||
return render_to_string("compressor/%s_%s.html" %
|
||||
(self.type, mode), final_context)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import django.dispatch
|
||||
|
||||
|
||||
post_compress = django.dispatch.Signal(providing_args=['name', 'type', 'mode', 'context'])
|
||||
post_compress = django.dispatch.Signal(providing_args=['type', 'mode', 'context'])
|
||||
|
|
|
@ -18,6 +18,7 @@ class CompressorNode(template.Node):
|
|||
self.nodelist = nodelist
|
||||
self.kind = kind
|
||||
self.mode = mode
|
||||
self.name = name
|
||||
|
||||
def compressor_cls(self, *args, **kwargs):
|
||||
compressors = {
|
||||
|
@ -70,6 +71,7 @@ class CompressorNode(template.Node):
|
|||
return cached_offline
|
||||
|
||||
# 3. Prepare the actual compressor and check cache
|
||||
context.update({'name': self.name})
|
||||
compressor = self.compressor_cls(content=self.nodelist.render(context),
|
||||
context=context)
|
||||
cache_key, cache_content = self.render_cached(compressor, forced)
|
||||
|
@ -127,13 +129,13 @@ def compress(parser, token):
|
|||
|
||||
args = token.split_contents()
|
||||
|
||||
if not len(args) in (2, 3):
|
||||
if not len(args) in (2, 3, 4):
|
||||
raise template.TemplateSyntaxError(
|
||||
"%r tag requires either one or two arguments." % args[0])
|
||||
"%r tag requires either one, two or three arguments." % args[0])
|
||||
|
||||
kind = args[1]
|
||||
|
||||
if len(args) == 3:
|
||||
if len(args) >= 3:
|
||||
mode = args[2]
|
||||
if not mode in OUTPUT_MODES:
|
||||
raise template.TemplateSyntaxError(
|
||||
|
@ -141,4 +143,8 @@ def compress(parser, token):
|
|||
(args[0], OUTPUT_FILE, OUTPUT_INLINE))
|
||||
else:
|
||||
mode = OUTPUT_FILE
|
||||
return CompressorNode(nodelist, kind, mode)
|
||||
if len(args) == 4:
|
||||
name = args[3]
|
||||
else:
|
||||
name = None
|
||||
return CompressorNode(nodelist, kind, mode, name)
|
||||
|
|
|
@ -86,8 +86,8 @@ would be rendered something like::
|
|||
</script>
|
||||
|
||||
The compress template tag also supports a third argument for naming the output
|
||||
of that particular compress tag. This is then passed as an argument to the
|
||||
`post_compress signal <signals>`.
|
||||
of that particular compress tag. This is then added to the context so you can
|
||||
access it in the `post_compress signal <signals>`.
|
||||
|
||||
.. _memcached: http://memcached.org/
|
||||
.. _caching documentation: http://docs.djangoproject.com/en/1.2/topics/cache/#memcached
|
||||
|
@ -159,10 +159,6 @@ sends the following arguments:
|
|||
``sender``
|
||||
Always "django-compressor".
|
||||
|
||||
``name``
|
||||
The value provided in the 3rd positional argument to the template tag, or
|
||||
``None`` if no 3rd positional argument was provided.
|
||||
|
||||
``type``
|
||||
Either "``js``" or "``css``".
|
||||
|
||||
|
@ -171,11 +167,17 @@ sends the following arguments:
|
|||
|
||||
``context``
|
||||
The context dictionary used to render the output of the compress template
|
||||
tag. If ``mode`` is "``file``", this will contain a "``url``" key that maps to
|
||||
the relative URL for the compressed asset. If ``type`` is "``css``", the
|
||||
context will additionally contain a "``media``" key with a value of ``None`` if
|
||||
no media attribute is specified on the link/style tag and equal to that
|
||||
attribute if one is specified.
|
||||
tag.
|
||||
|
||||
If ``mode`` is "``file``", this will contain a "``url``" key that maps to
|
||||
the relative URL for the compressed asset.
|
||||
|
||||
If ``type`` is "``css``", the context will additionally contain a
|
||||
"``media``" key with a value of ``None`` if no media attribute is specified on
|
||||
the link/style tag and equal to that attribute if one is specified.
|
||||
|
||||
Additionally, ``context['name']`` will be the third positional argument to
|
||||
the template tag, if provided.
|
||||
|
||||
.. note::
|
||||
|
||||
|
|
|
@ -17,12 +17,12 @@ class PostCompressSignalTestCase(TestCase):
|
|||
<link rel="stylesheet" href="/media/css/one.css" type="text/css" />
|
||||
<style type="text/css">p { border:5px solid green;}</style>
|
||||
<link rel="stylesheet" href="/media/css/two.css" type="text/css" />"""
|
||||
self.css_node = CssCompressor(self.css, block_name='foo')
|
||||
self.css_node = CssCompressor(self.css)
|
||||
|
||||
self.js = """\
|
||||
<script src="/media/js/one.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">obj.value = "value";</script>"""
|
||||
self.js_node = JsCompressor(self.js, block_name='foo')
|
||||
self.js_node = JsCompressor(self.js)
|
||||
|
||||
def tearDown(self):
|
||||
post_compress.disconnect()
|
||||
|
@ -35,7 +35,6 @@ class PostCompressSignalTestCase(TestCase):
|
|||
self.js_node.output()
|
||||
args, kwargs = callback.call_args
|
||||
self.assertEquals('django-compressor', kwargs['sender'])
|
||||
self.assertEquals('foo', kwargs['name'])
|
||||
self.assertEquals('js', kwargs['type'])
|
||||
self.assertEquals('file', kwargs['mode'])
|
||||
context = kwargs['context']
|
||||
|
@ -49,7 +48,6 @@ class PostCompressSignalTestCase(TestCase):
|
|||
self.css_node.output()
|
||||
args, kwargs = callback.call_args
|
||||
self.assertEquals('django-compressor', kwargs['sender'])
|
||||
self.assertEquals('foo', kwargs['name'])
|
||||
self.assertEquals('css', kwargs['type'])
|
||||
self.assertEquals('file', kwargs['mode'])
|
||||
context = kwargs['context']
|
||||
|
@ -60,7 +58,7 @@ class PostCompressSignalTestCase(TestCase):
|
|||
<link rel="stylesheet" href="/media/css/one.css" media="handheld" type="text/css" />
|
||||
<style type="text/css" media="print">p { border:5px solid green;}</style>
|
||||
<link rel="stylesheet" href="/media/css/two.css" type="text/css" />"""
|
||||
css_node = CssCompressor(css, block_name='foo')
|
||||
css_node = CssCompressor(css)
|
||||
def listener(sender, **kwargs):
|
||||
pass
|
||||
callback = Mock(wraps=listener)
|
||||
|
|
|
@ -4,6 +4,10 @@ from django.conf import settings
|
|||
from django.template import Template, Context, TemplateSyntaxError
|
||||
from django.test import TestCase
|
||||
|
||||
from mock import Mock
|
||||
|
||||
from compressor.signals import post_compress
|
||||
|
||||
from .base import css_tag
|
||||
|
||||
|
||||
|
@ -96,3 +100,16 @@ class TemplatetagTestCase(TestCase):
|
|||
<script type="text/javascript">obj.value = "value";</script>"""
|
||||
self.assertEqual(out, render(template, context))
|
||||
|
||||
def test_named_compress_tag(self):
|
||||
template = u"""{% load compress %}{% compress js inline foo %}
|
||||
<script type="text/javascript">obj.value = "value";</script>
|
||||
{% endcompress %}
|
||||
"""
|
||||
def listener(sender, **kwargs):
|
||||
pass
|
||||
callback = Mock(wraps=listener)
|
||||
post_compress.connect(callback)
|
||||
render(template)
|
||||
args, kwargs = callback.call_args
|
||||
context = kwargs['context']
|
||||
self.assertEqual('foo', context['name'])
|
||||
|
|
Loading…
Reference in New Issue