-
Notifications
You must be signed in to change notification settings - Fork 26
/
dialogos_tags.py
123 lines (94 loc) · 3.27 KB
/
dialogos_tags.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
from django import template
from django.core.urlresolvers import reverse
from django.contrib.contenttypes.models import ContentType
from dialogos.forms import UnauthenticatedCommentForm, AuthenticatedCommentForm
from dialogos.models import Comment
register = template.Library()
class BaseCommentNode(template.Node):
@classmethod
def handle_token(cls, parser, token):
bits = token.split_contents()
if not cls.requires_as_var and len(bits) == 2:
return cls(parser.compile_filter(bits[1]))
elif len(bits) == 4:
if bits[2] != "as":
raise template.TemplateSyntaxError("%r's 2nd argument must be 'as'" % bits[0])
return cls(parser.compile_filter(bits[1]), bits[3])
if cls.requires_as_var:
args = "1 argument"
else:
args = "either 1 or 3 arguments"
raise template.TemplateSyntaxError("%r takes %s" % (bits[0], args))
def __init__(self, obj, varname=None):
self.obj = obj
self.varname = varname
def get_comments(self, context):
obj = self.obj.resolve(context)
return Comment.objects.filter(
object_id=obj.pk,
content_type=ContentType.objects.get_for_model(obj)
)
class CommentCountNode(BaseCommentNode):
requires_as_var = False
def render(self, context):
comments = self.get_comments(context).count()
if self.varname is not None:
context[self.varname] = comments
return ""
return unicode(comments)
class CommentsNode(BaseCommentNode):
requires_as_var = True
def render(self, context):
context[self.varname] = self.get_comments(context)
return ""
class CommentFormNode(BaseCommentNode):
requires_as_var = False
def render(self, context):
obj = self.obj.resolve(context)
user = context.get("user")
if user is None or not user.is_authenticated():
form = UnauthenticatedCommentForm(obj=obj)
else:
form = AuthenticatedCommentForm(obj=obj)
context[self.varname] = form
return ""
class CommentTargetNode(BaseCommentNode):
requires_as_var = False
def render(self, context):
obj = self.obj.resolve(context)
return reverse("post_comment", kwargs={
"content_type_id": ContentType.objects.get_for_model(obj).pk,
"object_id": obj.pk
})
@register.tag
def comment_count(parser, token):
"""
Usage:
{% comment_count obj %}
or
{% comment_count obj as var %}
"""
return CommentCountNode.handle_token(parser, token)
@register.tag
def comments(parser, token):
"""
Usage:
{% comments obj as var %}
"""
return CommentsNode.handle_token(parser, token)
@register.tag
def comment_form(parser, token):
"""
Usage:
{% comment_form obj as comment_form %}
Will read the `user` var out of the contex to know if the form should be
form an auth'd user or not.
"""
return CommentFormNode.handle_token(parser, token)
@register.tag
def comment_target(parser, token):
"""
Usage:
{% comment_target obj [as varname] %}
"""
return CommentTargetNode.handle_token(parser, token)