Diverse Code Cleanups
*Code wurde PEP-8 gerecht formatiert * Kleine Fehler die der PyCharm Inspector beanstandet wurden korrigiert
This commit is contained in:
committed by
Christian Berg
parent
f34281089d
commit
86a0db050d
@@ -1,7 +1,7 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
|
||||
from datetime import date, timedelta
|
||||
from django.contrib.auth.models import User
|
||||
from django.conf import settings
|
||||
from django.core.cache import cache
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.core.urlresolvers import reverse
|
||||
@@ -20,12 +20,12 @@ ladder_seasons = set()
|
||||
|
||||
|
||||
class EventRanking(models.Model):
|
||||
'''
|
||||
"""
|
||||
Event Rankings funktionieren genauso wie Season Rankings.
|
||||
Sie beschränken sich aber auf einen Event und werden nur dann angestossen,
|
||||
wenn der Event als Turnier markiert wurde.
|
||||
'''
|
||||
user = models.ForeignKey(User)
|
||||
"""
|
||||
user = models.ForeignKey(settings.AUTH_USER_MODEL)
|
||||
event = models.ForeignKey(Event)
|
||||
placement = models.PositiveIntegerField(blank=True, null=True)
|
||||
avg_placement = models.FloatField(default=4)
|
||||
@@ -42,7 +42,7 @@ class EventRanking(models.Model):
|
||||
return reverse('event-ranking', args=[self.tourney_id])
|
||||
|
||||
def recalculate(self):
|
||||
'''
|
||||
"""
|
||||
Berechnet die durschnittliche Platzierung und Punkte, u.v.m. neu.
|
||||
|
||||
Diese Daten werden benötigt um die Platzierung zu erstellen. Sie
|
||||
@@ -52,7 +52,7 @@ class EventRanking(models.Model):
|
||||
Das Eigenschaft dirty ist ein altes Überbleibsel, um das Objekt
|
||||
zur neuberrechnung zu markieren. Mittlerweile wird ein lokaler
|
||||
Cache dafür verwendet, das ist schneller.
|
||||
'''
|
||||
"""
|
||||
logger.info(u'Recalculate EventRanking for Player %s in %s', self.user, self.event.name) # @IgnorePep8
|
||||
event_hanchans = Player.objects.valid_hanchans(user=self.user_id, event=self.event_id) # @IgnorePep8
|
||||
aggregator = event_hanchans.aggregate(
|
||||
@@ -72,16 +72,20 @@ class EventRanking(models.Model):
|
||||
|
||||
|
||||
class Hanchan(models.Model):
|
||||
'''
|
||||
"""
|
||||
Ein komplette Runde Mahjong, die aus genau 4 Spielern bestehen muss.
|
||||
Es werden aber noch andere Tests durchgeführt, ob sie gültig ist.
|
||||
Außerdem gehört jede Hanchan zu einer Veranstaltung.
|
||||
'''
|
||||
"""
|
||||
comment = models.TextField(_('Comment'), blank=True)
|
||||
confirmed = models.BooleanField(_('Has been Confirmed'), default=True, help_text=_('Only valid and confirmed Hanchans will be counted in the rating.')) # @IgnorePep8
|
||||
event = models.ForeignKey(Event)
|
||||
player_names = models.CharField(max_length=127, editable=False)
|
||||
players = models.ManyToManyField(User, through='Player',verbose_name=_('Players')) # @IgnorePep8
|
||||
players = models.ManyToManyField(
|
||||
settings.AUTH_USER_MODEL,
|
||||
through='Player',
|
||||
verbose_name=_('Players')
|
||||
)
|
||||
season = models.ForeignKey('LadderSeason', blank=True, null=True, editable=False) # @IgnorePep8
|
||||
start = models.DateTimeField(_('Start'), help_text=_('This is crucial to get the right Hanchans that scores')) # @IgnorePep8
|
||||
valid = models.BooleanField(_('Is Valid'), default=False)
|
||||
@@ -95,14 +99,14 @@ class Hanchan(models.Model):
|
||||
return "Hanchan am {0:%d.%m.%Y} um {0:%H:%M} ({1})".format(self.start, self.player_names)
|
||||
|
||||
def check_validity(self):
|
||||
'''
|
||||
"""
|
||||
Prüft ob die Hanchan gültig ist.
|
||||
|
||||
4 Spieler müssen genau 100.000 Punkte erreichen, mehr sind nur erlaubt
|
||||
wenn midestens ein Spieler ins Minus (auf 0) geraten ist. Ansonsten
|
||||
wird die Hanchan als ungültig markiert aber trotzdem abgespeichert,
|
||||
außerdem wird die Begründung zurück gegeben, was nicht gestimmt hat.
|
||||
'''
|
||||
"""
|
||||
logger.debug("Hanchan wird geprüft ob er valide ist...")
|
||||
if not self.pk:
|
||||
self.valid = False
|
||||
@@ -132,7 +136,7 @@ class Hanchan(models.Model):
|
||||
return 'Wir wissen nicht warum, aber das kann nicht passen...'
|
||||
|
||||
def clean(self):
|
||||
'''
|
||||
"""
|
||||
Prüft ob wichtige Vorrausetzungen gegeben sind und aktualisiert ein
|
||||
paar Zwischenspeicher, bevor gespeichert wird.
|
||||
|
||||
@@ -143,7 +147,7 @@ class Hanchan(models.Model):
|
||||
|
||||
Die Gültigkeit wird geprüft und die Sasion in der die Hanchan liegt
|
||||
wird aktualisert.
|
||||
'''
|
||||
"""
|
||||
logger.debug("Hanchan clean() wurde getriggert!")
|
||||
|
||||
# if self.pk and self.player_set.distinct().count() != 4:
|
||||
@@ -156,10 +160,10 @@ class Hanchan(models.Model):
|
||||
return self
|
||||
|
||||
def compute_player_placements(self):
|
||||
u'''
|
||||
u"""
|
||||
Bestimmt die Platzierung eines der Spieler einer Hanchan und speichert
|
||||
diese beim jeweiligen Spieler ab.
|
||||
'''
|
||||
"""
|
||||
logger.debug("Berechne die Platzierungen neu...")
|
||||
attending_players = self.player_set.select_related('hanchan', 'user')
|
||||
attending_players = attending_players.order_by('-score')
|
||||
@@ -182,9 +186,9 @@ class Hanchan(models.Model):
|
||||
player.save(season_id=self.season_id, mark_dirty=True)
|
||||
|
||||
def get_absolute_url(self):
|
||||
'''
|
||||
"""
|
||||
URL zur Hanchanliste des Events wo diese Hanchan gelistet wurde.
|
||||
'''
|
||||
"""
|
||||
url = reverse('event-hanchan-list', kwargs={'event': self.event.pk})
|
||||
return u'%(url)s#%(pk)d' % {'url': url, 'pk': self.pk}
|
||||
|
||||
@@ -201,12 +205,12 @@ class Hanchan(models.Model):
|
||||
|
||||
|
||||
class KyuDanRanking(models.Model):
|
||||
u'''
|
||||
u"""
|
||||
Die Einstufung des Spieles im Kyu bzw. Dan System.
|
||||
Im Gegensatz zum Ladder Ranking ist das nicht Saison gebunden.
|
||||
daher läuft es getrennt.
|
||||
'''
|
||||
user = models.OneToOneField(User)
|
||||
"""
|
||||
user = models.OneToOneField(settings.AUTH_USER_MODEL)
|
||||
dan = models.PositiveSmallIntegerField(blank=True, null=True)
|
||||
dan_points = models.PositiveIntegerField(default=0)
|
||||
kyu = models.PositiveSmallIntegerField(default=10, blank=True, null=True)
|
||||
@@ -229,11 +233,11 @@ class KyuDanRanking(models.Model):
|
||||
return u"%s - %d. Kyu" % (self.user.username, self.kyu)
|
||||
|
||||
def append_3_in_a_row_bonuspoints(self, hanchan):
|
||||
u'''
|
||||
u"""
|
||||
Wenn der Spieler 3 Siege in folge hatte, bekommt er so viele Punkte
|
||||
das er einen Dan Rang aufsteigt. Dies wird als Kommentar abgespeichert,
|
||||
um es besser nachvollziehen zu können.
|
||||
'''
|
||||
"""
|
||||
|
||||
if self.dan and hanchan.placement == 1:
|
||||
self.wins_in_a_row += 1
|
||||
@@ -259,12 +263,12 @@ class KyuDanRanking(models.Model):
|
||||
self.dan_points += bonus_points
|
||||
|
||||
def append_tournament_bonuspoints(self, player):
|
||||
'''
|
||||
"""
|
||||
Prüft ob es die letzte Hanchan in einem Turnier war. Wenn ja werden
|
||||
bei Bedarf Bonuspunkte vergeben, falls der Spieler das Turnier gewonnen
|
||||
hat.
|
||||
:param player: Ein Player Objekt
|
||||
'''
|
||||
"""
|
||||
bonus_points = 0
|
||||
current_event = player.hanchan.event
|
||||
if not current_event.is_tournament:
|
||||
@@ -300,10 +304,10 @@ class KyuDanRanking(models.Model):
|
||||
return reverse('player-kyu-score', args=[self.user.username])
|
||||
|
||||
def recalculate(self):
|
||||
'''
|
||||
"""
|
||||
Fetches all valid Hanchans from this Player and recalculates his
|
||||
Kyu/Dan Ranking.
|
||||
'''
|
||||
"""
|
||||
logger.debug("recalculating Kyu/Dan punkte for %s...", self.user)
|
||||
valid_hanchans = Player.objects.valid_hanchans(user=self.user_id)
|
||||
valid_hanchans = valid_hanchans.order_by('hanchan__start')
|
||||
@@ -326,10 +330,10 @@ class KyuDanRanking(models.Model):
|
||||
self.save(force_update=True)
|
||||
|
||||
def update_points(self, player):
|
||||
'''
|
||||
"""
|
||||
Berechne die Kyu bzw. Dan Punkte für ein Spiel neu.
|
||||
:param player: Das Player Objekt das neuberechnet werden soll.
|
||||
'''
|
||||
"""
|
||||
player.bonus_points = 0
|
||||
player.comment = ""
|
||||
player.dan_points = None
|
||||
@@ -403,7 +407,7 @@ class KyuDanRanking(models.Model):
|
||||
|
||||
|
||||
class LadderRanking(models.Model):
|
||||
user = models.ForeignKey(User)
|
||||
user = models.ForeignKey(settings.AUTH_USER_MODEL)
|
||||
season = models.ForeignKey('LadderSeason')
|
||||
placement = models.PositiveIntegerField(blank=True, null=True)
|
||||
avg_placement = models.FloatField(blank=True, null=True)
|
||||
@@ -441,9 +445,9 @@ class LadderRanking(models.Model):
|
||||
class LadderSeasonManager(models.Manager):
|
||||
|
||||
def current(self):
|
||||
'''
|
||||
"""
|
||||
Returns the current season and caches the result for 12 hours
|
||||
'''
|
||||
"""
|
||||
current_season = cache.get('current_mahjong_season')
|
||||
if not current_season:
|
||||
try:
|
||||
@@ -456,10 +460,10 @@ class LadderSeasonManager(models.Manager):
|
||||
return current_season
|
||||
|
||||
def get_by_date(self, deadline):
|
||||
'''
|
||||
"""
|
||||
returns the season that where running on the given date.
|
||||
:param deadline: the date you're intrested in
|
||||
'''
|
||||
"""
|
||||
try:
|
||||
season = self.filter(start__lte=deadline, end__gte=deadline)
|
||||
return season[0]
|
||||
@@ -468,9 +472,9 @@ class LadderSeasonManager(models.Manager):
|
||||
|
||||
|
||||
class LadderSeason(models.Model):
|
||||
u'''
|
||||
u"""
|
||||
Eine Saison für das Kasu interne Ladder-Ranking.
|
||||
'''
|
||||
"""
|
||||
name = models.CharField(max_length=100)
|
||||
start = models.DateField()
|
||||
end = models.DateField()
|
||||
@@ -488,10 +492,13 @@ class LadderSeason(models.Model):
|
||||
def recalculate(self):
|
||||
logger.info(u'Recalculate LadderSeason %s', self.name)
|
||||
self.ladderranking_set.update(placement=None)
|
||||
ladderrankings_for_placement = self.ladderranking_set.filter(
|
||||
hanchan_count__gt=MIN_HANCHANS_FOR_LADDER
|
||||
).order_by(
|
||||
'avg_placement', '-avg_score'
|
||||
)
|
||||
placement = 1
|
||||
ladder_rankings = self.ladderranking_set.filter(hanchan_count__gt=MIN_HANCHANS_FOR_LADDER) # @IgnorePep8
|
||||
ladder_rankings = ladder_rankings.order_by('avg_placement', '-avg_score') # @IgnorePep8
|
||||
for ranking in ladder_rankings:
|
||||
for ranking in ladderrankings_for_placement:
|
||||
ranking.placement = placement
|
||||
ranking.save(force_update=True)
|
||||
placement += 1
|
||||
@@ -556,12 +563,28 @@ class PlayerManager(models.Manager):
|
||||
|
||||
class Player(models.Model):
|
||||
hanchan = models.ForeignKey(Hanchan)
|
||||
user = models.ForeignKey(User)
|
||||
user = models.ForeignKey(settings.AUTH_USER_MODEL)
|
||||
score = models.PositiveIntegerField(default=0)
|
||||
placement = models.PositiveSmallIntegerField(blank=True, null=True, default=None) # @IgnorePep8
|
||||
kyu_points = models.PositiveSmallIntegerField(blank=True, null=True, default=None) # @IgnorePep8
|
||||
dan_points = models.PositiveSmallIntegerField(blank=True, null=True, default=None) # @IgnorePep8
|
||||
bonus_points = models.PositiveSmallIntegerField(blank=True, null=True, default=0) # @IgnorePep8
|
||||
placement = models.PositiveSmallIntegerField(
|
||||
blank=True,
|
||||
null=True,
|
||||
default=None
|
||||
)
|
||||
kyu_points = models.PositiveSmallIntegerField(
|
||||
blank=True,
|
||||
null=True,
|
||||
default=None
|
||||
)
|
||||
dan_points = models.PositiveSmallIntegerField(
|
||||
blank=True,
|
||||
null=True,
|
||||
default=None
|
||||
)
|
||||
bonus_points = models.PositiveSmallIntegerField(
|
||||
blank=True,
|
||||
null=True,
|
||||
default=0
|
||||
)
|
||||
comment = models.TextField(_('Comment'), blank=True)
|
||||
objects = PlayerManager()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user