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 | # -*- coding: utf-8 -*- | 1 | # -*- coding: utf-8 -*- |
2 | 2 | ||
3 | from django.core.management.base import BaseCommand, CommandError | 3 | from django.core.management.base import BaseCommand, CommandError |
4 | +from haystack.query import SearchQuerySet | ||
4 | 5 | ||
5 | from accounts.models import User | 6 | from accounts.models import User |
6 | from badger.utils import get_counters_to_badge | 7 | from badger.utils import get_counters_to_badge |
@@ -14,17 +15,31 @@ class Command(BaseCommand): | @@ -14,17 +15,31 @@ class Command(BaseCommand): | ||
14 | for badge in Badge.objects.filter(type='auto'): | 15 | for badge in Badge.objects.filter(type='auto'): |
15 | if not badge.comparison: | 16 | if not badge.comparison: |
16 | continue | 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,6 +11,7 @@ class Badge(models.Model): | ||
11 | (u'gte', _(u'Greater than or equal')), | 11 | (u'gte', _(u'Greater than or equal')), |
12 | (u'lte', _(u'less than or equal')), | 12 | (u'lte', _(u'less than or equal')), |
13 | (u'equal', _(u'Equal')), | 13 | (u'equal', _(u'Equal')), |
14 | + (u'biggest', _(u'Biggest')), | ||
14 | ) | 15 | ) |
15 | TYPE_CHOICES = ( | 16 | TYPE_CHOICES = ( |
16 | (u'auto', _(u'Automatically')), | 17 | (u'auto', _(u'Automatically')), |
@@ -23,6 +24,13 @@ class Badge(models.Model): | @@ -23,6 +24,13 @@ class Badge(models.Model): | ||
23 | (u'revisions', _(u'Revisions')), | 24 | (u'revisions', _(u'Revisions')), |
24 | (u'tickets', _(u'Ticket')), | 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 | title = models.CharField(_(u'Title'), max_length=200) | 34 | title = models.CharField(_(u'Title'), max_length=200) |
27 | description = models.CharField(_(u'Description'), max_length=200) | 35 | description = models.CharField(_(u'Description'), max_length=200) |
28 | image = models.ImageField(upload_to='badges') | 36 | image = models.ImageField(upload_to='badges') |