def get_platform_message(self):
        data = parameter_required()
        filter_args = {PlatformMessage.isdelete == False}
        if common_user():
            filter_args.add(
                PlatformMessage.PMstatus == PlanetMessageStatus.publish.value)
        if is_supplizer():
            filter_args.add(PlatformMessage.PMcreate == request.user.id)

        if data.get('PMstatus', None) is not None:
            filter_args.add(PlatformMessage.PMstatus == data.get('pmstatus'))

        pm_list = PlatformMessage.query.filter(*filter_args).order_by(
            PlatformMessage.createtime.desc()).all_with_page()
        for pm in pm_list:
            self._fill_pm(pm)
            if common_user():
                self._fill_um(pm, request.user.id)
            else:
                um_read_count = UserPlatfromMessage.query.filter(
                    UserPlatfromMessage.isdelete == False,
                    UserPlatfromMessage.PMid == pm.PMid,
                    UserPlatfromMessage.UPMstatus ==
                    UserPlanetMessageStatus.read.value).count()
                pm.fill('pmreadcount', um_read_count)

        return Success(data=pm_list)
Exemple #2
0
    def _fill_raiders_list(raiders):
        """攻略列表"""
        raiders.fields = ['TRid']
        raiders.fill('trtitle', '{}游玩攻略'.format(raiders.TRlocation))
        author = User.query.filter_by_(USid=raiders.AuthorID).first()
        author_info = None if not author else {
            'usname': author.USname,
            'usheader': author.USheader,
            'usid': author.USid,
            'usminilevel': MiniUserGrade(author.USminiLevel).zh_value
        }

        raiders.fill('author', author_info)
        raiders.fill('travelrecordtype_zh',
                     TravelRecordType(raiders.TRtype).zh_value)
        img_path = PyQuery(raiders.TRcontent)('img').attr('src')
        raiders.fill('picture', img_path)
        followed = True if common_user() and UserCollectionLog.query.filter(
            UserCollectionLog.UCLcoType == CollectionType.user.value,
            UserCollectionLog.isdelete
            == false(), UserCollectionLog.UCLcollector == getattr(
                request, 'user').id, UserCollectionLog.UCLcollection
            == raiders.AuthorID).first() else False
        raiders.fill('followed', followed)
        is_own = True if common_user() and raiders.AuthorID == getattr(
            request, 'user').id else False
        raiders.fill('is_own', is_own)
Exemple #3
0
    def list(self):
        """拼团/商品列表"""
        args = request.args.to_dict()
        now = datetime.datetime.now()
        option = args.get('option')
        gpstatus = args.get('gpstatus')
        starttime, endtime = args.get('starttime', '2019-01-01') or '2019-01-01', args.get('endtime', '2100-01-01') or '2100-01-01'
        if is_admin() or is_supplizer():
            return self._back_group_product_list(gpstatus, starttime, endtime)

        if str(option) == 'my':
            my_group = []
            if common_user():
                my_group = self._filter_joined_group().all_with_page()
            list(map(lambda x: self._fill_single_group(x), my_group))
            return Success(data=my_group)

        elif str(option) == 'all':
            all_group = self._filter_not_joined_group().all_with_page()
            list(map(lambda x: self._fill_single_group(x), all_group))
            return Success(data=all_group)

        my_group = []
        if common_user():
            my_group = self._filter_joined_group().distinct().limit(2).all()

        list(map(lambda x: self._fill_single_group(x), my_group))

        all_group = self._filter_not_joined_group().distinct().limit(2).all()

        list(map(lambda x: self._fill_single_group(x), all_group))

        group_goods = GroupGoodsProduct.query.filter(GroupGoodsProduct.isdelete == False,
                                                     GroupGoodsProduct.GPstatus == ApplyStatus.agree.value,
                                                     GroupGoodsProduct.GPday == now.date()
                                                     ).order_by(GroupGoodsProduct.createtime.desc()).all_with_page()
        for gp in group_goods:
            gp.hide('SUid', 'PRid', 'GPfreight')
            product = Products.query.filter(Products.PRid == gp.PRid, Products.isdelete == False).first()
            if not product:
                continue
            gps_list = GroupGoodsSku.query.filter_by(GPid=gp.GPid, isdelete=False).all()
            gpsku_price = [gps.SKUPrice for gps in gps_list]
            gp.fill('gpstatus_en', ApplyStatus(gp.GPstatus).name)
            gp.fill('gpstatus_zh', ApplyStatus(gp.GPstatus).zh_value)
            gp.fill('prmainpic', product['PRmainpic'])
            gp.fill('prtitle', product.PRtitle)
            gp.fill('gpdeposit', max(gpsku_price))

        res = {'my_group': my_group,
               'all_group': all_group,
               'group_goods': group_goods
               }

        return Success(data=res)
    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)
