diff --git a/src/badger/management/__init__.py b/src/badger/management/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/badger/management/__init__.py diff --git a/src/badger/management/commands/__init__.py b/src/badger/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/badger/management/commands/__init__.py diff --git a/src/badger/management/commands/update_badges.py b/src/badger/management/commands/update_badges.py new file mode 100644 index 0000000..38e1eb5 --- /dev/null +++ b/src/badger/management/commands/update_badges.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- + +from django.core.management.base import BaseCommand, CommandError + +from accounts.models import User +from badger.utils import get_counters_to_badge +from badger.models import Badge + + +class Command(BaseCommand): + help = "Updates the user's badges" + + def handle(self, *args, **kwargs): + 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) diff --git a/src/badger/utils.py b/src/badger/utils.py new file mode 100644 index 0000000..8ffa806 --- /dev/null +++ b/src/badger/utils.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- + +from django.db.models import Count + +from proxy.models import Revision, Ticket, Wiki +from super_archives.models import Message + + +def get_counters_to_badge(user): + count_revisions = Revision.objects.filter(author=user.username).count() + count_tickets = Ticket.objects.filter(author=user.username).count() + count_wikis = Wiki.objects.filter(author=user.username).count() + + return dict( + messages=user.emails.aggregate(Count('message'))['message__count'], + revisions=count_revisions, + tickets=count_tickets, + wikis=count_wikis, + contributions=count_revisions + count_tickets + count_wikis, + ) + +# using haystack +# sqs = SearchQuerySet() +# sqs.filter(type='changeset', author=user.get_full_name()).count() +# sqs.filter(type='wiki', author=user.get_full_name()).count() +# sqs.filter(type='ticket', author=user.get_full_name()).count() +# Should it use the author_and_username attr too? -- libgit2 0.21.2