diff options
Diffstat (limited to 'hyperkitty/views/message.py')
-rw-r--r-- | hyperkitty/views/message.py | 65 |
1 files changed, 40 insertions, 25 deletions
diff --git a/hyperkitty/views/message.py b/hyperkitty/views/message.py index 0245b24..32467f9 100644 --- a/hyperkitty/views/message.py +++ b/hyperkitty/views/message.py @@ -22,6 +22,7 @@ import urllib import datetime +from collections import namedtuple import django.utils.simplejson as json from django.http import HttpResponse, Http404 @@ -30,9 +31,11 @@ from django.conf import settings from django.core.urlresolvers import reverse from django.core.mail import EmailMessage from django.core.exceptions import SuspiciousOperation +from django.template import RequestContext, loader from django.contrib.auth.decorators import login_required -from hyperkitty.lib import get_store, get_months, get_votes +from hyperkitty.lib import get_store, get_months +from hyperkitty.lib.voting import set_message_votes from hyperkitty.models import Rating from forms import SearchForm, ReplyForm, PostForm @@ -48,17 +51,7 @@ def index(request, mlist_fqdn, message_id_hash): if message is None: raise Http404 message.sender_email = message.sender_email.strip() - - # Extract all the votes for this message - message.likes, message.dislikes = get_votes(message_id_hash) - message.likestatus = "neutral" - if message.likes - message.dislikes >= 10: - message.likestatus = "likealot" - elif message.likes - message.dislikes > 0: - message.likestatus = "like" - #elif message.likes - message.dislikes < 0: - # message.likestatus = "dislike" - + set_message_votes(message, request.user) mlist = store.get_list(mlist_fqdn) context = { @@ -98,11 +91,21 @@ def attachment(request, mlist_fqdn, message_id_hash, counter, filename): def vote(request, mlist_fqdn, message_id_hash): """ Add a rating to a given message identified by messageid. """ + if request.method != 'POST': + raise SuspiciousOperation + if not request.user.is_authenticated(): return HttpResponse('You must be logged in to vote', content_type="text/plain", status=403) + store = get_store(request) + message = store.get_message_by_hash_from_list(mlist_fqdn, message_id_hash) + if message is None: + raise Http404 + value = int(request.POST['vote']) + if value not in [-1, 0, 1]: + raise SuspiciousOperation # Checks if the user has already voted for a this message. try: @@ -112,21 +115,33 @@ def vote(request, mlist_fqdn, message_id_hash): return HttpResponse("You've already cast this vote", content_type="text/plain", status=403) except Rating.DoesNotExist: - v = Rating(list_address=mlist_fqdn, messageid=message_id_hash, vote=value) - v.user = request.user - - v.vote = value - v.save() + if value != 0: + v = Rating(list_address=mlist_fqdn, messageid=message_id_hash, + vote=value) + v.user = request.user + else: + return HttpResponse("There is no vote to cancel", + content_type="text/plain", status=500) + + if value == 0: + v.delete() + else: + v.vote = value + v.save() # Extract all the votes for this message to refresh it - status = { "like": 0, "dislike": 0 } - for vote in Rating.objects.filter(messageid=message_id_hash): - if vote.vote == 1: - status["like"] += 1 - elif vote.vote == -1: - status["dislike"] += 1 - - return HttpResponse(json.dumps(status), + set_message_votes(message, request.user) + FakeMList = namedtuple("MailingList", ["name"]) + t = loader.get_template('messages/like_form.html') + html = t.render(RequestContext(request, { + "object": message, + "message_id_hash": message_id_hash, + "mlist": FakeMList(name=mlist_fqdn)} + )) + + result = { "like": message.likes, "dislike": message.dislikes, + "html": html, } + return HttpResponse(json.dumps(result), mimetype='application/javascript') |