示例#1
0
    def get_data(self):
        model_mgr = ModelRequestMgr()
        raidmaster_all = model_mgr.get_mastermodel_all(RaidMaster,
                                                       'id',
                                                       using=backup_db)
        maxlevel = BackendApi.get_playermaxlevel(model_mgr, using=backup_db)

        result = []

        all_zero = True
        for raidmaster in raidmaster_all:
            row = [u'%d:%s' % (raidmaster.id, raidmaster.name)]
            data_appear = DailyRaidAppearCount.aggregate(
                self.date, raidmaster.id)
            data_destroy = DailyRaidDestroyCount.aggregate(
                self.date, raidmaster.id)
            if data_appear or data_destroy:
                all_zero = False

            data_appear = data_appear or {}
            data_destroy = data_destroy or {}

            for level in xrange(1, maxlevel + 1):
                row.append(
                    data_appear.get(level, 0) - data_destroy.get(level, 0))
            result.append(row)
        if all_zero:
            return None
        else:
            return result
示例#2
0
    def handle(self, *args, **options):
        print('===========================')
        print('aggregate_cabaretclub_batch')
        print('===========================')

        model_mgr = ModelRequestMgr()

        section_lasttime = self.get_batch_section_lasttime()

        storemaster_list = model_mgr.get_mastermodel_all(CabaClubStoreMaster,
                                                         fetch_deleted=True,
                                                         using=backup_db)
        storemaster_all_dict = dict([(storemaster.id, storemaster)
                                     for storemaster in storemaster_list])
        max_uid = CabaClubStorePlayerData.max_value('uid', using=backup_db)

        offset = 0
        uids = range(1, max_uid + 1)
        while uids[offset:offset + BATCH_SIZE]:
            print "Done... now %d Max %d" % (offset, max_uid)
            for uid in uids[offset:offset + BATCH_SIZE]:
                self.update_cabaretclub_proceed(uid, storemaster_all_dict,
                                                section_lasttime)
            offset += BATCH_SIZE
            time.sleep(1)

        print "all done."
示例#3
0
    def setUp(self):
        # DMMID.
        self.__player = self.create_dummy(DummyType.PLAYER)
        self.__player.pdays = 0
        self.__player.lbtime = OSAUtil.get_now() - datetime.timedelta(days=1)
        self.__player.getModel(PlayerLogin).save()

        model_mgr = ModelRequestMgr()
        # ログインボーナスを消しておく.
        for model in model_mgr.get_mastermodel_all(LoginBonusMaster):
            model_mgr.set_delete(model)
        for model in model_mgr.get_mastermodel_all(AccessBonusMaster):
            model_mgr.set_delete(model)
        # 全プレ渡しておくかぁ.
        presenteveryone_list = BackendApi.get_presenteveryone_list_forloginbonus(
            model_mgr)
        if presenteveryone_list:
            BackendApi.tr_receive_presenteveryone(model_mgr, self.__player.id,
                                                  presenteveryone_list)

        # ロングログインの設定も消しておく.
        config = BackendApi.get_current_loginbonustimelimitedconfig(model_mgr)
        self.__datalist = [data[1] for data in config.datalist]
        BackendApi.update_loginbonustimelimitedconfig(model_mgr, [])

        model_mgr.write_all()
        model_mgr.write_end()

        # 報酬.
        prize = self.create_dummy(DummyType.PRIZE_MASTER, gold=100)

        # アクセスボーナス.
        self.create_dummy(DummyType.ACCESS_BONUS_MASTER, 1, prizes=[prize.id])

        # プレゼント数.
        self.__present_num = BackendApi.get_present_num(
            self.__player.id, model_mgr)

        BackendApi.update_totalloginbonusconfig(
            model_mgr,
            0,
            stime=OSAUtil.get_datetime_min(),
            etime=OSAUtil.get_datetime_min(),
            mid_next=0,
            continuity_login=False)
