From e56c1968f7a35ed53bf45bbda07b15b3914ac41e Mon Sep 17 00:00:00 2001 From: Luan Date: Sat, 9 Nov 2013 00:23:10 -0200 Subject: [PATCH] Adding 'biggest' option as option to badges and refactoring update_badges --- src/badger/management/commands/update_badges.py | 43 +++++++++++++++++++++++++++++-------------- src/badger/models.py | 8 ++++++++ 2 files changed, 37 insertions(+), 14 deletions(-) diff --git a/src/badger/management/commands/update_badges.py b/src/badger/management/commands/update_badges.py index 767e586..33c5955 100644 --- a/src/badger/management/commands/update_badges.py +++ b/src/badger/management/commands/update_badges.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from django.core.management.base import BaseCommand, CommandError +from haystack.query import SearchQuerySet from accounts.models import User from badger.utils import get_counters_to_badge @@ -14,17 +15,31 @@ class Command(BaseCommand): for badge in Badge.objects.filter(type='auto'): if not badge.comparison: continue - for user in User.objects.all(): - user_counters = get_counters_to_badge(user) - - # TODO remove user if it doesn't sastify the conditions of the - # badge anymore - if badge.comparison == 'gte': - if user_counters[badge.user_attr] >= badge.value: - badge.awardees.add(user) - elif badge.comparison == 'lte': - if user_counters[badge.user_attr] <= badge.value: - badge.awardees.add(user) - elif badge.comparison == 'equal': - if user_counters[badge.user_attr] == badge.value: - badge.awardees.add(user) + elif badge.comparison == 'biggest': + order = u'-{}'.format(Badge.USER_ATTR_OPTS[badge.user_attr]) + sqs = SearchQuerySet().filter(type='user') + user = sqs.order_by(order)[0] + badge.awardees.remove(*list(badge.awardees.all())) + badge.awardees.add(User.objects.get(pk=user.pk)) + continue + + comparison = u'__{}'.format(badge.comparison) if badge.comparison \ + is not 'equal' else u'' + + key = u'{}{}'.format( + Badge.USER_ATTR_OPTS[badge.user_attr], + comparison + ) + opts = {key: badge.value} + + sqs = SearchQuerySet().filter( + type='user', + **opts + ) + + # Remove all awardees to make sure that all of then + # still accomplish the necessary to keep the badge + badge.awardees.remove(*list(badge.awardees.all())) + + for user in sqs: + badge.awardees.add(User.objects.get(pk=user.pk)) diff --git a/src/badger/models.py b/src/badger/models.py index cca9bc4..57f6367 100644 --- a/src/badger/models.py +++ b/src/badger/models.py @@ -11,6 +11,7 @@ class Badge(models.Model): (u'gte', _(u'Greater than or equal')), (u'lte', _(u'less than or equal')), (u'equal', _(u'Equal')), + (u'biggest', _(u'Biggest')), ) TYPE_CHOICES = ( (u'auto', _(u'Automatically')), @@ -23,6 +24,13 @@ class Badge(models.Model): (u'revisions', _(u'Revisions')), (u'tickets', _(u'Ticket')), ) + USER_ATTR_OPTS = { + u'messages': u'message_count', + u'revisions': u'changeset_count', + u'tickets': u'ticket_count', + u'wikis': u'wiki_count', + u'contributions': u'contribution_count', + } title = models.CharField(_(u'Title'), max_length=200) description = models.CharField(_(u'Description'), max_length=200) image = models.ImageField(upload_to='badges') -- libgit2 0.21.2