1
from django.contrib.contenttypes.models import ContentType
2
from django.core.exceptions import ObjectDoesNotExist
3
from django.http import HttpResponse, Http404
5
from exceptions import *
6
from django.conf import settings
7
from default_settings import RATINGS_VOTES_PER_IP
8
from wl_utils import get_real_ip
11
class AddRatingView(object):
13
def __call__(self, request, content_type_id, object_id, field_name, score):
14
"""__call__(request, content_type_id, object_id, field_name, score)
16
Adds a vote to the specified model field.
21
instance = self.get_instance(content_type_id, object_id)
22
except ObjectDoesNotExist:
23
raise Http404('Object does not exist')
25
context = self.get_context(request)
26
context['instance'] = instance
29
field = getattr(instance, field_name)
30
except AttributeError:
31
return self.invalid_field_response(request, context)
38
had_voted = bool(field.get_rating_for_user(
39
request.user, get_real_ip(request), request.COOKIES))
41
context['had_voted'] = had_voted
44
adds = field.add(score, request.user,
45
get_real_ip(request), request.COOKIES)
46
except IPLimitReached:
47
return self.too_many_votes_from_ip_response(request, context)
49
return self.authentication_required_response(request, context)
51
return self.invalid_rating_response(request, context)
52
except CannotChangeVote:
53
return self.cannot_change_vote_response(request, context)
54
except CannotDeleteVote:
55
return self.cannot_delete_vote_response(request, context)
57
return self.rating_changed_response(request, context, adds)
58
return self.rating_added_response(request, context, adds)
60
def get_context(self, request, context={}):
63
def render_to_response(self, template, context, request):
64
raise NotImplementedError
66
def too_many_votes_from_ip_response(self, request, context):
67
response = HttpResponse(
68
'Too many votes from this IP address for this object.')
71
def rating_changed_response(self, request, context, adds={}):
72
response = HttpResponse('Vote changed.')
74
cookie_name, cookie = adds['cookie_name'], adds['cookie']
76
response.delete_cookie(cookie_name)
78
# TODO: move cookie max_age to settings
79
response.set_cookie(cookie_name, cookie, 31536000, path='/')
82
def rating_added_response(self, request, context, adds={}):
83
response = HttpResponse('Vote recorded.')
85
cookie_name, cookie = adds['cookie_name'], adds['cookie']
87
response.delete_cookie(cookie_name)
89
# TODO: move cookie max_age to settings
90
response.set_cookie(cookie_name, cookie, 31536000, path='/')
93
def authentication_required_response(self, request, context):
94
response = HttpResponse('You must be logged in to vote.')
95
response.status_code = 403
98
def cannot_change_vote_response(self, request, context):
99
response = HttpResponse('You have already voted.')
100
response.status_code = 403
103
def cannot_delete_vote_response(self, request, context):
104
response = HttpResponse('You can\'t delete this vote.')
105
response.status_code = 403
108
def invalid_field_response(self, request, context):
109
response = HttpResponse('Invalid field name.')
110
response.status_code = 403
113
def invalid_rating_response(self, request, context):
114
response = HttpResponse('Invalid rating value.')
115
response.status_code = 403
118
def get_instance(self, content_type_id, object_id):
119
return ContentType.objects.get(pk=content_type_id)\
120
.get_object_for_this_type(pk=object_id)
123
class AddRatingFromModel(AddRatingView):
125
def __call__(self, request, model, app_label, object_id, field_name, score):
126
"""__call__(request, model, app_label, object_id, field_name, score)
128
Adds a vote to the specified model field.
132
content_type = ContentType.objects.get(
133
model=model, app_label=app_label)
134
except ContentType.DoesNotExist:
135
raise Http404('Invalid `model` or `app_label`.')
137
return super(AddRatingFromModel, self).__call__(request, content_type.id,
138
object_id, field_name, score)