Exemple #5
0
 def _my_home_page_count(usid):
     followed = UserCollectionLog.query.filter(
         UserCollectionLog.isdelete == false(),
         UserCollectionLog.UCLcollector == usid,
         UserCollectionLog.UCLcoType == CollectionType.user.value,
     ).count()
     fens = UserCollectionLog.query.filter(
         UserCollectionLog.isdelete == false(),
         UserCollectionLog.UCLcollection == usid,
         UserCollectionLog.UCLcoType == CollectionType.user.value,
     ).count()
     published = TravelRecord.query.filter(
         TravelRecord.isdelete == false(),
         TravelRecord.AuthorID == usid).count()
     user = User.query.filter_by_(USid=usid).first()
     follow_status = True if common_user(
     ) and UserCollectionLog.query.filter(
         UserCollectionLog.isdelete
         == false(), UserCollectionLog.UCLcollector == getattr(
             request, 'user').id, UserCollectionLog.UCLcollection == usid,
         UserCollectionLog.UCLcoType
         == CollectionType.user.value).first() else False
     try:
         usminilevel = MiniUserGrade(user.USminiLevel).zh_value
     except Exception:
         usminilevel = None
     return (followed, fens, published, getattr(user, 'USname', None),
             getattr(user, 'USheader', None), usminilevel, follow_status)
Exemple #6
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)
Exemple #7
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)
 def create_room(self):
     if not common_user():
         raise AuthorityError
     user = get_current_user()
     data = parameter_required()
     roomid = self.get_room(data, user)
     return Success(data=roomid)
Exemple #9
0
 def add_toilet(self):
     """添加厕所"""
     if common_user():
         creator = User.query.filter_by_(
             USid=getattr(request, 'user').id).first_('请重新登录')
         creator_id = creator.USid
         creator_type = ApplyFrom.user.value
     elif is_admin():
         creator = Admin.query.filter_by_(
             ADid=getattr(request, 'user').id).first_('请重新登录')
         creator_id = creator.ADid
         creator_type = ApplyFrom.platform.value
     else:
         raise TokenError('请重新登录')
     data = parameter_required({
         'latitude': '纬度',
         'longitude': '经度',
         'toimage': '图片'
     })
     latitude, longitude = data.get('latitude'), data.get('longitude')
     latitude, longitude = self.cplay.check_lat_and_long(
         latitude, longitude)
     if common_user() and latitude and longitude:
         self.BaseController.get_user_location(latitude, longitude,
                                               creator_id)
     exist = Toilet.query.filter(Toilet.isdelete == false(),
                                 Toilet.longitude == longitude,
                                 Toilet.latitude == latitude).first()
     if exist:
         raise ParamsError('该位置的厕所已被上传过')
     with db.auto_commit():
         toilet = Toilet.create({
             'TOid': str(uuid.uuid1()),
             'creatorID': creator_id,
             'creatorType': creator_type,
             'longitude': longitude,
             'latitude': latitude,
             'TOimage': data.get('toimage'),
             'TOstatus': ApprovalAction.submit.value
         })
         db.session.add(toilet)
     super(CScenicSpot, self).create_approval('totoilet', creator_id,
                                              toilet.TOid, creator_type)
     return Success('上传成功', data={'toid': toilet.TOid})
    def list(self):
        """魔盒/商品列表"""
        args = request.args.to_dict()
        now = datetime.now()
        option = args.get('option')
        mbastatus = args.get('mbastatus')
        starttime, endtime = (args.get('starttime', '2019-01-01')
                              or '2019-01-01',
                              args.get('endtime', '2100-01-01')
                              or '2100-01-01')

        if is_admin() or is_supplizer():
            return self._back_box_product_list(mbastatus, starttime, endtime)
        if str(option) == 'my':
            my_box = []
            if common_user():
                my_box = self._filter_my_box().all_with_page()
                list(map(lambda x: self._fill_single_box(x), my_box))
            return Success(data=my_box)

        my_box = []
        if common_user():
            my_box = self._filter_my_box().distinct().limit(2).all()
            list(map(lambda x: self._fill_single_box(x), my_box))
        box_product = MagicBoxApply.query.filter(
            MagicBoxApply.isdelete == False,
            MagicBoxApply.MBAday == now.date(),
            MagicBoxApply.MBAstatus == ApplyStatus.agree.value).order_by(
                MagicBoxApply.createtime.desc()).all_with_page()
        for box in box_product:
            box.fields = ['MBAid', 'MBAday', 'MBAstatus']
            product = Products.query.filter(
                Products.PRid == box.PRid, Products.isdelete == False).first()
            if not product:
                continue
            mbssku_list = MagicBoxApplySku.query.filter_by_(
                MBAid=box.MBAid).all()
            mbssku_price = [mbs.LowestPrice for mbs in mbssku_list]
            box.fill('prtitle', product.PRtitle)
            box.fill('prmainpic', product['PRmainpic'])
            box.fill('mbadeposit', min(mbssku_price))
        res = {'mybox': my_box, 'box_product': box_product}
        return Success(data=res)
 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)
