from django.template import Library, Node from django.db.models import get_model from django.db.models import Q from datetime import datetime register = Library() class UpcommingContentNode(Node): def __init__(self, model, fieldnames, num, varname): self.num, self.varname = num, varname self.fieldnames = fieldnames.split('|') self.model = get_model(*model.split('.')) def render(self, context): now = datetime.now() # do an OR lookup with the given fieldnames query = Q(**{'%s__gte' % self.fieldnames.pop(0): now}) for fieldname in self.fieldnames: query = query | Q(**{'%s__gte' % fieldname: now}) context[self.varname] = self.model._default_manager.filter(query)[:self.num] return'' def get_upcoming(parser, token): """ Usage: {% get_upcoming app.Model fieldname(s) howmeny as variablename %} {% get_upcoming events.Event start_date 5 as upcoming_events %} {% get_upcoming events.Event start_date|end_date 5 as upcoming_events %} """ bits = token.contents.split() if len(bits) != 6: raise TemplateSyntaxError, "'%s' tag takes exactly four arguments" % bits[0] if bits[4] != 'as': raise TemplateSyntaxError, "Second last argument to '%s' tag must be 'as'" % bits[0] return UpcommingContentNode(bits[1], bits[2], bits[3], bits[5]) get_upcoming = register.tag(get_upcoming)