summaryrefslogtreecommitdiffstats
path: root/hyperkitty/views/message.py
diff options
context:
space:
mode:
Diffstat (limited to 'hyperkitty/views/message.py')
-rw-r--r--hyperkitty/views/message.py65
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')