Exemple #12
0
    def verify_have_paid(gp, gg=None):
        """检验该团/商品 是否已付过押金"""
        if not common_user():
            return
        usid = request.user.id
        om_list = []
        order_main = None
        if gg:
            order_main = OrderMain.query.join(
                GuessRecord, GuessRecord.OMid == OrderMain.OMid
            ).filter(GuessRecord.USid == usid, GuessRecord.isdelete == False,
                     GuessRecord.GRstatus == GuessRecordStatus.valid.value,
                     GuessRecord.GGid == gg.GGid,
                     OrderMain.isdelete == False,
                     OrderMain.OMinRefund == False,
                     OrderMain.OMfrom == OrderFrom.guess_group.value,
                     OrderMain.USid == usid,
                     OrderMain.OMstatus.notin_((OrderMainStatus.cancle.value,
                                                OrderMainStatus.wait_pay.value))
                     ).first()
            current_app.logger.info('have ggid return paid om is {}'.format(order_main))
        if not gg or not order_main:
            order_mains = OrderMain.query.outerjoin(OrderPart,
                                                    OrderPart.OMid == OrderMain.OMid
                                                    ).filter(OrderMain.isdelete == False,
                                                             OrderMain.OMinRefund == False,
                                                             OrderMain.OMstatus == OrderMainStatus.wait_send.value,
                                                             OrderMain.USid == usid,
                                                             OrderMain.OMfrom == OrderFrom.guess_group.value,
                                                             OrderPart.isdelete == False,
                                                             OrderPart.PRid == gp.GPid
                                                             ).all()
            for om in order_mains:
                gr = GuessRecord.query.outerjoin(GuessGroup,
                                                 GuessGroup.GGid == GuessRecord.GGid
                                                 ).filter(GuessRecord.isdelete == False,
                                                          GuessRecord.GRstatus == GuessRecordStatus.valid.value,
                                                          GuessRecord.OMid == om.OMid,
                                                          GuessGroup.isdelete == False,
                                                          GuessGroup.GGstatus != GuessGroupStatus.failed.value
                                                          ).first()
                if not gr:
                    om_list.append(om)

            current_app.logger.info('get paid order main {} ; id : {}'.format(len(order_mains),
                                                                              [i.OMid for i in order_mains]))
            order_main = om_list[0] if len(om_list) > 0 else None
            current_app.logger.info('filter paid om count: {}'.format(len(om_list)))
            current_app.logger.info('return paid om is {}'.format(order_main))
        return order_main
Exemple #13
0
    def get_ticket(self):
        """门票详情"""
        args = request.args.to_dict()
        tiid = args.get('tiid')
        tsoid = args.get('tsoid')
        secret_usid = args.get('secret_usid')
        if not (tiid or tsoid):
            raise ParamsError
        ticketorder = None
        if tsoid:
            if not common_user():
                raise TokenError
            ticketorder = TicketsOrder.query.filter(TicketsOrder.isdelete == false(),
                                                    TicketsOrder.USid == getattr(request, 'user').id,
                                                    TicketsOrder.TSOid == tsoid).first()
            tiid = ticketorder.TIid if ticketorder else tiid
        if secret_usid:
            try:
                superid = super(CTicket, self)._base_decode(secret_usid)
                current_app.logger.info('secret_usid --> superid {}'.format(superid))
                if common_user() and superid != getattr(request, 'user').id:
                    with db.auto_commit():
                        uin = UserInvitation.create({
                            'UINid': str(uuid.uuid1()),
                            'USInviter': superid,
                            'USInvited': getattr(request, 'user').id,
                            'UINapi': request.path
                        })
                        current_app.logger.info('已创建邀请记录')
                        db.session.add(uin)
            except Exception as e:
                current_app.logger.info('secret_usid 记录失败 error = {}'.format(e))

        ticket = Ticket.query.filter(Ticket.isdelete == false(), Ticket.TIid == tiid).first_('未找到该门票信息')
        self._fill_ticket(ticket, ticketorder=ticketorder)
        return Success(data=ticket)
