# -*- 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 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': # We only do this in POST request, to speedup the responsetime. return response # Start an SQL Transaction transaction.enter_transaction_management() transaction.managed(True) # recalculate tournament (event) rankings: event_ranking_queue = cache.get('event_ranking_queue', set()) if len(event_ranking_queue) > 0: while len(event_ranking_queue) > 0: event_id, user_id = event_ranking_queue.pop() 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() self.recalculate_event_placement(event_id) cache.set('event_ranking_queue', event_ranking_queue, 360) transaction.commit() # recalculate dirty kyu/dan rankings: kyu_dan_ranking_queue = cache.get('kyu_dan_ranking_queue', set()) while len(kyu_dan_ranking_queue) > 0: user_id = kyu_dan_ranking_queue.pop() ranking = models.KyuDanRanking.objects.get_or_create( user_id=user_id)[0] ranking.recalculate() cache.set('kyu_dan_ranking_queue', kyu_dan_ranking_queue, 360) transaction.commit() # Recaluclate Dirty LadderRankings: ladder_ranking_queue = cache.get('ladder_ranking_queue', set()) while len(ladder_ranking_queue) > 0: season_id, user_id = ladder_ranking_queue.pop() if season_id and user_id: ranking = models.LadderRanking.objects.get_or_create( user_id=user_id, season_id=season_id)[0] ranking.recalculate() else: logger.error('Season: %i; Benutzer Nr. %i - existiert nicht!', season_id, user_id) cache.set('ladder_ranking_queue', ladder_ranking_queue, 360) transaction.commit() # Recaluclate Dirty Season Placements: ladder_season_queue = cache.get('ladder_season_queue', set()) for season_id in ladder_season_queue: season = models.LadderSeason.objects.get_or_create(pk=season_id)[0] season.recalculate() cache.set('ladder_season_queue', ladder_season_queue, 360) transaction.commit() transaction.leave_transaction_management() return response def recalculate_event_placement(self, event_id): eventranking_set = models.EventRanking.objects.filter( event_id=event_id).order_by('avg_placement', '-avg_score') eventranking_set.update(placement=None) placement = 1 for ranking in eventranking_set: ranking.placement = placement placement += 1 ranking.save(force_update=True)