示例#1
0
    def check(self):
        model_mgr = ModelRequestMgr()

        # 進行情報があるかを確認.
        playdata = ScoutPlayData.getByKey(
            ScoutPlayData.makeID(self.__player0.id, self.__scout.id))
        if playdata is None:
            raise AppTestError(u'進行情報が保存されていない')
        elif playdata.progress == 0:
            raise AppTestError(u'進行度が進んでいない')

        # 報酬.
        resultlist = playdata.result.get('result', None)
        if not resultlist:
            raise AppTestError(u'結果が設定されていない')

        for result in resultlist:
            self.__player0.exp += result['exp_add']
            self.__player0.gold += result['gold_add']

        # お金確認.
        playergold = PlayerGold.getByKey(playdata.uid)
        if playergold.gold != self.__player0.gold:
            raise AppTestError(u'お金が正しくない')

        # 経験値.
        playerexp = PlayerExp.getByKey(playdata.uid)
        if playerexp.exp != self.__player0.exp:
            raise AppTestError(u'お金が正しくない')

        # イベント設定されているか.
        eventlist = playdata.result.get('event', None)
        if not eventlist:
            raise AppTestError(u'イベントが設定されていない')

        # ハプニング発生のイベントが設定されているか.
        targetevent = None
        for event in eventlist:
            if event.get_type() == Defines.ScoutEventType.HAPPENING:
                targetevent = event
        if targetevent is None:
            raise AppTestError(u'ハプニング発生イベントが設定されていない')
        elif targetevent.happening != self.__happeningmaster.id:
            raise AppTestError(
                u'ハプニング発生イベントに正しくハプニングが設定されていない.%d vs %d' %
                (targetevent.happening, self.__happeningmaster.id))

        happeningset = BackendApi.get_current_happening(
            model_mgr, self.__player0.id)
        if happeningset is None or happeningset.happening.mid != self.__happeningmaster.id:
            raise AppTestError(u'ハプニングが開始されていない.')

        raidboss = BackendApi.get_raid(
            model_mgr,
            happeningset.id,
            happening_eventvalue=HappeningUtil.make_raideventvalue(
                self.__eventmaster.id))
        record = raidboss.getDamageRecord(self.__player0.id)
        if not record.champagne:
            raise AppTestError(u'シャンパンコールのフラグが立っていない.')
示例#2
0
    def check(self):
        keys = ('redirect_url', )
        for k in keys:
            if self.response.get(k, None) is None:
                raise AppTestError(u'%sが設定されていない' % k)

        # 書き込み後の進行情報.
        playdata = self.getWroteEventScoutPlayData()
        self.checkEventCommonResult(playdata)

        stagemaster = self.getStageByNumber(self.eventplaydata.stage)

        # URLを確認.
        redirect_url = self.response['redirect_url']
        if redirect_url.find('/raideventscoutanim/{}/{}'.format(
                stagemaster.id, playdata.alreadykey)) == -1:
            raise AppTestError(u'リダイレクト先が正しくない')

        # 進行度.
        if playdata.progress == 0:
            raise AppTestError(u'進行度が進んでいない')

        events = self.checkEventScoutResultEvent(
            playdata,
            [Defines.ScoutEventType.LEVELUP, Defines.ScoutEventType.COMPLETE])

        # レベルアップの結果を検証.
        playerexp = PlayerExp.getByKey(playdata.uid)
        levelupevent = events[Defines.ScoutEventType.LEVELUP]
        if playerexp.level != levelupevent.level:
            raise AppTestError(u'レベルアップイベントに正しくレベルが設定されていない.{} vs {}'.format(
                playerexp.level, levelupevent.level))
