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

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

View File

@@ -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]

View File

@@ -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}),

View File

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

View File

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

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

View File

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

View File

@@ -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 %}

View File

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

View File

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

View File

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

View File

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

View File

@@ -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},

View File

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