61 lines
1.9 KiB
Python
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()
|