示例#3
0
    def checkEventCommonResult(self, playdata):
        """共通の実行結果を確認.
        """
        if playdata is None:
            raise AppTestError(u'進行情報が保存されていない')
        elif playdata.alreadykey != self.eventplaydata.confirmkey:
            raise AppTestError(u'重複確認用のキーが正しくない')

        # 報酬.
        resultlist = playdata.result.get('result', None)
        if resultlist is None:
            raise AppTestError(u'結果が設定されていない')

        post_exp = self.player.exp
        post_gold = self.player.gold
        for result in resultlist:
            post_exp += result['exp_add']
            post_gold += result['gold_add']

        # お金確認.
        playergold = PlayerGold.getByKey(playdata.uid)
        if playergold.gold != post_gold:
            raise AppTestError(u'お金が正しくない')

        # 経験値.
        playerexp = PlayerExp.getByKey(playdata.uid)
        if playerexp.exp != post_exp:
            raise AppTestError(u'経験値が正しくない')

        # イベント設定されているか.
        eventlist = playdata.result.get('event', None)
        if not eventlist:
            raise AppTestError(u'イベントが設定されていない')
示例#4
0
    def check(self):
        self.checkResponseStatus()

        # 進行情報があるかを確認.
        playdata = ScoutPlayData.getByKey(
            ScoutPlayData.makeID(self.__player0.id, self.__scout.id))
        if playdata is None:
            raise AppTestError(u'進行情報が保存されていない')
        elif playdata.progress == 0:
            raise AppTestError(u'進行度が進んでいない')

        # 報酬.
        resultlist = playdata.result.get('result', None)
        if not resultlist:
            raise AppTestError(u'結果が設定されていない')

        for result in resultlist:
            self.__player0.exp += result['exp_add']
            self.__player0.gold += result['gold_add']

        # お金確認.
        playergold = PlayerGold.getByKey(playdata.uid)
        if playergold.gold != self.__player0.gold:
            raise AppTestError(u'お金が正しくない')

        # 経験値.
        playerexp = PlayerExp.getByKey(playdata.uid)
        if playerexp.exp != self.__player0.exp:
            raise AppTestError(u'お金が正しくない')

        # デッキコスト.
        playerdeck = PlayerDeck.getByKey(playdata.uid)
        if playerdeck.deckcapacityscout != (self.__player0.deckcapacityscout +
                                            1):
            raise AppTestError(u'デッキコスト上限が正しくない')

        # イベント設定されているか.
        eventlist = playdata.result.get('event', None)
        if not eventlist:
            raise AppTestError(u'イベントが設定されていない')

        # レベルアップとスカウト完了のイベントが設定されているか.
        levelupevent = None
        completeevent = None
        for event in eventlist:
            if event.get_type() == Defines.ScoutEventType.LEVELUP:
                levelupevent = event
            elif event.get_type() == Defines.ScoutEventType.COMPLETE:
                completeevent = event
        if levelupevent is None:
            raise AppTestError(u'レベルアップイベントが設定されていない')
        elif completeevent is None:
            raise AppTestError(u'スカウト完了イベントが設定されていない')
        elif playerexp.level != levelupevent.level:
            raise AppTestError(u'レベルアップイベントに正しくレベルが設定されていない.%d vs %d' %
                               (playerexp.level, levelupevent.level))
        elif playdata.mid != completeevent.scoutid:
            raise AppTestError(u'完了イベントに正しくスカウトIDが設定されていない.%d vs %d' %
                               (playdata.mid, completeevent.scoutid))
