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