Commit e56c1968f7a35ed53bf45bbda07b15b3914ac41e

Authored by Luan
1 parent e8a87460

Adding 'biggest' option as option to badges and refactoring update_badges

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')