Files
kasu/src/maistar_ranking/managers.py

61 lines
1.9 KiB
Python

# -*- encoding: utf-8 -*-
"""
Created on 22.11.2014
@author: christian
"""
from django.db import models
from . import settings
class GameManager(models.Manager):
use_for_related_fields = True
def player_games(self, player, season=None, **kwargs):
queryset = self.filter(
models.Q(player1=player) | models.Q(player2=player) |
models.Q(player3=player) | models.Q(player4=player) |
models.Q(player5=player) | models.Q(player6=player)
)
if season:
queryset = queryset.filter(season=season)
if kwargs:
queryset = queryset.filter(**kwargs)
return queryset
class LadderManager(models.Manager):
use_for_related_fields = True
def calculate_rankings(self, season):
"""
Berechnet die Jahresrankings für die Spieler neu.
@param season: Das Jahr das neu berechnet werden soll
@type season: Integer
"""
rankings = self.filter(season=season)
rankings.update(placement=None)
rankings = rankings.filter(
games_count__gte=settings.MAISTAR_GAMES_FOR_LADDERRANKING) # @IgnorePep8
rankings = rankings.order_by('avg_placement', '-avg_score')
placement = 1
previous_avg_placement = None
previous_avg_score = None
previous_placement = None
for ranking in rankings:
if ranking.avg_placement == previous_avg_placement \
and ranking.avg_score == previous_avg_score:
ranking.placement = previous_placement
else:
ranking.placement = placement
ranking.save(force_update=True)
previous_avg_placement = ranking.avg_placement
previous_avg_score = ranking.avg_score
previous_placement = ranking.placement
placement += 1
def get_seasons(self):
return self.values_list('season', flat=True).order_by(
'season').distinct()