Example #1
0
    def GET(self):
        userid = self.user.userid
        aid = int(self.req.input().get('activity_id') or 0)

        sale, today = {}, time.strftime(DATE_FMT)
        with get_connection('qmm_wx') as db:
            sale = db.select_one(
                    table = 'market_activity',
                    where = {
                        'id' : ('!=', aid),
                        'qf_uid' : int(userid),
                        'audit_status' : ('in', (SpecialDefine.AUDIT_STATUS_PLACED,
                                                 SpecialDefine.AUDIT_STATUS_SUCCESS)),
                        'status' : ('in', (SpecialDefine.STATUS_PLACED,
                                           SpecialDefine.STATUS_NORMAL,
                                           SpecialDefine.STATUS_TEST)),
                        'redeem_start_date' : ('<=', today),
                        'redeem_end_date' : ('>=', today),
                        'atype' : SpecialDefine.ATYPE_SALE,
                        'buyable_start_date' : ('<=', today),
                        'buyable_end_date' : ('>=', today),
                        'title' : ('not like', '测试%'),
                        'quantity' : ('>', '0'),
                    },
                    fields = 'price, id, origin_price, business_title, title') or {}

        return self.write(success({'sale' : sale}))
Example #2
0
    def POST(self):
        userid = self.user.userid
        if not SpecialApi.check_allow_create(userid):
            raise ParamError('禁止创建特卖通知!')

        args = self.req.input()
        # 参数
        params = {i : args.get(i) for i in ['title', 'descr', 'redeem_start_date',
                                            'redeem_end_date', 'img'] }

        params['redeem_start_time'] = args.get('redeem_start_time', "05:00")
        params['redeem_end_time'] = args.get('redeem_end_time', "23:00")
        params['quantity'] = int(args['quantity'])

        # 价格
        price, origin_price = int(args['price']), int(args['origin_price'])
        price_limit = int(redis_pool.get('_mchnt_api_sale_price_limit_') or 70000)
        if price > price_limit:
            raise ParamError('创建特卖失败')
        if price > origin_price * 0.8:
            raise ParamError('至少8折才有吸引力')
        params['price'] = price
        params['origin_price'] = origin_price

        result = self.create(**params)

        return self.write(success({'activity_id' : result}))
Example #3
0
    def POST(self):
        args = {k:v.strip() for k, v in self.req.input().iteritems()}
        #args = dict(lower_price=200, coupon_price=20, userid=1000)
        lower_price = int(args['lower_price'])
        coupon_price = int(args['coupon_price'])
        expire_days = 14

        user_id = int(self.user.ses.get('userid'))

        result = dict(status=False)

        if not check_allow_create(user_id):
            raise ParamError('活动结束后才能再创建哦')

        try:

            self.create_coupon(user_id, lower_price, coupon_price,
                               expire_days)

            result['status'] = True
        except:
            log.exception('create coupon')
            raise

        return self.write(success(result))
Example #4
0
    def POST(self):
        actv = None
        with get_connection('qf_marketing') as db:
            actv = db.select_one(
                    table= 'activity',
                    where= {
                        'id': self.validator.data['coupon_id'],
                    },
                    fields= 'id, create_mchnt_id, status, create_time')
        if not actv:
            raise ParamError('活动不存在')

        if actv['create_mchnt_id'] != str(self.user.userid):
            if actv['create_mchnt_id'] == str(self.get_big_uid()):
                raise ParamError('此活动为总账户创建,你无法执行修改~')
            raise ParamError('暂无修改此活动的权限')

        # 已经进行的活动不能删除
        now = datetime.datetime.now()
        notify_datetime = get_notify_datetime(actv['create_time'])
        if not now < notify_datetime:
                raise ParamError('不能删除已经进行的红包推广活动!')

        if actv['status'] != 3:
            try:
                act = Activity(id=actv['id'], status=3,
                               src='qpos')
                thrift_callex(config.QF_MARKETING_SERVERS, QFMarketing,
                              'activity_change', act)
            except:
                log.warn(traceback.format_exc())
                raise ThirdError('关闭活动失败')

        return self.write(success({}))
