示例#1
0
    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))
示例#2
0
    def __valid_master(self, master):
        if not master.is_public:
            return

        model_mgr = self.getModelMgr()

        if 0 < master.cardid and model_mgr.get_model(CardMaster,
                                                     master.cardid) is None:
            raise ModelEditValidError(u'存在しないカードが設定されています.prize=%d' %
                                      master.id)
        elif 0 < master.itemid and model_mgr.get_model(ItemMaster,
                                                       master.itemid) is None:
            raise ModelEditValidError(u'存在しないアイテムが設定されています.prize=%d' %
                                      master.id)

        if master.additional_ticket_id and master.additional_ticket_num:
            if not Defines.GachaConsumeType.GachaTicketType.NAMES.has_key(
                    master.additional_ticket_id):
                raise ModelEditValidError(
                    u'未実装の新規追加ガチャチケットが設定されています.prize=%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))
示例#3
0
    def __valid_master(self, master):
        if not master.is_public:
            return

        idx = 0
        prizeidlist = []
        while True:
            prizeid = master.getPrizeId(idx)
            idx += 1

            if prizeid is None:
                break

            weight = master.getWeight(idx)
            if not prizeid or not weight:
                continue
            prizeidlist.append(prizeid)

        if not prizeidlist:
            raise ModelEditValidError(u'報酬が設定されていません.seat=%d' % master.id)
        prizeidlist = list(set(prizeidlist))

        prizelist = PrizeMaster.getByKey(prizeidlist)
        if len(prizeidlist) != len(prizelist):
            raise ModelEditValidError(u'存在しない報酬が設定されています.seat=%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))
示例#4
0
    def __valid_master(self, master):
        if not master.is_public:
            return

        self.valid_stagedata(master, ScoutEventMaster)

        model_mgr = self.getModelMgr()

        master.bustup = master.bustup or []
        if not isinstance(master.bustup, list):
            raise ModelEditValidError(u'バストアップ画像は画像URLのリストで設定してください.stage=%d' %
                                      master.id)
        for bustup in master.bustup:
            if isinstance(bustup, (str, unicode)):
                continue
            raise ModelEditValidError(u'バストアップ画像は画像URLのリストで設定してください.stage=%d' %
                                      master.id)

        if master.movie:
            moviemaster = BackendApi.get_eventmovie_master(
                model_mgr, master.movie)
            if moviemaster is None:
                raise ModelEditValidError(u'存在しない動画が設定されています.stage=%d' %
                                          master.id)

        if 0 < master.eventrate_gachapt:
            if master.gachaptmin < 1 or master.gachaptmax < 1:
                raise ModelEditValidError(u'専用ガチャのポイントが設定されていません.stage=%d' %
                                          master.id)
            elif master.gachaptmax < master.gachaptmin:
                raise ModelEditValidError(
                    u'専用ガチャポイントの最大値が最小値よりも小さくなっています.stage=%d' % master.id)
示例#5
0
    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))
示例#6
0
class Handler(AdminModelEditHandler):
    """マスターデータの操作.
    """
    class Form(AppModelForm):
        class Meta:
            model = ShopItemMaster
            exclude = (Defines.MASTER_EDITTIME_COLUMN, )

        schedule = AppModelChoiceField(ScheduleMaster,
                                       required=False,
                                       label=u'期間')

    def setting_property(self):
        self.MODEL_LABEL = u'ショップの商品'

    def __valid_master(self, master):
        if not master.is_public:
            return
        try:
            prizelist = master.getItemList()
        except CabaretError, err:
            raise ModelEditValidError(err.value)

        model_mgr = self.getModelMgr()
        for prize in prizelist:
            if 0 < prize.cardid and model_mgr.get_model(
                    CardMaster, prize.cardid) is None:
                raise ModelEditValidError(u'商品に存在しないカードが設定されています.prize=%d' %
                                          master.id)
            elif 0 < prize.itemid and model_mgr.get_model(
                    ItemMaster, prize.itemid) is None:
                raise ModelEditValidError(u'商品に存在しないアイテムが設定されています.prize=%d' %
                                          master.id)
示例#7
0
    def __valid_master(self, master):
        if not master.is_public:
            return

        def checkprize(clumnprizes):
            datalist = []
            try:
                for v in clumnprizes:
                    data = BattleRankMaster.PrizeData(v)
                    if 0 < data.rate:
                        datalist.append(data)
                    self.checkPrize(master, data.prizes)
                if len(datalist) == 0:
                    raise ModelEditValidError(u'報酬が設定されていません.id=%d' %
                                              master.id)
            except ModelEditValidError:
                raise
            except:
                raise ModelEditValidError(u'報酬データに問題があります.id=%d' % master.id)

        checkprize(master.winprizes)
        checkprize(master.loseprizes)
        checkprize(master.rankupprizes)

        if master.win < 1:
            raise ModelEditValidError(u'連勝数が設定されていません.id=%d' % master.id)
        elif master.times < 1:
            raise ModelEditValidError(u'達成回数が設定されていません.id=%d' % master.id)
