Skip to content

Commit 5bf736a

Browse files
committed
Merge pull request django-compressor#272 from diox/develop
Cleanup after monkeypatching in compress command
2 parents 354ecdc + 8be1f38 commit 5bf736a

File tree

5 files changed

+62
-6
lines changed

5 files changed

+62
-6
lines changed

compressor/management/commands/compress.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ def patched_render(self, context):
3838
# not, to be able to handle complex inheritance chain.
3939
self._render_firstnode = MethodType(patched_render_firstnode, self)
4040
self._render_firstnode(context)
41+
42+
# Cleanup, uninstall our _render monkeypatch now that it has been called
43+
self._render = self._old_render
4144
return context
4245

4346

@@ -52,7 +55,10 @@ def patched_render_firstnode(self, context):
5255
# its get_parent method so that rendering the ExtendsNode only
5356
# gives us the blocks content without doing any actual rendering.
5457
extra_context = {}
55-
firstnode = self.nodelist[0]
58+
try:
59+
firstnode = self.nodelist[0]
60+
except IndexError:
61+
firstnode = None
5662
if isinstance(firstnode, ExtendsNode):
5763
firstnode._log = self._log
5864
firstnode._log_verbosity = self._log_verbosity
@@ -75,8 +81,11 @@ def patched_render_firstnode(self, context):
7581
# as well.
7682
if self._log_verbosity > 0:
7783
self._log.write("Caught error when rendering extend node from "
78-
"template %s\n" % self)
84+
"template %s\n" % getattr(self, 'name', self))
7985
return None
86+
finally:
87+
# Cleanup, uninstall our get_parent monkeypatch now that it has been called
88+
firstnode.get_parent = firstnode._old_get_parent
8089
return extra_context
8190

8291

@@ -89,6 +98,7 @@ def patched_get_parent(self, context):
8998
compiled_template = self._old_get_parent(context)
9099
compiled_template._log = self._log
91100
compiled_template._log_verbosity = self._log_verbosity
101+
compiled_template._old_render = compiled_template._render
92102
compiled_template._render = MethodType(patched_render, compiled_template)
93103
return compiled_template
94104

compressor/tests/test_offline.py

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,13 @@ def setUp(self):
2727
self._old_compress_offline = settings.COMPRESS_OFFLINE
2828
self._old_template_dirs = settings.TEMPLATE_DIRS
2929
self._old_offline_context = settings.COMPRESS_OFFLINE_CONTEXT
30-
self._old_template_loaders = settings.TEMPLATE_LOADERS
3130
self.log = StringIO()
3231

33-
# Force template dirs, because it enables us to force compress to
32+
# Reset template dirs, because it enables us to force compress to
3433
# consider only a specific directory (helps us make true,
3534
# independant unit tests).
3635
settings.TEMPLATE_DIRS = (
37-
os.path.join(settings.TEMPLATE_DIRS[0], self.templates_dir),
36+
os.path.join(settings.TEST_DIR, 'test_templates', self.templates_dir),
3837
)
3938
# Enable offline compress
4039
settings.COMPRESS_ENABLED = True
@@ -47,7 +46,6 @@ def tearDown(self):
4746
settings.COMPRESS_ENABLED = self._old_compress
4847
settings.COMPRESS_OFFLINE = self._old_compress_offline
4948
settings.TEMPLATE_DIRS = self._old_template_dirs
50-
settings.TEMPLATE_LOADERS = self._old_template_loaders
5149
self.template_file.close()
5250
manifest_path = os.path.join('CACHE', 'manifest.json')
5351
if default_storage.exists(manifest_path):
@@ -73,6 +71,25 @@ class OfflineGenerationBlockSuperMultipleTestCase(OfflineTestCaseMixin, TestCase
7371
expected_hash = "2f6ef61c488e"
7472

7573

74+
class OfflineGenerationBlockSuperMultipleWithCachedLoaderTestCase(OfflineTestCaseMixin, TestCase):
75+
templates_dir = "test_block_super_multiple_cached"
76+
expected_hash = "2f6ef61c488e"
77+
78+
def setUp(self):
79+
self._old_template_loaders = settings.TEMPLATE_LOADERS
80+
settings.TEMPLATE_LOADERS = (
81+
('django.template.loaders.cached.Loader', (
82+
'django.template.loaders.filesystem.Loader',
83+
'django.template.loaders.app_directories.Loader',
84+
)),
85+
)
86+
super(OfflineGenerationBlockSuperMultipleWithCachedLoaderTestCase, self).setUp()
87+
88+
def tearDown(self):
89+
super(OfflineGenerationBlockSuperMultipleWithCachedLoaderTestCase, self).tearDown()
90+
settings.TEMPLATE_LOADERS = self._old_template_loaders
91+
92+
7693
class OfflineGenerationBlockSuperTestCaseWithExtraContent(OfflineTestCaseMixin, TestCase):
7794
templates_dir = "test_block_super_extra"
7895

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{% spaceless %}
2+
{% block js %}
3+
<script type="text/javascript">
4+
alert("test using multiple inheritance and block.super");
5+
</script>
6+
{% endblock %}
7+
8+
{% block css %}
9+
<style type="text/css">
10+
body {
11+
background: red;
12+
}
13+
</style>
14+
{% endblock %}
15+
{% endspaceless %}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{% extends "base.html" %}
2+
3+
{% block css %}{% endblock %}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{% extends "base2.html" %}
2+
{% load compress %}
3+
4+
{% block js %}{% spaceless %}
5+
{% compress js %}
6+
{{ block.super }}
7+
<script type="text/javascript">
8+
alert("this alert shouldn't be alone!");
9+
</script>
10+
{% endcompress %}
11+
{% endspaceless %}{% endblock %}

0 commit comments

Comments
 (0)