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
@@ -47,7 +47,7 @@ def set_dirty(event=None, season=None, user=None):
|
||||
elif user:
|
||||
key_to_add = user
|
||||
queue_name = 'kyu_dan_ranking_queue'
|
||||
|
||||
recalculation_queue = cache.get(queue_name, set())
|
||||
recalculation_queue.add(key_to_add)
|
||||
cache.set(queue_name, recalculation_queue, 360)
|
||||
if key_to_add and queue_name:
|
||||
recalculation_queue = cache.get(queue_name, set())
|
||||
recalculation_queue.add(key_to_add)
|
||||
cache.set(queue_name, recalculation_queue, 360)
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
|
||||
'''
|
||||
"""
|
||||
Created on 19.09.2011
|
||||
|
||||
@author: christian
|
||||
'''
|
||||
"""
|
||||
# import stuff we need from django
|
||||
from django.contrib import admin
|
||||
from . import models, set_dirty
|
||||
@@ -45,7 +45,6 @@ class EventRankingAdmin(admin.ModelAdmin):
|
||||
list_display = ('placement', 'user', 'event', 'avg_placement', 'avg_score',
|
||||
'hanchan_count', 'good_hanchans', 'won_hanchans', 'dirty')
|
||||
list_display_links = ('user',)
|
||||
list_filter = ('event',)
|
||||
actions = [recalculate]
|
||||
|
||||
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
|
||||
'''
|
||||
"""
|
||||
Created on 04.10.2011
|
||||
|
||||
@author: christian
|
||||
'''
|
||||
from django.contrib.auth.models import User
|
||||
"""
|
||||
from django.contrib.auth import get_user_model
|
||||
import django.forms
|
||||
from django.forms.models import BaseInlineFormSet, inlineformset_factory
|
||||
from django.utils import timezone
|
||||
@@ -30,10 +30,10 @@ class HanchanForm(forms.ModelForm):
|
||||
}
|
||||
|
||||
def clean_start(self):
|
||||
u'''
|
||||
u"""
|
||||
Das Datum darf nicht in der Zukunft liegen und es muss innerhalb der
|
||||
Dauer des Events liegen.
|
||||
'''
|
||||
"""
|
||||
start = self.cleaned_data['start']
|
||||
event = self.cleaned_data['event']
|
||||
if start > timezone.now():
|
||||
@@ -58,8 +58,8 @@ class HanchanAdminForm(HanchanForm):
|
||||
class PlayerForm(forms.ModelForm):
|
||||
error_css_class = 'error'
|
||||
required_css_class = 'required'
|
||||
player_choices = User.objects.filter(groups__in=(1, 2)).distinct()
|
||||
player_choices = player_choices.order_by('username')
|
||||
player_choices = get_user_model().objects.filter(groups__in=(1, 2))
|
||||
player_choices = player_choices.order_by('username').distinct()
|
||||
user = forms.ModelChoiceField(player_choices, required=True)
|
||||
comment = forms.CharField(
|
||||
widget=forms.widgets.TextInput(attrs={'maxlength': 255}),
|
||||
|
||||
@@ -4,9 +4,8 @@
|
||||
Generate Randum Mahjong Hanchans to the the Raning System
|
||||
"""
|
||||
|
||||
from django.contrib.auth.models import User
|
||||
from django.contrib import auth
|
||||
from django.core.management.base import BaseCommand
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from events.models import Event
|
||||
from mahjong_ranking import models
|
||||
import random
|
||||
@@ -14,16 +13,16 @@ from datetime import timedelta
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = "Deletes all expired user registrations from the database"
|
||||
|
||||
|
||||
def add_players(self, hanchan):
|
||||
user_list = set()
|
||||
while len(user_list) < 4:
|
||||
random_user = random.choice(self.user_list)
|
||||
user_list.add(random_user)
|
||||
|
||||
|
||||
player_list = list()
|
||||
ostwind_list = list()
|
||||
for user in user_list:
|
||||
for user in user_list:
|
||||
player_list.append(models.Player(user=user, hanchan=hanchan, score=25000))
|
||||
for player in player_list:
|
||||
player.save()
|
||||
@@ -36,7 +35,7 @@ class Command(BaseCommand):
|
||||
score = random.randrange(1300, 8000, 100)
|
||||
loser = player_list[random.randrange(0,4,1)]
|
||||
winner = player_list[random.randrange(0,4,1)]
|
||||
winner.score += score
|
||||
winner.score += score
|
||||
|
||||
print 'Ostwind: %s, Gewinner: %s, Verlierer: %s, %d Punkte' % (
|
||||
ostwind.user,
|
||||
@@ -53,12 +52,12 @@ class Command(BaseCommand):
|
||||
player.score -= score / 3
|
||||
else:
|
||||
loser.score -= score
|
||||
|
||||
|
||||
for player in player_list:
|
||||
if player.score <= 0:
|
||||
player.score = 0
|
||||
end_of_game = True
|
||||
|
||||
|
||||
if winner == ostwind:
|
||||
print "Wind bleibt"
|
||||
else:
|
||||
@@ -81,14 +80,14 @@ class Command(BaseCommand):
|
||||
hanchan.save()
|
||||
self.add_players(hanchan)
|
||||
hanchan.save()
|
||||
|
||||
|
||||
|
||||
|
||||
def handle(self, *args, **options):
|
||||
num_hanchans = int(options.get('hanchans', 4))
|
||||
self.user_list = list(User.objects.all())
|
||||
|
||||
self.user_list = list(auth.get_user_model().objects.all())
|
||||
|
||||
for event in Event.objects.all():
|
||||
for i in range(random.randrange(2,8)):
|
||||
self.create_hanchan(event)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
'''
|
||||
"""
|
||||
Created on 23.05.2011
|
||||
|
||||
@author: christian
|
||||
'''
|
||||
"""
|
||||
from django.core.cache import cache
|
||||
from django.db import transaction
|
||||
from mahjong_ranking import models
|
||||
@@ -11,10 +11,10 @@ from . import logger
|
||||
|
||||
|
||||
class DenormalizationUpdateMiddleware(object):
|
||||
'''
|
||||
"""
|
||||
This Class deferres the recalculation for the Otaku XP at the end of a
|
||||
response.
|
||||
'''
|
||||
"""
|
||||
|
||||
def process_response(self, request, response):
|
||||
if request.method != 'POST':
|
||||
@@ -57,7 +57,7 @@ class DenormalizationUpdateMiddleware(object):
|
||||
user_id=user_id, season_id=season_id)[0]
|
||||
ranking.recalculate()
|
||||
else:
|
||||
logger.error('Season: %i; User %i - existiert nicht!', season_id, user_id)
|
||||
logger.error('Season: %i; Benutzer Nr. %i - existiert nicht!', season_id, user_id)
|
||||
cache.set('ladder_ranking_queue', ladder_ranking_queue, 360)
|
||||
transaction.commit()
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
{% for player in hanchan.player_set.all %}
|
||||
<div class="player" >
|
||||
<a href="{% url 'player-ladder-score' player.user %}"><img
|
||||
{% if player.user.get_profile.thumbnail %}src="{{player.user.get_profile.thumbnail.url}}"{% else %}src="{{STATIC_URL}}img/unknown_thumbnail.png"{% endif %}
|
||||
src="{% if player.user.get_profile.thumbnail %}{{player.user.get_profile.thumbnail.url}}{% else %}{{STATIC_URL}}img/unknown_thumbnail.png{% endif %}"
|
||||
class="avatar" alt=""
|
||||
title="{% if player.dan_points != None %}Dan P.: {{player.dan_points}}{% else %}Kyu P.: {{player.kyu_points}}{% endif %} - {{player.comment}}"/></a>
|
||||
<h4>{{player.placement}}. - <a href="{% url 'player-ladder-score' player.user %}">{{ player.user }}</a></h4>
|
||||
|
||||
@@ -2,9 +2,8 @@
|
||||
{% load i18n %}
|
||||
|
||||
{% block additional_nav_elements %}
|
||||
<a href="{% url 'season_ranking-archive' %}" {% if is_archive %}class="active"{% endif %}>{% trans 'Archive' %}</a>
|
||||
<a href="{% url 'season_ranking-archive' %}" class="{% if is_archive %}active{% endif %}">{% trans 'Archive' %}</a>
|
||||
{% if perms.events.add_event %}
|
||||
<a href="{% url 'event-form' %}" {% ifequal request.path '/events/add/' %}class="active"{% endifequal %}>{% trans 'Add Event' %}</a>
|
||||
<a href="{% url 'event-form' %}" class="{% ifequal request.path '/events/add/' %}active{% endifequal %}">{% trans 'Add Event' %}</a>
|
||||
{% endif %}
|
||||
</ul>
|
||||
{% endblock %}
|
||||
@@ -18,7 +18,7 @@
|
||||
<tr>
|
||||
<th rowspan="2">{% trans 'Date' %}</th>
|
||||
<th rowspan="2">{% trans 'Event' %}</th>
|
||||
<th rowspan="2">{% trans 'Start' %}<//th>
|
||||
<th rowspan="2">{% trans 'Start' %}</th>
|
||||
<th rowspan="2">{% trans 'Placement' %}</th>
|
||||
<th colspan="4">{% trans 'Players' %}</th>
|
||||
<th rowspan="2">{% trans 'Dan Points' %}</th>
|
||||
@@ -28,7 +28,7 @@
|
||||
<tr>
|
||||
<th>1.</th>
|
||||
<th>2.</th>
|
||||
<th>3.<//th>
|
||||
<th>3.</th>
|
||||
<th>4.</th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -46,10 +46,10 @@
|
||||
<td>{{ result.comment }}</td>
|
||||
<td>
|
||||
{% if perms.mahjong_ranking.delete_hanchan %}
|
||||
<a href="{% url 'delete-hanchan' result.hanchan.pk %}"><img src="{{STATIC_URL}}icons/table_delete.png" alt="{% trans 'Delete' %}" title="{% trans 'Delete Hanchan' %}"/>
|
||||
<a href="{% url 'delete-hanchan' result.hanchan.pk %}"><img src="{{STATIC_URL}}icons/table_delete.png" alt="{% trans 'Delete' %}" title="{% trans 'Delete Hanchan' %}"/></a>
|
||||
{% endif %}
|
||||
{% if perms.mahjong_ranking.change_hanchan %}
|
||||
<a href="{% url 'edit-hanchan' result.hanchan.pk %}"><img src="{{STATIC_URL}}icons/table_edit.png" alt="{% trans 'Edit' %}" title="{% trans 'Edit Hanchan' %}"/>
|
||||
<a href="{% url 'edit-hanchan' result.hanchan.pk %}"><img src="{{STATIC_URL}}icons/table_edit.png" alt="{% trans 'Edit' %}" title="{% trans 'Edit Hanchan' %}"/></a>
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<table>
|
||||
<thead><tr>
|
||||
<th>{% trans 'Event' %}</th>
|
||||
<th>{% trans 'Start' %}<//th>
|
||||
<th>{% trans 'Start' %}</th>
|
||||
<th colspan="4">{% trans 'Players' %}</th>
|
||||
<th>{% trans 'Placement' %}</th>
|
||||
<th>{% trans 'Kyu Points' %}</th>
|
||||
@@ -36,10 +36,10 @@
|
||||
<td>{{ result.comment }}</td>
|
||||
<td>
|
||||
{% if perms.mahjong_ranking.delete_hanchan %}
|
||||
<a href="{% url 'delete-hanchan' result.hanchan.pk %}"><img src="{{STATIC_URL}}icons/table_delete.png" alt="{% trans 'Delete' %}" title="{% trans 'Delete Hanchan' %}"/>
|
||||
<a href="{% url 'delete-hanchan' result.hanchan.pk %}"><img src="{{STATIC_URL}}icons/table_delete.png" alt="{% trans 'Delete' %}" title="{% trans 'Delete Hanchan' %}"/></a>
|
||||
{% endif %}
|
||||
{% if perms.mahjong_ranking.change_hanchan %}
|
||||
<a href="{% url 'edit-hanchan' result.hanchan.pk %}"><img src="{{STATIC_URL}}icons/table_edit.png" alt="{% trans 'Edit' %}" title="{% trans 'Edit Hanchan' %}"/>
|
||||
<a href="{% url 'edit-hanchan' result.hanchan.pk %}"><img src="{{STATIC_URL}}icons/table_edit.png" alt="{% trans 'Edit' %}" title="{% trans 'Edit Hanchan' %}"/></a>
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
<tr>
|
||||
<th rowspan="2">{% trans 'Date' %}</th>
|
||||
<th rowspan="2">{% trans 'Event' %}</th>
|
||||
<th rowspan="2">{% trans 'Start' %}<//th>
|
||||
<th rowspan="2">{% trans 'Start' %}</th>
|
||||
<th rowspan="2">{% trans 'Placement' %}</th>
|
||||
<th colspan="4">{% trans 'Players' %}</th>
|
||||
<th rowspan="2">{% trans 'Kyu Points' %}</th>
|
||||
@@ -26,7 +26,7 @@
|
||||
<tr>
|
||||
<th>1.</th>
|
||||
<th>2.</th>
|
||||
<th>3.<//th>
|
||||
<th>3.</th>
|
||||
<th>4.</th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -43,10 +43,10 @@
|
||||
<td class="center">{{result.kyu_points}}</td>
|
||||
<td>
|
||||
{% if perms.mahjong_ranking.delete_hanchan %}
|
||||
<a href="{% url 'delete-hanchan' result.hanchan.pk %}"><img src="{{STATIC_URL}}icons/table_delete.png" alt="{% trans 'Delete' %}" title="{% trans 'Delete Hanchan' %}"/>
|
||||
<a href="{% url 'delete-hanchan' result.hanchan.pk %}"><img src="{{STATIC_URL}}icons/table_delete.png" alt="{% trans 'Delete' %}" title="{% trans 'Delete Hanchan' %}"/></a>
|
||||
{% endif %}
|
||||
{% if perms.mahjong_ranking.change_hanchan %}
|
||||
<a href="{% url 'edit-hanchan' result.hanchan.pk %}"><img src="{{STATIC_URL}}icons/table_edit.png" alt="{% trans 'Edit' %}" title="{% trans 'Edit Hanchan' %}"/>
|
||||
<a href="{% url 'edit-hanchan' result.hanchan.pk %}"><img src="{{STATIC_URL}}icons/table_edit.png" alt="{% trans 'Edit' %}" title="{% trans 'Edit Hanchan' %}"/></a>
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
<tr>
|
||||
<th rowspan="2">{% trans 'Date' %}</th>
|
||||
<th rowspan="2">{% trans 'Event' %}</th>
|
||||
<th rowspan="2">{% trans 'Start' %}<//th>
|
||||
<th rowspan="2">{% trans 'Start' %}</th>
|
||||
<th rowspan="2">{% trans 'Placement' %}</th>
|
||||
<th colspan="4">{% trans 'Players' %}</th>
|
||||
<th rowspan="2"></th>
|
||||
@@ -26,7 +26,7 @@
|
||||
<tr>
|
||||
<th>1.</th>
|
||||
<th>2.</th>
|
||||
<th>3.<//th>
|
||||
<th>3.</th>
|
||||
<th>4.</th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -42,10 +42,10 @@
|
||||
{% endfor %}
|
||||
<td>
|
||||
{% if perms.mahjong_ranking.delete_hanchan %}
|
||||
<a href="{% url 'delete-hanchan' result.hanchan.pk %}"><img src="{{STATIC_URL}}icons/table_delete.png" alt="{% trans 'Delete' %}" title="{% trans 'Delete Hanchan' %}"/>
|
||||
<a href="{% url 'delete-hanchan' result.hanchan.pk %}"><img src="{{STATIC_URL}}icons/table_delete.png" alt="{% trans 'Delete' %}" title="{% trans 'Delete Hanchan' %}"/></a>
|
||||
{% endif %}
|
||||
{% if perms.mahjong_ranking.change_hanchan %}
|
||||
<a href="{% url 'edit-hanchan' result.hanchan.pk %}"><img src="{{STATIC_URL}}icons/table_edit.png" alt="{% trans 'Edit' %}" title="{% trans 'Edit Hanchan' %}"/>
|
||||
<a href="{% url 'edit-hanchan' result.hanchan.pk %}"><img src="{{STATIC_URL}}icons/table_edit.png" alt="{% trans 'Edit' %}" title="{% trans 'Edit Hanchan' %}"/></a>
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -1,17 +1,16 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
|
||||
'''
|
||||
"""
|
||||
Created on 03.10.2011
|
||||
|
||||
@author: christian
|
||||
'''
|
||||
"""
|
||||
from django.conf.urls import * # @UnusedWildImport
|
||||
import views
|
||||
|
||||
urlpatterns = patterns('',
|
||||
url(r'^$',
|
||||
views.LadderRankingList.as_view(),
|
||||
name="mahjong-ladder"),
|
||||
urlpatterns = patterns(
|
||||
'',
|
||||
url(r'^$', views.LadderRankingList.as_view(), name="mahjong-ladder"),
|
||||
url(r'archive/$',
|
||||
views.LadderRankingList.as_view(),
|
||||
kwargs={'is_archive': True},
|
||||
|
||||
@@ -1,18 +1,20 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
|
||||
import urllib
|
||||
|
||||
from django.contrib import auth, messages
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.http import HttpResponseRedirect, Http404
|
||||
import django.forms
|
||||
import django.http
|
||||
from django.utils.translation import gettext as _
|
||||
from django.views import generic
|
||||
from events.models import Event
|
||||
from mahjong_ranking import forms, models
|
||||
from utils.mixins import LoginRequiredMixin, PermissionRequiredMixin
|
||||
import django.forms
|
||||
import xlwt
|
||||
from django import http
|
||||
import urllib
|
||||
|
||||
from events.models import Event
|
||||
from . import forms, models
|
||||
from membership.models import Membership
|
||||
from utils.mixins import LoginRequiredMixin, PermissionRequiredMixin
|
||||
|
||||
|
||||
kyu_dan_order = {
|
||||
'+full_name': ('user__last_name', 'user__first_name'),
|
||||
@@ -29,10 +31,10 @@ kyu_dan_order = {
|
||||
|
||||
|
||||
class DeleteHanchan(PermissionRequiredMixin, generic.DeleteView):
|
||||
'''
|
||||
"""
|
||||
Fragt zuerst nach, ob die Hanchan wirklich gelöscht werden soll.
|
||||
Wir die Frage mit "Ja" beantwortet, wird die die Hanchan gelöscht.
|
||||
'''
|
||||
"""
|
||||
form_class = forms.HanchanForm
|
||||
model = models.Hanchan
|
||||
permission_required = 'mahjong_ranking.delete_hanchan'
|
||||
@@ -44,10 +46,10 @@ class DeleteHanchan(PermissionRequiredMixin, generic.DeleteView):
|
||||
|
||||
|
||||
class HanchanForm(PermissionRequiredMixin, generic.UpdateView):
|
||||
'''
|
||||
"""
|
||||
Ein Formular um eine neue Hanchan anzulegen, bzw. eine bestehende zu
|
||||
bearbeitsen
|
||||
'''
|
||||
"""
|
||||
form_class = forms.HanchanForm
|
||||
model = models.Hanchan
|
||||
permission_required = 'mahjong_ranking.add_hanchan'
|
||||
@@ -60,7 +62,7 @@ class HanchanForm(PermissionRequiredMixin, generic.UpdateView):
|
||||
else:
|
||||
formset.save()
|
||||
self.object = form.save()
|
||||
return HttpResponseRedirect(self.get_success_url())
|
||||
return django.http.HttpResponseRedirect(self.get_success_url())
|
||||
|
||||
def form_invalid(self, form, formset):
|
||||
return self.render_to_response(self.get_context_data(
|
||||
@@ -106,10 +108,10 @@ class HanchanForm(PermissionRequiredMixin, generic.UpdateView):
|
||||
return context
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
'''
|
||||
"""
|
||||
|
||||
:param request:
|
||||
'''
|
||||
"""
|
||||
self.object = self.get_object()
|
||||
form = self.get_form(self.get_form_class())
|
||||
formset = self.get_formset()
|
||||
@@ -131,9 +133,9 @@ class HanchanForm(PermissionRequiredMixin, generic.UpdateView):
|
||||
|
||||
|
||||
class EventHanchanList(generic.ListView):
|
||||
'''
|
||||
"""
|
||||
Auflistung aller Hanchan die während der Veranstaltung gespielt wurden.
|
||||
'''
|
||||
"""
|
||||
model = models.Hanchan
|
||||
|
||||
def get_queryset(self):
|
||||
@@ -144,7 +146,7 @@ class EventHanchanList(generic.ListView):
|
||||
queryset = queryset.order_by('start')
|
||||
return queryset
|
||||
except models.Event.DoesNotExist:
|
||||
raise Http404(_('Event does not exist'))
|
||||
raise django.http.Http404(_('Event does not exist'))
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = generic.ListView.get_context_data(self, **kwargs)
|
||||
@@ -153,10 +155,10 @@ class EventHanchanList(generic.ListView):
|
||||
|
||||
|
||||
class EventRankingList(generic.ListView):
|
||||
'''
|
||||
"""
|
||||
Anzeige des Eventrankings, daß erstellt wurde falls der Termin als internes
|
||||
Turnier markiert wurde.
|
||||
'''
|
||||
"""
|
||||
model = models.EventRanking
|
||||
|
||||
def get_queryset(self):
|
||||
@@ -166,7 +168,7 @@ class EventRankingList(generic.ListView):
|
||||
queryset = queryset.prefetch_related()
|
||||
return queryset
|
||||
except models.Event.DoesNotExist:
|
||||
raise Http404(_('Event does not exist'))
|
||||
raise django.http.Http404(_('Event does not exist'))
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = generic.ListView.get_context_data(self, **kwargs)
|
||||
@@ -175,10 +177,9 @@ class EventRankingList(generic.ListView):
|
||||
|
||||
|
||||
class KyuDanRankingList(generic.ListView):
|
||||
'''
|
||||
"""
|
||||
Anzeige aller Spiele mit ihrem Kyu bzw Dan Grad.
|
||||
'''
|
||||
models.KyuDanRanking
|
||||
"""
|
||||
default_order = '-score'
|
||||
order_by = ''
|
||||
paginate_by = 25
|
||||
@@ -213,7 +214,7 @@ class LadderRankingList(generic.ListView):
|
||||
else:
|
||||
self.season = models.LadderSeason.objects.current()
|
||||
except models.LadderSeason.DoesNotExist:
|
||||
raise Http404(_('Season does not exist'))
|
||||
raise django.http.Http404(_('Season does not exist'))
|
||||
queryset = models.LadderRanking.objects.filter(season=self.season, placement__isnull=False).select_related()
|
||||
return queryset
|
||||
|
||||
@@ -238,7 +239,7 @@ class LadderRankingExcel(generic.View):
|
||||
|
||||
def get(self, request, **kwargs):
|
||||
self.queryset = self.team.members.all()
|
||||
response = http.HttpResponse(mimetype=u'application/msexcel')
|
||||
response = django.http.HttpResponse(mimetype=u'application/msexcel')
|
||||
|
||||
filename = urllib.quote(self.filename.encode('utf-8'))
|
||||
response['Content-Disposition'] = "attachment; filename*=UTF-8''%s" % filename
|
||||
@@ -277,12 +278,11 @@ class LadderRankingExcel(generic.View):
|
||||
self.set_col(sheet, current_row, 9, profile.weight or None)
|
||||
self.set_col(sheet, current_row, 10, profile.emergency_contact or None)
|
||||
self.set_col(sheet, current_row, 11, profile.emergency_phone or None)
|
||||
except models.MemberProfile.DoesNotExist:
|
||||
except Membership.DoesNotExist:
|
||||
pass
|
||||
current_row += 1
|
||||
|
||||
for column in range(0, 13):
|
||||
print column, self.max_colwidth[column]
|
||||
sheet.col(column).width = (self.max_colwidth[column] + 1) * 256
|
||||
|
||||
workbook.save(response)
|
||||
@@ -294,10 +294,10 @@ class PlayerScore(LoginRequiredMixin, generic.ListView):
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
try:
|
||||
self.user = auth.models.User.objects.get(username=self.kwargs.get('username'))
|
||||
self.user = auth.get_user_model().objects.get(username=self.kwargs.get('username'))
|
||||
self.membership = Membership.objects.get_or_create(user=self.user)[0]
|
||||
except auth.models.User.DoesNotExist:
|
||||
raise Http404(_("No user found matching the name %s") % self.kwargs.get('username'))
|
||||
except auth.get_user_model().DoesNotExist:
|
||||
raise django.http.Http404(_("No user found matching the name %s") % self.kwargs.get('username'))
|
||||
return generic.ListView.get(self, request, *args, **kwargs)
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
@@ -305,13 +305,13 @@ class PlayerScore(LoginRequiredMixin, generic.ListView):
|
||||
context['membership'] = self.membership
|
||||
try:
|
||||
context['kyu_dan_ranking'] = models.KyuDanRanking.objects.get(user=self.user)
|
||||
except:
|
||||
except models.KyuDanRanking.DoesNotExist:
|
||||
context['ranking'] = None
|
||||
try:
|
||||
context['ladder_ranking'] = models.LadderRanking.objects.get(
|
||||
user=self.user,
|
||||
season=models.LadderSeason.objects.current())
|
||||
except:
|
||||
except models.LadderRanking.DoesNotExist:
|
||||
context['ladder_ranking'] = models.LadderRanking(user=self.user)
|
||||
return context
|
||||
|
||||
@@ -343,10 +343,8 @@ class PlayerLadderScore(PlayerScore):
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = PlayerScore.get_context_data(self, **kwargs)
|
||||
|
||||
season_list = models.LadderRanking.objects.filter(user=self.user).select_related('user')
|
||||
season_list = season_list.values_list('id', 'season__name')
|
||||
|
||||
context['season'] = self.season
|
||||
context['seasons_select_form'] = forms.SeasonSelectForm(user=self.user)
|
||||
context['seasons_select_field'] = django.forms.ChoiceField(choices=season_list)
|
||||
|
||||
Reference in New Issue
Block a user