updateranking.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536
  1. from django.core.management.base import BaseCommand, CommandError
  2. from django.db.models import F
  3. from misago.dbsettings import DBSettings
  4. from misago.models import Rank, User
  5. class Command(BaseCommand):
  6. """
  7. 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.
  8. """
  9. help = 'Updates users ranking'
  10. def handle(self, *args, **options):
  11. # Find special ranks
  12. special_ranks = []
  13. for rank in Rank.objects.filter(special=1):
  14. special_ranks.append(str(rank.pk))
  15. # Count users that are in ranking
  16. users_total = User.objects.exclude(rank__in=special_ranks).count()
  17. # Update Ranking
  18. defaulted_ranks = False
  19. for rank in Rank.objects.filter(special=0).order_by('order'):
  20. if defaulted_ranks:
  21. # Set ranks according to ranking
  22. rank.assign_rank(users_total, special_ranks)
  23. else:
  24. # Set default rank first
  25. User.objects.exclude(rank__in=special_ranks).update(rank=rank)
  26. defaulted_ranks = True
  27. # Inflate scores
  28. settings = DBSettings()
  29. inflation = float(100 - settings['ranking_inflation']) / 100
  30. User.objects.all().update(score=F('score') * inflation, ranking=0)
  31. self.stdout.write('Users ranking for has been updated.\n')