Example #5
0
    def GET(self):
        pid = self.req.input().get('pid', '0').strip()
        if not is_valid_int(pid):
            raise ParamError('param error')
        pid = int(pid)

        return success({'shop_types': get_shop_cates(pid)})
Example #6
0
    def POST(self):
        param = self._trans_input()

        with get_connection_exception('qmm_wx') as db:
            where = {'id' : param['actv_id']}
            db.update('market_activity', param['data'], where=where)

        return self.write(success({}))
Example #7
0
 def GET(self):
     rule_descr = config.ACTV_TIPS.get('promotion', {}).get('rule', [])
     return self.write(
         success({
             'period_days': 14,
             'current_datetime': time.strftime(DTM_FMT),
             'rule_descr': rule_descr
         }))
Example #8
0
    def GET(self):
        user_id = self.user.ses.get('userid')
        page_number = int(self.req.input().get('page', 0))
        page_size = int(self.req.input().get('pagesize', 10))

        offset = page_size * page_number
        result = self.get_effect_list(user_id, offset, page_size, self.req)
        return self.write(success(result))
Example #9
0
    def GET(self):
        result = dict(pop_list=[],
                      pot_list=[])

        result['pop_list'] = self.get_pop_list()
        result['pot_list'] = self.get_pot_list()

        return self.write(success(result))
Example #10
0
    def GET(self, userid=None):
        d = {k: v.strip() for k, v in self.req.input().iteritems()}
        expectdate = d.get('expectdate')
        if not is_valid_date(expectdate):
            raise ParamError('账期格式错误')

        # 数据总结
        settle_statis = get_settle_statis(userid, expectdate)
        totalmoney = totalfee = totalmonthfee = 0
        for i in settle_statis:
            totalmoney += i['tradeamt']
            totalfee += i['fee']

        # 获取扣款历史
        monthfees = []
        try:
            monthfees = thrift_call(FundService, 'findWithholdHistory',
                                    config.FUND_SERVERS, userid, expectdate)
        except:
            log.warn(traceback.format_exc())

        # 扣款历史
        fee_detail_list = []
        for monthfee in monthfees:
            # 费用是正的是补给用户的,加到总额里面去
            if monthfee.amount > 0:
                totalmoney += monthfee.amount
            else:
                totalmonthfee += monthfee.amount
            is_rent_fee = False
            if isinstance(monthfee.title, types.UnicodeType):
                monthfee.title = monthfee.title.encode('utf-8')
            # 修改title如果是月租费的话 etc 12月QPOS月服务费
            if monthfee.title == 'QPOS月服务费':
                monthfee.title = '%s月%s' % (monthfee.evidence_date[5:7],
                                            monthfee.title)
                is_rent_fee = True
            # 存在的话,就合并
            is_exist = False
            for fee in fee_detail_list:
                if monthfee.title == fee['name'] and is_rent_fee:
                    fee['value'] += monthfee.amount
                    is_exist = True
                    break
            if not is_exist:
                fee_detail_list.append({
                    'name': monthfee.title,
                    'value': monthfee.amount,
                    'month': monthfee.evidence_date
                })

        return self.write(
            success({
                'total_amt': totalmoney - totalfee + totalmonthfee,
                'total_trade_amt': totalmoney,
                'totalfee': totalfee,
                'feedetail': fee_detail_list
            }))
Example #11
0
 def GET(self):
     rule_descr =  config.ACTV_TIPS.get('sale', {}).get('rule', [])
     return self.write(success({
         'max_discount': '0.8',
         'timestamp': int(time.time()),
         'sale_max_count': 100,
         'max_expire_days': 14,
         'rule_descr': rule_descr
     }))
Example #12
0
    def GET(self):
        all_buyers = get_all_buyers() or []

        d = {k:v.strip() for k, v in self.req.input().iteritems()}
        num = int(d.get('num', 10))

        latest_orders = random.sample(all_buyers, min(len(all_buyers), num))

        return self.write(success({'orders' : latest_orders}))