Exemple #14
0
 def toilet_list(self):
     """厕所列表"""
     args = request.args.to_dict()
     toilet_query = Toilet.query.filter(Toilet.isdelete == false())
     if is_admin():
         tostatus = args.get('tostatus')
         try:
             ApprovalAction(tostatus)
         except Exception as e:
             # current_app.logger.error('TOstatus error is {}'.format(e))
             tostatus = None
         if tostatus:
             toilet_query = toilet_query.filter(Toilet.TOstatus == tostatus)
         toilets = toilet_query.order_by(
             Toilet.createtime.desc()).all_with_page()
         for toilet in toilets:
             toilet.hide('creatorID', 'creatorType')
             toilet.fill('tostatus_zh',
                         ApprovalAction(toilet.TOstatus).zh_value)
     else:
         parameter_required(
             {
                 'latitude': '请允许授权位置信息,以便为您展示附近的厕所',
                 'longitude': '请允许授权位置信息,以便为您展示附近的厕所'
             },
             datafrom=args)
         latitude, longitude = args.get('latitude'), args.get('longitude')
         if latitude == 'null':
             raise ParamsError('请允许授权位置信息,以便为您展示附近的厕所')
         latitude, longitude = self.cplay.check_lat_and_long(
             latitude, longitude)
         if common_user() and latitude and longitude:
             self.BaseController.get_user_location(
                 latitude, longitude,
                 getattr(request, 'user').id)
         scale = args.get('scale', 14)
         variable = self.scale_dict.get(int(float(scale)))
         toilets = toilet_query.filter(
             Toilet.TOstatus == ApprovalAction.agree.value,
             Toilet.latitude <= float(latitude) + variable,
             Toilet.latitude >= float(latitude) - variable,
             Toilet.longitude <= float(longitude) + variable,
             Toilet.longitude >= float(longitude) - variable,
         ).all()
         [toilet.hide('creatorID', 'creatorType') for toilet in toilets]
     return Success(data=toilets)
Exemple #15
0
 def _fill_single_group(self, gg):
     gg.hide('USid')
     gg.fill('ggstatus_en', GuessGroupStatus(getattr(gg, 'GGstatus', 0)).name)
     gg.fill('ggstatus_zh', GuessGroupStatus(getattr(gg, 'GGstatus', 0)).zh_value)
     headers, numbers = self._fill_number_and_headers(gg)
     gg.fill('headers', headers)
     gg.fill('numbers', numbers)
     if common_user():
         gr = GuessRecord.query.filter_by_(GGid=gg.GGid, USid=request.user.id,
                                           GRstatus=GuessRecordStatus.valid.value).first()
         if gr:
             type = '我参与的'
             if gg.USid == request.user.id:
                 type = '我发起的'
             gg.fill('type', type)
         if gg.GGstatus == GuessGroupStatus.failed.value:
             gg.fill('type', '拼团失败')
Exemple #16
0
    def _filter_not_joined_group():
        filter_args = []
        if common_user():  # 只筛选自己没参加过的团
            usid = request.user.id
            all_gr = db.session.query(GuessRecord.GGid, func.group_concat(GuessRecord.USid)
                                      ).filter(GuessRecord.isdelete == False,
                                               GuessRecord.GRstatus == GuessRecordStatus.valid.value
                                               ).group_by(GuessRecord.GGid).all()
            ggid_list = [gr[0] for gr in all_gr if usid not in gr[1]]
            filter_args.append(GuessGroup.GGid.in_(ggid_list))

        all_group = GuessGroup.query.filter(GuessGroup.isdelete == False,
                                            GuessGroup.GGendtime >= datetime.datetime.now(),
                                            GuessGroup.GGstatus.in_((GuessGroupStatus.pending.value,
                                                                     GuessGroupStatus.waiting.value)),
                                            * filter_args
                                            ).order_by(func.field(GuessGroup.GGstatus, 0, 10, 20, -10),
                                                       GuessGroup.createtime.desc())
        return all_group
Exemple #17
0
 def _list_ticketorders(self):
     import copy
     if not common_user():
         raise TokenError
     tos = TicketsOrder.query.filter(TicketsOrder.isdelete == false(),
                                     TicketsOrder.USid == getattr(request, 'user').id
                                     ).order_by(TicketsOrder.createtime.desc()).all_with_page()
     res = []
     for to in tos:
         ticket = Ticket.query.filter(Ticket.isdelete == false(), Ticket.TIid == to.TIid).first()
         ticket = copy.deepcopy(ticket)
         if not ticket:
             current_app.logger.error('未找到ticket, tiid: {}'.format(to.TIid))
             continue
         self._fill_ticket(ticket, to)
         ticket.fields = ['TIid', 'TIname', 'TIimg', 'TIstartTime', 'TIendTime', 'TIstatus', 'tsoid', 'tsocode',
                          'tsostatus', 'tsostatus_zh', 'interrupt', 'tistatus_zh', 'ticategory', 'tsoqrcode']
         ticket.fill('short_str', '{}.{}抢票开启 | {}'.format(ticket.TIstartTime.month,
                                                          ticket.TIstartTime.day, ticket.TIabbreviation))
         res.append(ticket)
         del ticket
     return Success(data=res)
