7
7
from default_settings import RATINGS_VOTES_PER_IP
8
8
from wl_utils import get_real_ip
10
11
class AddRatingView(object):
11
13
def __call__(self, request, content_type_id, object_id, field_name, score):
12
14
"""__call__(request, content_type_id, object_id, field_name, score)
14
Adds a vote to the specified model field."""
16
Adds a vote to the specified model field.
17
21
instance = self.get_instance(content_type_id, object_id)
18
22
except ObjectDoesNotExist:
19
23
raise Http404('Object does not exist')
21
25
context = self.get_context(request)
22
26
context['instance'] = instance
25
29
field = getattr(instance, field_name)
26
30
except AttributeError:
27
31
return self.invalid_field_response(request, context)
34
had_voted = bool(field.get_rating_for_user(request.user, get_real_ip(request), request.COOKIES))
38
had_voted = bool(field.get_rating_for_user(
39
request.user, get_real_ip(request), request.COOKIES))
36
41
context['had_voted'] = had_voted
39
adds = field.add(score, request.user, get_real_ip(request), request.COOKIES)
44
adds = field.add(score, request.user,
45
get_real_ip(request), request.COOKIES)
40
46
except IPLimitReached:
41
47
return self.too_many_votes_from_ip_response(request, context)
42
48
except AuthRequired:
51
57
return self.rating_changed_response(request, context, adds)
52
58
return self.rating_added_response(request, context, adds)
54
60
def get_context(self, request, context={}):
57
63
def render_to_response(self, template, context, request):
58
64
raise NotImplementedError
60
66
def too_many_votes_from_ip_response(self, request, context):
61
response = HttpResponse('Too many votes from this IP address for this object.')
67
response = HttpResponse(
68
'Too many votes from this IP address for this object.')
64
71
def rating_changed_response(self, request, context, adds={}):
68
75
if 'deleted' in adds:
69
76
response.delete_cookie(cookie_name)
71
response.set_cookie(cookie_name, cookie, 31536000, path='/') # TODO: move cookie max_age to settings
78
# TODO: move cookie max_age to settings
79
response.set_cookie(cookie_name, cookie, 31536000, path='/')
74
82
def rating_added_response(self, request, context, adds={}):
75
83
response = HttpResponse('Vote recorded.')
76
84
if 'cookie' in adds:
78
86
if 'deleted' in adds:
79
87
response.delete_cookie(cookie_name)
81
response.set_cookie(cookie_name, cookie, 31536000, path='/') # TODO: move cookie max_age to settings
89
# TODO: move cookie max_age to settings
90
response.set_cookie(cookie_name, cookie, 31536000, path='/')
84
93
def authentication_required_response(self, request, context):
85
94
response = HttpResponse('You must be logged in to vote.')
86
95
response.status_code = 403
89
98
def cannot_change_vote_response(self, request, context):
90
99
response = HttpResponse('You have already voted.')
91
100
response.status_code = 403
94
103
def cannot_delete_vote_response(self, request, context):
95
104
response = HttpResponse('You can\'t delete this vote.')
96
105
response.status_code = 403
99
108
def invalid_field_response(self, request, context):
100
109
response = HttpResponse('Invalid field name.')
101
110
response.status_code = 403
104
113
def invalid_rating_response(self, request, context):
105
114
response = HttpResponse('Invalid rating value.')
106
115
response.status_code = 403
109
118
def get_instance(self, content_type_id, object_id):
110
119
return ContentType.objects.get(pk=content_type_id)\
111
120
.get_object_for_this_type(pk=object_id)
114
123
class AddRatingFromModel(AddRatingView):
115
125
def __call__(self, request, model, app_label, object_id, field_name, score):
116
126
"""__call__(request, model, app_label, object_id, field_name, score)
118
Adds a vote to the specified model field."""
128
Adds a vote to the specified model field.
120
content_type = ContentType.objects.get(model=model, app_label=app_label)
132
content_type = ContentType.objects.get(
133
model=model, app_label=app_label)
121
134
except ContentType.DoesNotExist:
122
135
raise Http404('Invalid `model` or `app_label`.')
124
137
return super(AddRatingFromModel, self).__call__(request, content_type.id,
125
138
object_id, field_name, score)