summaryrefslogtreecommitdiffstats
path: root/hyperkitty
diff options
context:
space:
mode:
authorAurélien Bompard <aurelien@bompard.org>2013-06-20 17:47:30 +0200
committerAurélien Bompard <aurelien@bompard.org>2013-06-20 17:47:30 +0200
commitdf0b5fb2fb74d1dec39bca6e60b04b49619caf81 (patch)
tree2af403b2f9db71f797c97a768833d696fe4ed3eb /hyperkitty
parent0f5a2b253de5712423a999e860600c38fb7211db (diff)
downloadhyperkitty-df0b5fb2fb74d1dec39bca6e60b04b49619caf81.tar.gz
hyperkitty-df0b5fb2fb74d1dec39bca6e60b04b49619caf81.tar.xz
hyperkitty-df0b5fb2fb74d1dec39bca6e60b04b49619caf81.zip
Factor thread votes computation
Diffstat (limited to 'hyperkitty')
-rw-r--r--hyperkitty/lib/voting.py27
-rw-r--r--hyperkitty/templates/threads/summary_thread.html6
-rw-r--r--hyperkitty/views/list.py43
3 files changed, 38 insertions, 38 deletions
diff --git a/hyperkitty/lib/voting.py b/hyperkitty/lib/voting.py
index 8624d75..d21d977 100644
--- a/hyperkitty/lib/voting.py
+++ b/hyperkitty/lib/voting.py
@@ -39,7 +39,9 @@ def get_votes(msgid, user=None):
elif vote.vote == -1:
dislikes += 1
if user is not None and user.is_authenticated() and vote.user == user:
- myvote = vote.vote
+ if not isinstance(msgid, list) or vote.messageid == msgid[0]:
+ # for a thread, only consider the starting email
+ myvote = vote.vote
return likes, dislikes, myvote
@@ -54,3 +56,26 @@ def set_message_votes(message, user=None):
message.likestatus = "like"
#elif message.likes - message.dislikes < 0:
# message.likestatus = "dislike"
+
+
+def set_thread_votes(thread, user=None):
+ total = 0
+ # XXX: 1 SQL request per thread, possible optimization here
+ likes, dislikes, myvote = get_votes(thread.email_id_hashes)
+ total = likes + dislikes
+ try:
+ thread.likes = likes / total
+ except ZeroDivisionError:
+ thread.likes = 0
+ try:
+ thread.dislikes = dislikes / total
+ except ZeroDivisionError:
+ thread.dislikes = 0
+ thread.likestatus = "neutral"
+ if thread.likes - thread.dislikes >= 10:
+ thread.likestatus = "likealot"
+ elif thread.likes - thread.dislikes > 0:
+ thread.likestatus = "like"
+ #elif thread.likes - thread.dislikes < 0:
+ # thread.likestatus = "dislike"
+
diff --git a/hyperkitty/templates/threads/summary_thread.html b/hyperkitty/templates/threads/summary_thread.html
index cb26ffe..87a5433 100644
--- a/hyperkitty/templates/threads/summary_thread.html
+++ b/hyperkitty/templates/threads/summary_thread.html
@@ -21,17 +21,13 @@
>{{thread.category}}</a>
</li>
{% endif %}
- {% if use_mockups %}
- <li class="likestatus neutral">
- +0/-0
- </li>
- {% endif %}
<li class="participant">
{{ thread.participants|length }}
</li>
<li class="discussion">
{{ thread.length }}
</li>
+ <span class="likestatus {{ thread.likestatus }}">+{{ thread.likes }}/-{{ thread.dislikes }}</span>
</ul>
</div>
</div>
diff --git a/hyperkitty/views/list.py b/hyperkitty/views/list.py
index 896edb2..8b222c4 100644
--- a/hyperkitty/views/list.py
+++ b/hyperkitty/views/list.py
@@ -34,13 +34,19 @@ from django.http import Http404
from hyperkitty.models import Tag, Favorite, LastView
from hyperkitty.lib import get_months, get_store, get_display_dates, daterange
from hyperkitty.lib import FLASH_MESSAGES, paginate
-from hyperkitty.lib.voting import get_votes, set_message_votes
+from hyperkitty.lib.voting import get_votes, set_message_votes, set_thread_votes
if settings.USE_MOCKUPS:
from hyperkitty.lib.mockup import generate_top_author, generate_thread_per_category
+Thread = namedtuple('Thread', [
+ "thread_id", "subject", "participants", "length", "date_active",
+ "likes", "dislikes", "likestatus",
+ ])
+
+
def archives(request, mlist_fqdn, year=None, month=None, day=None):
if year is None and month is None:
today = datetime.date.today()
@@ -80,32 +86,7 @@ def _thread_list(request, mlist, threads, template_name='thread_list.html', extr
participants.update(thread.participants)
# Votes
- totalvotes = 0
- totallikes = 0
- totaldislikes = 0
- for message_id_hash in thread.email_id_hashes:
- 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:
- thread.likes = 0
- try:
- thread.dislikes = totaldislikes / totalvotes
- except ZeroDivisionError:
- thread.dislikes = 0
- thread.likestatus = "neutral"
- if thread.likes - thread.dislikes >= 10:
- thread.likestatus = "likealot"
- elif thread.likes - thread.dislikes > 0:
- thread.likestatus = "like"
- #elif thread.likes - thread.dislikes < 0:
- # thread.likestatus = "dislike"
+ set_thread_votes(thread, request.user)
# Favorites
thread.favorite = False
@@ -179,17 +160,15 @@ def overview(request, mlist_fqdn=None):
list_name=mlist.name, start=begin_date, end=end_date)
threads = []
- Thread = namedtuple('Thread', ["thread_id", "subject", "participants",
- "length", "date_active", "likes", "dislikes"])
participants = set()
for thread_obj in threads_result:
# Votes
- # XXX: 1 SQL request per thread, possible optimization here
- likes, dislikes, myvote = get_votes(thread_obj.email_id_hashes)
+ set_thread_votes(thread_obj, request.user)
thread = Thread(thread_obj.thread_id, thread_obj.subject,
thread_obj.participants, len(thread_obj),
thread_obj.date_active.replace(tzinfo=utc),
- likes, dislikes)
+ thread_obj.likes, thread_obj.dislikes,
+ thread_obj.likestatus)
# Statistics on how many participants and threads this month
participants.update(thread.participants)
threads.append(thread)