2
Template tags for Django
4
# TODO: add in Jinja tags if Coffin is available
6
from django import template
7
from django.contrib.contenttypes.models import ContentType
8
from django.db.models import ObjectDoesNotExist
10
from djangoratings.models import Vote
12
register = template.Library()
14
class RatingByRequestNode(template.Node):
15
def __init__(self, request, obj, context_var):
16
self.request = request
17
self.obj, self.field_name = obj.split('.')
18
self.context_var = context_var
20
def render(self, context):
22
request = template.resolve_variable(self.request, context)
23
obj = template.resolve_variable(self.obj, context)
24
field = getattr(obj, self.field_name)
25
except (template.VariableDoesNotExist, AttributeError):
28
vote = field.get_rating_for_user(request.user, request.META['REMOTE_ADDR'], request.COOKIES)
29
context[self.context_var] = vote
30
except ObjectDoesNotExist:
31
context[self.context_var] = 0
34
def do_rating_by_request(parser, token):
36
Retrieves the ``Vote`` cast by a user on a particular object and
37
stores it in a context variable. If the user has not voted, the
38
context variable will be 0.
42
{% rating_by_request request on instance as vote %}
45
bits = token.contents.split()
47
raise template.TemplateSyntaxError("'%s' tag takes exactly five arguments" % bits[0])
49
raise template.TemplateSyntaxError("second argument to '%s' tag must be 'on'" % bits[0])
51
raise template.TemplateSyntaxError("fourth argument to '%s' tag must be 'as'" % bits[0])
52
return RatingByRequestNode(bits[1], bits[3], bits[5])
53
register.tag('rating_by_request', do_rating_by_request)
55
class RatingByUserNode(RatingByRequestNode):
56
def render(self, context):
58
user = template.resolve_variable(self.request, context)
59
obj = template.resolve_variable(self.obj, context)
60
field = getattr(obj, self.field_name)
61
except template.VariableDoesNotExist:
64
vote = field.get_rating_for_user(user)
65
context[self.context_var] = vote
66
except ObjectDoesNotExist:
67
context[self.context_var] = 0
70
def do_rating_by_user(parser, token):
72
Retrieves the ``Vote`` cast by a user on a particular object and
73
stores it in a context variable. If the user has not voted, the
74
context variable will be 0.
78
{% rating_by_user user on instance as vote %}
81
bits = token.contents.split()
83
raise template.TemplateSyntaxError("'%s' tag takes exactly five arguments" % bits[0])
85
raise template.TemplateSyntaxError("second argument to '%s' tag must be 'on'" % bits[0])
87
raise template.TemplateSyntaxError("fourth argument to '%s' tag must be 'as'" % bits[0])
88
return RatingByUserNode(bits[1], bits[3], bits[5])
89
register.tag('rating_by_user', do_rating_by_user)