Commit c13358756e50b6291ee7acfa826a590777d163b9

Authored by Luan
1 parent 95c40aa2

Refactoring user's counters

src/accounts/search_indexes.py
... ... @@ -4,6 +4,7 @@ from haystack import indexes
4 4 from django.db.models import Count
5 5  
6 6 from proxy.models import Revision, Ticket, Wiki
  7 +from badger.utils import get_users_counters
7 8 from .models import User
8 9  
9 10  
... ... @@ -34,6 +35,12 @@ class UserIndex(indexes.SearchIndex, indexes.Indexable):
34 35 def get_model(self):
35 36 return User
36 37  
  38 + @property
  39 + def badge_counters(self):
  40 + if not hasattr(self, '_badge_counters'):
  41 + self._badge_counters = get_users_counters()
  42 + return self._badge_counters
  43 +
37 44 def get_updated_field(self):
38 45 return 'date_joined'
39 46  
... ... @@ -66,16 +73,16 @@ class UserIndex(indexes.SearchIndex, indexes.Indexable):
66 73 return u'user'
67 74  
68 75 def prepare_message_count(self, obj):
69   - return obj.emails.aggregate(Count('message'))['message__count']
  76 + return self.badge_counters[obj.username]['messages']
70 77  
71 78 def prepare_changeset_count(self, obj):
72   - return Revision.objects.filter(author=obj.username).count()
  79 + return self.badge_counters[obj.username]['revisions']
73 80  
74 81 def prepare_ticket_count(self, obj):
75   - return Ticket.objects.filter(author=obj.username).count()
  82 + return self.badge_counters[obj.username]['tickets']
76 83  
77 84 def prepare_wiki_count(self, obj):
78   - return Wiki.objects.filter(author=obj.username).count()
  85 + return self.badge_counters[obj.username]['wikis']
79 86  
80 87 def index_queryset(self, using=None):
81 88 return self.get_model().objects.filter(is_active=True)
... ...
src/badger/management/commands/update_badges.py
... ... @@ -4,7 +4,6 @@ from django.core.management.base import BaseCommand, CommandError
4 4 from haystack.query import SearchQuerySet
5 5  
6 6 from accounts.models import User
7   -from badger.utils import get_counters_to_badge
8 7 from badger.models import Badge
9 8  
10 9  
... ...
src/badger/utils.py
... ... @@ -2,32 +2,45 @@
2 2  
3 3 from django.db.models import Count
4 4  
5   -from haystack.query import SearchQuerySet
6   -
7 5 from proxy.models import Revision, Ticket, Wiki
8   -from super_archives.models import Message
9   -
10   -
11   -def get_counters_to_badge(user):
12   - # count_revisions = Revision.objects.filter(author=user.username).count()
13   - # count_tickets = Ticket.objects.filter(author=user.username).count()
14   - # count_wikis = Wiki.objects.filter(author=user.username).count()
15   - count_revisions = SearchQuerySet().filter(
16   - type='changeset',
17   - author=user.username
18   - ).count()
19   - count_tickets = SearchQuerySet().filter(
20   - type='ticket',
21   - author=user.username
22   - ).count()
23   - count_wikis = SearchQuerySet().filter(
24   - type='wiki',
25   - author=user.username
26   - ).count()
27   - return dict(
28   - messages=user.emails.aggregate(Count('message'))['message__count'],
29   - revisions=count_revisions,
30   - tickets=count_tickets,
31   - wikis=count_wikis,
32   - contributions=count_revisions + count_tickets + count_wikis,
33   - )
  6 +from accounts.models import User
  7 +
  8 +
  9 +def get_wiki_counters():
  10 + return {
  11 + author: count for author, count in Wiki.objects.values_list(
  12 + 'author'
  13 + ).annotate(count=Count('author'))
  14 + }
  15 +
  16 +
  17 +def get_revision_counters():
  18 + return {
  19 + author: count for author, count in Revision.objects.values_list(
  20 + 'author'
  21 + ).annotate(count=Count('author'))
  22 + }
  23 +
  24 +
  25 +def get_ticket_counters():
  26 + return {
  27 + author: count for author, count in Ticket.objects.values_list(
  28 + 'author'
  29 + ).annotate(count=Count('author'))
  30 + }
  31 +
  32 +
  33 +def get_users_counters():
  34 + wiki_counters = get_wiki_counters()
  35 + revision_counters = get_revision_counters()
  36 + ticket_counters = get_ticket_counters()
  37 +
  38 + users_counters = {}
  39 + for user in User.objects.annotate(message_count=Count('emails__message')):
  40 + users_counters[user.username] = {
  41 + 'messages': user.message_count,
  42 + 'wikis': wiki_counters.get(user.username, 0),
  43 + 'revisions': revision_counters.get(user.username, 0),
  44 + 'tickets': ticket_counters.get(user.username, 0),
  45 + }
  46 + return users_counters
... ...