示例#5
0
    def check(self):
        self.checkResponseStatus()

        # 進行情報があるかを確認.
        happening = Happening.getByKey(self.__happening.id)
        playerhappening = PlayerHappening.getByKey(self.__player0.id)

        if happening is None or happening.progress == 0:
            raise AppTestError(u'進行情報が保存されていない')

        # 報酬.
        resultlist = playerhappening.happening_result.get('result', None)
        if resultlist is None:
            raise AppTestError(u'結果が設定されていない')

        gold_add = 0
        for result in resultlist:
            self.__player0.exp += result['exp_add']
            gold_add += result['gold_add']

        # お金確認.
        if happening.gold != gold_add:
            raise AppTestError(u'お金が正しくない')

        # 経験値.
        playerexp = PlayerExp.getByKey(self.__player0.id)
        if playerexp.exp != self.__player0.exp:
            raise AppTestError(u'お金が正しくない')

        # イベント設定されているか.
        eventlist = playerhappening.happening_result.get('event', None)
        if not eventlist:
            raise AppTestError(u'イベントが設定されていない')

        # レベルアップとスカウト完了のイベントが設定されているか.
        levelupevent = None
        completeevent = None
        for event in eventlist:
            if event.get_type() == Defines.ScoutEventType.LEVELUP:
                levelupevent = event
            elif event.get_type() == Defines.ScoutEventType.COMPLETE:
                completeevent = event
        if levelupevent is None:
            raise AppTestError(u'レベルアップイベントが設定されていない')
        elif completeevent is None:
            raise AppTestError(u'スカウト完了イベントが設定されていない')
        elif playerexp.level != levelupevent.level:
            raise AppTestError(u'レベルアップイベントに正しくレベルが設定されていない.%d vs %d' %
                               (playerexp.level, levelupevent.level))
        elif happening.mid != completeevent.scoutid:
            raise AppTestError(u'完了イベントに正しくハプニングIDが設定されていない.%d vs %d' %
                               (happening.mid, completeevent.scoutid))

        # レイド.
        raid = Raid.getByKey(self.__happening.id)
        if raid is None:
            raise AppTestError(u'レイドが発生していない.')
示例#6
0
    def check(self):
        self.checkResponseStatus()

        # 進行情報があるかを確認.
        happening = Happening.getByKey(self.__happening.id)
        playerhappening = PlayerHappening.getByKey(self.__player0.id)

        if happening is None or happening.progress == 0:
            raise AppTestError(u'進行情報が保存されていない')

        # 報酬.
        resultlist = playerhappening.happening_result.get('result', None)
        if resultlist is None:
            raise AppTestError(u'結果が設定されていない')

        gold_add = 0
        for result in resultlist:
            self.__player0.exp += result['exp_add']
            gold_add += result['gold_add']

        # お金確認.
        if happening.gold != gold_add:
            raise AppTestError(u'お金が正しくない')

        # 経験値.
        playerexp = PlayerExp.getByKey(self.__player0.id)
        if playerexp.exp != self.__player0.exp:
            raise AppTestError(u'お金が正しくない')

        # イベント設定されているか.
        eventlist = playerhappening.happening_result.get('event', None)
        if not eventlist:
            raise AppTestError(u'イベントが設定されていない')

        # アイテム獲得のイベントが設定されているか.
        targetevent = None
        for event in eventlist:
            if event.get_type() == Defines.ScoutEventType.GET_ITEM:
                targetevent = event
        if targetevent is None:
            raise AppTestError(u'アイテム獲得が設定されていない')
        elif targetevent.item != self.__itemmaster.id:
            raise AppTestError(u'イベントのアイテムIDが正しくない')

        # 報酬リストにアイテムが入っているか.
        if not happening.idDropped(Defines.ItemType.ITEM,
                                   self.__itemmaster.id):
            raise AppTestError(u'報酬リストにアイテムが設定されていない')
示例#7
0
 def tr_recover_exp():
     model_mgr = ModelRequestMgr()
     new_player_exp = PlayerExp.getByKeyForUpdate(player2.id)
     new_player_exp.exp = 0
     print "Before | exp = %s, level = %s" % (new_player_exp.exp,
                                              new_player_exp.level)
     model_mgr.set_got_models([new_player_exp])
     model_mgr.set_got_models([
         model_cls.getByKeyForUpdate(player2.id)
         for model_cls in (PlayerDeck, PlayerAp, PlayerFriend)
     ])
     BackendApi.tr_add_exp(model_mgr, player2, player1.exp)
     model_mgr.write_all()
     print "After  | exp = %s, level = %s" % (new_player_exp.exp,
                                              new_player_exp.level)
     return model_mgr
