diff options
author | Aurélien Bompard <aurelien@bompard.org> | 2013-06-20 17:47:30 +0200 |
---|---|---|
committer | Aurélien Bompard <aurelien@bompard.org> | 2013-06-20 17:47:30 +0200 |
commit | df0b5fb2fb74d1dec39bca6e60b04b49619caf81 (patch) | |
tree | 2af403b2f9db71f797c97a768833d696fe4ed3eb | |
parent | 0f5a2b253de5712423a999e860600c38fb7211db (diff) | |
download | hyperkitty-df0b5fb2fb74d1dec39bca6e60b04b49619caf81.tar.gz hyperkitty-df0b5fb2fb74d1dec39bca6e60b04b49619caf81.tar.xz hyperkitty-df0b5fb2fb74d1dec39bca6e60b04b49619caf81.zip |
Factor thread votes computation
-rw-r--r-- | hyperkitty/lib/voting.py | 27 | ||||
-rw-r--r-- | hyperkitty/templates/threads/summary_thread.html | 6 | ||||
-rw-r--r-- | hyperkitty/views/list.py | 43 |
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) |