Exemple #18
0
    def read(self):
        data = parameter_required(('pmid', ))
        if not common_user():
            raise AuthorityError
        user = get_current_user()
        with db.auto_commit():
            upm = UserPlatfromMessage.query.filter_by(PMid=data.get('pmid'),
                                                      USid=user.USid,
                                                      isdelete=False).first()
            upml = UserPlatfromMessageLog.create({
                'UPMLid': str(uuid.uuid1()),
                'UPMid': upm.UPMid,
                'USid': user.USid
            })

            if upm.UPMstatus != UserPlanetMessageStatus.read.value:
                upm.UPMstatus = UserPlanetMessageStatus.read.value

            db.session.add(upml)
            db.session.add(upm)
        # usersids = self.get_usersid()
        # self.push_platform_message(usid=user.USid, usersid=usersids.get(user.USid))
        return Success()
Exemple #19
0
    def list_product(self):
        """获取活动商品"""
        data = parameter_required(('tlaid', ))
        tlaid = data.get('tlaid')
        tlastatus = data.get('tlastatus')
        prtitle = data.get('prtitle', '')
        filter_args = {
            TimeLimitedProduct.isdelete == False,
        }
        if common_user():
            filter_args.add(
                TimeLimitedProduct.TLAstatus == ApplyStatus.agree.value)
            current_app.logger.info('本次是普通用户进行查询')
        elif is_supplizer():
            current_app.logger.info('本次是供应商进行查询')
            filter_args.add(TimeLimitedProduct.SUid == request.user.id)

        else:
            current_app.logger.info('本次是管理员进行查询')

        if tlaid:
            filter_args.add(TimeLimitedProduct.TLAid == data.get('tlaid'))
        if tlastatus:
            filter_args.add(
                TimeLimitedProduct.TLAstatus == data.get('tlastatus'))
        if prtitle:
            filter_args.add(Products.PRtitle.ilike('%{}%'.format(prtitle)))

        filter_args.add(
            TimeLimitedProduct.TLAstatus >= ApplyStatus.shelves.value)
        tlp_list = TimeLimitedProduct.query.join(
            Products, Products.PRid == TimeLimitedProduct.PRid).filter(
                *filter_args).order_by(
                    TimeLimitedProduct.createtime.desc()).all()
        product_list = list()
        # tlaid = tlp.TLAid
        if common_user():
            tla = TimeLimitedActivity.query.filter(
                TimeLimitedActivity.isdelete == False,
                TimeLimitedActivity.TLAid == tlaid,
                TimeLimitedActivity.TLAstatus.in_([
                    TimeLimitedStatus.waiting.value,
                    TimeLimitedStatus.starting.value
                ])).first_('活动已下架')
        else:
            tla = TimeLimitedActivity.query.filter(
                TimeLimitedActivity.isdelete == False,
                TimeLimitedActivity.TLAid == tlaid,
            ).first_('没有此活动')

        for tlp in tlp_list:
            current_app.logger.info(tlp)

            product = self._fill_tlp(tlp, tla)
            if product:
                product_list.append(product)

        # 筛选后重新分页
        page = int(data.get('page_num', 1)) or 1
        count = int(data.get('page_size', 15)) or 15
        total_count = len(product_list)
        if page < 1:
            page = 1
        total_page = math.ceil(total_count / int(count)) or 1
        start = (page - 1) * count
        if start > total_count:
            start = 0
        if total_count / (page * count) < 0:
            ad_return_list = product_list[start:]
        else:
            ad_return_list = product_list[start:(page * count)]
        request.page_all = total_page
        request.mount = total_count
        # tlakwargs = dict(tlaname=tla.TlAname)
        self._fill_tla(tla)
        return Success(data=ad_return_list).get_body(tla=tla)
