Code

Ticket #1065: cache_tag.diff

File cache_tag.diff, 4.3 KB (added by zz, 6 years ago)

Improved tag to accept time as variable

Line 
1Index: django/templatetags/cache.py
2===================================================================
3--- django/templatetags/cache.py        (revision 6914)
4+++ django/templatetags/cache.py        (working copy)
5@@ -1,5 +1,4 @@
6-from django.template import Library, Node, TemplateSyntaxError
7-from django.template import resolve_variable
8+from django.template import Library, Node, Variable, TemplateSyntaxError, VariableDoesNotExist
9 from django.core.cache import cache
10 from django.utils.encoding import force_unicode
11 
12@@ -13,9 +12,16 @@
13         self.vary_on = vary_on
14 
15     def render(self, context):
16+        try:
17+            self.expire_time = int(self.expire_time)
18+        except ValueError:
19+            try:
20+                self.expire_time = int(Variable(self.expire_time).resolve(context))
21+            except (ValueError, TypeError, VariableDoesNotExist):
22+                raise TemplateSyntaxError(u"Cannot resolve cache timeout! '%s' must be an integer." % self.expire_time)
23         # Build a unicode key for this fragment and all vary-on's.
24         cache_key = u':'.join([self.fragment_name] + \
25-            [force_unicode(resolve_variable(var, context)) for var in self.vary_on])
26+            [force_unicode(Variable(var).resolve(context)) for var in self.vary_on])
27         value = cache.get(cache_key)
28         if value is None:
29             value = self.nodelist.render(context)
30@@ -48,10 +54,6 @@
31     tokens = token.contents.split()
32     if len(tokens) < 3:
33         raise TemplateSyntaxError(u"'%r' tag requires at least 2 arguments." % tokens[0])
34-    try:
35-        expire_time = int(tokens[1])
36-    except ValueError:
37-        raise TemplateSyntaxError(u"First argument to '%r' must be an integer (got '%s')." % (tokens[0], tokens[1]))
38-    return CacheNode(nodelist, expire_time, tokens[2], tokens[3:])
39+    return CacheNode(nodelist, tokens[1], tokens[2], tokens[3:])
40 
41 register.tag('cache', do_cache)
42Index: tests/regressiontests/templates/tests.py
43===================================================================
44--- tests/regressiontests/templates/tests.py    (revision 6914)
45+++ tests/regressiontests/templates/tests.py    (working copy)
46@@ -877,12 +877,17 @@
47             'cache04' : ('{% load cache %}{% cache 2 test %}cache04{% endcache %}', {}, 'cache03'),
48             'cache05' : ('{% load cache %}{% cache 2 test foo %}cache05{% endcache %}', {'foo': 1}, 'cache05'),
49             'cache06' : ('{% load cache %}{% cache 2 test foo %}cache06{% endcache %}', {'foo': 2}, 'cache06'),
50-            'cache07' : ('{% load cache %}{% cache 2 test foo %}cache06{% endcache %}', {'foo': 1}, 'cache05'),
51+            'cache07' : ('{% load cache %}{% cache 2 test foo %}cache07{% endcache %}', {'foo': 1}, 'cache05'),
52+            'cache08' : ('{% load cache %}{% cache time test foo %}cache08{% endcache %}', {'foo': 2, 'time': 2}, 'cache06'),
53+            'cache09' : ('{% load cache %}{% cache time test foo %}cache09{% endcache %}', {'foo': 3, 'time': -1}, 'cache09'),
54+            'cache10' : ('{% load cache %}{% cache time test foo %}cache10{% endcache %}', {'foo': 3, 'time': -1}, 'cache10'),
55 
56-            # Raise exception if we dont have at least 2 args, first one integer.
57-            'cache08' : ('{% load cache %}{% cache %}{% endcache %}', {}, template.TemplateSyntaxError),
58-            'cache09' : ('{% load cache %}{% cache 1 %}{% endcache %}', {}, template.TemplateSyntaxError),
59-            'cache10' : ('{% load cache %}{% cache foo bar %}{% endcache %}', {}, template.TemplateSyntaxError),
60+            # Raise exception if we dont have at least 2 args, first one resolved to integer.
61+            'cache11' : ('{% load cache %}{% cache %}{% endcache %}', {}, template.TemplateSyntaxError),
62+            'cache12' : ('{% load cache %}{% cache 1 %}{% endcache %}', {}, template.TemplateSyntaxError),
63+            'cache13' : ('{% load cache %}{% cache foo bar %}{% endcache %}', {}, template.TemplateSyntaxError),
64+            'cache14' : ('{% load cache %}{% cache foo bar %}{% endcache %}', {'foo': 'fail'}, template.TemplateSyntaxError),
65+            'cache15' : ('{% load cache %}{% cache foo bar %}{% endcache %}', {'foo': []}, template.TemplateSyntaxError),
66 
67             ### AUTOESCAPE TAG ##############################################
68             'autoescape-tag01': ("{% autoescape off %}hello{% endautoescape %}", {}, "hello"),