示例#8
0
    def check(self):
        self.checkResponseStatus()

        model_mgr = ModelRequestMgr()

        # 進行情報があるかを確認.
        playdata = ScoutPlayData.getByKey(
            ScoutPlayData.makeID(self.__player0.id, self.__scout.id))
        if playdata is None:
            raise AppTestError(u'進行情報が保存されていない')
        elif playdata.progress == 0:
            raise AppTestError(u'進行度が進んでいない')

        # 報酬.
        resultlist = playdata.result.get('result', None)
        if not resultlist:
            raise AppTestError(u'結果が設定されていない')

        for result in resultlist:
            self.__player0.exp += result['exp_add']
            self.__player0.gold += result['gold_add']

        # お金確認.
        playergold = PlayerGold.getByKey(playdata.uid)
        if playergold.gold != self.__player0.gold:
            raise AppTestError(u'お金が正しくない')

        # 経験値.
        playerexp = PlayerExp.getByKey(playdata.uid)
        if playerexp.exp != self.__player0.exp:
            raise AppTestError(u'お金が正しくない')

        # 宝箱獲得のイベントが設定されているか.
        targetevent = BackendApi.find_scout_event(
            playdata, Defines.ScoutEventType.GET_TREASURE)
        if targetevent is None:
            raise AppTestError(u'宝箱獲得イベントが設定されていない')
        elif targetevent.treasuretype != Defines.TreasureType.GOLD:
            raise AppTestError(u'宝箱獲得イベントに正しくカードが設定されていない.%d' %
                               targetevent.treasuretype)

        treasure_num = BackendApi.get_treasure_num(model_mgr,
                                                   Defines.TreasureType.GOLD,
                                                   self.__player0.id)
        if (self.__treasure_num + 1) != treasure_num:
            raise AppTestError(u'宝箱の所持数が想定外.%d vs %d' %
                               ((self.__treasure_num + 1), treasure_num))
示例#9
0
        def tr():
            model_mgr = ModelRequestMgr()
            player = BackendApi.get_player(None, uid, [], model_mgr=model_mgr)
            player_exp = PlayerExp.getByKeyForUpdate(uid)
            player_exp.exp = 0
            model_mgr.set_got_models([player_exp])
            model_mgr.set_got_models([
                model_cls.getByKeyForUpdate(uid)
                for model_cls in (PlayerDeck, PlayerAp, PlayerFriend)
            ])

            BackendApi.tr_add_exp(model_mgr, player, exp)
            model_mgr.write_all()

            print "level=%s,exp=%s" % (player_exp.level, player_exp.exp)

            return model_mgr
示例#10
0
    def check(self):
        self.checkResponseStatus()

        # 進行情報があるかを確認.
        happening = Happening.getByKey(self.__happening.id)
        playerhappening = PlayerHappening.getByKey(self.__player0.id)

        if happening is None:
            raise AppTestError(u'進行情報が保存されていない')

        # 報酬.
        resultlist = playerhappening.happening_result.get('result', None)
        if resultlist is None:
            raise AppTestError(u'結果が設定されていない')

        gold_add = 0
        for result in resultlist:
            self.__player0.exp += result['exp_add']
            gold_add += result['gold_add']

        # お金確認.
        if happening.gold != gold_add:
            raise AppTestError(u'お金が正しくない')

        # 経験値.
        playerexp = PlayerExp.getByKey(self.__player0.id)
        if playerexp.exp != self.__player0.exp:
            raise AppTestError(u'お金が正しくない')

        # イベント設定されているか.
        eventlist = playerhappening.happening_result.get('event', None)
        if not eventlist:
            raise AppTestError(u'イベントが設定されていない')

        # イベント設定されているか.
        eventlist = playerhappening.happening_result.get('event', None)
        if not eventlist:
            raise AppTestError(u'イベントが設定されていない')

        # 体力不足のイベントが設定されているか.
        targetevent = None
        for event in eventlist:
            if event.get_type() == Defines.ScoutEventType.AP_NONE:
                targetevent = event
        if targetevent is None:
            raise AppTestError(u'体力不足イベントが設定されていない')