Exemple #20
0
    def _fill_travelrecord(trecord):
        """填充时光记录详情"""
        if trecord.TRtype == TravelRecordType.essay.value:  # 随笔
            trecord.fields = ['TRid', 'TRlocation', 'TRtype', 'TRstatus']
            content = json.loads(trecord.TRcontent)
            trecord.fill('text', content.get('text', '...'))
            trecord.fill('image', content.get('image'))
            trecord.fill('video', content.get('video'))
            if content.get('image'):
                showtype = 'image'
            elif content.get('video'):
                showtype = 'video'
            else:
                showtype = 'text'
            trecord.fill('showtype', showtype)
        elif trecord.TRtype == TravelRecordType.travels.value:  # 游记
            trecord.fields = [
                'TRid', 'TRlocation', 'TRtitle', 'TRtype', 'TRcontent',
                'TRstatus'
            ]
            img_path = PyQuery(trecord.TRcontent)('img').attr('src')
            trecord.fill(
                'picture',
                (img_path if str(img_path).startswith('http') else API_HOST +
                 img_path if img_path else None))
            text_content = PyQuery(trecord.TRcontent)('p').eq(0).text()
            text_content = '{}...'.format(
                text_content) if text_content else None
            trecord.fill('text', text_content)
        else:  # 攻略
            trecord.fields = [
                'TRid', 'TRlocation', 'TRbudget', 'TRproducts', 'TRtype',
                'TRcontent', 'TRstatus'
            ]
            trecord.fill('trtitle', '{}游玩攻略'.format(trecord.TRlocation))
            trproducts_str = None
            if trecord.TRproducts:
                trecord.TRproducts = json.loads(trecord.TRproducts)
                trproducts_str = '、'.join(
                    map(lambda x: str(x), trecord.TRproducts))
            trecord.fill('trproducts_str', trproducts_str)
            if trecord.TRbudget:
                trecord.fill('trbudget_str',
                             '¥{}'.format(round(float(trecord.TRbudget), 2)))
            img_path = PyQuery(trecord.TRcontent)('img').attr('src')
            trecord.fill(
                'picture',
                (img_path if str(img_path).startswith('http') else API_HOST +
                 img_path if img_path else None))
            text_content = PyQuery(trecord.TRcontent)('p').eq(0).text()
            text_content = '{}...'.format(
                text_content) if text_content else None
            trecord.fill('text', text_content)

        trecord.fill(
            'travelrecordtype_zh', TravelRecordStatus.auditing.zh_value
            if trecord.TRstatus == TravelRecordStatus.auditing.value else
            TravelRecordType(trecord.TRtype).zh_value)
        trecord.fill('trstatus_zh',
                     TravelRecordStatus(trecord.TRstatus).zh_value)
        author = User.query.filter_by_(USid=trecord.AuthorID).first()
        author_info = None if not author else {
            'usname': author.USname,
            'usid': author.USid,
            'usheader': author.USheader,
            'usminilevel': MiniUserGrade(author.USminiLevel).zh_value
        }

        trecord.fill('author', author_info)
        is_own = True if common_user() and getattr(
            request, 'user').id == trecord.AuthorID else False
        trecord.fill('is_own', is_own)
        followed = True if common_user() and UserCollectionLog.query.filter(
            UserCollectionLog.UCLcoType == CollectionType.user.value,
            UserCollectionLog.isdelete
            == false(), UserCollectionLog.UCLcollector == getattr(
                request, 'user').id, UserCollectionLog.UCLcollection
            == trecord.AuthorID).first() else False
        trecord.fill('followed', followed)
    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)
Exemple #22
0
    def list(self):
        form = BrandsListForm().valid_data()
        pbstatus = dict(form.pbstatus.choices).get(form.pbstatus.data)
        free = dict(form.free.choices).get(form.free.data)
        # time_order = dict(form.time_order.choices).get(form.time_order.data)
        itid = form.itid.data
        itid = itid.split('|') if itid else []
        kw = form.kw.data
        brand_query = ProductBrand.query.filter_(
            ProductBrand.isdelete == False,
            ProductBrand.PBstatus == pbstatus
        )
        if itid:
            brand_query = brand_query.join(
                BrandWithItems, ProductBrand.PBid == BrandWithItems.PBid
            ).filter(
                BrandWithItems.isdelete == False,
                BrandWithItems.ITid.in_(itid)
            )
        if is_supplizer():
            current_app.logger.info('供应商查看品牌列表..')
            brand_query = brand_query.filter(
                ProductBrand.SUid == request.user.id
            )
        if free is True:
            brand_query = brand_query.filter(
                ProductBrand.SUid.is_(None)
            )
        elif free is False:
            brand_query = brand_query.filter(
                ProductBrand.SUid.isnot(None)
            )
        if kw:
            brand_query = brand_query.filter(
                ProductBrand.PBname.contains(kw)
            )
        if common_user():
            brand_query = brand_query.filter(ProductBrand.PBid.notin_(self.hide_pbid))
        brands = brand_query.order_by(ProductBrand.PBsort.asc(), ProductBrand.createtime.desc()).all_with_page()

        for brand in brands:
            brand.fill('PBstatus_en', ProductBrandStatus(brand.PBstatus).name)
            brand.fill('PBstatus_zh', ProductBrandStatus(brand.PBstatus).zh_value)
            brand.add('createtime')
            # 标签
            print(brand.PBid)
            pb_items = Items.query.filter_by().join(BrandWithItems, Items.ITid == BrandWithItems.ITid).filter_(
                BrandWithItems.PBid == brand.PBid,
                BrandWithItems.isdelete == False,
            ).all()
            brand.fill('items', pb_items)
            if is_admin() or brand.SUid:
                supplizer = Supplizer.query.filter(
                    Supplizer.isdelete == False,
                    Supplizer.SUid == brand.SUid
                ).first()
                if not supplizer:
                    with db.auto_commit():
                        brand.SUid = None
                        db.session.add(brand)
                    continue
                supplizer.fields = ['SUloginPhone', 'SUlinkPhone', 'SUname', 'SUlinkman', 'SUheader']
                brand.fill('supplizer', supplizer)
            self._fill_brand(brand, recommend_pr=True, coupon=True)

        return Success(data=brands)