示例#4
0
 def setUp(self):
     model_mgr = ModelRequestMgr()
     
     # DMMID.
     self.__player = self.create_dummy(DummyType.PLAYER)
     self.__player.cardlimititem = 100
     self.__player.getModel(PlayerDeck).save()
     
     # カード.
     cardmaster = self.create_dummy(DummyType.CARD_MASTER, maxlevel=10)
     basecard = self.create_dummy(DummyType.CARD, self.__player, cardmaster)
     self.__basecard = BackendApi.get_cards([basecard.id], model_mgr)[0]
     
     materialcardidlist = []
     for _ in xrange(10):
         cardmaster = self.create_dummy(DummyType.CARD_MASTER, cost=10, basematerialexp=100)
         materialcardidlist.append(self.create_dummy(DummyType.CARD, self.__player, cardmaster).id)
     self.__materialcardlist = BackendApi.get_cards(materialcardidlist, model_mgr)
     
     self.__player.gold = BackendApi.calc_composition_cost(self.__basecard, self.__materialcardlist)
     self.__player.getModel(PlayerGold).save()
     
     self.__compositiondata = BackendApi.get_compositiondata(model_mgr, self.__player.id)
     self.__requestkey = self.__player.req_confirmkey
     
     exp = BackendApi.calc_composition_exp(self.__basecard, self.__materialcardlist, is_great_success=False)
     exp_great = BackendApi.calc_composition_exp(self.__basecard, self.__materialcardlist, is_great_success=True)
     
     self.create_dummy(DummyType.CARD_LEVEL_EXP_MASTER, 1, 0)
     self.create_dummy(DummyType.CARD_LEVEL_EXP_MASTER, 2, exp)
     tmp = self.create_dummy(DummyType.CARD_LEVEL_EXP_MASTER, 3, exp_great)
     
     level_min = tmp.level
     exp_min = tmp.exp
     for levelexp in model_mgr.get_mastermodel_all(CardLevelExpMster, order_by='level', fetch_deleted=True):
         if levelexp.level <= level_min:
             continue
         elif exp_min < levelexp.exp:
             break
         exp_min += 1
         levelexp.exp = exp_min
         levelexp.save()
     model_mgr.get_mastermodel_all(CardLevelExpMster, order_by='level', fetch_deleted=True, reflesh=True)
示例#5
0
 def get_data(self):
     data = ScoutCompleteCount.aggregate(self.date)
     if not data:
         return None
     model_mgr = ModelRequestMgr()
     masterlist = model_mgr.get_mastermodel_all(ScoutMaster,
                                                'id',
                                                using=backup_db)
     result = [(u'%d:%s' % (master.id, master.name), data.get(master.id, 0))
               for master in masterlist]
     return result
示例#6
0
 def get_data(self):
     data = BattleRankPlayCount.aggregate(self.date)
     if not data:
         return None
     model_mgr = ModelRequestMgr()
     masterlist = model_mgr.get_mastermodel_all(BattleRankMaster,
                                                'id',
                                                using=backup_db)
     result = [(u'%d:%s%s' % (master.id, master.region, master.town),
                data.get(master.id, 0)) for master in masterlist]
     return result
示例#7
0
 def get_data(self):
     data = PlayerLevelDistributionAmount.aggregate()
     if not data:
         return None
     model_mgr = ModelRequestMgr()
     levelexplist = model_mgr.get_mastermodel_all(PlayerLevelExpMaster,
                                                  'level',
                                                  using=backup_db)
     result = [(levelexp.level, data.get(levelexp.level, 0))
               for levelexp in levelexplist]
     return result
示例#8
0
 def get_data(self):
     data = CardDistributionAmount.aggregate()
     if not data:
         return None
     model_mgr = ModelRequestMgr()
     cardmasterlist = model_mgr.get_mastermodel_all(CardMaster,
                                                    'id',
                                                    using=backup_db)
     result = [(u'%d:%s' % (cardmaster.id, cardmaster.name),
                data.get(cardmaster.id, 0))
               for cardmaster in cardmasterlist]
     return result
示例#9
0
    def get_data(self):
        model_mgr = ModelRequestMgr()
        itemmasterlist = model_mgr.get_mastermodel_all(ItemMaster,
                                                       order_by='id')

        result = []
        for itemmaster in itemmasterlist:
            _, vnum, rnum = ItemDistributionAmount.aggregateByMasterId(
                itemmaster.id)
            if vnum or rnum:
                result.append((itemmaster.id, itemmaster.name, vnum, rnum))
        if result:
            return result
        else:
            return None
