Stylesheets werden nur mit Less erzeugt. Damit können sie gleich

optimiert werden.
jQuery wurde entfernt.
Übersetzungen wurden korrigiert.
Neue sync.sh Datei, welche änderungen mit rsync auf den Server spielt
und das neuladen erzwingt.
This commit is contained in:
Christian Berg
2014-12-14 23:57:40 +01:00
parent 711c303f9a
commit 9c2413a794
76 changed files with 2514 additions and 1884 deletions

221
maistar_ranking/models.py Normal file
View File

@@ -0,0 +1,221 @@
# -*- encoding: utf-8 -*-
import logging
from django.core.urlresolvers import reverse
from django.db import models
from django.utils.translation import ugettext as _
from events.models import Event
from membership.models import Membership
from . import settings, managers
class Game(models.Model):
"""
Ein kompettes Spiel Mai-Star bestehend aus 6 Spielern
"""
event = models.ForeignKey(Event, related_name='maistargame_set')
comment = models.TextField(_('Comment'), blank=True)
player1 = models.ForeignKey(
settings.AUTH_USER_MODEL, verbose_name=_("Player 1"), related_name='+'
)
player1_score = models.SmallIntegerField(_("Score"))
player1_placement = models.PositiveSmallIntegerField(editable=False)
player2 = models.ForeignKey(
settings.AUTH_USER_MODEL, verbose_name=_("Player 2"), related_name='+'
)
player2_score = models.SmallIntegerField(_("Score"))
player2_placement = models.PositiveSmallIntegerField(editable=False)
player3 = models.ForeignKey(
settings.AUTH_USER_MODEL, verbose_name=_("Player 3"), related_name='+'
)
player3_score = models.SmallIntegerField(_("Score"))
player3_placement = models.PositiveSmallIntegerField(editable=False)
player4 = models.ForeignKey(
settings.AUTH_USER_MODEL, verbose_name=_("Player 4"), related_name='+'
)
player4_score = models.SmallIntegerField(_("Score"))
player4_placement = models.PositiveSmallIntegerField(editable=False)
player5 = models.ForeignKey(
settings.AUTH_USER_MODEL, verbose_name=_("Player 5"), related_name='+'
)
player5_score = models.SmallIntegerField(_("Score"))
player5_placement = models.PositiveSmallIntegerField(editable=False)
player6 = models.ForeignKey(
settings.AUTH_USER_MODEL, verbose_name=_("Player 6"), related_name='+'
)
player6_score = models.SmallIntegerField(_("Score"))
player6_placement = models.PositiveSmallIntegerField(editable=False)
confirmed = models.BooleanField(
_('Has been confirmed'),
default=True,
help_text=_('the game only counts whe it has been confirmed')
)
player_names = models.CharField(max_length=255, editable=False)
season = models.PositiveSmallIntegerField(_('Season'), editable=False,
db_index=True)
objects = managers.GameManager()
def __str__(self):
return _("Mai-Star Game with {0} from {1:%Y-%m-%d}").format(
self.player_names, self.event.start
)
def get_absolute_url(self):
"""
URL zur Hanchanliste des Events wo diese Hanchan gelistet wurde.
"""
url = reverse('maistar-game-list',
kwargs={'event': self.event.pk})
return u'%(url)s#%(pk)d' % {'url': url, 'pk': self.pk}
@property
def player_list(self):
try:
return self._player_list
except AttributeError:
self._player_list = list()
for nr in range(1, 7):
self._player_list.append({
'user': getattr(self, 'player%d' % nr),
'membership': Membership.objects.get(
user=getattr(self, 'player%d' % nr)
),
'score': getattr(self, 'player%d_score' % nr),
'placement': getattr(self, 'player%d_placement' % nr),
})
return self._player_list
def save(self, force_insert=False, force_update=False, using=None,
update_fields=None):
u"""
Bestimmt die Platzierung eines jeden Spielers noch vor dem speichern.
Außerdem wird eine Kommasperierte Liste der Spiele mitgespeichert.
"""
logging.debug("Berechne die Platzierungen neu...")
game_date = self.event.start.date()
player_tuples = [
(self.player1.id, self.player1.username, self.player1_score),
(self.player2.id, self.player2.username, self.player2_score),
(self.player3.id, self.player3.username, self.player3_score),
(self.player4.id, self.player4.username, self.player4_score),
(self.player5.id, self.player5.username, self.player5_score),
(self.player6.id, self.player6.username, self.player6_score),
]
season_start = settings.MAISTAR_SEASON_START.replace(
year=game_date.year)
# sort player by Score:
player_tuples = sorted(player_tuples, key=lambda player: player[2],
reverse=True)
logging.debug(player_tuples)
other_player_ranking = 1
other_player_score = 0
player_names = []
ranking = 1
player_nr = 1
for player_id, player_name, player_score in player_tuples:
if player_score == other_player_score:
player_ranking = other_player_ranking
else:
player_ranking = ranking
setattr(self, "player%d_id" % player_nr, player_id)
setattr(self, "player%d_score" % player_nr, player_score)
setattr(self, "player%d_placement" % player_nr, player_ranking)
other_player_ranking = player_ranking
other_player_score = player_score
player_names.append(player_name)
player_nr += 1
ranking += 1
self.player_names = ', '.join(player_names)
if game_date >= season_start:
self.season = season_start.year
else:
self.season = season_start.year - 1
super(Game, self).save(force_insert=force_insert,
force_update=force_update, using=using,
update_fields=update_fields)
class Ranking(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL)
season = models.PositiveSmallIntegerField(_("Season"))
placement = models.PositiveIntegerField(blank=True, null=True)
avg_placement = models.PositiveSmallIntegerField(blank=True, null=True)
avg_score = models.SmallIntegerField(blank=True, null=True)
games_count = models.PositiveSmallIntegerField(default=0)
games_good = models.PositiveSmallIntegerField(default=0)
games_won = models.PositiveSmallIntegerField(default=0)
objects = managers.LadderManager()
class Meta(object):
ordering = ('-season', 'placement', 'avg_placement', '-avg_score',)
def __str__(self):
return "Mai-Star Ranking: %s, Season: %d" % (self.user, self.season)
def get_absolute_url(self):
return reverse('maistar-player-games', kwargs={
'username': self.user.username,
'season': self.season
})
def recalculate(self):
logging.info(
u'Recalculate Mai-Star Ranking for Player %s in Season %s',
self.user, self.season
)
self.placement = None
self.avg_placement = None
self.avg_score = None
self.games_count = 0
self.games_good = 0
self.games_won = 0
player_score = 0
player_placement = 0
for game in Game.objects.player_games(self.user, self.season):
placement = 0
score = 0
for player in ('player1', 'player2', 'player3', 'player4',
'player5', 'player6'):
if getattr(game, player) == self.user:
placement = getattr(game, "%s_placement" % player)
score = getattr(game, "%s_score" % player)
player_placement += placement
player_score += score
self.games_count += 1
self.games_good += 1 if placement <= 3 else 0
self.games_won += 1 if placement == 1 else 0
if self.games_count > 0:
self.avg_placement = round(player_placement / self.games_count)
self.avg_score = round(player_score / self.games_count)
self.save()
def update_maistar_ranking(sender, instance, **kwargs):
for player in instance.player_list:
ranking, created = Ranking.objects.get_or_create(
user=player['user'],
season=instance.season
)
if created:
logging.debug('Created ranking for %s in Season %d',
player['user'].username, instance.season)
else:
logging.debug('Updating ranking for %s in Season %d',
player['user'].username, instance.season)
ranking.recalculate()
Ranking.objects.calculate_rankings(instance.season)
models.signals.post_delete.connect(update_maistar_ranking, sender=Game)
models.signals.post_save.connect(update_maistar_ranking, sender=Game)