Exemple #23
0
 def travelrecord_list(self):
     """时光记录(个人中心)列表"""
     args = request.args.to_dict()
     usid, date, area, trtype = args.get('usid'), args.get(
         'date'), args.get('area'), args.get('trtype')
     option = args.get('option')
     if usid:
         ucl_list = [usid]
         counts = self._my_home_page_count(usid)
         top = self._init_top_dict(counts)
     elif common_user():
         ucl_list = db.session.query(
             UserCollectionLog.UCLcollection).filter(
                 UserCollectionLog.UCLcoType == CollectionType.user.value,
                 UserCollectionLog.isdelete == false(),
                 UserCollectionLog.UCLcollector == getattr(
                     request, 'user').id).all()
         ucl_list = [ucl[0] for ucl in ucl_list]
         counts = self._my_home_page_count(getattr(request, 'user').id)
         top = self._init_top_dict(counts)
     elif is_admin():
         ucl_list = top = None
     else:
         # return Success(data={'top': {'followed': 0, 'fens': 0, 'published': 0,
         #                              'usname': None, 'usheader': None, 'usminilevel': None, 'concerned': False},
         #                      'travelrecord': []})
         raise TokenError('请重新登录')
     base_filter = [TravelRecord.isdelete == false()]
     if not (common_user() and option == 'my') and not is_admin():
         base_filter.append(TravelRecord.AuthorID.in_(ucl_list))
         base_filter.append(
             TravelRecord.TRstatus == TravelRecordStatus.published.value)
     trecords_query = TravelRecord.query.filter(*base_filter)
     if date:
         if not re.match(r'^\d{4}-\d{2}$', date):
             raise ParamsError('查询日期格式错误')
         year, month = str(date).split('-')
         trecords_query = trecords_query.filter(
             extract('month', TravelRecord.createtime) == month,
             extract('year', TravelRecord.createtime) == year)
     if trtype or str(trtype) == '0':
         if not re.match(r'^[012]$', str(trtype)):
             raise ParamsError('trtype 参数错误')
         trecords_query = trecords_query.filter(
             TravelRecord.TRtype == trtype)
     if area:
         scenicspots = db.session.query(ScenicSpot.SSPname).filter(
             ScenicSpot.isdelete == false(),
             ScenicSpot.SSParea.ilike('%{}%'.format(area))).all()
         ssname = [ss[0] for ss in scenicspots]
         trecords_query = trecords_query.filter(
             or_(*map(
                 lambda x: TravelRecord.TRlocation.ilike('%{}%'.format(x)),
                 ssname)))
     if common_user() and option == 'my':
         trecords_query = trecords_query.filter(
             TravelRecord.AuthorID == getattr(request, 'user').id)
     trecords = trecords_query.order_by(
         TravelRecord.createtime.desc()).all_with_page()
     [self._fill_travelrecord(x) for x in trecords]
     return Success(data={'top': top, 'travelrecord': trecords})
Exemple #24
0
    def _fill_brand(self, brand, **kwargs):
        product_num, product_fields, = kwargs.get('product_num', 3), kwargs.get('product_fields', list())
        new_product = kwargs.get('new_product', False)
        banner_show = kwargs.get('banner_show', False)
        recommend_pr = kwargs.get('recommend_pr', False)
        coupon = kwargs.get('coupon', False)

        if not product_fields:
            product_fields = self.prfields[:]

        if coupon:
            user = None
            if common_user():
                user = get_current_user()
            brand_coupon = self._get_brand_coupon(brand.SUid, user)

            if brand_coupon:
                from planet.control.CCoupon import CCoupon
                ccoupon = CCoupon()
                usid = user.USid if user else None
                ccoupon._coupon(brand_coupon, usid=usid, fill_con=False)
                product_num -= 1

                brand.fill('coupon', brand_coupon)

        # 推荐商品
        if recommend_pr:
            brand_recommend_product = self._recommend_pb_product(brand.PBid).all()[:product_num]
            pr_supplement_id = list()
            if brand_recommend_product:
                for product in brand_recommend_product:
                    product.fields = product_fields
                    pr_supplement_id.append(product.PRid)

            supplement_num = product_num - len(brand_recommend_product)
            if supplement_num:
                supplement_product = Products.query.filter(
                    Products.isdelete == false(), Products.PBid == brand.PBid).order_by(
                    Products.createtime.desc(), Products.PRid.notin_(pr_supplement_id)).all()
                brand_recommend_product.extend(supplement_product[:supplement_num])
            if brand_recommend_product:
                brand.fill('recommend', brand_recommend_product)

        # 新品推荐
        if new_product:
            brand_new_prodct = Products.query.filter(
                Products.isdelete == false(), Products.PBid == brand.PBid).order_by(Products.createtime.desc()).all()
            brand_new_prodct = brand_new_prodct[:self.br_new]
            if brand_new_prodct:
                for product in brand_new_prodct: product.fields = product_fields
                brand.fill('new', brand_new_prodct)

        # todo 填充动态
        # brand.fill('BrandTweets', list())

        # 填充banner
        if banner_show:
            bb_list = BrandBanner.query.filter(
                BrandBanner.PBid == brand.PBid, BrandBanner.isdelete == false()).order_by(
                BrandBanner.BBsort.asc(), BrandBanner.createtime.desc()).all()
            bbs = self._fill_bb(bb_list)
            if bbs:
                brand.fill('brandbanner', bbs)