示例#10
0
    def handle(self, *args, **options):

        print '================================'
        print 'aggregate_cabarettreasure'
        print '================================'

        # 出力先.
        path = OSAUtil.get_now().strftime(args[0])

        # 書き込むデータをここに溜め込む.
        writer = Command.Writer(path)

        # 今のユーザIDの最大値を取得.
        uid_max = PlayerTreasure.max_value('id', 0, using=backup_db)

        # 交換できるもの.
        model_mgr = ModelRequestMgr()
        trade_all = dict([(model.id, model)
                          for model in model_mgr.get_mastermodel_all(
                              TradeMaster, fetch_deleted=True, using=backup_db)
                          ])

        for uid in xrange(1, uid_max + 1):
            # 現在の所持数.
            player = PlayerTreasure.getByKey(uid, using=backup_db)
            if player is None:
                continue

            cabaretking = player.get_cabaretking_num()
            row = [str(uid), str(cabaretking)]

            # ユーザログを集計して消費量を求める.
            userloglist = UserLogTrade.fetchValues(filters={'uid': uid},
                                                   using=backup_db)
            consumed = 0
            for userlog in userloglist:
                trademaster = trade_all.get(userlog.mid, None)
                if trademaster:
                    consumed += trademaster.rate_cabaretking
            row.append('%s' % (cabaretking + consumed))
            rowtext = ','.join(row)
            print rowtext
            writer.add(rowtext)

        writer.output(overwrite=False)

        print '================================'
        print 'all done..'
示例#11
0
    def setUp(self):
        # DMMID.
        self.__player = self.create_dummy(DummyType.PLAYER)
        self.__player.lbtime = OSAUtil.get_now() - datetime.timedelta(days=1)
        self.__player.tlmid = 0
        self.__player.getModel(PlayerLogin).save()

        model_mgr = ModelRequestMgr()
        # アクセスボーナスを消しておく.
        for model in model_mgr.get_mastermodel_all(AccessBonusMaster):
            model_mgr.set_delete(model)
        # 全プレ渡しておくかぁ.
        presenteveryone_list = BackendApi.get_presenteveryone_list_forloginbonus(
            model_mgr)
        if presenteveryone_list:
            BackendApi.tr_receive_presenteveryone(model_mgr, self.__player.id,
                                                  presenteveryone_list)

        model_mgr.write_all()
        model_mgr.write_end()

        # 報酬.
        prize = self.create_dummy(DummyType.PRIZE_MASTER, gold=100)

        # ログインボーナス.
        master = self.create_dummy(DummyType.LOGIN_BONUS_TIME_LIMITED_MASTER)
        self.create_dummy(DummyType.LOGIN_BONUS_TIME_LIMITED_DAYS_MASTER,
                          master.id,
                          1,
                          prizes=[prize.id])

        # 設定.
        model_mgr = ModelRequestMgr()
        config = BackendApi.get_current_totalloginbonusconfig(model_mgr)
        self.__ori_config = cPickle.dumps(config)
        BackendApi.update_totalloginbonusconfig(model_mgr,
                                                master.id,
                                                OSAUtil.get_datetime_min(),
                                                OSAUtil.get_datetime_max(),
                                                continuity_login=False)

        # プレゼント数.
        self.__present_num = BackendApi.get_present_num(self.__player.id)
示例#12
0
    def get_data(self):
        model_mgr = ModelRequestMgr()
        eventid = self.getEventId(model_mgr)

        result = []

        raidmaster_all = model_mgr.get_mastermodel_all(RaidMaster,
                                                       'id',
                                                       fetch_deleted=True,
                                                       using=backup_db)
        for raidmaster in raidmaster_all:
            row = ["%s(ID:%s)" % (raidmaster.name, raidmaster.id)]
            data = RaidEventDestroyLevelMap.hgetall(eventid, raidmaster.id)
            if not data:
                continue
            for level in xrange(1, 101):
                num = data.get(str(level), 0)
                row.append(num)
            result.append(row)
        if result:
            return result
        else:
            return None
