Commit b6931d87192bb747729fe96556509d14ff528c9b

Authored by Luan
1 parent 4bb4c06a

Adding command to rebuild user's badges

src/badger/management/commands/rebuild_badges.py 0 → 100644
... ... @@ -0,0 +1,44 @@
  1 +# -*- coding: utf-8 -*-
  2 +
  3 +from django.core.management.base import BaseCommand, CommandError
  4 +from haystack.query import SearchQuerySet
  5 +
  6 +from accounts.models import User
  7 +from badger.models import Badge
  8 +
  9 +
  10 +class Command(BaseCommand):
  11 + help = "Rebuild the user's badges."
  12 +
  13 + def handle(self, *args, **kwargs):
  14 + for badge in Badge.objects.filter(type='auto'):
  15 + if not badge.comparison:
  16 + continue
  17 + elif badge.comparison == 'biggest':
  18 + order = u'-{}'.format(Badge.USER_ATTR_OPTS[badge.user_attr])
  19 + sqs = SearchQuerySet().filter(type='user')
  20 + user = sqs.order_by(order)[0]
  21 + badge.awardees.remove(*list(badge.awardees.all()))
  22 + badge.awardees.add(User.objects.get(pk=user.pk))
  23 + continue
  24 +
  25 + comparison = u'__{}'.format(badge.comparison) if badge.comparison \
  26 + is not 'equal' else u''
  27 +
  28 + key = u'{}{}'.format(
  29 + Badge.USER_ATTR_OPTS[badge.user_attr],
  30 + comparison
  31 + )
  32 + opts = {key: badge.value}
  33 +
  34 + sqs = SearchQuerySet().filter(
  35 + type='user',
  36 + **opts
  37 + )
  38 +
  39 + # Remove all awardees to make sure that all of then
  40 + # still accomplish the necessary to keep the badge
  41 + badge.awardees.remove(*list(badge.awardees.all()))
  42 +
  43 + for user in sqs:
  44 + badge.awardees.add(User.objects.get(pk=user.pk))
... ...
src/badger/management/commands/update_badges.py
... ... @@ -18,7 +18,6 @@ class Command(BaseCommand):
18 18 order = u'-{}'.format(Badge.USER_ATTR_OPTS[badge.user_attr])
19 19 sqs = SearchQuerySet().filter(type='user')
20 20 user = sqs.order_by(order)[0]
21   - badge.awardees.remove(*list(badge.awardees.all()))
22 21 badge.awardees.add(User.objects.get(pk=user.pk))
23 22 continue
24 23  
... ... @@ -36,9 +35,5 @@ class Command(BaseCommand):
36 35 **opts
37 36 )
38 37  
39   - # Remove all awardees to make sure that all of then
40   - # still accomplish the necessary to keep the badge
41   - badge.awardees.remove(*list(badge.awardees.all()))
42   -
43 38 for user in sqs:
44 39 badge.awardees.add(User.objects.get(pk=user.pk))
... ...