Diverse Code Cleanups

*Code wurde PEP-8 gerecht formatiert
* Kleine Fehler die der PyCharm Inspector beanstandet wurden korrigiert
This commit is contained in:
Christian Berg
2014-11-26 16:04:52 +01:00
committed by Christian Berg
parent f34281089d
commit 86a0db050d
76 changed files with 619 additions and 528 deletions

View File

@@ -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()