Example #13
0
    def GET(self):
        userid = int(self.user.userid)

        coupon_list = self.get_effect_list(userid)
        allow_create = check_allow_create(userid)

        return self.write(success({
            'coupon_list': coupon_list,
            'allow_create': allow_create
        }))
Example #14
0
    def GET(self):
        d = {k:v.strip() for k, v in self.req.input().iteritems()}

        # 商户userid
        userid = d.get('userid')

        # 消费者id
        customer_id = d.get('customer_id')

        return self.write(success(self._get_tips(userid, customer_id)))
Example #15
0
 def GET(self):
     notify_dt =  datetime.datetime.now() + datetime.timedelta(days=1)
     notify_dtm = notify_dt.replace(hour=11, minute=0, second=0)
     rule_descr = config.ACTV_TIPS.get('coupon', {}).get('rule', [])
     return self.write(success({
         'notify_time': notify_dtm.strftime('%Y-%m-%d %H:%M'),
         'lower_price': 2000,
         'period_days': 14,
         'rule_descr':  rule_descr
         }))
Example #16
0
    def GET(self):
        userid = self.user.ses.get('userid')

        # 获取版本号
        req = self.req
        log.debug('user_agent:%s' % req.environ.get('HTTP_USER_AGENT', ''))
        version, platform = get_app_info(req.environ.get(
            'HTTP_USER_AGENT', ''))
        log.info('version:%s  platform:%s' % (version, platform))

        type_list = self.get_type_list(userid, version)
        return self.write(success(type_list))
Example #17
0
 def GET(self):
     if self.customer.is_login():
         return self.write(
             success({
                 'customer_id': hids.encode(self.customer.customer_id),
                 'csid': self.get_cookie('csid')
             }))
     else:
         # 如果校验失败, 删除cookie
         del_domains = getattr(config, 'DEL_DOMAINS', ['o.qfpay.com'])
         for domain in del_domains:
             self.resp.del_cookie('csid', domain=domain)
         return self.write(error(QFRET.SESSIONERR))
Example #18
0
    def GET(self, userid=None):
        d = {k: v.strip() for k, v in self.req.input().iteritems()}
        # 账期
        expectdate = d.get('expectdate')
        if not is_valid_date(expectdate):
            raise ParamError('账期格式错误')

        # 分页信息
        page, pagesize = d.get('page', 0), d.get('pagesize', 10)
        if not all(map(is_valid_int, (pagesize, page))):
            raise ParamError('分页信息错误')

        # 到账详细信息
        details = defaultdict(list)
        try:
            trade_rs = thrift_call(FundService, 'findActtradeInfo',
                                   config.FUND_SERVERS, userid, expectdate,
                                   int(page), int(pagesize))
            for r in trade_rs:
                details[r.tradetime[:10]].append({
                    'tradetime':
                    r.tradetime,
                    'tradeamt':
                    r.tradeamt,
                    'fee':
                    r.fee,
                    'type':
                    r.tradetype,
                    'coupon_fee':
                    r.ori_coupon_amt - r.coupon_amt,
                    'ori_coupon_amt':
                    r.ori_coupon_amt
                })
        except:
            log.warn(traceback.format_exc())

        # 头部信息
        statis = get_settle_statis(userid, expectdate)
        statis.sort(key=lambda d: d['tradedt'], reverse=True)
        ret = []
        for i in statis:
            records = details.get(i['tradedt'])
            if records:
                ret.append({
                    'txdt': i['tradedt'],
                    'cnt': i['cnt'],
                    'fee': i['fee'],
                    'tradeamt': i['tradeamt'],
                    'details': records
                })
        return self.write(success(ret))
Example #19
0
    def GET(self):
        d = {k:v.strip() for k, v in self.req.input().iteritems()}
        userid = self.user.ses.get('userid')
        page = int(d.get('page', 0))
        pagesize = int(d.get('pagesize', 10))

        ret = {}
        # 是否能够创建特卖活动
        ret['allow_create'] = SpecialApi.check_allow_create(userid)
        # 获取特卖活动列表
        ret['activity_list'] = self._list(userid, page, pagesize)
        # 当前时间挫
        ret['timestamp'] = int(time.time())

        return self.write(success(ret))