示例#11
0
    def check(self):
        self.checkResponseStatus()

        # 進行情報があるかを確認.
        playdata = ScoutPlayData.getByKey(
            ScoutPlayData.makeID(self.__player0.id, self.__scout.id))
        if playdata is None:
            raise AppTestError(u'進行情報が保存されていない')
        elif playdata.progress == 0:
            raise AppTestError(u'進行度が進んでいない')

        # 報酬.
        resultlist = playdata.result.get('result', None)
        if not resultlist:
            raise AppTestError(u'結果が設定されていない')

        for result in resultlist:
            self.__player0.exp += result['exp_add']
            self.__player0.gold += result['gold_add']

        # お金確認.
        playergold = PlayerGold.getByKey(playdata.uid)
        if playergold.gold != self.__player0.gold:
            raise AppTestError(u'お金が正しくない')

        # 経験値.
        playerexp = PlayerExp.getByKey(playdata.uid)
        if playerexp.exp != self.__player0.exp:
            raise AppTestError(u'お金が正しくない')

        # イベント設定されているか.
        eventlist = playdata.result.get('event', None)
        if not eventlist:
            raise AppTestError(u'イベントが設定されていない')

        # レベルアップのイベントが設定されているか.
        targetevent = None
        for event in eventlist:
            if event.get_type() == Defines.ScoutEventType.LEVELUP:
                targetevent = event
        if targetevent is None:
            raise AppTestError(u'レベルアップイベントが設定されていない')
        elif playerexp.level != targetevent.level:
            raise AppTestError(u'イベントに正しくレベルが設定されていない.%d vs %d' %
                               (playerexp.level, targetevent.level))
示例#12
0
 def check(self):
     self.checkResponseStatus()
     
     # 進行情報があるかを確認.
     happening = Happening.getByKey(self.__happening.id)
     playerhappening = PlayerHappening.getByKey(self.__player0.id)
     
     if happening is None or happening.progress == 0:
         raise AppTestError(u'進行情報が保存されていない')
     
     # 報酬.
     resultlist = playerhappening.happening_result.get('result', None)
     if resultlist is None:
         raise AppTestError(u'結果が設定されていない')
     
     gold_add = 0
     for result in resultlist:
         self.__player0.exp += result['exp_add']
         gold_add += result['gold_add']
     
     # お金確認.
     if happening.gold != gold_add:
         raise AppTestError(u'お金が正しくない')
     
     # 経験値.
     playerexp = PlayerExp.getByKey(self.__player0.id)
     if playerexp.exp != self.__player0.exp:
         raise AppTestError(u'お金が正しくない')
     
     # イベント設定されているか.
     eventlist = playerhappening.happening_result.get('event', None)
     if not eventlist:
         raise AppTestError(u'イベントが設定されていない')
     
     # レベルアップのイベントが設定されているか.
     targetevent = None
     for event in eventlist:
         if event.get_type() == Defines.ScoutEventType.LEVELUP:
             targetevent = event
     if targetevent is None:
         raise AppTestError(u'レベルアップイベントが設定されていない')
     elif playerexp.level != targetevent.level:
         raise AppTestError(u'イベントに正しくレベルが設定されていない.%d vs %d' % (playerexp.level, targetevent.level))
