Introduced a new 'compressed' context dictionary to be passed to the templates to prevent accidental overriding of context variables with common names (e.g. "name", "url", "content"). Fixes #150, #151, #156.
This commit is contained in:
@@ -258,13 +258,14 @@ class Compressor(object):
|
|||||||
Renders the compressor output with the appropriate template for
|
Renders the compressor output with the appropriate template for
|
||||||
the given mode and template context.
|
the given mode and template context.
|
||||||
"""
|
"""
|
||||||
if context is None:
|
# Just in case someone renders the compressor outside
|
||||||
context = {}
|
# the usual template rendering cycle
|
||||||
final_context = Context()
|
if 'compressed' not in self.context:
|
||||||
final_context.update(self.context)
|
self.context['compressed'] = {}
|
||||||
final_context.update(context)
|
|
||||||
final_context.update(self.extra_context)
|
self.context['compressed'].update(context or {})
|
||||||
post_compress.send(sender='django-compressor', type=self.type,
|
self.context['compressed'].update(self.extra_context)
|
||||||
|
final_context = Context(self.context)
|
||||||
mode=mode, context=final_context)
|
mode=mode, context=final_context)
|
||||||
return render_to_string("compressor/%s_%s.html" %
|
return render_to_string("compressor/%s_%s.html" %
|
||||||
(self.type, mode), final_context)
|
(self.type, mode), final_context)
|
||||||
|
@@ -1 +1 @@
|
|||||||
<link rel="stylesheet" href="{{ url }}" type="text/css"{% if media %} media="{{ media }}"{% endif %} />
|
<link rel="stylesheet" href="{{ compressed.url }}" type="text/css"{% if compressed.media %} media="{{ compressed.media }}"{% endif %} />
|
@@ -1 +1 @@
|
|||||||
<style type="text/css"{% if media %} media="{{ media }}"{% endif %}>{{ content|safe }}</style>
|
<style type="text/css"{% if compressed.media %} media="{{ compressed.media }}"{% endif %}>{{ compressed.content|safe }}</style>
|
@@ -1 +1 @@
|
|||||||
<script type="text/javascript" src="{{ url }}"></script>
|
<script type="text/javascript" src="{{ compressed.url }}"></script>
|
@@ -1 +1 @@
|
|||||||
<script type="text/javascript">{{ content|safe }}</script>
|
<script type="text/javascript">{{ compressed.content|safe }}</script>
|
@@ -81,10 +81,13 @@ class CompressorNode(template.Node):
|
|||||||
return cached_offline
|
return cached_offline
|
||||||
|
|
||||||
# Prepare the compressor
|
# Prepare the compressor
|
||||||
context.update({'name': self.name})
|
if 'compressed' in context:
|
||||||
|
raise template.TemplateSyntaxError("A context variable named "
|
||||||
|
"'compresse' was found in the context. Make sure to name "
|
||||||
|
"it differently as this name is reserved to Compressor.")
|
||||||
|
context['compressed'] = {'name': self.name}
|
||||||
compressor = self.compressor_cls(content=self.nodelist.render(context),
|
compressor = self.compressor_cls(content=self.nodelist.render(context),
|
||||||
context=context)
|
context=context)
|
||||||
|
|
||||||
# Check cache
|
# Check cache
|
||||||
cache_key, cache_content = self.render_cached(compressor, forced)
|
cache_key, cache_content = self.render_cached(compressor, forced)
|
||||||
if cache_content is not None:
|
if cache_content is not None:
|
||||||
|
@@ -1,9 +1,38 @@
|
|||||||
Changelog
|
Changelog
|
||||||
=========
|
=========
|
||||||
|
|
||||||
v1.1.2
|
v1.2.0
|
||||||
------
|
------
|
||||||
|
|
||||||
|
- Introduced a new ``compressed`` context dictionary that is passed to
|
||||||
|
the templates that are responsible for rendering the compressed snippets.
|
||||||
|
|
||||||
|
This is a **backwards-incompatible change** if you've overridden any of
|
||||||
|
the included templates:
|
||||||
|
|
||||||
|
- ``compressor/css_file.html``
|
||||||
|
- ``compressor/css_inline.html``
|
||||||
|
- ``compressor/js_file.html``
|
||||||
|
- ``compressor/js_inline.html``
|
||||||
|
|
||||||
|
The variables passed to those templates have been namespaced in a
|
||||||
|
dictionary, so it's easy to fix your own templates.
|
||||||
|
|
||||||
|
For example, the old ``compressor/js_file.html``::
|
||||||
|
|
||||||
|
<script type="text/javascript" src="{{ url }}"></script>
|
||||||
|
|
||||||
|
The new ``compressor/js_file.html``::
|
||||||
|
|
||||||
|
<script type="text/javascript" src="{{ compressed.url }}"></script>
|
||||||
|
|
||||||
|
- Removed old templates named ``compressor/css.html`` and
|
||||||
|
``compressor/js.html`` that were originally left for backwards
|
||||||
|
compatibility. If you've overridden them, just rename them to
|
||||||
|
``compressor/css_file.html`` or ``compressor/js_file.html`` and
|
||||||
|
make sure you've accounted for the backwards incompatible change
|
||||||
|
of the template context mentioned above.
|
||||||
|
|
||||||
- Reverted an unfortunate change to the YUI filter that prepended
|
- Reverted an unfortunate change to the YUI filter that prepended
|
||||||
``'java -jar'`` to the binary name, which doesn't alway work, e.g.
|
``'java -jar'`` to the binary name, which doesn't alway work, e.g.
|
||||||
if the YUI compressor is shipped as a script like
|
if the YUI compressor is shipped as a script like
|
||||||
|
@@ -38,7 +38,7 @@ class PostCompressSignalTestCase(TestCase):
|
|||||||
self.assertEquals('js', kwargs['type'])
|
self.assertEquals('js', kwargs['type'])
|
||||||
self.assertEquals('file', kwargs['mode'])
|
self.assertEquals('file', kwargs['mode'])
|
||||||
context = kwargs['context']
|
context = kwargs['context']
|
||||||
assert 'url' in context
|
assert 'url' in context['compressed']
|
||||||
|
|
||||||
def test_css_signal_sent(self):
|
def test_css_signal_sent(self):
|
||||||
def listener(sender, **kwargs):
|
def listener(sender, **kwargs):
|
||||||
@@ -51,7 +51,7 @@ class PostCompressSignalTestCase(TestCase):
|
|||||||
self.assertEquals('css', kwargs['type'])
|
self.assertEquals('css', kwargs['type'])
|
||||||
self.assertEquals('file', kwargs['mode'])
|
self.assertEquals('file', kwargs['mode'])
|
||||||
context = kwargs['context']
|
context = kwargs['context']
|
||||||
assert 'url' in context
|
assert 'url' in context['compressed']
|
||||||
|
|
||||||
def test_css_signal_multiple_media_attributes(self):
|
def test_css_signal_multiple_media_attributes(self):
|
||||||
css = """\
|
css = """\
|
||||||
|
@@ -121,4 +121,4 @@ class TemplatetagTestCase(TestCase):
|
|||||||
render(template)
|
render(template)
|
||||||
args, kwargs = callback.call_args
|
args, kwargs = callback.call_args
|
||||||
context = kwargs['context']
|
context = kwargs['context']
|
||||||
self.assertEqual('foo', context['name'])
|
self.assertEqual('foo', context['compressed']['name'])
|
||||||
|
Reference in New Issue
Block a user