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)
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)
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)
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)
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)
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)
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})
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])
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)
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)
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)
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)
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)
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)
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
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)
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)