示例#8
0
    def __valid_itemnum_and_stock(self, model_mgr, master):
        if master.itemnum <= 0:
            raise ModelEditValidError(u'「一回の交換で取得できる個数」の値が0以下です.id=%d' %
                                      master.id)

        if master.stock < 0:
            raise ModelEditValidError(u'「交換可能回数」の値がマイナスです.id=%d' % master.id)
示例#9
0
 def checkPrize(prizeidlist, name):
     if len(prizeidlist) != len(list(set(prizeidlist))):
         raise ModelEditValidError(u'%sが重複しています.id=%d' %
                                   (name, master.id))
     prizelist = BackendApi.get_prizemaster_list(model_mgr, prizeidlist)
     if len(prizeidlist) != len(prizelist):
         raise ModelEditValidError(u'%sに存在しない報酬が設定されています.id=%d' %
                                   (name, master.id))
 def checkMaster(master_cls, midlist):
     if len(midlist) != len(list(set(midlist))):
         raise ModelEditValidError(u'全プレが重複しています.id=%d' %
                                   master.date.strftime("%Y-%m-%d"))
     modellist = BackendApi.get_model_list(model_mgr, master_cls,
                                           midlist)
     if len(midlist) != len(modellist):
         raise ModelEditValidError(u'存在しない全プレが設定されています.id=%d' %
                                   master.date.strftime("%Y-%m-%d"))
示例#11
0
 def __valid_master(self, master):
     if not master.is_public:
         return
     model_mgr = self.getModelMgr()
     prizes = master.prizes
     if len(prizes) != len(list(set(prizes))):
         raise ModelEditValidError(u'報酬が重複しています.area=%d' % master.id)
     prizelist = BackendApi.get_prizemaster_list(model_mgr, prizes)
     if len(prizes) != len(prizelist):
         raise ModelEditValidError(u'存在しない報酬が設定されています.area=%d' % master.id)
示例#12
0
    def __valid_rarity_fixed_boxid(self, model_mgr, master):
        if master.consumetype == Defines.GachaConsumeType.FIXEDSR:
            if master.rarity_fixed_boxid == 0:
                raise ModelEditValidError(u'消費するものがSR確定ガチャですが、「レアリティ確定の際に使用するBoxID」が未設定です.gacha=%d' % master.id)
            if master.rarity_fixed_num <= 0:
                raise ModelEditValidError(u'消費するものがSR確定ガチャですが、「レアリティ確定枚数」が0以下です.gacha=%d' % master.id)

            model = model_mgr.get_model(GachaBoxMaster, master.rarity_fixed_boxid)
            if model is None:
                raise ModelEditValidError(u'「レアリティ確定の際に使用するBoxID」に、GachaBoxMasterに存在しないIDが指定されています.gacha=%d' % master.id)
示例#13
0
    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)
示例#14
0
 def checkPrize(prizeidlist, name):
     if not isinstance(prizeidlist, list):
         raise ModelEditValidError(
             u'%sのJsonが壊れています.eventid=%s,number=%s' %
             (name, master.eventid, master.number))
     try:
         self.checkPrize(master, prizeidlist, name)
     except ModelEditValidError, err:
         raise ModelEditValidError(
             u'%s.eventid=%s,number=%s' %
             (err, name, master.eventid, master.number))
示例#15
0
 def checkRankingPrize(prizes, name):
     if not isinstance(prizes, list):
         raise ModelEditValidError(u'%sのJsonが壊れています.battleevent=%d' %
                                   (name, master.id))
     for data in prizes:
         diff = set(['prize', 'rank_min', 'rank_max']) - set(
             data.keys())
         if diff:
             raise ModelEditValidError(
                 u'%sに想定外のデータが含まれています.battleevent=%d' %
                 (name, master.id))
         self.checkPrize(master, data['prize'], name, 'battleeventrank')
示例#16
0
    def __check_trade_shop_item_masetr_ids(self, model_mgr, master):
        if not isinstance(master.trade_shop_item_master_ids, (list)):
            raise ModelEditValidError(
                u'trade_shop_item_master_idsのJsonが壊れています.id=%d' % master.id)

        for trade_shop_item_master_id in master.trade_shop_item_master_ids:
            model = model_mgr.get_model(TradeShopItemMaster,
                                        trade_shop_item_master_id)
            if model is None:
                raise ModelEditValidError(
                    u'trade_shop_item_master_idsで指定されているidがTradeShopItemMasterに存在しません.id=%d'
                    % master.id)
