def list(self):
        """商品列表"""
        args = parameter_required()
        prtitle = args.get('prtitle')
        ipstatus = args.get('status')
        try:
            ipstatus = getattr(ApplyStatus, ipstatus).value
        except Exception as e:
            current_app.logger.error(
                'integral list status error : {}'.format(e))
            ipstatus = None
        integral_balance = 0
        if common_user():
            ipstatus = ApplyStatus.agree.value
            user = User.query.filter_by_(USid=request.user.id).first()
            integral_balance = getattr(user, 'USintegral', 0)
        elif is_tourist():
            ipstatus = ApplyStatus.agree.value

        filter_args = [
            IntegralProduct.isdelete == False,
            IntegralProduct.IPstatus == ipstatus, Products.isdelete == False,
            Products.PRstatus == ProductStatus.usual.value
        ]
        if is_supplizer():
            filter_args.append(Products.CreaterId == request.user.id),
        if prtitle:
            filter_args.append(Products.PRtitle.ilike('%{}%'.format(prtitle)))
        ips = IntegralProduct.query.outerjoin(
            Products, Products.PRid == IntegralProduct.PRid).filter_(
                *filter_args).order_by(
                    IntegralProduct.createtime.desc()).all_with_page()
        for ip in ips:
            pr = Products.query.filter(Products.PRid == ip.PRid).first()
            pb = ProductBrand.query.filter(
                ProductBrand.PBid == pr.PBid).first()
            ip.fill('prtitle', pr.PRtitle)
            ip.fill('prmainpic', pr['PRmainpic'])
            ip.fill('ipstatus_zh', ApplyStatus(ip.IPstatus).zh_value)
            ip.fill('ipstatus_en', ApplyStatus(ip.IPstatus).name)
            ip.fill('pbname', pb.PBname)

        res = dict(product=ips)
        if common_user() or is_tourist():
            cfg = ConfigSettings()
            rule = cfg.get_item('integralrule', 'rule')
            integral = dict(balance=integral_balance, rule=rule)
            res['integral'] = integral
        return Success(data=res)
Beispiel #2
0
    def get(self):
        """商品详情"""
        args = request.args.to_dict()
        gpid, ggid, gg = args.get('gpid'), args.get('ggid'), None
        if not gpid and not ggid:
            raise ParamsError('gpid | ggid 至少需要其一')
        if ggid:
            gg = GuessGroup.query.filter(GuessGroup.isdelete == False, GuessGroup.GGid == ggid,
                                         # GuessGroup.GGendtime >= datetime.datetime.now()
                                         ).first_('该拼团已结束')
            gpid = gg.GPid
        agree_status = GroupGoodsProduct.GPstatus == ApplyStatus.agree.value
        filter_args = [GroupGoodsProduct.isdelete == False, GroupGoodsProduct.GPid == gpid]

        if common_user() or is_tourist():
            filter_args.append(agree_status)

        try:
            if gg and gg.GGstatus == GuessGroupStatus.completed.value and agree_status in filter_args:
                filter_args.remove(agree_status)

            gp = GroupGoodsProduct.query.filter(*filter_args).first_()
            product = self._fill_gp(gp, gg)
        except Exception as e :
            current_app.logger.error('The error is {}'.format(e))
            raise StatusError("该拼团活动已结束")
        return Success('获取成功', data=product)
Beispiel #3
0
 def batch_upload(self):
     if is_tourist():
         current_app.logger.info(">>>  Tourist Bulk Uploading Files  <<<")
     else:
         current_app.logger.info(">>>  {} Bulk Uploading Files  <<<".format(
             request.user.model))
     self.check_file_size()
     files = request.files.to_dict()
     current_app.logger.info(">>> Uploading {} Files  <<<".format(
         len(files)))
     if len(files) > 30:
         raise ParamsError('最多可同时上传30张图片')
     # todo 视频数量限制
     data = parameter_required()
     folder = self.allowed_folder(data.get('type'))
     file_url_list = []
     for file in files.values():
         upload_file = self._upload_file(file, folder)
         file_dict = {
             'data': upload_file[0],
             'video_thum': upload_file[1],
             'video_dur': upload_file[2],
             'upload_type': upload_file[3]
         }
         file_url_list.append(file_dict)
     return Success('上传成功', file_url_list)
