diff options
Diffstat (limited to 'hyperkitty/views')
-rw-r--r-- | hyperkitty/views/list.py | 8 | ||||
-rw-r--r-- | hyperkitty/views/message.py | 65 | ||||
-rw-r--r-- | hyperkitty/views/thread.py | 17 |
3 files changed, 52 insertions, 38 deletions
diff --git a/hyperkitty/views/list.py b/hyperkitty/views/list.py index 7f89ee8..7dbb1ad 100644 --- a/hyperkitty/views/list.py +++ b/hyperkitty/views/list.py @@ -29,7 +29,8 @@ from django.core.urlresolvers import reverse from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from hyperkitty.models import Tag, Favorite -from hyperkitty.lib import get_months, get_store, get_display_dates, get_votes +from hyperkitty.lib import get_months, get_store, get_display_dates +from hyperkitty.lib.voting import get_votes from forms import SearchForm @@ -77,10 +78,13 @@ def _thread_list(request, mlist, threads, template_name='thread_list.html', extr totallikes = 0 totaldislikes = 0 for message_id_hash in thread.email_id_hashes: - likes, dislikes = get_votes(message_id_hash) + likes, dislikes, myvote = get_votes(message_id_hash, request.user) totallikes = totallikes + likes totalvotes = totalvotes + likes + dislikes totaldislikes = totaldislikes + dislikes + if message_id_hash == thread.thread_id: + # Starting email: same id as the thread_id + thread.myvote = myvote try: thread.likes = totallikes / totalvotes except ZeroDivisionError: 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') diff --git a/hyperkitty/views/thread.py b/hyperkitty/views/thread.py index 8fcca20..a1788cd 100644 --- a/hyperkitty/views/thread.py +++ b/hyperkitty/views/thread.py @@ -21,6 +21,7 @@ # import datetime +from collections import namedtuple import django.utils.simplejson as json @@ -33,7 +34,8 @@ from django.core.exceptions import SuspiciousOperation from hyperkitty.models import Tag, Favorite from forms import SearchForm, AddTagForm, ReplyForm -from hyperkitty.lib import get_months, get_store, stripped_subject, get_votes +from hyperkitty.lib import get_months, get_store, stripped_subject +from hyperkitty.lib.voting import set_message_votes def thread_index(request, mlist_fqdn, threadid, month=None, year=None): @@ -55,15 +57,7 @@ def thread_index(request, mlist_fqdn, threadid, month=None, year=None): participants = {} for email in emails: # Extract all the votes for this message - email.likes, email.dislikes = get_votes(email.message_id_hash) - email.likestatus = "neutral" - if email.likes - email.dislikes >= 10: - email.likestatus = "likealot" - elif email.likes - email.dislikes > 0: - email.likestatus = "like" - #elif email.likes - email.dislikes < 0: - # email.likestatus = "dislike" - + set_message_votes(email, request.user) # Statistics on how many participants and messages this month participants[email.sender_name] = email.sender_email @@ -146,10 +140,11 @@ def add_tag(request, mlist_fqdn, threadid): # Now refresh the tag list tags = Tag.objects.filter(threadid=threadid, list_address=mlist_fqdn) + FakeMList = namedtuple("MailingList", ["name"]) t = loader.get_template('threads/tags.html') html = t.render(RequestContext(request, { "tags": tags, - "list_address": mlist_fqdn})) + "mlist": FakeMList(name=mlist_fqdn)})) response = {"tags": [ t.tag for t in tags ], "html": html} return HttpResponse(json.dumps(response), |