Exemple #25
0
    def list(self):
        """列出标签"""
        form = ItemListForm().valid_data()
        ittype = form.ittype.data
        psid = form.psid.data
        kw = form.kw.data
        recommend = form.recommend.data
        recommend = True if str(recommend) == '1' else None

        # 如果查询商品对应的标签, 则可以传场景的id
        items_query = Items.query.filter_(Items.isdelete == False, Items.ITtype == ittype,
                                          Items.ITrecommend == recommend, Items.ITauthority != ItemAuthrity.other.value,
                                          Items.ITposition != ItemPostion.other.value,
                                          )

        if psid:
            items_query = items_query.outerjoin(SceneItem, SceneItem.ITid == Items.ITid
                                                ).filter_(SceneItem.isdelete == False,
                                                          SceneItem.PSid == psid,
                                                          )

            scene_items = [sit.ITid for sit in
                           SceneItem.query.filter(SceneItem.PSid == psid, SceneItem.isdelete == False,
                                                  ProductScene.isdelete == False).all()]
            prscene_count = Products.query.outerjoin(ProductItems, ProductItems.PRid == Products.PRid
                                                     ).filter(Products.isdelete == False,
                                                              Products.PRfeatured == True,
                                                              Products.PRstatus == ProductStatus.usual.value,
                                                              ProductItems.isdelete == False,
                                                              ProductItems.ITid.in_(list(set(scene_items)))
                                                              ).count()
            if not prscene_count:
                items_query = items_query.filter(Items.ITid != 'planet_featured')  # 如果该场景下没有精选商品,不显示“大行星精选”标签

        if is_supplizer():
            # 供应商下不显示被限时场景关联着的标签
            time_limit_itids = [it.ITid for it in
                                Items.query.join(SceneItem, SceneItem.ITid == Items.ITid
                                                 ).join(ProductScene, ProductScene.PSid == SceneItem.PSid
                                                        ).filter(SceneItem.isdelete == False,
                                                                 ProductScene.isdelete == False,
                                                                 Items.isdelete == False,
                                                                 ProductScene.PStimelimited == True).all()]
            items_query = items_query.filter(Items.ITauthority == ItemAuthrity.no_limit.value,
                                             Items.ITposition.in_([ItemPostion.scene.value,
                                                                   ItemPostion.news_bind.value,
                                                                   ItemPostion.index.value]
                                                                  ),
                                             Items.ITid.notin_(time_limit_itids),
                                             Items.ITid != 'planet_featured'
                                             )
        if is_admin():
            items_query = items_query.filter(Items.ITid != 'planet_featured')

        if kw:
            items_query = items_query.filter(
                Items.ITname.contains(kw)
            )
        items_query = items_query.order_by(Items.ITsort.asc(), Items.createtime.desc())

        # 普通用户默认获取已经自选过的圈子标签
        if str(ittype) == str(ItemType.news.value):
            uid = request.user.id if common_user() else None
            items = self._filter_new_items(uid=uid, option=form.option.data)
            return Success(data=items)
        items = items_query.all()
        for item in items:
            item.fill('ITtype_zh', ItemType(item.ITtype).zh_value)
            if item.ITtype == ItemType.product.value:
                pr_scene = ProductScene.query.outerjoin(SceneItem, SceneItem.PSid == ProductScene.PSid
                                                        ).filter_(SceneItem.isdelete == False,
                                                                  SceneItem.ITid == item.ITid,
                                                                  ProductScene.isdelete == False).all()
                if (is_supplizer() or is_admin()) and pr_scene:
                    psname_list = str([ps.PSname for ps in pr_scene])
                    psname_list = re.sub(r'[\[\]\'\,]+', '', psname_list)
                    item.ITname = getattr(item, 'ITname', '') + ' / ' + str(psname_list)  # 后台要显示标签所属场景

                item.fill('prscene', pr_scene)
        return Success('获取成功', data=items)
Exemple #26
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