示例#13
0
    def check(self):
        self.checkResponseStatus()

        # 進行情報があるかを確認.
        playdata = ScoutPlayData.getByKey(
            ScoutPlayData.makeID(self.__player0.id, self.__scout.id))
        if playdata is None:
            raise AppTestError(u'進行情報が保存されていない')

        # 報酬.
        resultlist = playdata.result.get('result', None)
        if resultlist is None:
            raise AppTestError(u'結果が設定されていない')

        for result in resultlist:
            self.__player0.exp += result['exp_add']
            self.__player0.gold += result['gold_add']

        # お金確認.
        playergold = PlayerGold.getByKey(playdata.uid)
        if playergold.gold != self.__player0.gold:
            raise AppTestError(u'お金が正しくない')

        # 経験値.
        playerexp = PlayerExp.getByKey(playdata.uid)
        if playerexp.exp != self.__player0.exp:
            raise AppTestError(u'お金が正しくない')

        # イベント設定されているか.
        eventlist = playdata.result.get('event', None)
        if not eventlist:
            raise AppTestError(u'イベントが設定されていない')

        # 体力不足のイベントが設定されているか.
        targetevent = None
        for event in eventlist:
            if event.get_type() == Defines.ScoutEventType.AP_NONE:
                targetevent = event
        if targetevent is None:
            raise AppTestError(u'体力不足イベントが設定されていない')
示例#14
0
    def check(self):
        self.checkResponseStatus()

        # 進行情報があるかを確認.
        playdata = ScoutPlayData.getByKey(
            ScoutPlayData.makeID(self.__player0.id, self.__scout.id))
        if playdata is None:
            raise AppTestError(u'進行情報が保存されていない')
        elif playdata.progress == 0:
            raise AppTestError(u'進行度が進んでいない')

        # 報酬.
        resultlist = playdata.result.get('result', None)
        if not resultlist:
            raise AppTestError(u'結果が設定されていない')

        for result in resultlist:
            self.__player0.exp += result['exp_add']
            self.__player0.gold += result['gold_add']

        # お金確認.
        playergold = PlayerGold.getByKey(playdata.uid)
        if playergold.gold != self.__player0.gold:
            raise AppTestError(u'お金が正しくない')

        # 経験値.
        playerexp = PlayerExp.getByKey(playdata.uid)
        if playerexp.exp != self.__player0.exp:
            raise AppTestError(u'お金が正しくない')

        # カード獲得のイベントが設定されているか.
        targetevent = BackendApi.find_scout_event(
            playdata, Defines.ScoutEventType.GET_CARD)
        if targetevent is None:
            raise AppTestError(u'カード獲得イベントが設定されていない')
        elif targetevent.card != self.__cardmaster.id:
            raise AppTestError(u'カード獲得イベントに正しくカードが設定されていない.%d vs %d' %
                               (targetevent.card, self.__cardmaster.id))
        elif targetevent.is_received:
            raise AppTestError(u'カード受取判定済になってしまっている')
