def __valid_master(self, master): master.id = RaidEventRaidMaster.makeID(master.eventid, master.mid) if not master.is_public: return model_mgr = self.getModelMgr() if BackendApi.get_raideventmaster(model_mgr, master.eventid) is None: raise ModelEditValidError( u'存在しないイベントが設定されています.raideventraid=%d,%d' % (master.eventid, master.mid)) elif BackendApi.get_raid_master(model_mgr, master.mid) is None: raise ModelEditValidError( u'存在しないレイドが設定されています.raideventraid=%d,%d' % (master.eventid, master.mid)) midlist = dict(master.specialcard).keys() if len(midlist) != len(master.specialcard): raise ModelEditValidError(u'ご指名キャストが重複しています.raideventraid=%d,%d' % (master.eventid, master.mid)) elif len(CardMaster.getByKey(midlist)) != len(midlist): raise ModelEditValidError( u'存在しないキャストがご指名されています.raideventraid=%d,%d' % (master.eventid, master.mid))
def valid_write_end(self): master_all = {} for master in DefaultCardMaster.fetchValues( filters={'ctype__in': Defines.CharacterType.NAMES.keys()}): master_all[master.ctype] = master card_all = {} for card in CardMaster.fetchValues(): card_all[card.id] = card errors = [] for ctype, name in Defines.CharacterType.NAMES.items(): master = master_all.get(ctype) if master is None: continue if card_all.get(master.leader) is None: errors.append(u'タイプ:%sの初期リーダーカードが存在しません' % name) for mid in master.members: if card_all.get(mid) is None: errors.append(u'タイプ:%sの初期デッキに存在しないカードが含まれています' % name) for mid in master.box: if card_all.get(mid) is None: errors.append(u'タイプ:%sの初期BOXカードに存在しないカードが含まれています' % name) if errors: raise ModelEditValidError('<br />'.join(errors))
def __valid_master(self, master): if not master.is_public: return elif CardMaster.getValuesByKey(master.cardid) is None: raise ModelEditValidError(u'思いで開放に必要なカードが存在しません.id=%d, card=%d' % (master.id, master.cardid)) if master.contenttype == Defines.MemoryContentType.MOVIE and not settings_sub.IS_LOCAL and not settings_sub.IS_DEV: if not str(master.contentdata).isdigit( ) or not MoviePlayList.getByKey(int(master.contentdata)): raise ModelEditValidError(u'存在しない動画が設定されています.id=%d' % master.id) if master.contenttype == Defines.MemoryContentType.MOVIE_PC and not settings_sub.IS_LOCAL and not settings_sub.IS_DEV: if not str(master.contentdata).isdigit( ) or not PcMoviePlayList.getByKey(int(master.contentdata)): raise ModelEditValidError(u'存在しない動画が設定されています.id=%d' % master.id) if master.contenttype == Defines.MemoryContentType.VOICE and not settings_sub.IS_LOCAL: if not str(master.contentdata).isdigit( ) or not VoicePlayList.getByKey(int(master.contentdata)): raise ModelEditValidError(u'存在しない音声が設定されています.id=%d' % master.id) if self.valid_error_num < 10: for record in self.allmasters: if master.id == record.id: self.valid_error_num += 1 raise ModelEditValidError(u'IDが重複しています.id={}'.format( master.id))
def validate(self): master = None if self.itype == Defines.ItemType.CARD: master = CardMaster.getByKey(self.mid) elif self.itype == Defines.ItemType.ITEM: master = ItemMaster.getByKey(self.mid) if master is None: raise CabaretError(u'存在しないマスターがドロップアイテムテーブルに設定されています.')
def get(cls, album, hklevel): redisdb = cls.getDB() mid = redisdb.hget(cls.KEY, CardMaster.makeAlbumHklevel(album, hklevel)) if mid and str(mid).isdigit(): mid = int(mid) else: mid = None return mid
def __valid_master(self, master): if not master.is_public: return model_mgr = self.getModelMgr() if not isinstance(master.rankingprizes, list): raise ModelEditValidError(u'ランキング報酬のJsonが壊れています.scoutevent=%d' % master.id) for data in master.rankingprizes: diff = set(['prize', 'rank_min', 'rank_max']) - set(data.keys()) if diff: raise ModelEditValidError( u'ランキング報酬に想定外のデータが含まれています.scoutevent=%d' % master.id) self.checkPrize(master, data['prize'], u'ランキング報酬', u'scoutevent') master.beginer_rankingprizes = master.beginer_rankingprizes or [] if not isinstance(master.beginer_rankingprizes, list): raise ModelEditValidError(u'新店舗ランキング報酬のJsonが壊れています.scoutevent=%d' % master.id) for data in master.beginer_rankingprizes: diff = set(['prize', 'rank_min', 'rank_max']) - set(data.keys()) if diff: raise ModelEditValidError( u'新店舗ランキング報酬に想定外のデータが含まれています.scoutevent=%d' % master.id) self.checkPrize(master, data['prize'], u'新店舗ランキング報酬', u'scoutevent') if not isinstance(master.pointprizes, (dict, list)): raise ModelEditValidError(u'ポイント達成報酬のJsonが壊れています.scoutevent=%d' % master.id) for prizeidlist in master.get_pointprizes().values(): self.checkPrize(master, prizeidlist, u'ポイント達成報酬', u'scoutevent') midlist = dict(master.specialcard).keys() if len(midlist) != len(master.specialcard): raise ModelEditValidError(u'ご指名キャストが重複しています.scoutevent=%d' % master.id) elif len(CardMaster.getByKey(midlist)) != len(midlist): raise ModelEditValidError(u'存在しないキャストがご指名されています.scoutevent=%d' % master.id) if master.movie_op: moviemaster = BackendApi.get_eventmovie_master( model_mgr, master.movie_op) if moviemaster is None: raise ModelEditValidError(u'存在しない動画が設定されています.scoutevent=%d' % master.id) if not self.__is_exist_file(master.lovetime_starimgon): raise ModelEditValidError( u'「星の取得画像」に存在しない画像が設定されています.scoutevent=%d' % master.id) if not self.__is_exist_file(master.lovetime_starimgoff): raise ModelEditValidError( u'「星の身取得画像」に存在しない画像が設定されています.scoutevent=%d' % master.id)
def get_data(self): # 直近2週間で取ってきてみる. DAYS = 14 date_from = self.date - datetime.timedelta(days=DAYS) date_to = OSAUtil.get_now() # ガチャのマスターデータ. gachamaster_dict = dict([(master.id, master) for master in GachaMaster.fetchValues( fetch_deleted=True, using=backup_db)]) # カードのマスターデータ. cardmaster_dict = dict([(master.id, master) for master in CardMaster.fetchValues( fetch_deleted=True, using=backup_db)]) # 対象のユーザー. uidlist = PaymentGachaLastPlayTimeSortedSet.fetchByDate( date_from, date_to) result = [[ 'ユーザID', '生涯課金額', 'ガチャ1', 'ガチャを回した時のリーダー1', 'ガチャ2', 'ガチャを回した時のリーダー2', 'ガチャ3', 'ガチャを回した時のリーダー3' ]] for uid in uidlist: row = [uid] # 生涯課金額. model = PlayerConsumePoint.getByKey(uid, using=backup_db) row.append(model.point_total if model else 0) redisdata = PaymentGachaPlayerLeaderHash.getByUserIDList( [uid]).get(uid) or {} items = list(redisdata.items()) items.sort(key=lambda x: x[1]['date'], reverse=True) for gachaid, data in items: # 引いたガチャ. gachamaster = gachamaster_dict[gachaid] # その時のリーダー. cardmaster = cardmaster_dict[data['card']] row.extend([ u'%s(ID:%d)' % (gachamaster.name, gachamaster.id), u'%s(ID:%d)' % (cardmaster.name, cardmaster.id) ]) result.append(row) return result
def handle(self, *args, **options): print '================================' print 'copy_img' print '================================' out = args[0] # ガチャのマスターを取得. gachalist = GachaMaster.fetchValues(filters={ 'consumetype__in': Defines.GachaConsumeType.PAYMENT_TYPES, 'schedule__gt': 0 }, using=backup_db) # ガチャのボックスデータを作成. read_boxids = [] card_dict = {} for gacha in gachalist: if gacha.boxid in read_boxids: continue schedule = ScheduleMaster.getByKey(gacha.schedule, using=backup_db) name = u'%s(%s-%s)' % (gacha.name, schedule.stime.strftime('%m/%d'), schedule.stime.strftime('%m/%d')) boxmaster = GachaBoxMaster.getByKey(gacha.boxid, using=backup_db) gachamasterset = GachaMasterSet(gacha, boxmaster, schedule) gachabox = GachaBox(gachamasterset, GachaPlayData.makeInstance( GachaPlayData.makeID(0, gacha.boxid)), blank=True) grouplist = GachaGroupMaster.getByKey(gachabox.get_group_id_list(), using=backup_db) # カードIDとガチャのIDをひもづける. for group in grouplist: if 1 < len(group.table): continue cardid = group.table[0]['id'] arr = card_dict[cardid] = card_dict.get(cardid) or [] arr.append(name) # カードマスターを取得. cardmasterlist = CardMaster.getByKey(card_dict.keys(), order_by='id', using=backup_db) # CSVを作成. rows = [] def makeRow(row): arr = [] for v in row: s = u'%s' % v s = s.replace('"', '""') arr.append(u'"%s"' % s) return u','.join(arr) for cardmaster in cardmasterlist: cardsortmaster = CardSortMaster.getByKey(cardmaster.id, using=backup_db) row = [ cardmaster.id, cardmaster.name, Defines.Rarity.NAMES[cardsortmaster.rare], Defines.CharacterType.NAMES[cardsortmaster.ctype] ] row.extend(card_dict[cardmaster.id]) str_row = makeRow(row) print str_row rows.append(str_row) csv_data = StrUtil.to_s(u'\n'.join(rows), dest_enc='shift-jis') f = None try: f = open(out, "w") f.write(csv_data) f.close() except: if f: f.close() f = None raise print '================================' print 'output:%s' % out print 'all done..'
def get_data(self): result = [] # 指輪のマスターデータ. master_dict = dict([ (master.id, master.name) for master in CardMaster.fetchValues( filters={'ckind': Defines.CardKind.EVOLUTION}, using=backup_db) ]) if not master_dict: return None midlist = master_dict.keys() waylist = Defines.CardGetWayType.NAMES.keys() titles = [u'ユーザID'] for mid in midlist: for way in waylist: result.append( u'%s(%s)' % (master_dict[mid].name, Defines.CardGetWayType.NAMES[way])) titles.extend([u'直近一ヶ月の課金額', u'生涯課金額']) result.append(titles) # 7日前. s_time = DateTimeUtil.toBaseTime( self.date - datetime.timedelta(days=7), 0) e_time = self.date # 過去1週間以内にログインしたユーザー. str_uidlist = WeeklyLoginSet.getUserIdListByRange(s_time, e_time) redisdb = RingGetNumHash.getDB() keys = [RingGetNumHash.makeKey(self.date, mid) for mid in midlist] union_key = DailyPaymentPointSet.makeUnionSortSet(s_time, e_time) for str_uid in str_uidlist: row = [] uid = int(str_uid) row.append(uid) # 各カードの枚数. members = [RingGetNumHash.makeMember(uid, way) for way in waylist] for key in keys: values = redisdb.hmget(key, members) for v in values: v = int(str(v)) if str(v).isdigit() else 0 row.append(v) # 直近1ヶ月の課金額. point = redisdb.zscore(union_key, uid) or 0 row.append(point) # 生涯課金額. model = PlayerConsumePoint.getByKey(uid, using=backup_db) row.append(model.point_total if model else 0) result.append(row) # 後片付け. redisdb.delete(union_key) return result
def _save(cls, pipe, album, hklevel, mid): pipe.hset(cls.KEY, CardMaster.makeAlbumHklevel(album, hklevel), mid)
def _flush(cls, pipe): """関係するキャッシュを全て削除. """ masterlist = CardMaster.fetchValues(['albumhklevel']) for master in masterlist: pipe.delete(AlbumMemoriesSet.makeKey(master.album))
def __valid_master(self, master): if not (1 <= master.id <= 0xffffff): raise ModelEditValidError(u'イベントのマスターIDが不正です.battleevent=%d' % master.id) if not master.is_public: return if not isinstance(master.rankingprizes, list): raise ModelEditValidError(u'ランキング報酬のJsonが壊れています.battleevent=%d' % master.id) for data in master.rankingprizes: diff = set(['prize', 'rank_min', 'rank_max']) - set(data.keys()) if diff: raise ModelEditValidError( u'ランキング報酬に想定外のデータが含まれています.battleevent=%d' % master.id) self.checkPrize(master, data['prize'], u'ランキング報酬', 'battleevent') master.beginer_rankingprizes = master.beginer_rankingprizes or [] if not isinstance(master.beginer_rankingprizes, list): raise ModelEditValidError( u'新店舗ランキング報酬のJsonが壊れています.battleevent=%d' % master.id) for data in master.beginer_rankingprizes: diff = set(['prize', 'rank_min', 'rank_max']) - set(data.keys()) if diff: raise ModelEditValidError( u'新店舗ランキング報酬に想定外のデータが含まれています.battleevent=%d' % master.id) self.checkPrize(master, data['prize'], u'新店舗ランキング報酬', 'battleevent') if not isinstance(master.pointprizes, (dict, list)): raise ModelEditValidError( u'名声ポイント達成報酬のJsonが壊れています.battleevent=%d' % master.id) for prizeidlist in master.get_pointprizes().values(): self.checkPrize(master, prizeidlist, u'名声ポイント達成報酬', 'battleevent') try: specialtable = dict(master.specialtable) except: raise ModelEditValidError(u'特効倍率テーブルが壊れています.battleevent=%d' % master.id) diff = set(specialtable.keys()) - set(Defines.Rarity.NAMES.keys()) if diff: raise ModelEditValidError( u'特効倍率テーブルに存在しないレア度が含まれています.battleevent=%d' % master.id) for arr in specialtable.values(): if not isinstance(arr, list): raise ModelEditValidError(u'特効倍率テーブルが壊れています.battleevent=%d' % master.id) for v in arr: if not isinstance(v, (int, long)): raise ModelEditValidError( u'特効倍率テーブルが壊れています.battleevent=%d' % master.id) specialcard = dict(master.specialcard) midlist = specialcard.keys() if len(midlist) != len(master.specialcard): raise ModelEditValidError(u'特効キャストが重複しています.battleeventraid=%d' % master.id) elif len(CardMaster.getByKey(midlist)) != len(midlist): raise ModelEditValidError( u'存在しないキャストが特効に設定されています.battleeventraid=%d' % master.id) dest = [] for mid, _ in master.specialcard: arr = specialcard.get(mid) if isinstance(arr, (int, long)): arr = [arr] if not isinstance(arr, list) or len(arr) < 1: raise ModelEditValidError(u'特効キャストテーブルが壊れています.battleevent=%d' % master.id) for v in arr: if not isinstance(v, (int, long)): raise ModelEditValidError( u'特効キャストテーブルが壊れています.battleevent=%d' % master.id) dest.append([mid, arr]) master.specialcard = dest
def get_data(self, sql): CardMaster.sql('', using=backup_db) cursor = connections[backup_db].cursor() cursor.execute(sql) return cursor.fetchall()[0]