- A template tag that can be used to output different based on time ranges. Useful for displaying different logos during holiday season or different html during a campaign period.
if_in_time_range template tag.
1 class IfInTimeRangeNode(Node):
2 def __init__(self, from_date, to_date, nodelist_true, nodelist_false):
3 self.from_date,self.to_date = Variable(from_date),Variable(to_date)
4 self.nodelist_true,self.nodelist_false = nodelist_true,nodelist_false
5
6 def __repr__(self):
7 return '<IfInTimeRangeNode>'
8
9 def render(self, context):
10 now = datetime.now()
11 try:
12 from_date = self.from_date.resolve(context)
13 except VariableDoesNotExist:
14 from_date = None
15 try:
16 to_date = self.to_date.resolve(context)
17 except VariableDoesNotExist:
18 to_date = None
19
20 if type(from_date) in (types.StringType, types.UnicodeType, SafeUnicode):
21 try:
22 from_date = parse_date(from_date)
23 except ValueError:
24 raise TemplateSyntaxError, "%r: Could not parse from date string." % self
25
26 if type(to_date) in (types.StringType, types.UnicodeType, SafeUnicode):
27 try:
28 to_date = parse_date(to_date)
29 except ValueError:
30 raise TemplateSyntaxError, "%r: Could not parse to date string." % self
31
32 if from_date < now and to_date >= now:
33 return self.nodelist_true.render(context)
34 else:
35 return self.nodelist_false.render(context)
36
37 @register.tag(name="if_in_time_range")
38 def if_in_time_range(parser, token):
39 try:
40 tag_name, from_date, to_date = token.split_contents()
41 except ValueError:
42 raise template.TemplateSyntaxError, "%r tag requires two arguments" % token.contents.split()[0]
43 end_tag = 'end'+tag_name
44 nodelist_true = parser.parse(('else',end_tag))
45 token = parser.next_token()
46 if token.contents == 'else':
47 nodelist_false = parser.parse((end_tag,))
48 parser.delete_first_token()
49 else:
50 nodelist_false = NodeList()
51
52 return IfInTimeRangeNode(from_date, to_date, nodelist_true, nodelist_false)
Comments
Sign in to leave a comment.