示例#13
0
 def handle(self, *args, **options):
     
     print '================================'
     print 'aggregate_deckmember'
     print '================================'
     
     # 出力先.
     path = OSAUtil.get_now().strftime(args[0])
     
     # 書き込むデータをここに溜め込む.
     writer = Command.Writer(path)
     
     # 対象を更新.
     LoginTimeCloneSet.update()
     
     # アクティブユーザだと判定される日数.
     now = OSAUtil.get_now()
     border_date = now - datetime.timedelta(days=Defines.ACTIVE_DAYS)
     
     LIMIT = 300
     
     model_mgr = ModelRequestMgr()
     cardmasters = dict([(master.id, master) for master in model_mgr.get_mastermodel_all(CardMaster, fetch_deleted=True, using=backup_db)])
     cardsortmasters = dict([(master.id, master) for master in model_mgr.get_mastermodel_all(CardSortMaster, fetch_deleted=True, using=backup_db)])
     
     # ヘッダ列.
     title = [u'ユーザID']
     for _ in xrange(Defines.DECK_CARD_NUM_MAX):
         title.extend([u'name', u'rare', u'hklevel', u'level', u'power'])
     for rare in Defines.Rarity.LIST:
         title.append(Defines.Rarity.NAMES[rare])
     writer.add(','.join(title))
     del title
     
     offset = 0
     while True:
         uidlist = LoginTimeCloneSet.fetchByRange(border_date, now, LIMIT, offset)
         
         # デッキ取得.
         decklist = Deck.getByKey(uidlist, using=backup_db)
         
         for deck in decklist:
             row = []
             
             raremap = {}
             
             # カード取得.
             cardidlist = deck.to_array()
             cards = dict([(card.id, card) for card in Card.getByKey(cardidlist, using=backup_db)])
             
             # ユーザID.
             row.append(str(deck.id))
             
             for cardid in cardidlist:
                 card = cards.get(cardid)
                 master = None
                 sortmaster = None
                 if card:
                     master = cardmasters.get(card.mid)
                     sortmaster = cardsortmasters.get(card.mid)
                 
                 if card is None or master is None or sortmaster is None:
                     name = u'不明'
                     rare = u'不明'
                     hklevel = u'不明'
                     level = u'不明'
                     power = u'不明'
                 else:
                     # カード名.
                     name = str(master.name)
                     # レア度.
                     rare = str(sortmaster.rare)
                     # ハメ管理度.
                     hklevel = str(sortmaster.hklevel)
                     # レベル.
                     level = str(card.level)
                     # 接客力.
                     power = str(CardUtil.calcPower(master.gtype, master.basepower, master.maxpower, card.level, master.maxlevel, card.takeover))
                     
                     raremap[sortmaster.rare] = raremap.get(sortmaster.rare, 0) + 1
                 
                 row.extend([name, rare, hklevel, level, power])
             
             for _ in xrange(Defines.DECK_CARD_NUM_MAX - len(cardidlist)):
                 row.extend(['', '', '', '', ''])
             
             for rare in Defines.Rarity.LIST:
                 row.append(str(raremap.get(rare, 0)))
             
             line = ','.join(row)
             writer.add(line)
         
         offset += LIMIT
         
         if len(uidlist) < LIMIT:
             break
     
     writer.output(overwrite=False)
     
     print '================================'
     print 'all done..'
