Commit e56c1968f7a35ed53bf45bbda07b15b3914ac41e
1 parent
e8a87460
Exists in
master
and in
39 other branches
Adding 'biggest' option as option to badges and refactoring update_badges
Showing
2 changed files
with
37 additions
and
14 deletions
Show diff stats
src/badger/management/commands/update_badges.py
1 | 1 | # -*- coding: utf-8 -*- |
2 | 2 | |
3 | 3 | from django.core.management.base import BaseCommand, CommandError |
4 | +from haystack.query import SearchQuerySet | |
4 | 5 | |
5 | 6 | from accounts.models import User |
6 | 7 | from badger.utils import get_counters_to_badge |
... | ... | @@ -14,17 +15,31 @@ class Command(BaseCommand): |
14 | 15 | for badge in Badge.objects.filter(type='auto'): |
15 | 16 | if not badge.comparison: |
16 | 17 | continue |
17 | - for user in User.objects.all(): | |
18 | - user_counters = get_counters_to_badge(user) | |
19 | - | |
20 | - # TODO remove user if it doesn't sastify the conditions of the | |
21 | - # badge anymore | |
22 | - if badge.comparison == 'gte': | |
23 | - if user_counters[badge.user_attr] >= badge.value: | |
24 | - badge.awardees.add(user) | |
25 | - elif badge.comparison == 'lte': | |
26 | - if user_counters[badge.user_attr] <= badge.value: | |
27 | - badge.awardees.add(user) | |
28 | - elif badge.comparison == 'equal': | |
29 | - if user_counters[badge.user_attr] == badge.value: | |
30 | - badge.awardees.add(user) | |
18 | + elif badge.comparison == 'biggest': | |
19 | + order = u'-{}'.format(Badge.USER_ATTR_OPTS[badge.user_attr]) | |
20 | + sqs = SearchQuerySet().filter(type='user') | |
21 | + user = sqs.order_by(order)[0] | |
22 | + badge.awardees.remove(*list(badge.awardees.all())) | |
23 | + badge.awardees.add(User.objects.get(pk=user.pk)) | |
24 | + continue | |
25 | + | |
26 | + comparison = u'__{}'.format(badge.comparison) if badge.comparison \ | |
27 | + is not 'equal' else u'' | |
28 | + | |
29 | + key = u'{}{}'.format( | |
30 | + Badge.USER_ATTR_OPTS[badge.user_attr], | |
31 | + comparison | |
32 | + ) | |
33 | + opts = {key: badge.value} | |
34 | + | |
35 | + sqs = SearchQuerySet().filter( | |
36 | + type='user', | |
37 | + **opts | |
38 | + ) | |
39 | + | |
40 | + # Remove all awardees to make sure that all of then | |
41 | + # still accomplish the necessary to keep the badge | |
42 | + badge.awardees.remove(*list(badge.awardees.all())) | |
43 | + | |
44 | + for user in sqs: | |
45 | + badge.awardees.add(User.objects.get(pk=user.pk)) | ... | ... |
src/badger/models.py
... | ... | @@ -11,6 +11,7 @@ class Badge(models.Model): |
11 | 11 | (u'gte', _(u'Greater than or equal')), |
12 | 12 | (u'lte', _(u'less than or equal')), |
13 | 13 | (u'equal', _(u'Equal')), |
14 | + (u'biggest', _(u'Biggest')), | |
14 | 15 | ) |
15 | 16 | TYPE_CHOICES = ( |
16 | 17 | (u'auto', _(u'Automatically')), |
... | ... | @@ -23,6 +24,13 @@ class Badge(models.Model): |
23 | 24 | (u'revisions', _(u'Revisions')), |
24 | 25 | (u'tickets', _(u'Ticket')), |
25 | 26 | ) |
27 | + USER_ATTR_OPTS = { | |
28 | + u'messages': u'message_count', | |
29 | + u'revisions': u'changeset_count', | |
30 | + u'tickets': u'ticket_count', | |
31 | + u'wikis': u'wiki_count', | |
32 | + u'contributions': u'contribution_count', | |
33 | + } | |
26 | 34 | title = models.CharField(_(u'Title'), max_length=200) |
27 | 35 | description = models.CharField(_(u'Description'), max_length=200) |
28 | 36 | image = models.ImageField(upload_to='badges') | ... | ... |