示例#17
0
    def __valid_item_type_and_id(self, model_mgr, master):
        if master.itype == Defines.ItemType.ITEM:
            model = model_mgr.get_model(ItemMaster, master.itemid)
            if model is None:
                raise ModelEditValidError(
                    u'アイテムIDに、ItemMasterに存在しないIDが指定されています.id=%d' % master.id)

        if master.itype == Defines.ItemType.CARD:
            model = model_mgr.get_model(CardMaster, master.itemid)
            if model is None:
                raise ModelEditValidError(
                    u'アイテムIDに、CardMasterに存在しないIDが指定されています.id=%d' % master.id)
示例#18
0
    def __valid_master(self, master):
        if not master.is_public:
            return

        if not isinstance(master.lvprizes, list):
            raise ModelEditValidError(u'教育LV達成報酬のJsonが壊れています.id=%d' %
                                      master.id)
        for data in master.lvprizes:
            diff = set(['prize', 'level']) - set(data.keys())
            if diff:
                raise ModelEditValidError(u'教育LV達成報酬に想定外のデータが含まれています.id=%d' %
                                          master.id)
            self.checkPrize(master, data['prize'], u'教育LV達成報酬',
                            u'produceevent')
示例#19
0
 def __valid_master(self, master):
     # 報酬.
     if not isinstance(master.customer_prizes, list):
         raise ModelEditValidError(u'集客数達成報酬のJsonが壊れています.id=%d' % master.id)
     prizeidlist = []
     for arr in master.customer_prizes:
         if len(arr) != 2:
             raise ModelEditValidError(
                 u'集客数達成報酬の中身が不正です.報酬IDと確率のペアで設定して下さい.id=%d' % master.id)
         prizeid, rate = arr
         prizeidlist.append(prizeid)
         if not isinstance(rate, (int, long)) or rate < 1:
             raise ModelEditValidError(u'集客数達成報酬の確率が不正です.id=%d' % master.id)
     self.checkPrize(master, prizeidlist, u'集客数達成報酬')
示例#20
0
 def checkprize(clumnprizes):
     datalist = []
     try:
         for v in clumnprizes:
             data = BattleRankMaster.PrizeData(v)
             if 0 < data.rate:
                 datalist.append(data)
             self.checkPrize(master, data.prizes)
         if len(datalist) == 0:
             raise ModelEditValidError(u'報酬が設定されていません.id=%d' %
                                       master.id)
     except ModelEditValidError:
         raise
     except:
         raise ModelEditValidError(u'報酬データに問題があります.id=%d' % master.id)
示例#21
0
 def __valid_master(self, master):
     if not master.is_public:
         return
     
     flag_end = False
     for number in xrange(1, SkillMaster.MULTI_SKILL_NUM_MAX):
         skilldata = master.get_skill(number)
         if skilldata is None:
             flag_end = True
         elif flag_end:
             raise ModelEditValidError(u'効果対象は左詰めで設定して下さい.skill=%d' % master.id)
     
     skilldata = master.get_skill(0)
     if skilldata is None:
         raise ModelEditValidError(u'効果対象は最低一つ設定して下さい.skill=%d' % master.id)
示例#22
0
    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))
示例#23
0
    def __valid_master(self, master):
        master.id = ScoutEventRaidMaster.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))
示例#24
0
class Handler(AdminModelEditHandler):
    """マスターデータの操作.
    """
    class Form(AppModelForm):
        class Meta:
            model = HappeningMaster
            exclude = (Defines.MASTER_EDITTIME_COLUMN, )

        boss = AppModelChoiceField(RaidMaster, required=False, label=u'レイドボス')

    def setting_property(self):
        self.MODEL_LABEL = u'ハプニング'

    def __valid_master(self, master):
        if not master.is_public:
            return

        model_mgr = self.getModelMgr()
        try:
            selector = ScoutDropItemSelector(None, master, 0)
            selector.validate()
        except CabaretError, err:
            raise ModelEditValidError('%s, happening=%d' %
                                      (err.value, master.id))

        raid = model_mgr.get_model(RaidMaster, master.boss)
        if raid is None:
            raise ModelEditValidError(u'存在しないレイドが設定されています.happening=%d' %
                                      master.id)