示例#14
0
 def handle(self, *args, **options):
     
     print '================================'
     print 'create_benchmark_csv'
     print '================================'
     
     
     USER_ID_START = OSAUtil.BENCH_USER_ID_START
     USER_NUM = 0
     if args:
         USER_NUM = int(args[0])
     USER_NUM = max(OSAUtil.BENCH_USER_ID_NUM, USER_NUM)
     
     print '================================'
     print 'USER_NUM=%d' % USER_NUM
     
     LEVEL = 1
     GOLD = 100000
     GACHA_PT = 3000
     CARD_NUM = 100
     CARD_LIMIT = CARD_NUM + 50
     FRIEND = 50
     FRIEND_REQUEST = 50
     FRIEND_EMPTY = 50
     FRIENDLIMIT = FRIEND + FRIEND_REQUEST * 2 + FRIEND_EMPTY
     RAID_ENDTIME = DateTimeUtil.strToDateTime("20150101", "%Y%m%d")
     RAIDLOG = 100
     GREETLOG = 100
     PRESENT = int(100 / len(Defines.ItemType.PRESENT_TYPES.keys()))
     PRESENT_LIMITTIME = DateTimeUtil.strToDateTime("20150101", "%Y%m%d")
     ITEM_RNUM = 50
     ITEM_VNUM = 50
     DECK_CAPACITY = 1000000
     CABARET_TREASURE = 100000
     
     TREASURE_NUM = 20
     
     OUTPUT_DIR = os.path.join(settings_sub.TMP_DOC_ROOT, 'dummy')
     csvmgr = ModelCSVManager(OUTPUT_DIR)
     
     model_mgr = ModelRequestMgr()
     
     # 各種マスターデータ.
     levelexpmaster = model_mgr.get_model(PlayerLevelExpMaster, LEVEL)
     item_all = model_mgr.get_mastermodel_all(ItemMaster)
     card_all = [master for master in model_mgr.get_mastermodel_all(CardMaster) if master.ckind == Defines.CardKind.NORMAL and master.hklevel == 1]
     happeningall = model_mgr.get_mastermodel_all(HappeningMaster)
     arealist = model_mgr.get_mastermodel_all(AreaMaster, order_by='id')[:2]
     scoutlist = ScoutMaster.fetchValues(filters={'area__in':[area.id for area in arealist]}, order_by='id')
     treasure_gold_all = model_mgr.get_mastermodel_all(TreasureGoldMaster)
     treasure_silver_all = model_mgr.get_mastermodel_all(TreasureSilverMaster)
     treasure_bronze_all = model_mgr.get_mastermodel_all(TreasureBronzeMaster)
     
     now = OSAUtil.get_now()
     
     print '================================'
     print 'players..'
     
     class ModelList:
         def __init__(self):
             self.modellist_all = []
         
         def add(self, modellist):
             csvmgr.setModelList(modellist)
     
     modellist_all = ModelList()
     
     for i in xrange(USER_NUM):
         modellist = []
         
         uid = i + USER_ID_START
         
         # プレイヤー作成.
         player = self.install(uid)
         
         # タイプ決定とか.
         self.regist(player, levelexpmaster, GOLD, GACHA_PT, FRIENDLIMIT, CARD_LIMIT, DECK_CAPACITY, CABARET_TREASURE)
         
         modellist.append(player.getModel(Player))
         for model_cls in ModelPlayer.Meta.MODELS:
             p = player.getModel(model_cls)
             if p:
                 modellist.append(p)
         
         # スカウト完了.
         for scout in scoutlist:
             playdata = ScoutPlayData.makeInstance(ScoutPlayData.makeID(uid, scout.id))
             playdata.progress = scout.execution
             modellist.append(playdata)
             
             # フレンドの近況.
             logdata = ScoutClearLog.makeData(player.id, scout.id)
             modellist.append(logdata)
         
         for area in arealist:
             model = AreaPlayData.makeInstance(AreaPlayData.makeID(uid, area.id))
             model.clevel = levelexpmaster.level
             modellist.append(model)
             
             # フレンドの近況.
             logdata = BossWinLog.makeData(player.id, area.id)
             modellist.append(logdata)
         
         # カード付与.
         playercard = player.getModel(PlayerCard)
         cardidlist = []
         for _ in xrange(CARD_NUM):
             playercard.card += 1
             cardid = Card.makeID(uid, playercard.card)
             
             cardmaster = random.choice(card_all)
             card = BackendApi.create_card_by_master(cardmaster)
             card.id = cardid
             card.uid = uid
             modellist.append(card)
             
             cardidlist.append(cardid)
         
         # デッキ設定.
         deck = Deck()
         deck.id = uid
         deck.set_from_array(cardidlist[:Defines.DECK_CARD_NUM_MAX])
         modellist.append(deck)
         
         # カード獲得フラグ.
         for cardmaster in card_all:
             cardacquisition = CardAcquisition.makeInstance(CardAcquisition.makeID(uid, cardmaster.id))
             cardacquisition.maxlevel = cardmaster.maxlevel
             modellist.append(cardacquisition)
             
             albumacquisition = AlbumAcquisition.makeInstance(AlbumAcquisition.makeID(uid, cardmaster.album))
             modellist.append(albumacquisition)
         
         # アイテム.
         for itemmaster in item_all:
             item = Item.makeInstance(Item.makeID(uid, itemmaster.id))
             item.rnum = ITEM_RNUM
             item.vnum = ITEM_VNUM
             modellist.append(item)
         
         # レイド履歴.
         states = (Defines.HappeningState.END, Defines.HappeningState.MISS, Defines.HappeningState.CANCEL)
         for lognumber in xrange(RAIDLOG):
             happeningmaster = random.choice(happeningall)
             raidmaster = BackendApi.get_raid_master(model_mgr, happeningmaster.boss)
             self.putRaidLog(modellist, player, happeningmaster, raidmaster, states[lognumber % len(states)])
         
         # レイド.
         happeningmaster = random.choice(happeningall)
         raidmaster = BackendApi.get_raid_master(model_mgr, happeningmaster.boss)
         self.putRaid(modellist, player, happeningmaster, raidmaster, RAID_ENDTIME)
         
         # プレゼント.
         def putPresent(itype, itemid, itemvalue):
             presentlist = BackendApi.create_present(model_mgr, 0, uid, itype, itemid, itemvalue, Defines.TextMasterID.ACCESS_BONUS, PRESENT_LIMITTIME, do_set_save=False)
             modellist.extend(presentlist)
             presentlist = BackendApi.create_present(model_mgr, 0, uid, itype, itemid, itemvalue, Defines.TextMasterID.ACCESS_BONUS, now, do_set_save=False)
             modellist.extend(presentlist)
         
         for _ in xrange(PRESENT):
             putPresent(Defines.ItemType.GOLD, 0, 1000)
             putPresent(Defines.ItemType.GACHA_PT, 0, 10)
             putPresent(Defines.ItemType.ITEM, random.choice(item_all).id, 1)
             putPresent(Defines.ItemType.CARD, random.choice(card_all).id, 1)
             putPresent(Defines.ItemType.RAREOVERTICKET, 0, 1)
             putPresent(Defines.ItemType.TRYLUCKTICKET, 0, 1)
             putPresent(Defines.ItemType.MEMORIESTICKET, 0, 1)
             putPresent(Defines.ItemType.GACHATICKET, 0, 1)
             putPresent(Defines.ItemType.GOLDKEY, 0, 1)
             putPresent(Defines.ItemType.SILVERKEY, 0, 1)
         
         # 宝箱.
         def makeTreasure(masterlist, model_cls, etime):
             master = random.choice(masterlist)
             model = model_cls()
             model.uid = uid
             model.mid = master.id
             model.etime = etime
             modellist.append(model)
         
         for _ in xrange(TREASURE_NUM):
             makeTreasure(treasure_gold_all, TreasureGold, now)
             makeTreasure(treasure_gold_all, TreasureGold, PRESENT_LIMITTIME)
             
             makeTreasure(treasure_silver_all, TreasureSilver, now)
             makeTreasure(treasure_silver_all, TreasureSilver, PRESENT_LIMITTIME)
             
             makeTreasure(treasure_bronze_all, TreasureBronze, now)
             makeTreasure(treasure_bronze_all, TreasureBronze, PRESENT_LIMITTIME)
         
         modellist_all.add(modellist)
         
         print 'complete uid=%d' % uid
     
     print '================================'
     print 'friends..'
     
     # ユーザーがそろっていないと作れないレコード.
     for i in xrange(USER_NUM):
         modellist = []
         
         uid = i + USER_ID_START
         
         # フレンド設定.
         self.putFriends(modellist, uid, USER_ID_START, USER_NUM, FRIEND, FRIEND_REQUEST)
         
         # あいさつ履歴.
         fid = uid
         for _ in xrange(GREETLOG):
             fid = ((fid - USER_ID_START + 1) % USER_NUM) + USER_ID_START
             while fid == uid:
                 fid = ((fid - USER_ID_START + 1) % USER_NUM) + USER_ID_START
             
             model = GreetLog()
             model.fromid = fid
             model.toid = uid
             modellist.append(model)
         
         modellist_all.add(modellist)
         
         print 'complete uid=%d' % uid
     
     csvmgr.output()
     
     print '================================'
     print 'all done..'
