updateranking.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536
  1. from django.core.exceptions import ValidationError, NON_FIELD_ERRORS
  2. from django.core.management.base import BaseCommand, CommandError
  3. from django.db.models import F
  4. from django.utils import timezone
  5. from optparse import make_option
  6. from misago.users.models import User, Rank
  7. class Command(BaseCommand):
  8. """
  9. This command is intended to work as CRON job fired of once per day or less if you have more users to update user ranking.
  10. """
  11. help = 'Updates users ranking'
  12. def handle(self, *args, **options):
  13. # Find special ranks
  14. special_ranks = []
  15. for rank in Rank.objects.filter(special=1):
  16. special_ranks.append(str(rank.pk))
  17. # Count users that are in ranking
  18. users_total = User.objects.exclude(rank__in=special_ranks).count()
  19. # Update Ranking
  20. defaulted_ranks = False
  21. for rank in Rank.objects.filter(special=0).order_by('order'):
  22. if defaulted_ranks:
  23. # Set ranks according to ranking
  24. rank.assign_rank(users_total, special_ranks)
  25. else:
  26. # Set default rank first
  27. User.objects.exclude(rank__in=special_ranks).update(rank=rank)
  28. defaulted_ranks = True
  29. # Inflate scores
  30. User.objects.all().update(score=F('score') * 0.95) # TODO: Ranking system SETTINGS!
  31. self.stdout.write('Users ranking for has been updated.\n')