Beispiel #4
0
    def list(self):
        """列出所有场景"""
        now = datetime.now()
        form = SceneListForm().valid_data()
        kw = form.kw.data
        query = ProductScene.query.filter(ProductScene.isdelete == False)
        if kw:
            query = query.filter(ProductScene.PSname.contains(kw))
        scenes = query.order_by(ProductScene.PSsort, ProductScene.createtime).all()
        res = list()
        for scene in scenes:
            if scene.PStimelimited:
                if scene.PSstarttime < now < scene.PSendtime:
                    countdown = scene.PSendtime - now
                    hours = str(countdown.days * 24 + (countdown.seconds // 3600))
                    minutes = str((countdown.seconds % 3600) // 60)
                    seconds = str((countdown.seconds % 3600) % 60)

                    scene.fill('countdown', "{}:{}:{}".format('0' + hours if len(hours) == 1 else hours,
                                                              '0' + minutes if len(minutes) == 1 else minutes,
                                                              '0' + seconds if len(seconds) == 1 else seconds))
                else:
                    if is_tourist() or common_user():
                        continue
            res.append(scene)
        return Success(data=res)
Beispiel #5
0
 def list(self):
     """获取优惠券列表"""
     form = CouponListForm().valid_data()
     itid = form.itid.data
     coupons = Coupon.query.filter(Coupon.isdelete == False)
     usid = suid = adid = None
     if is_supplizer():
         suid = request.user.id
     elif is_admin():
         adid = request.user.id
     elif not is_tourist():
         usid = request.user.id
     if itid:
         coupons = coupons.join(CouponItem,
                                CouponItem.COid == Coupon.COid).filter(
                                    CouponItem.ITid == itid,
                                    CouponItem.isdelete == False)
     if suid:
         coupons = coupons.filter(Coupon.SUid == suid)
     coupons = coupons.order_by(Coupon.createtime.desc(),
                                Coupon.COid).all_with_page()
     for coupon in coupons:
         # 标签
         self._coupon(coupon, usid=usid)
     return Success(data=coupons)
Beispiel #6
0
    def _fill_umsg(self, umsg, is_get=False, urunread=0):
        user = User.query.filter_by(USid=umsg.USid).first()
        admin = Admin.query.filter_by(ADid=umsg.USid).first()
        # unread = 0
        # supplizer = Supplizer.query.filter_by(SUid=umsg.USid).first()
        if not (user or admin):
            head = 'https://pre2.bigxingxing.com/img/logo.png'
            name = '大行星官方'
        else:
            if user:
                head = user['USheader']
                name = user.USname
                if is_get:
                    user.USunread = (user.USunread or 0) - urunread
                    if user.USunread < 0:
                        user.USunread = 0
                # else:
                # user.USunread = (user.USunread or 0) + 1
                # unread = user.USunread
            else:
                head = admin['ADheader']
                name = admin.ADname
                if is_get:
                    admin.ADunread = (admin.ADunread or 0) - urunread
                    if admin.ADunread < 0:
                        admin.ADunread = 0
                # else:
                # admin.ADunread = (admin.ADunread or 0) + 1
                # unread = admin.ADunread

        umsg.fill('head', head)
        if not is_tourist():
            umsg.fill('isself', user.USid == request.user.id)
        umsg.fill('name', name)
        umsg.add('createtime')
 def get(self):
     """商品详情"""
     args = parameter_required(('ipid', ))
     ipid = args.get('ipid')
     filter_args = [
         IntegralProduct.isdelete == False, IntegralProduct.IPid == ipid
     ]
     if common_user() or is_tourist():
         filter_args.append(
             IntegralProduct.IPstatus == ApplyStatus.agree.value)
     ip = IntegralProduct.query.filter(*filter_args).first_("没有找到该商品")
     product = self._fill_ip(ip)
     return Success('获取成功', data=product)
Beispiel #8
0
 def del_news(self):
     """删除资讯"""
     if is_tourist():
         raise TokenError()
     elif is_admin():
         usid = request.user.id
         admin = self._check_admin(usid)
         current_app.logger.info('Admin {0} deleted a news'.format(
             admin.ADname))
     elif is_supplizer():
         usid = request.user.id
         sup = self._check_supplizer(usid)
         current_app.logger.info('Supplizer {0} deleted a news'.format(
             sup.SUname))
     else:
         usid = request.user.id
         user = self.snews.get_user_by_id(usid)
         current_app.logger.info('User {0} deleted a news'.format(
             user.USname))
     data = parameter_required(('neid', ))
     neids = data.get('neid')
     with db.auto_commit():
         for neid in neids:
             news = News.query.filter_by_(NEid=neid).first_('未找到该资讯或已被删除')
             if is_admin():
                 if news.NEstatus != NewsStatus.refuse.value:
                     raise StatusError('只能删除已下架状态的资讯')
             else:
                 if news.USid != usid:
                     raise StatusError('只能删除自己发布的资讯')
             News.query.filter_by(NEid=neid, isdelete=False).delete_()
             NewsTag.query.filter_by(NEid=neid).delete_()  # 删除标签关联
             NewsComment.query.filter_by(NEid=neid).delete_()  # 删除评论
             NewsFavorite.query.filter_by(NEid=neid).delete_()  # 删除点赞
             NewsTrample.query.filter_by(NEid=neid).delete_()  # 删除点踩
             # 如果在审核中,同时取消在进行的审批流
             try:
                 if news.NEstatus == NewsStatus.auditing.value:
                     approval_info = Approval.query.filter_by_(
                         AVcontent=neid,
                         AVstartid=news.USid,
                         AVstatus=ApplyStatus.wait_check.value).first()
                     approval_info.update(
                         {'AVstatus': ApplyStatus.cancle.value})
                     db.session.add(approval_info)
             except Exception as e:
                 current_app.logger.error('删除圈子相关审批流时出错: {}'.format(e))
     return Success('删除成功', {'neid': neids})
Beispiel #9
0
 def upload_img(self):
     if is_tourist():
         current_app.logger.info(">>>  Tourist Uploading Files  <<<")
     else:
         current_app.logger.info(">>>  {} Uploading Files  <<<".format(
             request.user.model))
     self.check_file_size()
     file = request.files.get('file')
     data = parameter_required()
     folder = self.allowed_folder(data.get('type'))
     if not file:
         raise ParamsError(u'上传有误')
     file_data = self._upload_file(file, folder)
     return Success('上传成功',
                    data=file_data[0]).get_body(video_thum=file_data[1],
                                                video_dur=file_data[2],
                                                upload_type=file_data[3])
Beispiel #10
0
    def list(self):
        """获取优惠券列表"""
        form = CouponListForm().valid_data()
        itid = form.itid.data
        coupons = Coupon.query.filter(Coupon.isdelete == false())
        usid = suid = adid = None
        if is_supplizer():
            suid = request.user.id
        elif is_admin():
            adid = request.user.id
        elif not is_tourist():
            usid = request.user.id
        if itid:
            coupons = coupons.join(CouponItem,
                                   CouponItem.COid == Coupon.COid).filter(
                                       CouponItem.ITid == itid,
                                       CouponItem.isdelete == false())

        if suid:
            coupons = coupons.filter(Coupon.SUid == suid)
        coupons = coupons.order_by(
            Coupon.COsort.asc(),
            Coupon.createtime.desc(),
        ).all_with_page()
        return_coupons = list()
        for coupon in coupons:
            # 标签
            if itid and itid == 'home_recommend_category' and usid:
                coupon_user = CouponUser.query.filter(
                    CouponUser.isdelete == false(),
                    CouponUser.COid == coupon.COid,
                    CouponUser.USid == usid).first()
                if coupon_user:
                    current_app.logger.info(
                        'coupon_user ={}'.format(coupon_user))
                    continue
            self._coupon(coupon, usid=usid)

            return_coupons.append(coupon)
        return Success(data=return_coupons)
Beispiel #11
0
 def get_news_comment(self):
     """获取资讯评论"""
     if not is_tourist():
         usid = request.user.id
         if usid:
             user = self.snews.get_user_by_id(usid)
             current_app.logger.info(
                 'User {0} is checking the news commentary'.format(
                     user.USname))
             tourist = 0
     else:
         usid = None
         tourist = 1
     args = parameter_required(('neid', 'page_num', 'page_size'))
     neid = args.get('neid')
     news_comments = self.snews.get_news_comment(
         (NewsComment.NEid == neid, NewsComment.isdelete == False,
          NewsComment.NCparentid.is_(None), NewsComment.NCrootid.is_(None)))
     comment_total_count = NewsComment.query.filter(
         NewsComment.NEid == neid, NewsComment.isdelete == False).count()
     for news_comment in news_comments:
         self._get_one_comment(news_comment, neid, usid)
     return Success(data=news_comments).get_body(
         comment_count=comment_total_count, istourist=tourist)
Beispiel #12
0
    def get_news_content(self):
        """资讯详情"""
        if is_tourist():
            usid = None
            tourist = 1
        elif is_admin():
            usid = request.user.id
            admin = self._check_admin(usid)
            current_app.logger.info(
                'Admin {0} is browsing the news content'.format(admin.ADname))
            tourist = 'admin'
        elif is_supplizer():
            usid = request.user.id
            sup = self._check_supplizer(usid)
            current_app.logger.info(
                'Supplizer {0} is browsing the news content'.format(
                    sup.SUname))
            tourist = 'supplizer'
        else:
            usid = request.user.id
            user = self.snews.get_user_by_id(usid)
            current_app.logger.info(
                'User {0} is browsing the news content'.format(user.USname))
            tourist = 0
        args = parameter_required(('neid', ))
        neid = args.get('neid')
        news = self.snews.get_news_content({'NEid': neid})
        news.fields = [
            'NEid', 'NEtitle', 'NEpageviews', 'NEmainpic', 'NEisrecommend'
        ]

        if re.match(r'^[01]$', str(tourist)):  # 是普通用户或游客
            if news.NEstatus == NewsStatus.usual.value:
                self.snews.update_pageviews(news.NEid)  # 增加浏览量
            else:
                if news.USid != usid:  # 前台查看‘我发布的’ ,也需要获取非上架状态的
                    raise StatusError('该资讯正在审核中,请耐心等待')
                else:
                    pass

        # 点赞数量显示
        if usid:
            is_own = 1 if news.USid == usid else 0
            is_favorite = self.snews.news_is_favorite(neid, usid)
            favorite = 1 if is_favorite else 0
            is_trample = self.snews.news_is_trample(neid, usid)
            trample = 1 if is_trample else 0
        else:
            is_own = 0
            favorite = 0
            trample = 0
        news.fill('is_own', is_own)
        news.fill('is_favorite', favorite)
        news.fill('is_trample', trample)

        # 作者信息
        if news.USheader and news.USname:
            news_author = {'usname': news.USname, 'usheader': news['USheader']}
        else:
            news_author = User.query.filter_by(USid=news.USid).first()
            if news_author:
                news_author.fields = ['USname', 'USheader']
            else:
                news_author = {'usname': '神秘的客官', 'usheader': ''}
        news.fill('author', news_author)
        news.fill('createtime', news.createtime)
        commentnumber = self.snews.get_news_comment_count(neid)
        news.fill('commentnumber', commentnumber)
        favoritnumber = self.snews.get_news_favorite_count(neid)
        news.fill('favoritnumber', favoritnumber)
        tramplenumber = self.snews.get_news_trample_count(neid)
        news.fill('tramplenumber', tramplenumber)

        # 内容填充
        news_content = json.loads(news.NEtext)
        for item in news_content:
            if item.get('type') == 'video' and item['content']:
                item['content']['video'] = self.__verify_get_url([
                    item.get('content')['video'],
                ])[0]
                item['content']['thumbnail'] = self.__verify_get_url([
                    item.get('content')['thumbnail'],
                ])[0]
            elif item.get('type') == 'image' and item['content']:
                item['content'] = self.__verify_get_url(item['content'])
            else:
                continue
        news.fill('netext', news_content)

        # 关联标签
        tags = self.snews.get_item_list((NewsTag.NEid == neid, ))
        if tags:
            [tag.hide('PSid') for tag in tags]
            news.fill('items', tags)

        # 关联的优惠券
        coids = news.COid
        if coids:
            coupon_info = []
            coid_list = json.loads(coids)
            for coid in coid_list:
                coupon = Coupon.query.filter_by_(COid=coid).first()
                if not coupon:
                    continue
                coupon_detail = CCoupon()._title_subtitle(coupon)
                coupon.fill('title_subtitle', coupon_detail)
                coupon_user = CouponUser.query.filter_by_({
                    'USid': usid,
                    'COid': coupon.COid
                }).first() if usid else False
                coupon.fill('ready_collected', bool(coupon_user))
                coupon_info.append(coupon)
            news.fill('coupon', coupon_info)

        # 关联的商品
        prids = news.PRid
        if prids:
            prid_info = []
            prid_list = json.loads(prids)
            for prid in prid_list:
                product = Products.query.filter_by_(PRid=prid).first()
                if not product:
                    continue
                product.fields = [
                    'PRid', 'PRtitle', 'PRprice', 'PRlinePrice', 'PRmainpic'
                ]
                brand = ProductBrand.query.filter_by_(
                    PBid=product.PBid).first()
                product.fill('brand', brand)
                prid_info.append(product)
            news.fill('product', prid_info)

        return Success(data=news).get_body(istourist=tourist)
Beispiel #13
0
 def create(self):
     """添加"""
     if is_admin():
         Admin.query.filter_by_(ADid=request.user.id).first_('账号状态异常')
         current_app.logger.info(">>>  Admin Create a Supplizer  <<<")
     elif is_tourist():
         current_app.logger.info(
             ">>>  Tourist Uploading Supplizer Files  <<<")
     else:
         raise AuthorityError('无权限')
     form = SupplizerCreateForm().valid_data()
     pbids = form.pbids.data
     suid = str(uuid.uuid1())
     if is_admin():
         sustatus = UserStatus.usual.value
         sudeposit = form.sudeposit.data
     else:
         sustatus = UserStatus.auditing.value
         sudeposit = 0
     supassword = generate_password_hash(
         form.supassword.data) if form.supassword.data else None
     try:
         with db.auto_commit():
             supperlizer = Supplizer.create({
                 'SUid':
                 suid,
                 'SUlinkPhone':
                 form.sulinkphone.data,
                 'SUloginPhone':
                 form.suloginphone.data,
                 'SUname':
                 form.suname.data,
                 'SUlinkman':
                 form.sulinkman.data,
                 'SUbaseRate':
                 form.subaserate.data,
                 'SUaddress':
                 form.suaddress.data,
                 'SUdeposit':
                 sudeposit,
                 'SUstatus':
                 sustatus,  # 管理员添加的可直接上线
                 'SUbanksn':
                 form.subanksn.data,
                 'SUbankname':
                 form.subankname.data,
                 'SUpassword':
                 supassword,
                 'SUheader':
                 form.suheader.data,
                 'SUcontract':
                 form.sucontract.data,
                 'SUbusinessLicense':
                 form.subusinesslicense.data,
                 'SUregisteredFund':
                 form.suregisteredfund.data,
                 'SUmainCategory':
                 form.sumaincategory.data,
                 'SUregisteredTime':
                 form.suregisteredtime.data,
                 'SUlegalPerson':
                 form.sulegalperson.data,
                 'SUemail':
                 form.suemail.data,
                 'SUlegalPersonIDcardFront':
                 form.sulegalpersonidcardfront.data,
                 'SUlegalPersonIDcardBack':
                 form.sulegalpersonidcardback.data,
             })
             db.session.add(supperlizer)
             if is_admin():
                 BASEADMIN().create_action(AdminActionS.insert.value,
                                           'Supplizer', suid)
             if pbids:
                 for pbid in pbids:
                     product_brand = ProductBrand.query.filter(
                         ProductBrand.isdelete == False,
                         ProductBrand.PBid == pbid).first()
                     if not product_brand:
                         raise NotFound('品牌不存在')
                     if product_brand.SUid:
                         raise DumpliError('品牌已有供应商')
                     product_brand.SUid = supperlizer.SUid
                     db.session.add(product_brand)
             if sudeposit and is_admin():
                 SupplizerDepositLog.create({
                     'SDLid': str(uuid.uuid1()),
                     'SUid': suid,
                     'SDLnum': Decimal(sudeposit),
                     'SDafter': Decimal(sudeposit),
                     'SDbefore': 0,
                     'SDLacid': request.user.id,
                 })
                 BASEADMIN().create_action(AdminActionS.insert.value,
                                           'SupplizerDepositLog',
                                           str(uuid.uuid1()))
     except IntegrityError:
         raise ParamsError('手机号重复')
     return Success('创建成功', data={'suid': supperlizer.SUid})
    def get_commodity_list(self):
        if is_tourist():
            usid = None
            tourist = 1
            time_filter = (TrialCommodity.AgreeStartTime <= date.today(),
                           TrialCommodity.AgreeEndTime >= date.today(),
                           TrialCommodity.TCstocks > 0)
        elif is_admin():
            usid = request.user.id
            admin = self._check_admin(usid)
            current_app.logger.info('Admin {0} get commodity list'.format(
                admin.ADname))
            tourist = 'admin'
            time_filter = tuple()
        elif is_supplizer():
            usid = request.user.id
            sup = self._check_supplizer(usid)
            current_app.logger.info('Supplizer {} get commodity list'.format(
                sup.SUname))
            time_filter = (TrialCommodity.CreaterId == usid, )
            tourist = 'supplizer'
        else:
            usid = request.user.id
            user = self._verify_user(usid)
            current_app.logger.info('User {0} get commodity list'.format(
                user.USname))
            tourist = 0
            time_filter = (TrialCommodity.AgreeStartTime <= date.today(),
                           TrialCommodity.AgreeEndTime >= date.today(),
                           TrialCommodity.TCstocks > 0)

        args = parameter_required(('page_num', 'page_size'))
        kw = args.get('kw')
        tcstatus = args.get('tcstatus', 'upper')
        if str(tcstatus) not in [
                'upper', 'auditing', 'reject', 'cancel', 'sell_out', 'all'
        ]:
            raise ParamsError('tcstatus, 参数错误')
        tcstatus = getattr(TrialCommodityStatus, tcstatus).value
        commodity_query = TrialCommodity.query.filter(
            TrialCommodity.isdelete == False)
        commodity_query = commodity_query.join(
            ProductBrand, ProductBrand.PBid == TrialCommodity.PBid).filter(
                ProductBrand.isdelete == False,
                ProductBrand.PBstatus == ProductBrandStatus.upper.value)
        if tcstatus is not None:
            commodity_query = commodity_query.filter(
                TrialCommodity.TCstatus == tcstatus)
        if time_filter:
            commodity_query = commodity_query.filter(*time_filter)
        if kw:
            commodity_query = commodity_query.filter(
                or_(ProductBrand.PBname.contains(kw),
                    TrialCommodity.TCtitle.contains(kw)))
        # commodity_list = TrialCommodity.query.filter_(or_(and_(*[TrialCommodity.TCtitle.contains(x) for x in kw]),
        #                                                   and_(*[ProductBrand.PBname.contains(x) for x in kw]),
        #                                                   ),
        #                                               TrialCommodity.isdelete == False,
        #                                               TrialCommodity.TCstatus == tcstatus,
        #                                               *time_filter).order_by(TrialCommodity.createtime.desc()).all_with_page()
        commodity_list = commodity_query.order_by(
            TrialCommodity.createtime.desc()).all_with_page()
        for commodity in commodity_list:
            commodity.hide('TCrejectReason')
            if commodity.TCstatus == TrialCommodityStatus.reject.value:
                reason = commodity.TCrejectReason or '不符合审核规定,请修改后重新提交'
                commodity.fill("reject_reason", reason)
            commodity.fill(
                "zh_remarks",
                "{0}天{1}元".format(commodity.TCdeadline,
                                  round(float(commodity.TCdeposit), 2)))
            prbrand = ProductBrand.query.filter_by_(
                PBid=commodity.PBid).first()
            commodity.fill('brand', prbrand)
            commodity.TCattribute = json.loads(commodity.TCattribute)
            if commodity.TCstatus == TrialCommodityStatus.upper.value and commodity.TCstocks <= 0:
                status = TrialCommodityStatus.sell_out.zh_value
            else:
                status = TrialCommodityStatus(commodity.TCstatus).zh_value
            commodity.fill('zh_tcstatus', status)
            commodity.hide('CreaterId', 'PBid')
        background = Activity.query.filter_by_(
            ACtype=ActivityType.free_use.value, ACshow=True).first()
        banner = background["ACtopPic"] if background else ""
        remarks = getattr(background, "ACdesc",
                          "体验专区") if background else "体验专区"
        data = {
            "banner": banner,
            "remarks": remarks,
            "commodity": commodity_list
        }
        return Success(data=data).get_body(tourist=tourist)
    def get_commodity(self):
        if is_tourist():
            usid = None
            tourist = 1
        elif is_admin():
            usid = request.user.id
            admin = self._check_admin(usid)
            current_app.logger.info('Admin {} get commodity details'.format(
                admin.ADname))
            tourist = 'admin'
        elif is_supplizer():
            usid = request.user.id
            sup = self._check_supplizer(usid)
            current_app.logger.info(
                'Supplizer {} get commodity details'.format(sup.SUname))
            tourist = 'supplizer'
        else:
            usid = request.user.id
            user = self._verify_user(usid)
            current_app.logger.info('User {} get commodity details'.format(
                user.USname))
            tourist = 0
        args = parameter_required(('tcid', ))
        tcid = args.get('tcid')
        commodity = TrialCommodity.query.filter_(
            TrialCommodity.TCid == tcid,
            TrialCommodity.isdelete == False).first_('未找到商品信息, tcid参数异常')
        commodity.TCattribute = json.loads(
            getattr(commodity, 'TCattribute') or '[]')
        commodity.TCstatus = TrialCommodityStatus(commodity.TCstatus).zh_value
        # 品牌
        brand = ProductBrand.query.filter_by_(PBid=commodity.PBid,
                                              isdelete=False).first()
        if brand:
            brand.hide('PBlinks', 'PBbackgroud')
        commodity.fill('brand', brand)
        # 商品图片
        image_list = TrialCommodityImage.query.filter_by_(
            TCid=tcid, isdelete=False).all()
        [image.hide('TCid') for image in image_list]
        commodity.fill('image', image_list)
        commodity.fill('zh_deadline', '{}天'.format(commodity.TCdeadline))
        # 填充sku
        skus = TrialCommoditySku.query.filter_by_(TCid=tcid).all()
        sku_value_item = []
        for sku in skus:
            sku.SKUattriteDetail = json.loads(
                getattr(sku, 'SKUattriteDetail') or '[]')
            sku.SKUprice = commodity.TCdeposit
            sku_value_item.append(sku.SKUattriteDetail)
        commodity.fill('skus', skus)
        # 拼装skuvalue
        sku_value_instance = TrialCommoditySkuValue.query.filter_by_(
            TCid=tcid).first()
        if not sku_value_instance:
            sku_value_item_reverse = []
            for index, name in enumerate(commodity.TCattribute):
                value = list(
                    set([attribute[index] for attribute in sku_value_item]))
                value = sorted(value)
                combination = {'name': name, 'value': value}
                sku_value_item_reverse.append(combination)
        else:
            sku_value_item_reverse = []
            tskuvalue = json.loads(sku_value_instance.TSKUvalue)
            for index, value in enumerate(tskuvalue):
                sku_value_item_reverse.append({
                    'name':
                    commodity.TCattribute[index],
                    'value':
                    value
                })

        commodity.fill('skuvalue', sku_value_item_reverse)
        return Success(data=commodity).get_body(tourist=tourist)
Beispiel #16
0
    def get(self):
        form = ActivityGetForm().valid_data()
        act_instance = form.activity
        ac_type = ActivityType(form.actype.data).name
        mbjid = form.mbjid.data
        mbaid = None
        if not mbjid:
            usid = None if is_tourist() else request.user.id
        else:
            magic_box_join = MagicBoxJoin.query.filter_by({'MBJid': mbjid}).first()
            if magic_box_join:
                usid = magic_box_join.USid
                mbaid = magic_box_join.MBAid
            else:
                usid = None if is_tourist() else request.user.id

        today = date.today()
        act_instance.hide('ACid', 'ACbackGround', 'ACbutton', 'ACtopPic')
        if ac_type == 'magic_box':  # 魔盒
            if not mbjid:
                query = db.session.query(Products, MagicBoxApply).join(
                    ProductSku, ProductSku.PRid == Products.PRid
                ).join(
                    MagicBoxApply, MagicBoxApply.SKUid == ProductSku.SKUid
                ).filter_(
                    MagicBoxApply.AgreeStartime <= today,
                    MagicBoxApply.AgreeEndtime >= today,
                    MagicBoxApply.isdelete == False,
                )
                if not is_admin() and not is_supplizer():
                    query = query.filter(
                        MagicBoxApply.MBAstatus == ApplyStatus.agree.value,
                   )
                product, magic_apply = query.first_('活动未在进行中')
                mbaid = magic_apply.MBAid
            else:
                magic_box_join = MagicBoxJoin.query.filter(
                    MagicBoxJoin.isdelete == False,
                    MagicBoxJoin.MBJid == mbjid,
                ).first_('活动不存在')
                product, magic_apply = db.session.query(Products, MagicBoxApply).join(
                    ProductSku, ProductSku.PRid == Products.PRid
                ).join(
                    MagicBoxApply, MagicBoxApply.SKUid == ProductSku.SKUid
                ).filter_(
                    # MagicBoxApply.AgreeStartime <= today,
                    # MagicBoxApply.AgreeEndtime >= today,
                    MagicBoxApply.MBAid == magic_box_join.MBAid,
                    MagicBoxApply.isdelete == False
                ).first_('活动不存在')

            act_instance.fill('prpic', product.PRmainpic)
            magic_apply.fileds = [
                'SKUprice', 'SKUminPrice', 'Gearsone',
                'Gearstwo', 'Gearsthree', 'AgreeStartime',
                'AgreeEndtime', 'MBAid', 'SKUprice', 'SKUminPrice'
            ]
            magic_apply.Gearsone = json.loads(magic_apply.Gearsone or '[]')
            magic_apply.Gearstwo = json.loads(magic_apply.Gearstwo or '[]')
            magic_apply.Gearsthree = json.loads(magic_apply.Gearsthree or '[]')
            act_instance.fill('infos', magic_apply)
            # 当前价格
            if usid is not None:
                magic_box_join = MagicBoxJoin.query.filter_by_({
                    'MBAid': mbaid,
                    'USid': usid
                }).first()

                if magic_box_join:
                    magic_apply.fill('current_price', magic_box_join.MBJcurrentPrice)
                    # 判断是否是自己的盒子:
                    if not is_tourist() and request.user.id == magic_box_join.USid:
                        can_buy = True
                    else:
                        can_buy = False
                    magic_apply.fill('can_buy', can_buy)
                    # 拆盒记录
                    mbp_history = MagicBoxOpen.query.filter_by_({'MBJid': magic_box_join.MBJid}).order_by(MagicBoxOpen.createtime.desc()).limit(4).all()
                    magic_apply.fill('open_history', mbp_history)

        # todo 是否需要判断前后台
        elif ac_type == 'guess_num':
            # apply = Products.query.join(
            #     ProductSku, Products.PRid == ProductSku.PRid
            # ).join(
            #     GuessNumAwardApply, GuessNumAwardApply.SKUid == ProductSku.SKUid
            # ).filter_(
            #     GuessNumAwardApply.AgreeStartime <= today,
            #     GuessNumAwardApply.AgreeEndtime >= today,
            #     MagicBoxApply.isdelete == False,
            # ).first_('活动未在进行')
            # apply = GuessNumAwardApply.query.filter_by(
            #     GuessNumAwardApply.GNAAstarttime <= today,
            #     GuessNumAwardApply.GNAAendtime >= today).order_by(
            #     GuessNumAwardApply.createtime.desc()).first_('活动未进行')
            #
            # gnap = GuessNumAwardProduct.query.filter_by(GNAAid=apply.GNAAid, isdelete=False).first_('活动未进行')
            apply = GuessNumAwardProduct.query.filter(
                    GuessNumAwardProduct.GNAAid == GuessNumAwardApply.GNAAid,
                    GuessNumAwardApply.isdelete == False,
                    GuessNumAwardProduct.isdelete == False,
                    GuessNumAwardApply.GNAAstarttime <= today,
                    GuessNumAwardApply.GNAAendtime >= today
                ).order_by(GuessNumAwardApply.createtime.desc()).first_('活动未进行')
            act_instance.ACdesc = act_instance.ACdesc.split('|')
            act_instance.fill('prpic', apply.PRmainpic)
        return Success(data=act_instance)
Beispiel #17
0
    def get(self):
        """商品/盒子详情"""
        args = request.args.to_dict()
        mbaid, mbjid, mbj = args.get('mbaid'), args.get('mbjid'), None
        if not mbaid and not mbjid:
            raise ParamsError(' mbaid / mbjid 至少需要其一')
        if mbjid:
            mbj = MagicBoxJoin.query.filter(
                MagicBoxJoin.MBJid == mbjid,
                MagicBoxJoin.isdelete == False).first_('该礼盒活动已结束')
            mbaid = mbj.MBAid

        agree_status = MagicBoxApply.MBAstatus == ApplyStatus.agree.value
        filter_args = [
            MagicBoxApply.isdelete == False, MagicBoxApply.MBAid == mbaid
        ]
        if common_user() or is_tourist():
            filter_args.append(agree_status)
        try:
            if mbj and mbj.MBJstatus == MagicBoxJoinStatus.completed.value and agree_status in filter_args:
                filter_args.remove(agree_status)
            mba = MagicBoxApply.query.filter(*filter_args).first_('该礼盒商品已下架')
            product = self._fill_mba(mba)
        except Exception as e:
            current_app.logger.error('The error is {}'.format(e))
            raise StatusError('该礼盒商品已下架')

        product.fill(
            'rules',
            db.session.query(Activity.ACdesc).filter_by_(
                ACtype=ActivityType.magic_box.value).scalar())
        currentprice = records = have_paid = trade = lowest = None
        if mbj:
            # 有mbj 的情况下,重新显示 可购 原价 当前价 最低价
            currentprice = mbj.MBJcurrentPrice
            product.fill('PRprice', mbj.MBJprice)
            product.fill('mbjid', mbj.MBJid)
            product.fill('mbjstatus', mbj.MBJstatus)
            product.fill('mbjstatus_en',
                         MagicBoxJoinStatus(mbj.MBJstatus).name)
            product.fill('mbjstatus_zh',
                         MagicBoxJoinStatus(mbj.MBJstatus).zh_value)
            product.fill('mbadeposit', mbj.LowestPrice)  # 押金 (最低价)
            product.fill('purchaseprice', mbj.HighestPrice)  # 可购价
            product.fill('selectedsku', mbj.MBSid)  # 已选的sku
            spreadprice = None
            records = MagicBoxOpen.query.filter_by_(MBJid=mbj.MBJid).order_by(
                MagicBoxOpen.createtime.asc()).all()

            if common_user():
                if ActivityDeposit.query.filter(
                        ActivityDeposit.isdelete == False,
                        ActivityDeposit.ACtype == ActivityType.magic_box.value,
                        ActivityDeposit.ACDstatus ==
                        ActivityDepositStatus.valid.value,
                        ActivityDeposit.ACDcontentId == mbaid,
                        ActivityDeposit.ACDid == mbj.ACDid,
                        ActivityDeposit.USid == request.user.id).first():
                    have_paid = True
                spreadprice = float(currentprice) - float(mbj.LowestPrice)
                lowest = True if spreadprice <= 0 else False
                trade = True if currentprice <= mbj.HighestPrice else False
                spreadprice = 0 if spreadprice <= 0 else round(spreadprice, 2)

            product.fill('spreadprice', spreadprice)  # 需要补的差价

            gearlevel = {'1': 'A', '2': 'B', '3': 'C'}

            for mbjr in records:
                mbjr.fields = ['MBJid', 'createtime', 'USheader']
                action = MagicBoxOpenAction(mbjr.MBOaction).zh_value
                record_str = '{}帮拆礼盒{}, {}{}元, 当前{}元'.format(
                    mbjr.USname, gearlevel.get(str(mbjr.MBOgear)), action,
                    mbjr.MBOresult, mbjr.MBOprice)
                if mbjr.MBOresult == 0:
                    if mbjr.MBOaction == MagicBoxOpenAction.increase.value:
                        record_str = '{}帮拆礼盒{},已是最高价,增加了0元,当前{}元'.format(
                            mbjr.USname, gearlevel.get(str(mbjr.MBOgear)),
                            mbjr.MBOprice)
                    else:
                        record_str = '{}帮拆礼盒{},已是最低价,减少了0元,当前{}元'.format(
                            mbjr.USname, gearlevel.get(str(mbjr.MBOgear)),
                            mbjr.MBOprice)

                mbjr.fill('record_str', record_str)
        product.fill('currentprice', currentprice)
        product.fill('records', records)

        product.fill('topaydeposit', bool(not have_paid))  # 是否已付押金
        product.fill('trade', bool(trade))  # 是否可以购买
        product.fill('lowest', bool(lowest))  # 是否已达最大优惠

        return Success(data=product)
Beispiel #18
0
    def _fill_gp(self, gp, gg=None):
        product = Products.query.filter(Products.PRid == gp.PRid, Products.isdelete == False).first_('商品已下架')
        product.fields = ['PRid', 'PRtitle', 'PRprice', 'PRlinePrice', 'PRsalesValue', 'PRstatus', 'PRmainpic',
                          'PRattribute', 'PRdesc', 'PRdescription']
        if isinstance(product.PRattribute, str):
            product.PRattribute = json.loads(product.PRattribute)
        if isinstance(getattr(product, 'PRremarks', None) or '{}', str):
            product.PRremarks = json.loads(getattr(product, 'PRremarks', None) or '{}')

        pb = ProductBrand.query.filter_by(PBid=product.PBid, isdelete=False).first()
        pb.fields = ['PBname', 'PBid']

        images = ProductImage.query.filter(
            ProductImage.PRid == product.PRid, ProductImage.isdelete == False).order_by(
            ProductImage.PIsort).all()
        [img.hide('PRid') for img in images]
        product.fill('images', images)
        product.fill('brand', pb)
        gps_list = GroupGoodsSku.query.filter_by(GPid=gp.GPid, isdelete=False).all()
        gpsku_price = []
        skus = []
        sku_value_item = []
        for gps in gps_list:
            gpsku_price.append(round(float(gps.SKUPrice), 2))
            sku = ProductSku.query.filter_by(SKUid=gps.SKUid, isdelete=False).first()
            if not sku:
                current_app.logger.info('该sku已删除 skuid = {0}'.format(gps.SKUid))
                continue
            sku.hide('SKUstock', 'SkudevideRate', 'PRid')
            sku.fill('skuprice', gps.SKUPrice)
            sku.fill('gsstock', gps.GSstock)
            sku.fill('gsid', gps.GSid)

            if isinstance(sku.SKUattriteDetail, str):
                sku.SKUattriteDetail = json.loads(sku.SKUattriteDetail)
            sku_value_item.append(sku.SKUattriteDetail)
            skus.append(sku)
        if not skus:
            current_app.logger.info('该申请的商品没有sku prid = {0}'.format(product.PRid))
            return
        product.fill('skus', skus)
        sku_value_item_reverse = []
        for index, name in enumerate(product.PRattribute):
            value = list(set([attribute[index] for attribute in sku_value_item]))
            value = sorted(value)
            temp = {
                'name': name,
                'value': value
            }
            sku_value_item_reverse.append(temp)
        product.fill('skuvalue', sku_value_item_reverse)
        product.fill('gpstatus_zh', ApplyStatus(gp.GPstatus).zh_value)
        product.fill('gpstatus_en', ApplyStatus(gp.GPstatus).name)
        product.fill('gpstatus', gp.GPstatus)
        product.fill('gpdeposit', max(gpsku_price))  # 显示的押金
        product.fill('gprejectreason', gp.GPrejectReason)
        product.fill('gpid', gp.GPid)
        product.fill('gpday', gp.GPday)
        product.fill('gpfreight', gp.GPfreight)  # 运费目前默认为0
        # if not gg:
        #     gg_query = GuessGroup.query.filter(GuessGroup.isdelete == False,
        #                                        GuessGroup.GPid == gp.GPid,
        #                                        GuessGroup.GGendtime >= datetime.datetime.now(),
        #                                        GuessGroup.GGstatus == GuessGroupStatus.pending.value)
        #     if common_user():
        #         gg_query = gg_query.outerjoin(GuessRecord, GuessRecord.GGid == GuessGroup.GGid
        #                                       ).filter(GuessRecord.isdelete == False,
        #                                                GuessRecord.USid == request.user.id,
        #                                                GuessRecord.GRstatus == GuessRecordStatus.valid.value)
        #     gg = gg_query.first()

        if common_user() or is_tourist():
            headers, numbers = self._fill_number_and_headers(gg)
            status = getattr(gg, 'GGstatus', None)
            ggstatus_zh = GuessGroupStatus(status).zh_value if isinstance(status, int) else None
            tradeprice = None
            if gg and status == GuessGroupStatus.completed.value:
                tradeprice = db.session.query(OrderMain.OMtrueMount).outerjoin(
                    GuessRecord, GuessRecord.OMid == OrderMain.OMid
                ).filter(OrderMain.isdelete == False, GuessRecord.isdelete == False, GuessRecord.GGid == gg.GGid,
                         OrderMain.USid == request.user.id, GuessRecord.GRstatus == GuessRecordStatus.valid.value,
                         ).scalar() if common_user() else None
                ggstatus_zh = '本期正确结果: {}'.format(gg.GGcorrectNum) if common_user() else ggstatus_zh

            guess_group = {'ggid': getattr(gg, 'GGid', None),
                           'ggstatus': status,
                           'ggstatus_en': GuessGroupStatus(status).name if isinstance(status, int) else None,
                           'ggstatus_zh': ggstatus_zh,
                           'headers': headers,
                           'numbers': numbers,
                           'tradeprice': tradeprice,
                           'rules': db.session.query(Activity.ACdesc
                                                     ).filter_by_(ACtype=ActivityType.guess_group.value).scalar()
                           }
            product.fill('guess_group', guess_group)
            have_paid = self.verify_have_paid(gp, gg)
            usid = request.user.id if common_user() else None
            joined = self._already_joined(gg, usid)
            if gg and gg.GGstatus != GuessGroupStatus.pending.value:
                have_paid = True
                joined = True
            product.fill('topaydeposit', bool(not have_paid))
            product.fill('joined', bool(joined))
        return product
Beispiel #19
0
    def list(self):
        """获取正在进行中的活动"""
        # 判断是否是新人, 没有已付款的订单则为新人
        if is_tourist():
            exists_order = False
            filter_kwargs = dict(ACshow=True)
        elif is_admin():
            exists_order = False
            filter_kwargs = dict()
        else:
            usid = request.user.id
            exists_order = OrderMain.query.filter_(OrderMain.USid == usid,
                                                   OrderMain.OMstatus > OrderMainStatus.wait_pay.value
                                                   ).first()
            filter_kwargs = dict(ACshow=True)
        # if exists_order:
        #     activitys = Activity.query.filter_(Activity.ACtype != ActivityType.fresh_man.value,
        #                                        Activity.ACshow == True,
        #                                        Activity.isdelete == False
        #                                        ).order_by(Activity.ACsort).all()
        # else:
        activitys = Activity.query.filter_by_(filter_kwargs).order_by(Activity.ACsort).all()
        result = []
        today = date.today()
        for act in activitys:
            act.fields = ['ACbackGround', 'ACbutton', 'ACtype', 'ACname', 'ACshow', 'ACsort', 'ACdesc', 'ACtopPic']
            act.fill('actype_zh', ActivityType(act.ACtype).zh_value)
            # 活动是否有供应商参与
            if ActivityType(act.ACtype).name == 'guess_num':

                guess_num_count = GuessNumAwardProduct.query.filter(
                    GuessNumAwardProduct.GNAAid == GuessNumAwardApply.GNAAid,
                    GuessNumAwardApply.GNAAstatus == ApplyStatus.agree.value,
                    GuessNumAwardApply.isdelete == False,
                    GuessNumAwardProduct.isdelete == False,
                    GuessNumAwardApply.GNAAstarttime <= today,
                    GuessNumAwardApply.GNAAendtime >= today
                ).count()
                act.fill('prcount', guess_num_count)
            elif ActivityType(act.ACtype).name == 'magic_box':
                magic_box_count = MagicBoxApply.query.filter(
                    MagicBoxApply.isdelete == False,
                    MagicBoxApply.MBAstatus == ApplyStatus.agree.value,
                    MagicBoxApply.MBAday <= today
                ).count()
                act.fill('prcount', magic_box_count)
            elif ActivityType(act.ACtype).name == 'free_use':
                free_use_count = TrialCommodity.query.filter(
                    TrialCommodity.TCstatus == TrialCommodityStatus.upper.value,
                    TrialCommodity.AgreeStartTime <= today,
                    TrialCommodity.AgreeEndTime >= today,
                    TrialCommodity.TCstocks > 0
                ).count()
                act.fill('prcount', free_use_count)
            elif ActivityType(act.ACtype).name == 'fresh_man':
                fresh_man_count = FreshManFirstProduct.query.join(
                    FreshManFirstApply, FreshManFirstProduct.FMFAid == FreshManFirstApply.FMFAid
                ).filter_(
                    FreshManFirstProduct.isdelete == False,
                    FreshManFirstApply.AgreeStartime <= today,
                    FreshManFirstApply.AgreeEndtime >= today,
                    FreshManFirstApply.FMFAstatus == ApplyStatus.agree.value,
                ).count()
                act.fill('prcount', fresh_man_count)
            elif ActivityType(act.ACtype).name == 'guess_group':
                gg_count = GroupGoodsProduct.query.filter(GroupGoodsProduct.isdelete == False,
                                                          GroupGoodsProduct.GPstatus == ApplyStatus.agree.value,
                                                          GroupGoodsProduct.GPday == today
                                                          ).count()
                act.fill('prcount', gg_count)
            else:
                act.fill('prcount', 0)
            if is_admin():
                result = activitys
            else:
                if ActivityType(act.ACtype).name == 'guess_num':
                    lasting = GuessNumAwardApply.query.filter(
                        GuessNumAwardApply.isdelete == False,
                        GuessNumAwardApply.GNAAstatus == ApplyStatus.agree.value,
                        GuessNumAwardApply.AgreeStartime <= today,
                        GuessNumAwardApply.AgreeEndtime >= today,
                        ).all()
                    if lasting:
                        result.append(act)
                elif ActivityType(act.ACtype).name == 'magic_box':
                    lasting = MagicBoxApply.query.filter(
                        MagicBoxApply.isdelete == False,
                        MagicBoxApply.MBAstatus == ApplyStatus.agree.value,
                        MagicBoxApply.MBAday <= today
                    ).first()
                    if lasting:
                        result.append(act)
                elif ActivityType(act.ACtype).name == 'free_use':
                    lasting = TrialCommodity.query.filter(TrialCommodity.TCstatus == TrialCommodityStatus.upper.value,
                                                          TrialCommodity.AgreeStartTime <= today,
                                                          TrialCommodity.AgreeEndTime >= today,
                                                          TrialCommodity.TCstocks > 0,
                                                          TrialCommodity.isdelete == False
                                                          ).first()
                    if lasting:
                        result.append(act)
                else:
                    result.append(act)
        return Success(data=result)
Beispiel #20
0
    def get_all_news(self):
        if is_tourist():
            usid = None
            tourist = 1
        elif is_admin():
            usid = request.user.id
            admin = self._check_admin(usid)
            current_app.logger.info(
                'Admin {0} is browsing the list of news'.format(admin.ADname))
            tourist = 'admin'
        elif is_supplizer():
            usid = request.user.id
            sup = self._check_supplizer(usid)
            current_app.logger.info(
                'Supplizer {0} is browsing the list of news'.format(
                    sup.SUname))
            tourist = 'supplizer'
        else:
            usid = request.user.id
            user = self.snews.get_user_by_id(usid)
            current_app.logger.info(
                'User {0} is browsing the list of news'.format(user.USname))
            tourist = 0

        args = parameter_required(('page_num', 'page_size'))
        itid = args.get('itid')
        kw = args.get('kw', '').split() or ['']  # 关键词
        nestatus = args.get('nestatus') or 'usual'
        nestatus = getattr(NewsStatus, nestatus).value
        userid = None
        isrecommend = None
        if str(itid) == 'mynews':
            if not usid:
                raise TokenError('未登录')
            userid = usid
            itid = None
            nestatus = None
        elif is_supplizer():
            userid = usid
        elif str(itid) == 'isrecommend':
            isrecommend = True
            itid = None
        news_list = self.snews.get_news_list([
            or_(and_(*[News.NEtitle.contains(x)
                       for x in kw]), ),  # todo 暂更改为只匹配标题
            NewsTag.ITid == itid,
            News.NEstatus == nestatus,
            News.USid == userid,
            News.NEisrecommend == isrecommend,
        ])
        for news in news_list:
            news.fields = ['NEid', 'NEtitle', 'NEpageviews', 'createtime']
            # 添加发布者信息
            auther = news.USname or ''
            if news.NEfrom == ApplyFrom.platform.value:
                news.fill('authername', '{} (管理员)'.format(auther))
            elif news.NEfrom == ApplyFrom.supplizer.value:
                news.fill('authername', '{} (供应商)'.format(auther))
            else:
                news.fill('authername', '{} (用户)'.format(auther))
            if news.NEstatus == NewsStatus.usual.value and not (
                    is_admin() or is_supplizer()):
                self.snews.update_pageviews(news.NEid)  # 增加浏览量
            # 显示点赞状态
            if usid:
                is_favorite = self.snews.news_is_favorite(news.NEid, usid)
                favorite = 1 if is_favorite else 0
                is_own = 1 if news.USid == usid else 0
            else:
                favorite = 0
                is_own = 0
            news.fill('is_favorite', favorite)
            news.fill('is_own', is_own)
            # 显示审核状态
            if userid or is_admin():
                news.fill('zh_nestatus', NewsStatus(news.NEstatus).zh_value)
                news.fill('nestatus', NewsStatus(news.NEstatus).name)
                if news.NEstatus == NewsStatus.refuse.value:
                    reason = news.NErefusereason or '因内容不符合规定,审核未通过,建议修改后重新发布'
                    news.fill('refuse_info', reason)
            # 点赞数 评论数
            commentnumber = self.snews.get_news_comment_count(news.NEid)
            news.fill('commentnumber', commentnumber)
            favoritnumber = self.snews.get_news_favorite_count(news.NEid)
            news.fill('favoritnumber', favoritnumber)

            # 获取内容
            new_content = news.NEtext
            try:
                new_content = json.loads(new_content)
            except Exception as e:
                current_app.logger.error(
                    '内容转换json失败 NEid: {} ; ERROR >>> {} '.format(news.NEid, e))
                continue
            video_index, image_index, text_index = list(), list(), list()
            for index, item in enumerate(new_content):
                if item.get('type') == 'video':
                    video_index.append(index)
                elif item.get('type') == 'image':
                    image_index.append(index)
                elif item.get('type') == 'text':
                    text_index.append(index)

            if news.NEmainpic:
                showtype = 'picture'
                news.fill('mainpic', news['NEmainpic'])
            elif len(video_index):
                showtype = 'video'
                video_url = new_content[video_index[0]].get('content')['video']
                video_url = self.__verify_get_url([
                    video_url,
                ])[0]
                news.fill('video', video_url)
                thumbnail_url = new_content[video_index[0]].get(
                    'content')['thumbnail']
                thumbnail_url = self.__verify_get_url([
                    thumbnail_url,
                ])[0]
                news.fill('videothumbnail', thumbnail_url)
                news.fill(
                    'videoduration',
                    new_content[video_index[0]].get('content')['duration'])
            elif len(image_index):
                showtype = 'picture'
                pic_url = new_content[image_index[0]].get('content')[0]
                pic_url = self.__verify_get_url([
                    pic_url,
                ])[0]
                news.fill('mainpic', pic_url)
            else:
                showtype = 'text'
                news.fill(
                    'netext',
                    new_content[text_index[0]].get('content')[:100] + ' ...')
            news.fill('showtype', showtype)

            # 作者信息
            if news.USheader:
                usheader = news['USheader']
            else:
                usinfo = self.fill_user_info(news.USid)
                usheader = usinfo['USheader']
            news.fill('usheader', usheader)
        # 增加搜索记录
        if kw not in self.empty and usid:
            with self.snews.auto_commit() as s:
                instance = UserSearchHistory.create({
                    'USHid': str(uuid.uuid4()),
                    'USid': request.user.id,
                    'USHname': ' '.join(kw),
                    'USHtype': 10
                })
                s.add(instance)
        return Success(data=news_list).get_body(istourst=tourist)