Profile image for Ian Lewis IanLewis
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.
Language
Python
Tags
django range tag template time
Favorited By
Profile image for Mirat Bayrak

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