示例#15
0
    def handle(self, *args, **options):

        print '================================'
        print 'aggregate_cabaretclub_weekly'
        print '================================'

        last_week_starttime = BackendApi.to_cabaretclub_section_starttime(
            OSAUtil.get_now() - datetime.timedelta(days=7))

        str_year_and_week = args[0] if 0 < len(args) else None
        if str_year_and_week:
            week = int(str_year_and_week[4:])
            first_of_year = DateTimeUtil.strToDateTime(
                "%s%02d" % (str_year_and_week[:4],
                            Defines.CABARETCLUB_EVENT_DATE_CHANGE_TIME),
                "%Y%H")
            # 0週目.
            zero = BackendApi.to_cabaretclub_section_starttime(first_of_year)
            starttime = zero + datetime.timedelta(days=week * 7)
            if last_week_starttime < starttime:
                print u'未完了の週なので集計は行えません'
                return
        else:
            # 指定がない場合は前回の週.
            starttime = last_week_starttime
        print "target:%s" % starttime.strftime("%Y%W")
        endtime = BackendApi.to_cabaretclub_section_endtime(starttime)
        section_lasttime = endtime - datetime.timedelta(microseconds=1)

        model_mgr = ModelRequestMgr()
        self.update_eventconfig_previous_mid(model_mgr, starttime)

        # 店舗のマスターデータ.
        cabaclubstoremaster_dict = dict([
            (cabaclubstoremaster.id, cabaclubstoremaster)
            for cabaclubstoremaster in model_mgr.get_mastermodel_all(
                CabaClubStoreMaster, fetch_deleted=True, using=backup_db)
        ])
        # ユーザIDの最大値.
        uid_max = PlayerTreasure.max_value('id', using=backup_db)
        for uid in xrange(1, uid_max + 1):
            # 所持している店舗.ここはreadonlyで大丈夫.
            store_list = CabaClubStorePlayerData.fetchByOwner(
                uid, using=settings.DB_READONLY)
            if store_list:
                # この週に更新された店舗数.
                update_store_cnt = 0
                # Activeな店舗を週の終了時間まですすめる.
                for store in store_list:
                    cabaclubstoremaster = cabaclubstoremaster_dict[store.mid]
                    if not store.is_open:
                        # 閉じるときに集計しているので必要なし.
                        if starttime <= store.utime:
                            update_store_cnt += 1
                        continue
                    store_set = CabaclubStoreSet(cabaclubstoremaster, store)
                    lasttime = min(
                        section_lasttime,
                        store_set.get_limit_time() -
                        datetime.timedelta(microseconds=1))
                    if (lasttime - store.utime).total_seconds(
                    ) < cabaclubstoremaster.customer_interval:
                        # 獲得時間が経過していないので更新する必要が無い.
                        if starttime <= store.utime:
                            update_store_cnt += 1
                        continue

                    def tr_advance_the_time(uid, cabaclubstoremaster, now):
                        """店舗の時間をすすめる.
                        """
                        model_mgr = ModelRequestMgr()
                        BackendApi.tr_cabaclubstore_advance_the_time_with_checkalive(
                            model_mgr, uid, cabaclubstoremaster, now)
                        model_mgr.write_all()
                        model_mgr.write_end()

                    try:
                        db_util.run_in_transaction(tr_advance_the_time, uid,
                                                   cabaclubstoremaster,
                                                   lasttime)
                    except CabaretError, err:
                        if err.code == CabaretError.Code.ALREADY_RECEIVED:
                            # ユーザー自信が更新した可能性.
                            pass
                        else:
                            DbgLogger.write_error(err.value)
                            raise
                    update_store_cnt += 1
                if 0 < update_store_cnt:
                    # 売り上げに応じた名誉ポイントを配布.
                    def tr_send_point(uid, starttime):
                        """名誉ポイントの配布.
                        """
                        model_mgr = ModelRequestMgr()
                        scoredata_weekly = CabaClubScorePlayerDataWeekly.getByKeyForUpdate(
                            CabaClubScorePlayerDataWeekly.makeID(
                                uid, starttime))
                        if scoredata_weekly is None or scoredata_weekly.flag_aggregate:
                            return 0
                        # 配布する数を計算.
                        cabaclub_honor = int(
                            math.ceil(scoredata_weekly.proceeds / 1000.0))
                        if 0 < cabaclub_honor:
                            # 報酬付与.
                            prizedata = PrizeData.create(
                                cabaclub_honor=cabaclub_honor)
                            BackendApi.tr_add_prize(
                                model_mgr, uid, [prizedata],
                                Defines.TextMasterID.CABARETCLUB_WEEKLY_PRIZE)
                        # 重複防止.
                        scoredata_weekly.flag_aggregate = True
                        model_mgr.set_save(scoredata_weekly)
                        model_mgr.write_all()
                        model_mgr.write_end()
                        return cabaclub_honor

                    cabaclub_honor = db_util.run_in_transaction(
                        tr_send_point, uid, starttime)
                    print '%s...honor=%d' % (uid, cabaclub_honor)
                else:
                    print '%s...not updated' % uid
