From 112357a90705b68134c8276d6ee65cf94f2c4335 Mon Sep 17 00:00:00 2001
From: ffont
Date: Wed, 5 Apr 2017 15:04:48 +0200
Subject: [PATCH] Add last 24h top contributors table
https://github.com/MTG/freesound-datasets/issues/8
---
datasets/tasks.py | 20 ++++++--
datasets/views.py | 2 +-
templates/contribute.html | 98 +++++++++++++++++++++++++++------------
3 files changed, 84 insertions(+), 36 deletions(-)
diff --git a/datasets/tasks.py b/datasets/tasks.py
index 3d85f194..f6468852 100644
--- a/datasets/tasks.py
+++ b/datasets/tasks.py
@@ -8,6 +8,7 @@
import json
import math
import logging
+import datetime
logger = logging.getLogger('tasks')
@@ -153,22 +154,31 @@ def compute_dataset_taxonomy_stats(store_key, dataset_id):
@shared_task
-def compute_annotators_ranking(store_key, dataset_id, user_id, N=10):
+def compute_annotators_ranking(store_key, dataset_id, N=15):
logger.info('Start computing data for {0}'.format(store_key))
try:
dataset = Dataset.objects.get(id=dataset_id)
- user = User.objects.get(id=user_id)
-
+ reference_date = datetime.datetime.today() - datetime.timedelta(days=1)
ranking = list()
+ ranking_24h = list()
for user in User.objects.all():
n_annotations = Annotation.objects.filter(created_by=user, sound_dataset__dataset=dataset).count()
n_votes = Vote.objects.filter(created_by=user, annotation__sound_dataset__dataset=dataset).count()
ranking.append(
(user.username, n_annotations + n_votes)
)
- ranking = sorted(ranking, key=lambda x: x[1], reverse=True) # Sort by number of annotations
+ n_annotations_24h = Annotation.objects.filter(
+ created_at__gt=reference_date, created_by=user, sound_dataset__dataset=dataset).count()
+ n_votes_24h = Vote.objects.filter(
+ created_at__gt=reference_date, created_by=user, annotation__sound_dataset__dataset=dataset).count()
+ ranking_24h.append(
+ (user.username, n_annotations_24h + n_votes_24h)
+ )
+
+ ranking = sorted(ranking, key=lambda x: x[1], reverse=True) # Sort by number of annotations
+ ranking_24h = sorted(ranking_24h, key=lambda x: x[1], reverse=True) # Sort by number of annotations
- store.set(store_key, {'ranking': ranking[:N]})
+ store.set(store_key, {'ranking': ranking[:N], 'ranking_24h': ranking_24h[:N]})
logger.info('Finished computing data for {0}'.format(store_key))
except Dataset.DoesNotExist:
pass
diff --git a/datasets/views.py b/datasets/views.py
index 96c49a38..7923ece3 100644
--- a/datasets/views.py
+++ b/datasets/views.py
@@ -107,7 +107,7 @@ def contribute(request, short_name):
dataset = get_object_or_404(Dataset, short_name=short_name)
# Get previously stored annotators ranking
- annotators_ranking = data_from_async_task(compute_annotators_ranking, [dataset.id, request.user.id], {},
+ annotators_ranking = data_from_async_task(compute_annotators_ranking, [dataset.id], {},
DATASET_ANNOTATORS_RANKING_TEMPLATE.format(dataset.id), 60 * 1)
return render(request, 'contribute.html', {'dataset': dataset, 'annotators_ranking': annotators_ranking})
diff --git a/templates/contribute.html b/templates/contribute.html
index 844ba371..81ffed14 100644
--- a/templates/contribute.html
+++ b/templates/contribute.html
@@ -15,39 +15,77 @@
- Top 10 contributors
-
-
-
- # |
- Username |
- Number of contributions |
-
-
-
- {% for username, n_annotations in annotators_ranking.ranking %}
-
- {{ forloop.counter }} |
-
- {% if forloop.counter == 1 %}
- 🥇
- {% elif forloop.counter == 2 %}
- 🥈
- {% elif forloop.counter == 3 %}
- 🥉
- {% endif %}
- {{ username }}
- |
- {{ n_annotations}} |
-
- {% endfor %}
-
-
-
-
Last updated {{ annotators_ranking.redis_timestamp | timestamp_to_datetime | timesince }} ago
+
+
+
All time top contributors
+
+
+
+ # |
+ Username |
+ Number of contributions |
+
+
+
+ {% for username, n_annotations in annotators_ranking.ranking %}
+
+ {{ forloop.counter }} |
+
+ {% if forloop.counter == 1 %}
+ 🥇
+ {% elif forloop.counter == 2 %}
+ 🥈
+ {% elif forloop.counter == 3 %}
+ 🥉
+ {% endif %}
+ {{ username }}
+ |
+ {{ n_annotations}} |
+
+ {% endfor %}
+
+
+
+
+
Last 24h top contributors
+
+
+
+ # |
+ Username |
+ Number of contributions |
+
+
+
+ {% for username, n_annotations in annotators_ranking.ranking_24h %}
+
+ {{ forloop.counter }} |
+
+ {% if forloop.counter == 1 %}
+ 🥇
+ {% elif forloop.counter == 2 %}
+ 🥈
+ {% elif forloop.counter == 3 %}
+ 🥉
+ {% endif %}
+ {{ username }}
+ |
+ {{ n_annotations}} |
+
+ {% endfor %}
+
+
+
+
+ Last updated {{ annotators_ranking.redis_timestamp | timestamp_to_datetime | timesince }} ago
+
+
+
+
+
{% endblock %}