示例#15
0
    def handle(self, *args, **options):

        print '================================'
        print 'recover_goukonevent_score'
        print '================================'
        is_write = (args[0] if args else None) in ('1', 1)

        model_mgr = ModelRequestMgr()
        config = BackendApi.get_current_battleeventconfig(
            model_mgr, using=settings.DB_READONLY)
        mid = config.mid
        eventmaster = BackendApi.get_battleevent_master(
            model_mgr, mid, using=settings.DB_READONLY)
        eventrankmaster_list = BackendApi.get_battleevent_rankmaster_by_eventid(
            model_mgr, mid, using=settings.DB_READONLY)
        eventrankmaster_dict = dict([
            (eventrankmaster.rank, eventrankmaster)
            for eventrankmaster in eventrankmaster_list
        ])

        uid = PlayerExp.max_value('id')
        LIMIT = 500
        while 0 < uid:
            filters = {'mid': eventmaster.id, 'uid__lte': uid}

            scorerecord_list = BattleEventScore.fetchValues(
                filters=filters,
                order_by='-uid',
                limit=LIMIT,
                offset=0,
                using=settings.DB_READONLY)
            rankrecord_list = BattleEventRank.getByKey(
                [
                    BattleEventRank.makeID(scorerecord.uid, eventmaster.id)
                    for scorerecord in scorerecord_list
                ],
                using=settings.DB_READONLY)
            rankrecord_dict = dict([(rankrecord.uid, rankrecord)
                                    for rankrecord in rankrecord_list])

            for scorerecord in scorerecord_list:
                uid = min(uid, scorerecord.uid)

                if scorerecord.point_total < 1:
                    print '%s...zero' % scorerecord.uid
                    continue

                rankrecord = rankrecord_dict.get(scorerecord.uid)
                if rankrecord is None:
                    print '%s...rank None' % scorerecord.uid
                    continue

                eventrankmaster = eventrankmaster_dict.get(rankrecord.rank)
                if eventrankmaster is None:
                    print '%s...rank Unknown' % scorerecord.uid
                    continue

                p_key = BattleEventScorePerRank.makeID(
                    scorerecord.uid,
                    BattleEventScorePerRank.makeMid(mid, eventrankmaster.rank))
                if BackendApi.get_model(model_mgr,
                                        BattleEventScorePerRank,
                                        p_key,
                                        using=settings.DB_DEFAULT):
                    print '%s...Already' % scorerecord.uid
                    continue

                if is_write:
                    try:
                        db_util.run_in_transaction(Command.tr_write,
                                                   eventmaster,
                                                   eventrankmaster,
                                                   rankrecord).write_end()
                    except:
                        print '%s...ERROR' % scorerecord.uid
                        continue
                print '%s...SUCCESS' % scorerecord.uid
            uid -= 1
    def __proc_normal(self, model_mgr, redisdb, config, eventmaster,
                      rankmaster_dict, now, logintime, cdate):
        """通常のバトルイベント.
        """
        eventrankmaster = rankmaster_dict.get(eventmaster.rankstart)

        print 'start for normal'

        print '================================'
        print 'save level.'
        rediskey = "battleevent_preparation"
        redisdb.delete(rediskey)

        uid = PlayerExp.max_value('id')
        LIMIT = 500
        while 0 < uid:
            pipe = redisdb.pipeline()

            uidlist = range(max(0, uid - LIMIT) + 1, uid + 1)
            playerexplist = PlayerExp.getByKey(uidlist,
                                               using=settings.DB_READONLY)
            tutorialend_uid_list = [
                model.id for model in PlayerTutorial.getByKey(
                    uidlist, using=settings.DB_READONLY)
                if model.tutorialstate == Defines.TutorialStatus.COMPLETED
            ]
            for playerexp in playerexplist:
                if not playerexp.id in tutorialend_uid_list:
                    continue
                pipe.zadd(rediskey, playerexp.id, playerexp.level)

            pipe.execute()
            uid -= LIMIT

        print '================================'
        print 'allocate start.'
        data = redisdb.zrevrange(rediskey,
                                 0,
                                 1,
                                 withscores=True,
                                 score_cast_func=RedisModel.value_to_int)
        if data:
            level = data[0][1]
            groupid = 0
            while 0 < level:
                uidlist = [
                    RedisModel.value_to_int(uid)
                    for uid in redisdb.zrangebyscore(rediskey, level, level)
                    if RedisModel.value_to_int(uid)
                ]
                if uidlist:
                    random.shuffle(uidlist)
                    model_mgr, group = db_util.run_in_transaction(
                        Command.tr_write, groupid, eventmaster,
                        eventrankmaster, uidlist, now)
                    model_mgr.write_end()
                    if group and not group.fixed:
                        groupid = group.id
                    else:
                        groupid = 0
                level -= 1

        print '================================'
        print 'save rankuidset.'
        for rankmaster in rankmaster_dict.values():
            print "eventid=%s, rank=%s" % (rankmaster.eventid, rankmaster.rank)
            BackendApi.save_battleevent_rankuidset(rankmaster.eventid,
                                                   rankmaster.rank)

        # 後片付け.
        redisdb.delete(rediskey)

        print '================================'
        print 'all done.'