示例#16
0
    def handle(self, *args, **options):
        
        print '================================'
        print 'support'
        print '================================'
        
        # 出力先.
        path = OSAUtil.get_now().strftime(args[0])
        
        # 書き込むデータをここに溜め込む.
        writer = Command.Writer(path)
        
        # レイドマスター.
        model_mgr = ModelRequestMgr()
        raid_all = dict([(master.id, master) for master in model_mgr.get_mastermodel_all(RaidMaster, using=settings.DB_READONLY)])
        eventraid_all = dict([(master.mid, master) for master in model_mgr.get_mastermodel_all(RaidEventRaidMaster, using=settings.DB_READONLY)])
        
        # 対象のユーザ.
        UIDLIST = [16268, 29339]
        UIDSET = set(UIDLIST)
        
        UNKNOWNS = [
            56272661512882,
            56272661512893,
            87759066759449,
            99127845191766,
            128943508160593,
            136047384068178,
            137099651055617,
            137550622621716,
            143374598275073,
            149615185756161,
            157689724272723,
            165957536317441,
            172352742621192,
            183549722361857,
            193870528774147,
        ]
        
        # 対象の時間.
        filters = {
            'ctime__gte' : DateTimeUtil.strToDateTime("2014-01-07 15:00:00", "%Y-%m-%d %H:%M:%S"),
            'ctime__lt' : DateTimeUtil.strToDateTime("2014-01-13 19:00:00", "%Y-%m-%d %H:%M:%S"),
            'hp' : 0,
        }
        LIMIT = 1000
        
        offset = 0
        
        timebonus_time_min = DateTimeUtil.strToDateTime("2014-01-13 17:00:00", "%Y-%m-%d %H:%M:%S")
        timebonus_time_max = DateTimeUtil.strToDateTime("2014-01-13 19:00:00", "%Y-%m-%d %H:%M:%S")
        
        # 対象のハプニング.
        while True:
            raidlist = Raid.fetchValues(filters=filters, order_by='id', limit=LIMIT, offset=offset)
            
            for raid in raidlist:
                raidboss = RaidBoss(raid, raid_all[raid.mid], eventraid_all.get(raid.mid))
                if raid.id in UNKNOWNS:
                    print raid.id
                
                uidset = set(raidboss.getDamageRecordUserIdList())
                targetlist = list(UIDSET & uidset)
                if not targetlist:
                    continue
                
                helppoints = raidboss.getHelpEventPoints()
                for uid in targetlist:
                    owner = 0
                    mvp = 0
                    helppoint = 0
                    
                    if uid == raidboss.raid.oid:
                        # 発見者報酬.
                        owner = raidboss.get_owner_eventpoint()
                    else:
                        # 協力者報酬.
                        helppoint = helppoints.get(uid, 0)
                    
                    # MVP報酬.
                    mvpuidlist = raidboss.getMVPList()
                    for mvpuid in mvpuidlist:
                        if uid == mvpuid:
                            mvp += raidboss.get_mvp_eventpoint()
                    if not (owner or mvp or helppoint):
                        print raidboss.id
                    else:
                        text = '%s,%s,%s,%s,%s' % (uid, owner, mvp, helppoint, raid.ctime.strftime("%Y-%m-%d %H:%M"))
                        writer.add(text)
#                        print text
                
            if len(raidlist) < LIMIT:
                break
            offset += LIMIT
        
        writer.output(overwrite=False)
        
        print '================================'
        print 'all done..'