Example #20
0
    def GET(self):
        userid = int(self.user.userid)
        allow_funcs = getattr(config, 'ALLOW_FUNCS', ['sale', 'coupon', 'sale', 'card'])
        actv_types  = getattr(config, 'ACTV_TYPES', ['share_coupon', 'payment_coupon',
                                                    'notify_coupon', 'sale', 'card'])
        ret = []
        for i in allow_funcs:
            func = getattr(self, 'allow_create_'+i, None)

            if func:
                actvs = func(userid)
                if actvs:
                    ret.extend(actvs if isinstance(actvs, MulType) else [actvs])

        return self.write(success({'actvs' : [i for i in actv_types if i in ret]}))
Example #21
0
    def GET(self):
        params = self.req.input()

        groupid = None

        if 'userid' in params:
            groupid = self.get_groupid(userid=params['userid'])

        elif 'enuserid' in params:
            userid = hids.decode(params['enuserid'])
            if userid:
                groupid = self.get_groupid(userid=userid)

        else:
            if self.check_login():
                groupid = self.get_groupid()

        return self.write(success({'is_baipai': self.is_baipai(groupid)}))
Example #22
0
    def GET(self):
        sales = []
        d = {k:v.strip() for k, v in self.req.input().iteritems()}
        lng, lat = d.get('longitude'), d.get('latitude')
        limit = int(d.get('limit') or 100)

        if is_valid_num(lng) and is_valid_num(lat):
            all_sales = SpecialApi.get_all_sales()
            sales = SpecialApi.tidy_sales(all_sales,
                mode = 'near', lng = float(lng), lat = float(lat)) or []
            sales.sort(key=lambda x: x.get('dist'))

        ret = SpecialApi.get_head_sales() + sales[:limit]

        # 增加pv
        SpecialApi.add_actv_pv([i['activity_id'] for i in ret], d.get('query_from'))

        return self.write(success(ret))
Example #23
0
    def GET(self):
        d = self.validator.data
        datas = None
        with get_connection('qf_mchnt') as db:
            datas = db.select(
                     table= 'actv_effect',
                     where= {
                         'userid' : self.user.userid,
                     },
                     other= ('order by ctime desc limit {limit} offset {offset}'.format(
                        offset = d['page'] * d['pagesize'], limit = d['pagesize'])),
                     fields= 'id, ctime, type, content'
                    ) or []

        actv_effect = config.ACTV_EFFECT
        default_img_url = getattr(config, 'DATA_DEFAULT_IMG_URL', '')
        default_desc_fmt = getattr(config, 'DATA_DEFAULT_DESC_FMT', '')
        default_info_url = getattr(config, 'DATA_DEFAULT_INFO_URL', '')
        ret = []
        for data in datas:
            if data['type'] not in actv_effect:
                continue

            desc_fmt = actv_effect[data['type']].get('_desc_fmt', default_desc_fmt)
            info_url = actv_effect[data['type']].get('_info_fmt', default_info_url)
            param = data['content']
            try:
                actv = json.loads(param)['datas']
                actv = {k: unicode_to_utf8_ex(v) for k, v in actv.iteritems()}
                ret.append({
                    'ctime': tstamp_to_str(data['ctime']),
                    'img_url': actv_effect[data['type']].get('_img_url',
                                                             default_img_url),
                    'type': data['type'],
                    'id': data['id'],
                    'desc': desc_fmt.format(**actv),
                    'info_url': info_url.format(data['id'])
                })
            except:
                log.debug(traceback.format_exc())

        return self.write(success({'datas': ret}))
