From 72b33ddbcdc41eb5af42b86329d81d96894a9d10 Mon Sep 17 00:00:00 2001 From: Carlton Gibson Date: Tue, 10 Mar 2015 20:04:07 +0100 Subject: [PATCH] Make `compress` command (at least) run through on 1.8 FAILED (failures=15, errors=15, skipped=1) AssertionError: 2 != 12 OfflineGenerationError: ... key "XYZ" missing ... --- compressor/management/commands/compress.py | 41 +++++++++++++++++------------- compressor/offline/django.py | 27 ++++++++++++++------ 2 files changed, 43 insertions(+), 25 deletions(-) diff --git a/compressor/management/commands/compress.py b/compressor/management/commands/compress.py index 6be215e..0bc436a 100644 --- a/compressor/management/commands/compress.py +++ b/compressor/management/commands/compress.py @@ -5,6 +5,7 @@ from fnmatch import fnmatch from optparse import make_option +import django from django.core.management.base import NoArgsCommand, CommandError import django.template from django.template import Context @@ -53,24 +54,30 @@ class Command(NoArgsCommand): requires_model_validation = False def get_loaders(self): - from django.template.loader import template_source_loaders - if template_source_loaders is None: - try: - from django.template.loader import ( - find_template as finder_func) - except ImportError: - from django.template.loader import ( - find_template_source as finder_func) # noqa - try: - # Force django to calculate template_source_loaders from - # TEMPLATE_LOADERS settings, by asking to find a dummy template - source, name = finder_func('test') - except django.template.TemplateDoesNotExist: - pass - # Reload template_source_loaders now that it has been calculated ; - # it should contain the list of valid, instanciated template loaders - # to use. + if django.VERSION < (1, 8): from django.template.loader import template_source_loaders + if template_source_loaders is None: + try: + from django.template.loader import ( + find_template as finder_func) + except ImportError: + from django.template.loader import ( + find_template_source as finder_func) # noqa + try: + # Force django to calculate template_source_loaders from + # TEMPLATE_LOADERS settings, by asking to find a dummy template + source, name = finder_func('test') + except django.template.TemplateDoesNotExist: + pass + # Reload template_source_loaders now that it has been calculated ; + # it should contain the list of valid, instanciated template loaders + # to use. + from django.template.loader import template_source_loaders + else: + from django.template import engines + template_source_loaders = [] + for e in engines.all(): + template_source_loaders.extend(e.engine.get_template_loaders(e.engine.loaders)) loaders = [] # If template loader is CachedTemplateLoader, return the loaders # that it wraps around. So if we have diff --git a/compressor/offline/django.py b/compressor/offline/django.py index b326093..107c6e4 100644 --- a/compressor/offline/django.py +++ b/compressor/offline/django.py @@ -1,6 +1,7 @@ from __future__ import absolute_import from copy import copy +import django from django import template from django.conf import settings from django.template import Context @@ -14,7 +15,7 @@ from compressor.templatetags.compress import CompressorNode -def handle_extendsnode(extendsnode, block_context=None): +def handle_extendsnode(extendsnode, block_context=None, original=None): """Create a copy of Node tree of a derived template replacing all blocks tags with the nodes of appropriate blocks. Also handles {{ block.super }} tags. @@ -26,6 +27,9 @@ def handle_extendsnode(extendsnode, block_context=None): block_context.add_blocks(blocks) context = Context(settings.COMPRESS_OFFLINE_CONTEXT) + if original is not None: + context.template = original + compiled_parent = extendsnode.get_parent(context) parent_nodelist = compiled_parent.nodelist # If the parent template has an ExtendsNode it is not the root. @@ -33,7 +37,7 @@ def handle_extendsnode(extendsnode, block_context=None): # The ExtendsNode has to be the first non-text node. if not isinstance(node, TextNode): if isinstance(node, ExtendsNode): - return handle_extendsnode(node, block_context) + return handle_extendsnode(node, block_context, original) break # Add blocks of the root template to block context. blocks = dict((n.name, n) for n in @@ -95,7 +99,10 @@ def __init__(self, charset): def parse(self, template_name): try: - return get_template(template_name) + if django.VERSION < (1, 8): + return get_template(template_name) + else: + return get_template(template_name).template except template.TemplateSyntaxError as e: raise TemplateSyntaxError(str(e)) except template.TemplateDoesNotExist as e: @@ -111,15 +118,17 @@ def process_node(self, template, context, node): pass def render_nodelist(self, template, context, node): + if django.VERSION >= (1, 8): + context.template = template return node.nodelist.render(context) def render_node(self, template, context, node): return node.render(context, forced=True) - def get_nodelist(self, node): + def get_nodelist(self, node, original=None): if isinstance(node, ExtendsNode): try: - return handle_extendsnode(node) + return handle_extendsnode(node, block_context=None, original=original) except template.TemplateSyntaxError as e: raise TemplateSyntaxError(str(e)) except template.TemplateDoesNotExist as e: @@ -134,10 +143,12 @@ def get_nodelist(self, node): nodelist = getattr(node, 'nodelist', []) return nodelist - def walk_nodes(self, node): - for node in self.get_nodelist(node): + def walk_nodes(self, node, original=None): + if django.VERSION >= (1, 8) and original is None: + original = node + for node in self.get_nodelist(node, original): if isinstance(node, CompressorNode) and node.is_offline_compression_enabled(forced=True): yield node else: - for node in self.walk_nodes(node): + for node in self.walk_nodes(node, original): yield node