Commit c13358756e50b6291ee7acfa826a590777d163b9
1 parent
95c40aa2
Exists in
master
and in
39 other branches
Refactoring user's counters
Showing
3 changed files
with
52 additions
and
33 deletions
Show diff stats
src/accounts/search_indexes.py
@@ -4,6 +4,7 @@ from haystack import indexes | @@ -4,6 +4,7 @@ from haystack import indexes | ||
4 | from django.db.models import Count | 4 | from django.db.models import Count |
5 | 5 | ||
6 | from proxy.models import Revision, Ticket, Wiki | 6 | from proxy.models import Revision, Ticket, Wiki |
7 | +from badger.utils import get_users_counters | ||
7 | from .models import User | 8 | from .models import User |
8 | 9 | ||
9 | 10 | ||
@@ -34,6 +35,12 @@ class UserIndex(indexes.SearchIndex, indexes.Indexable): | @@ -34,6 +35,12 @@ class UserIndex(indexes.SearchIndex, indexes.Indexable): | ||
34 | def get_model(self): | 35 | def get_model(self): |
35 | return User | 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 | def get_updated_field(self): | 44 | def get_updated_field(self): |
38 | return 'date_joined' | 45 | return 'date_joined' |
39 | 46 | ||
@@ -66,16 +73,16 @@ class UserIndex(indexes.SearchIndex, indexes.Indexable): | @@ -66,16 +73,16 @@ class UserIndex(indexes.SearchIndex, indexes.Indexable): | ||
66 | return u'user' | 73 | return u'user' |
67 | 74 | ||
68 | def prepare_message_count(self, obj): | 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 | def prepare_changeset_count(self, obj): | 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 | def prepare_ticket_count(self, obj): | 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 | def prepare_wiki_count(self, obj): | 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 | def index_queryset(self, using=None): | 87 | def index_queryset(self, using=None): |
81 | return self.get_model().objects.filter(is_active=True) | 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,7 +4,6 @@ from django.core.management.base import BaseCommand, CommandError | ||
4 | from haystack.query import SearchQuerySet | 4 | from haystack.query import SearchQuerySet |
5 | 5 | ||
6 | from accounts.models import User | 6 | from accounts.models import User |
7 | -from badger.utils import get_counters_to_badge | ||
8 | from badger.models import Badge | 7 | from badger.models import Badge |
9 | 8 | ||
10 | 9 |
src/badger/utils.py
@@ -2,32 +2,45 @@ | @@ -2,32 +2,45 @@ | ||
2 | 2 | ||
3 | from django.db.models import Count | 3 | from django.db.models import Count |
4 | 4 | ||
5 | -from haystack.query import SearchQuerySet | ||
6 | - | ||
7 | from proxy.models import Revision, Ticket, Wiki | 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 |