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