Example #24
0
    def GET(self, userid=None):

        # 微信通道实名商户
        wx_oauth_mchnt, chnlbind = 0, {}
        with get_connection('qf_core') as db:
            chnlbind = db.select_one('chnlbind',
                                     where={
                                         'userid': ('in', (0, userid)),
                                         'available': 1,
                                         'tradetype': UserDefine.CHNLBIND_TYPE
                                     },
                                     other='order by priority',
                                     fields='key3, mchntid, chnlid, termid')
            # 微信通道下实名商户为微信特约商户
            if (chnlbind['chnlid'] == config.WX_CHNLID
                    and chnlbind['key3'] != 'wxeb6e671f5571abce'):
                wx_oauth_mchnt = 1

        # T1或者D1
        settle_type = UserDefine.SETTLE_TYPE_T1
        bigmchntids = set(get_bigmchntid() or [])
        if not chnlbind or not bigmchntids:
            settle_type = UserDefine.SETTLE_TYPE_T1
        elif (chnlbind['chnlid'] in config.D1_CHNLIDS and '{}_{}'.format(
                chnlbind['mchntid'], chnlbind['termid']) not in bigmchntids):
            settle_type = UserDefine.SETTLE_TYPE_D1
        else:
            settle_type = UserDefine.SETTLE_TYPE_T1

        # period
        # 若是t1需要获取账期
        period = {}
        if settle_type == UserDefine.SETTLE_TYPE_T1:
            td = time.strftime(DATE_FMT)
            period = UserUtil.get_periods(td) or {}

        return success({
            'wx_oauth_mchnt': wx_oauth_mchnt,
            'settle_type': settle_type,
            'period': period
        })
Example #25
0
    def GET(self):
        params = self.req.input()

        for i in ('out_trade_no', 'userid'):
            if not params.get(i):
                raise ParamError('%s is must' % i)

        # 校验是否开通积分功能
        open_pt(params['userid'])

        data = {
            #'userid' : params['userid'],
            'mchid' : hids.encode(config.WXY_QT2_CONF['app_uid'], int(params['userid'])),
            'out_trade_no' : params['out_trade_no']
        }

        ret = qt2_requests('/trade/v1/query', data, 'get')
        if not ret['data']:
            raise ParamError('out_trade_no不存在')

        return success(ret['data'][0])
Example #26
0
    def GET(self):
        d = self._trans_input()
        ret = {'notify_list' : [], 'total_count' : 0}

        userids = []
        with get_connection('qf_mchnt') as db:
            consumed_shops = db.select(
                        table = 'member',
                        where = {
                            'customer_id' : d['customer_id']
                        }, fields='userid') or []

            userids = [i['userid'] for i in consumed_shops]

        if userids:
            all_sales = SpecialApi.get_all_sales() or []
            consumed_sales = [sale for sale in all_sales if sale['qf_uid'] in userids]
            ret['notify_list'] = SpecialApi.tidy_sales(consumed_sales,
                    mode = 'consumed', lng = d['lng'], lat = d['lat'])
            ret['total_count'] = len(ret['notify_list'])

        return self.write(success(ret))
Example #27
0
    def GET(self):
        sales, today = [], time.strftime(DATE_FMT)
        where = {
            'audit_status' : ('in', (SpecialDefine.AUDIT_STATUS_PLACED,
                                     SpecialDefine.AUDIT_STATUS_SUCCESS)),
            'status' : ('in', (SpecialDefine.STATUS_PLACED,
                               SpecialDefine.STATUS_NORMAL,
                               SpecialDefine.STATUS_TEST)),
            'redeem_start_date' : ('<=', today),
            'redeem_end_date' : ('>=', today),
            'atype' : SpecialDefine.ATYPE_SALE,
            'buyable_start_date' : ('<=', today),
            'buyable_end_date' : ('>=', today),
            'title' : ('not like', '测试%'),
            'quantity' : ('>', '0'),
        }
        with get_connection('qmm_wx') as db:
            sales = db.select(
                    table = 'market_activity',
                    where = where,
                    fields = 'title, business_title, price, qf_uid, id')

        if not sales: return []

        shops = []
        with get_connection('qf_core') as db:
            shops = db.select(
                'profile',
                fields = 'longitude, userid, latitude',
                where = {'userid': ('in', list({i['qf_uid'] for i in sales}))}
            )
        shops = {i['userid']: i for i in shops or []}

        for sale in sales:
            shopinfo = shops.get(int(sale['qf_uid'])) or {}
            sale['lng'] = shopinfo.get('longitude') or 0
            sale['lat'] = shopinfo.get('latitude') or 0

        return self.write(success({'sales' : sales}))
