From c13358756e50b6291ee7acfa826a590777d163b9 Mon Sep 17 00:00:00 2001 From: Luan Date: Mon, 11 Nov 2013 12:16:37 -0200 Subject: [PATCH] Refactoring user's counters --- src/accounts/search_indexes.py | 15 +++++++++++---- src/badger/management/commands/update_badges.py | 1 - src/badger/utils.py | 69 +++++++++++++++++++++++++++++++++++++++++---------------------------- 3 files changed, 52 insertions(+), 33 deletions(-) diff --git a/src/accounts/search_indexes.py b/src/accounts/search_indexes.py index 2b1e1b1..8b2ba79 100644 --- a/src/accounts/search_indexes.py +++ b/src/accounts/search_indexes.py @@ -4,6 +4,7 @@ from haystack import indexes from django.db.models import Count from proxy.models import Revision, Ticket, Wiki +from badger.utils import get_users_counters from .models import User @@ -34,6 +35,12 @@ class UserIndex(indexes.SearchIndex, indexes.Indexable): def get_model(self): return User + @property + def badge_counters(self): + if not hasattr(self, '_badge_counters'): + self._badge_counters = get_users_counters() + return self._badge_counters + def get_updated_field(self): return 'date_joined' @@ -66,16 +73,16 @@ class UserIndex(indexes.SearchIndex, indexes.Indexable): return u'user' def prepare_message_count(self, obj): - return obj.emails.aggregate(Count('message'))['message__count'] + return self.badge_counters[obj.username]['messages'] def prepare_changeset_count(self, obj): - return Revision.objects.filter(author=obj.username).count() + return self.badge_counters[obj.username]['revisions'] def prepare_ticket_count(self, obj): - return Ticket.objects.filter(author=obj.username).count() + return self.badge_counters[obj.username]['tickets'] def prepare_wiki_count(self, obj): - return Wiki.objects.filter(author=obj.username).count() + return self.badge_counters[obj.username]['wikis'] def index_queryset(self, using=None): return self.get_model().objects.filter(is_active=True) diff --git a/src/badger/management/commands/update_badges.py b/src/badger/management/commands/update_badges.py index 33c5955..249a687 100644 --- a/src/badger/management/commands/update_badges.py +++ b/src/badger/management/commands/update_badges.py @@ -4,7 +4,6 @@ from django.core.management.base import BaseCommand, CommandError from haystack.query import SearchQuerySet from accounts.models import User -from badger.utils import get_counters_to_badge from badger.models import Badge diff --git a/src/badger/utils.py b/src/badger/utils.py index 18728a2..6d00a7e 100644 --- a/src/badger/utils.py +++ b/src/badger/utils.py @@ -2,32 +2,45 @@ from django.db.models import Count -from haystack.query import SearchQuerySet - from proxy.models import Revision, Ticket, Wiki -from super_archives.models import Message - - -def get_counters_to_badge(user): - # count_revisions = Revision.objects.filter(author=user.username).count() - # count_tickets = Ticket.objects.filter(author=user.username).count() - # count_wikis = Wiki.objects.filter(author=user.username).count() - count_revisions = SearchQuerySet().filter( - type='changeset', - author=user.username - ).count() - count_tickets = SearchQuerySet().filter( - type='ticket', - author=user.username - ).count() - count_wikis = SearchQuerySet().filter( - type='wiki', - author=user.username - ).count() - return dict( - messages=user.emails.aggregate(Count('message'))['message__count'], - revisions=count_revisions, - tickets=count_tickets, - wikis=count_wikis, - contributions=count_revisions + count_tickets + count_wikis, - ) +from accounts.models import User + + +def get_wiki_counters(): + return { + author: count for author, count in Wiki.objects.values_list( + 'author' + ).annotate(count=Count('author')) + } + + +def get_revision_counters(): + return { + author: count for author, count in Revision.objects.values_list( + 'author' + ).annotate(count=Count('author')) + } + + +def get_ticket_counters(): + return { + author: count for author, count in Ticket.objects.values_list( + 'author' + ).annotate(count=Count('author')) + } + + +def get_users_counters(): + wiki_counters = get_wiki_counters() + revision_counters = get_revision_counters() + ticket_counters = get_ticket_counters() + + users_counters = {} + for user in User.objects.annotate(message_count=Count('emails__message')): + users_counters[user.username] = { + 'messages': user.message_count, + 'wikis': wiki_counters.get(user.username, 0), + 'revisions': revision_counters.get(user.username, 0), + 'tickets': ticket_counters.get(user.username, 0), + } + return users_counters -- libgit2 0.21.2