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 @@

Contribute to {{ dataset.name }}



-

Top 10 contributors

- - - - - - - - - - {% for username, n_annotations in annotators_ranking.ranking %} - - - - - - {% endfor %} - -
#UsernameNumber of contributions
{{ forloop.counter }} - {% if forloop.counter == 1 %} - 🥇 - {% elif forloop.counter == 2 %} - 🥈 - {% elif forloop.counter == 3 %} - 🥉 - {% endif %} - {{ username }} - {{ n_annotations}}
-
- Last updated {{ annotators_ranking.redis_timestamp | timestamp_to_datetime | timesince }} ago +
+
+

All time top contributors

+ + + + + + + + + + {% for username, n_annotations in annotators_ranking.ranking %} + + + + + + {% endfor %} + +
#UsernameNumber of contributions
{{ forloop.counter }} + {% if forloop.counter == 1 %} + 🥇 + {% elif forloop.counter == 2 %} + 🥈 + {% elif forloop.counter == 3 %} + 🥉 + {% endif %} + {{ username }} + {{ n_annotations}}
+
+
+

Last 24h top contributors

+ + + + + + + + + + {% for username, n_annotations in annotators_ranking.ranking_24h %} + + + + + + {% endfor %} + +
#UsernameNumber of contributions
{{ forloop.counter }} + {% if forloop.counter == 1 %} + 🥇 + {% elif forloop.counter == 2 %} + 🥈 + {% elif forloop.counter == 3 %} + 🥉 + {% endif %} + {{ username }} + {{ n_annotations}}
+
+
+ Last updated {{ annotators_ranking.redis_timestamp | timestamp_to_datetime | timesince }} ago +
+
+
+ + {% endblock %}