示例#25
0
    def __valid_master(self, master):
        if not master.is_public:
            return

        if not isinstance(master.rankingprizes, list):
            raise ModelEditValidError(
                u'ランキング報酬のJsonが壊れています.cabaclubrankevent={}'.format(master.id))

        for data in master.rankingprizes:
            diff = set(['prize', 'rank_min', 'rank_max']) - set(data.keys())
            if diff:
                raise ModelEditValidError(
                    u'ランキング報酬に想定外のデータが含まれています.cabaclubrankevent={}'.format(
                        master.id))
            self.checkPrize(master, data['prize'], u'ランキング報酬',
                            u'cabaclubrankevent')
示例#26
0
    def valid_write_end(self):
        errors = []

        master_all = PanelMissionMissionMaster.fetchValues()
        master_all.sort(key=lambda x: x.id)

        panel = None
        number = 0
        for master in master_all:
            if panel != master.panel:
                if panel is not None:
                    if number < Defines.PANELMISSION_MISSIN_NUM_PER_PANEL:
                        # パネルが足りてない.
                        for n in xrange(
                                number + 1,
                                Defines.PANELMISSION_MISSIN_NUM_PER_PANEL + 1):
                            errors.append(u'不足:panel=%d, number=%d' %
                                          (panel, n))
                panel = master.panel
                number = 0

            if Defines.PANELMISSION_MISSIN_NUM_PER_PANEL < master.number:
                # パネルが余分.
                errors.append(u'余分:panel=%d, number=%d' %
                              (panel, master.number))
            elif number == master.number:
                errors.append(u'重複:panel=%d, number=%d' % (panel, number))
            elif number != (master.number - 1):
                for n in xrange(number + 1, master.number):
                    errors.append(u'不足:panel=%d, number=%d' % (panel, n))

            number = master.number

        if errors:
            raise ModelEditValidError('<br />'.join(errors))
示例#27
0
 def __valid_master(self, master):
     try:
         ScoutDropItemSelector(None, master, 0).validate()
         ScoutHappeningSelector(None, master).validate()
     except CabaretError, err:
         raise ModelEditValidError('%s, happening=%d' %
                                   (err.value, master.id))
示例#28
0
    def __valid_master(self, master):
        if not master.is_public:
            return

        model_mgr = self.getModelMgr()

        if not BackendApi.get_movieplaylist_dict_by_uniquename(
                model_mgr, [master.sp]):
            raise ModelEditValidError(
                u'SP用の動画が存在しません.eventmovie=%d, filename=%s' %
                (master.id, master.sp))
        elif not BackendApi.get_pcmovieplaylist_dict_by_uniquename(
                model_mgr, [master.pc]):
            raise ModelEditValidError(
                u'PC用の動画が存在しません.eventmovie=%d, filename=%s' %
                (master.id, master.pc))
示例#29
0
    def valid_insert(self, master):
        model_mgr = self.getModelMgr()
        gachagroup_ids = [box['id'] for box in master.box]

        # flag = 0  (False)--> do not insert
        # flag = 1 (True) --> insert
        flag = True

        ng_groups = []
        for group_id in gachagroup_ids:
            group_data = model_mgr.get_model(GachaGroupMaster,
                                             group_id,
                                             using=settings.DB_READONLY)
            cardid_list = [t['id'] for t in group_data.table]
            ngcast_list = BackendApi.get_model_list(model_mgr,
                                                    NgCastMaster,
                                                    cardid_list,
                                                    using=settings.DB_READONLY)
            if ngcast_list:
                flag = ngcast_list[0].flag
                ng_groups.append(group_id)
        if ng_groups and not flag:
            raise ModelEditValidError(
                u'NGキャストを含んだグループが含まれています.id={}, ng_groups={}'.format(
                    master.id, ng_groups))

        self.__valid_master(master)
示例#30
0
 def valid_write_end(self):
     errors = []
     
     model_cls = self.Form.Meta.model
     master_all = model_cls.fetchValues()
     master_all.sort(key=lambda x:((x.eventid<<32)+x.stage))
     
     eventid = None
     area = 1
     stage = 0
     for master in master_all:
         if eventid != master.eventid:
             eventid = master.eventid
             area = 1
             stage = 0
         
         if master.area < area or (area+1) < master.area:
             errors.append(u'不正エリア:eventid=%d, stage=%d, area=%d' % (master.eventid, master.stage, master.area))
         else:
             area = master.area
         
         if stage == master.stage:
             errors.append(u'重複:eventid=%d, stage=%d' % (eventid, stage))
         elif stage != (master.stage - 1):
             for st in xrange(stage+1, master.stage):
                 errors.append(u'不足:eventid=%d, stage=%d' % (eventid, st))
         
         stage = master.stage
     
     if errors:
         raise ModelEditValidError('<br />'.join(errors))