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