Anpassungen des Codes an Django 1.11 mit Python 3

Grapelli wurde entfernt, das neue Django Admin ist hübsch genug.
This commit is contained in:
2017-05-10 10:15:39 +02:00
parent 5437b7b8de
commit 321531c160
25 changed files with 219 additions and 121 deletions

View File

@@ -1,7 +1,6 @@
# -*- encoding: utf-8 -*-
from django.utils.log import getLogger
from django.core.cache import cache
import logging
KYU_RANKS = (
(45, 1),
(40, 2),
@@ -30,10 +29,10 @@ DAN_RANKS = (
DAN_RANKS_DICT = dict([(dan, points) for points, dan in DAN_RANKS])
MIN_HANCHANS_FOR_LADDER = 5
logger = getLogger('kasu.mahjong_ranking')
logger = logging.getLogger('kasu.mahjong_ranking')
def set_dirty(event=None, season=None, user=None):
def set_dirty(event=None, season=None, user=None, hanchan_date=None):
if season and user:
key_to_add = (season, user)
queue_name = 'ladder_ranking_queue'
@@ -44,7 +43,7 @@ def set_dirty(event=None, season=None, user=None):
key_to_add = (event, user)
queue_name = 'event_ranking_queue'
elif user:
key_to_add = user
key_to_add = (user, hanchan_date)
queue_name = 'kyu_dan_ranking_queue'
if key_to_add and queue_name:
recalculation_queue = cache.get(queue_name, set())

View File

@@ -24,10 +24,10 @@ class HanchanForm(forms.ModelForm):
class Meta(object):
model = models.Hanchan
fields = ('start',
'player1', 'player1_input_score', # 'player1_comment',
'player2', 'player2_input_score', # 'player2_comment',
'player3', 'player3_input_score', # 'player3_comment',
'player4', 'player4_input_score', # 'player4_comment',
'player1', 'player1_input_score',
'player2', 'player2_input_score',
'player3', 'player3_input_score',
'player4', 'player4_input_score',
'comment')
widgets = {'event': forms.HiddenInput(),
'comment': forms.widgets.Textarea(attrs={'rows': 4, 'cols': 40})
@@ -35,11 +35,14 @@ class HanchanForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(HanchanForm, self).__init__(*args, **kwargs)
# self.fields['event'].widget.attrs['disabled'] = True
for i in xrange(1, 4):
player_queryset = USER_MODEL.objects.filter(is_active=True,
membership=True)
for i in range(1, 4):
player = 'player%d' % i
player_input_score = 'player%d_input_score' % i
self.fields[player_input_score].widget.attrs['size'] = 6
self.fields[player_input_score].widget.attrs['type'] = 'number'
self.fields[player].queryset = player_queryset

View File

@@ -20,6 +20,9 @@ class DenormalizationUpdateMiddleware(object):
def process_response(self, request, response):
# We only do this in POST request, to speedup the responsetime.
if request.method == 'POST':
print('event_ranking_queue', cache.get('event_ranking_queue', set()))
print('kyu_dan_ranking_queue', cache.get('kyu_dan_ranking_queue', set()))
print('ladder_ranking_queue', cache.get('ladder_ranking_queue', set()))
queue = cache.get('event_ranking_queue', set())
if len(queue) > 0:
self.recalculate_event_rankings(queue)
@@ -45,8 +48,6 @@ class DenormalizationUpdateMiddleware(object):
def recalculate_event_rankings(self, queue):
# recalculate tournament (event) rankings:
for event_id, user_id in queue:
logger.info("recalculate %d tournament Ranking in %s",
user_id, event_id)
ranking = models.EventRanking.objects.get_or_create(
event_id=event_id, user_id=user_id)[0]
ranking.recalculate()
@@ -54,10 +55,10 @@ class DenormalizationUpdateMiddleware(object):
return queue
def recalulate_kyu_dan_ranking(self, queue):
for user_id in queue:
ranking = models.KyuDanRanking.objects.get_or_create(user_id=user_id)[
0]
ranking.recalculate()
for user_id, hanchan_start in queue:
ranking = models.KyuDanRanking.objects.get_or_create(
user_id=user_id)[0]
ranking.recalculate(hanchan_start)
return queue
def recalculate_ladder_ranking(self, queue):

View File

@@ -0,0 +1,39 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('mahjong_ranking', '0003_auto_20160916_1800'),
]
operations = [
migrations.AlterField(
model_name='hanchan',
name='comment',
field=models.TextField(verbose_name='Anmerkung', blank=True),
),
migrations.AlterField(
model_name='hanchan',
name='player1_comment',
field=models.CharField(verbose_name='Anmerkung', max_length=255, editable=False, blank=True),
),
migrations.AlterField(
model_name='hanchan',
name='player2_comment',
field=models.CharField(verbose_name='Anmerkung', max_length=255, editable=False, blank=True),
),
migrations.AlterField(
model_name='hanchan',
name='player3_comment',
field=models.CharField(verbose_name='Anmerkung', max_length=255, editable=False, blank=True),
),
migrations.AlterField(
model_name='hanchan',
name='player4_comment',
field=models.CharField(verbose_name='Anmerkung', max_length=255, editable=False, blank=True),
),
]

View File

@@ -76,8 +76,7 @@ class EventRanking(models.Model):
self.good_hanchans += 1 if hanchan.placement == 2 else 0
self.avg_placement = sum_placement / self.hanchan_count
self.avg_score = sum_score / self.hanchan_count
self.save(force_update=True)
self.save(force_update=True)
class Hanchan(models.Model):
@@ -95,7 +94,6 @@ class Hanchan(models.Model):
player1 = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
limit_choices_to={'is_active': True, 'membership': True},
related_name='user_hanchan+',
verbose_name=_('Player 1'))
player1_input_score = models.IntegerField(_('Score'))
@@ -115,7 +113,6 @@ class Hanchan(models.Model):
player2 = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
limit_choices_to={'is_active': True, 'membership': True},
related_name='user_hanchan+',
verbose_name=_('Player 2'))
player2_input_score = models.IntegerField(_('Score'))
@@ -135,7 +132,6 @@ class Hanchan(models.Model):
player3 = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
limit_choices_to={'is_active': True, 'membership': True},
related_name='user_hanchan+',
verbose_name=_('Player 3'))
player3_input_score = models.IntegerField(_('Score'))
@@ -155,7 +151,6 @@ class Hanchan(models.Model):
player4 = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
limit_choices_to={'is_active': True, 'membership': True},
related_name='user_hanchan+',
verbose_name=_('Player 4'))
player4_input_score = models.IntegerField(_('Score'))
@@ -205,11 +200,11 @@ class Hanchan(models.Model):
try:
self.clean_fields()
except ValidationError as e:
print e.update_error_dict(errors)
except ValidationError as exception:
exception.update_error_dict(errors)
return
for i in xrange(1, 5):
for i in range(1, 5):
player = getattr(self, 'player%d' % i)
input_score = getattr(self, 'player%d_input_score' % i)
score_sum += input_score
@@ -309,7 +304,7 @@ class Hanchan(models.Model):
@property
def player_list(self):
player_list = []
for i in xrange(1, 5):
for i in range(1, 5):
player_list.append({
'user': getattr(self, 'player%d' % i),
'input_score': getattr(self, 'player%d_input_score' % i),
@@ -324,10 +319,12 @@ class Hanchan(models.Model):
return sorted(player_list, key=lambda player: player['input_score'],
reverse=True)
def save(self, **kwargs):
def save(self, recalculate=True, **kwargs):
self.season = self.event.mahjong_season or self.start.year
self.full_clean()
self.compute_player_placements()
if recalculate:
self.compute_player_placements()
update_ranking(sender=Hanchan, instance=self)
return models.Model.save(self, **kwargs)
@@ -435,7 +432,7 @@ class KyuDanRanking(models.Model):
else:
return reverse('player-kyu-score', args=[self.user.username])
def recalculate(self):
def recalculate(self, hanchan_start=None):
"""
Fetches all valid Hanchans from this Player and recalculates his
Kyu/Dan Ranking.
@@ -449,14 +446,23 @@ class KyuDanRanking(models.Model):
self.good_hanchans = 0
self.won_hanchans = 0
logger.info("recalculating Kyu/Dan points for %s...", self.user)
logger.info(
"recalculating Kyu/Dan points for %s since %s...",
self.user, str(hanchan_start)
)
self.update_rank()
valid_hanchans = Hanchan.objects.confirmed_hanchans(user=self.user)
valid_hanchans = valid_hanchans.order_by('start')
if self.legacy_date:
valid_hanchans = valid_hanchans.filter(start__gt=self.legacy_date)
""" TODO: Hanchan Punkte nur neu berechnen wenn sie vor hachan_start
lag. Es müssen aber alle durch die Schleife rennen, damit die Punkte
richtig gezählt werden."""
if hanchan_start:
valid_hanchans = valid_hanchans.filter(start__gte=hanchan_start)
self.hanchan_count += valid_hanchans.count()
for hanchan in valid_hanchans:
logger.debug('Update Kyu/Dan points for Hanchan started on %s', str(hanchan.start))
hanchan.get_playerdata(self.user)
hanchan.bonus_points = 0
hanchan.player_comment = u""
@@ -469,7 +475,7 @@ class KyuDanRanking(models.Model):
self.won_hanchans += 1 if hanchan.placement == 1 else 0
self.good_hanchans += 1 if hanchan.placement == 2 else 0
hanchan.update_playerdata(self.user)
hanchan.save(force_update=True)
hanchan.save(recalculate=False)
self.save(force_update=True)
def update_hanchan_points(self, hanchan):
@@ -537,7 +543,7 @@ class KyuDanRanking(models.Model):
if self.dan_points > min_points:
self.dan = dan_rank
break
if self.dan > old_dan:
if old_dan == None or self.dan > old_dan:
self.wins_in_a_row = 0
elif self.kyu_points < 1:
self.kyu_points = 0
@@ -600,10 +606,16 @@ class SeasonRanking(models.Model):
def update_ranking(sender, instance, **kwargs):
for user in (instance.player1, instance.player2, instance.player3, instance.player4):
logger.debug("marking %s's kyu/dan for recalculation", user)
set_dirty(user=user.id)
logger.debug(
"marking %(user)s's kyu/dan for recalculation since %(start)s",
{'user':user, 'start':str(instance.start.date())}
)
set_dirty(user=user.id, hanchan_date=instance.start.date())
if instance.season:
logger.debug("marking %s's ladder %i season for recalculation.", user, instance.season)
logger.debug(
"marking %s's ladder %i season for recalculation.",
user, instance.season
)
set_dirty(user=user.id, season=instance.season)
logger.debug("marking season %d for recalculation.", instance.season)
set_dirty(season=instance.season)
@@ -611,4 +623,4 @@ def update_ranking(sender, instance, **kwargs):
set_dirty(event=instance.event_id, user=user.id)
models.signals.pre_delete.connect(update_ranking, sender=Hanchan)
models.signals.post_save.connect(update_ranking, sender=Hanchan)
# models.signals.post_save.connect(update_ranking, sender=Hanchan)

View File

@@ -5,14 +5,12 @@ Created on 03.10.2011
@author: christian
"""
from django.conf.urls import * # @UnusedWildImport
from django.views.generic import RedirectView
import views
from django.conf.urls import url
from . import views
urlpatterns = patterns(
'',
urlpatterns = [
url(r'^$', RedirectView.as_view(
url='/ranking/mahjong-ladder/', permanent=True)
),
@@ -42,4 +40,4 @@ urlpatterns = patterns(
name="kyudanranking-list"),
url(r'^mahjong/(?P<order_by>[\+\-\w]+)/$',
views.KyuDanRankingList.as_view(), name="kyudanranking-list"),
)
]

View File

@@ -256,5 +256,4 @@ class PlayerLadderScore(PlayerScore):
self.season = date.today().year
hanchan_list = models.Hanchan.objects.season_hanchans(
user=self.user, season=self.season)
print hanchan_list
return hanchan_list