Example #28
0
    def GET(self):
        params = self.req.input()

        adcode = params.get('city_no', '').strip()
        city = params.get('city_name', '').strip()
        province = params.get('province_name', '').strip()

        regions = get_regions(city, province, adcode)

        # 整理商圈数据
        # 如果没有其他商圈,加上其他商圈
        other_region = config.OTHER_REGION
        add_other_region = True
        ret = []
        for i in regions:
            ret.append({'id': str(i.id), 'name': i.name, 'weight': 1})

            if i.id == int(other_region['id']):
                add_other_region = False
        if add_other_region:
            ret.insert(0, other_region)

        return success({'locate_region': {}, 'regions': ret})
Example #29
0
    def POST(self):
        params = self.req.input()

        if not is_valid_int(params.get('txamt')):
            raise ParamError('txmat is must')

        for i in ('openid', 'out_trade_no', 'userid'):
            if not params.get(i):
                raise ParamError('%s is must' % i)

        pay_type = params.get('pay_type', '800207')
        if pay_type not in ('800207', '800213'):
            raise ParamError('暂不支持该支付类型')

        # 校验是否开通积分功能
        open_pt(params['userid'])

        data = {
            'txamt' : int(params['txamt']),
            'sub_openid' : params['openid'],
            'pay_type' : pay_type,
            'txcurrcd' : 'CNY',
            'out_trade_no' : params['out_trade_no'],
            'txdtm' : time.strftime(DTM_FMT),
            'goods_name' : params.get('goods_name', ''),
            'mchid' : hids.encode(config.WXY_QT2_CONF['app_uid'], int(params['userid']))
        }
        if is_valid_datetime(params.get('txdtm')):
            data['txdtm'] = params['txdtm']

        ret = qt2_requests('/trade/v1/payment', data, 'post')

        resperr = ret.pop('resperr', '')
        ret.pop('respmsg', '')

        return success(ret, resperr)
Example #30
0
    def GET(self):
        if 'id' not in self.req.input():
            raise ParamError('活动不存在')
        actv_id = self.req.input()['id'].strip()
        userid = int(self.user.userid)

        actv = {}
        with get_connection('qf_mchnt') as db:
            actv = db.select_one('actv_effect',
                            where = {
                                'id' : actv_id,
                                'userid' : userid
                            }) or {}
        if not actv:
            raise ParamError('活动不存在')

        if actv['type'] not in UserDefine.ACTV_EFFECTS:
            raise ParamError('活动类型错误')

        # 活动结案报告
        params = json.loads(actv['content'])
        effect = copy.deepcopy(config.ACTV_EFFECT[actv['type']])

        # 整理输出
        result = {}
        for key, val in effect.iteritems():
            if key in ('datas', 'effect'):
                param = params.get(key) or {}
                param = {k:(v/100.0 if k.endswith('amt') else v) for k,v in param.iteritems()}
                result[key] = []
                for item in val:
                    try:
                        item['desc'] = item['desc'].format(**param)
                        result[key].append(item)
                    except:
                        #log.debug(traceback.format_exc())
                        pass
            elif key == 'rank':
                try:
                    result['rank'] = val.format(**params['rank'])
                except:
                    result['rank'] = ''
            elif not key.startswith('_'):
                result[key] = val

        # 活动信息
        datas = params.get('datas') or {}
        if datas:
            if actv['type'] == UserDefine.ACTV_EFFECT_SALE:
                datas['start_time'] = datas['create_time']
                datas['expire_time'] =datas['redeem_end_date'] + ' 00:00:00'

            try:
                result['actv_info'] = {
                    'expire_time' : str_to_tstamp(datas['expire_time'], DATETIME_FMT),
                    'start_time' : str_to_tstamp(datas['start_time'], DATETIME_FMT),
                    'actv_name' : datas.get('title', '')
                }
                if actv['type'] == UserDefine.ACTV_EFFECT_CARD:
                    result['actv_info']['actv_name'] = u'兑换{}活动'.format(params['datas']['goods_name'])
            except:
                log.debug(traceback.format_exc())

        return self.write(success(result))