From ed986d2eb3963bcfae2f26a4ae38b8391d9bdcab Mon Sep 17 00:00:00 2001 From: Jonas Obrist Date: Wed, 4 Feb 2015 02:11:59 +0900 Subject: [PATCH] 1.8 compatibility --- runtests.py | 6 +++++- sekizai/helpers.py | 49 ++++++++++++++++++++++++++++++---------------- 2 files changed, 37 insertions(+), 18 deletions(-) diff --git a/runtests.py b/runtests.py index 534292d..cc3500e 100644 --- a/runtests.py +++ b/runtests.py @@ -33,11 +33,15 @@ def runtests(): from django import VERSION from django.conf import settings + if VERSION[0] == 1 and VERSION[1] < 6: + runner = 'django.test.simple.DjangoTestSuiteRunner' + else: + runner = 'django.test.runner.DiscoverRunner' settings.configure( INSTALLED_APPS=INSTALLED_APPS, ROOT_URLCONF=ROOT_URLCONF, DATABASES=DATABASES, - TEST_RUNNER='django.test.simple.DjangoTestSuiteRunner', + TEST_RUNNER=runner, TEMPLATE_DIRS=TEMPLATE_DIRS, TEMPLATE_CONTEXT_PROCESSORS=TEMPLATE_CONTEXT_PROCESSORS, TEMPLATE_DEBUG=TEMPLATE_DEBUG, diff --git a/sekizai/helpers.py b/sekizai/helpers.py index 2b05ae4..ae9c4f1 100644 --- a/sekizai/helpers.py +++ b/sekizai/helpers.py @@ -1,9 +1,28 @@ # -*- coding: utf-8 -*- +from collections import namedtuple + from django.conf import settings -from django.template import VariableNode, Variable +from django.template.base import VariableNode, Variable, Template from django.template.loader import get_template from django.template.loader_tags import BlockNode, ExtendsNode +try: + from django.template import engines +except ImportError: + engines = None + +if engines is not None: + FAKE_CONTEXT = namedtuple('Context', 'engine')(engines.all()[0]) +else: + FAKE_CONTEXT = {} + + +def _get_nodelist(tpl): + if isinstance(tpl, Template): + return tpl.nodelist + else: + return tpl.template.nodelist + def is_variable_extend_node(node): if hasattr(node, 'parent_name_expr') and node.parent_name_expr: @@ -23,9 +42,9 @@ def _extend_blocks(extend_node, blocks): # we don't support variable extensions if is_variable_extend_node(extend_node): return - parent = extend_node.get_parent(None) + parent = extend_node.get_parent(FAKE_CONTEXT) # Search for new blocks - for node in parent.nodelist.get_nodes_by_type(BlockNode): + for node in _get_nodelist(parent).get_nodes_by_type(BlockNode): if node.name not in blocks: blocks[node.name] = node else: @@ -38,7 +57,7 @@ def _extend_blocks(extend_node, blocks): block = block.super block.super = node # search for further ExtendsNodes - for node in parent.nodelist.get_nodes_by_type(ExtendsNode): + for node in _get_nodelist(parent).get_nodes_by_type(ExtendsNode): _extend_blocks(node, blocks) break @@ -56,29 +75,25 @@ def _extend_nodelist(extend_node): found = [] for block in blocks.values(): - found += _scan_namespaces(block.nodelist, block, blocks.keys()) + found += _scan_namespaces(block.nodelist, block) - parent_template = extend_node.get_parent({}) + parent_template = extend_node.get_parent(FAKE_CONTEXT) # if this is the topmost template, check for namespaces outside of blocks - if not parent_template.nodelist.get_nodes_by_type(ExtendsNode): + if not _get_nodelist(parent_template).get_nodes_by_type(ExtendsNode): found += _scan_namespaces( - parent_template.nodelist, - None, - blocks.keys() + _get_nodelist(parent_template), + None ) else: found += _scan_namespaces( - parent_template.nodelist, - extend_node, - blocks.keys() + _get_nodelist(parent_template), + extend_node ) return found -def _scan_namespaces(nodelist, current_block=None, ignore_blocks=None): +def _scan_namespaces(nodelist, current_block=None): from sekizai.templatetags.sekizai_tags import RenderBlock - if ignore_blocks is None: - ignore_blocks = [] found = [] for node in nodelist: @@ -103,7 +118,7 @@ def _scan_namespaces(nodelist, current_block=None, ignore_blocks=None): def get_namespaces(template): compiled_template = get_template(template) - return _scan_namespaces(compiled_template.nodelist) + return _scan_namespaces(_get_nodelist(compiled_template)) def validate_template(template, namespaces):