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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ObjectDoesNotExist
from django.http import HttpResponse, Http404
from exceptions import *
from django.conf import settings
from default_settings import RATINGS_VOTES_PER_IP
from wl_utils import get_real_ip
class AddRatingView(object):
def __call__(self, request, content_type_id, object_id, field_name, score):
"""__call__(request, content_type_id, object_id, field_name, score)
Adds a vote to the specified model field.
"""
try:
instance = self.get_instance(content_type_id, object_id)
except ObjectDoesNotExist:
raise Http404('Object does not exist')
context = self.get_context(request)
context['instance'] = instance
try:
field = getattr(instance, field_name)
except AttributeError:
return self.invalid_field_response(request, context)
context.update({
'field': field,
'score': score,
})
had_voted = bool(field.get_rating_for_user(
request.user, get_real_ip(request), request.COOKIES))
context['had_voted'] = had_voted
try:
adds = field.add(score, request.user,
get_real_ip(request), request.COOKIES)
except IPLimitReached:
return self.too_many_votes_from_ip_response(request, context)
except AuthRequired:
return self.authentication_required_response(request, context)
except InvalidRating:
return self.invalid_rating_response(request, context)
except CannotChangeVote:
return self.cannot_change_vote_response(request, context)
except CannotDeleteVote:
return self.cannot_delete_vote_response(request, context)
if had_voted:
return self.rating_changed_response(request, context, adds)
return self.rating_added_response(request, context, adds)
def get_context(self, request, context={}):
return context
def render_to_response(self, template, context, request):
raise NotImplementedError
def too_many_votes_from_ip_response(self, request, context):
response = HttpResponse(
'Too many votes from this IP address for this object.')
return response
def rating_changed_response(self, request, context, adds={}):
response = HttpResponse('Vote changed.')
if 'cookie' in adds:
cookie_name, cookie = adds['cookie_name'], adds['cookie']
if 'deleted' in adds:
response.delete_cookie(cookie_name)
else:
# TODO: move cookie max_age to settings
response.set_cookie(cookie_name, cookie, 31536000, path='/')
return response
def rating_added_response(self, request, context, adds={}):
response = HttpResponse('Vote recorded.')
if 'cookie' in adds:
cookie_name, cookie = adds['cookie_name'], adds['cookie']
if 'deleted' in adds:
response.delete_cookie(cookie_name)
else:
# TODO: move cookie max_age to settings
response.set_cookie(cookie_name, cookie, 31536000, path='/')
return response
def authentication_required_response(self, request, context):
response = HttpResponse('You must be logged in to vote.')
response.status_code = 403
return response
def cannot_change_vote_response(self, request, context):
response = HttpResponse('You have already voted.')
response.status_code = 403
return response
def cannot_delete_vote_response(self, request, context):
response = HttpResponse('You can\'t delete this vote.')
response.status_code = 403
return response
def invalid_field_response(self, request, context):
response = HttpResponse('Invalid field name.')
response.status_code = 403
return response
def invalid_rating_response(self, request, context):
response = HttpResponse('Invalid rating value.')
response.status_code = 403
return response
def get_instance(self, content_type_id, object_id):
return ContentType.objects.get(pk=content_type_id)\
.get_object_for_this_type(pk=object_id)
class AddRatingFromModel(AddRatingView):
def __call__(self, request, model, app_label, object_id, field_name, score):
"""__call__(request, model, app_label, object_id, field_name, score)
Adds a vote to the specified model field.
"""
try:
content_type = ContentType.objects.get(
model=model, app_label=app_label)
except ContentType.DoesNotExist:
raise Http404('Invalid `model` or `app_label`.')
return super(AddRatingFromModel, self).__call__(request, content_type.id,
object_id, field_name, score)
|