def get_appid(self): '''获取app对应的appid''' default_appid = config.APPID_MAP.get(self._platform) return get_qd_conf_value(mode=(self._platform or '') + '_appid', key='ext', groupid=self.get_groupid(), default_val=default_appid)
def add_sign_tag(self, groupid, userid): ''' 针对特殊渠道需要将注册商户加入名单内 ''' if get_qd_conf_value(groupid=groupid, key='ext', mode='change_pwd_control', default=0): redis_pool.sadd(redis_new_sign, userid)
def _actv_list(self, d): def _get_where(): now = int(time.time()) r = {'userid': self.get_userid_condition()} if d['status'] in (ACTV_STATUS_NORMAL, ACTV_STAUS_STOPED): r['status'] = d['status'] if d['state'] == ACTV_STATE_ON: r['expire_time'] = ('>=', now) elif d['state'] == ACTV_STATE_OFF: r['expire_time'] = ('<', now) return r def _get_customer_num(ids): if not ids: return {} with get_connection_exception('qf_mchnt') as db: r = db.select('member_pt', fields= 'activity_id, count(*) as num', where= { 'activity_id': ('in', ids) }, other='group by activity_id') or [] return {i['activity_id']:i['num'] for i in r or []} where = _get_where() with get_connection_exception('qf_mchnt') as db: actvs = db.select( table = 'card_actv', fields = ( 'id, start_time, expire_time, exchange_num, ' 'total_pt, status, goods_amt, goods_name, ' 'obtain_amt, obtain_limit, exchange_pt' ), where = where, other = 'order by ctime desc limit {} offset {}'.format( d['limit'], d['offset'])) total_num = db.select_one('card_actv', where=where, fields='count(1) as num')['num'] ids = [i['id'] for i in actvs or []] customer_num = _get_customer_num(ids) userid = self.user.userid promotion_url = get_qd_conf_value(userid, 'card', groupid=self.get_groupid()) for i in actvs: i['customer_num'] = customer_num.get(i['id']) or 0 i['id'] = str(i['id']) i['state'] = self.get_state(str(i['expire_time'])) i['promotion_url'] = promotion_url return (actvs, total_num)
def rate_conf(self, **kw): ''' 获取金额的兑换人民币的比率 ''' if get_qd_conf_value(groupid=self.get_groupid(), mode='rate_control', key='ext', default=0): qdinfo = get_qudaoinfo(self.get_groupid()) return rate_cache[qdinfo['currency_sign']]
def mchnt_conf(self, qdmode, qdkey='service', **kw): '''获取配置''' default = getattr(config, qdmode, None) groupid = self.get_groupid() return get_qd_conf_value( mode=qdmode, key=qdkey, groupid=groupid, default_key=int(groupid not in config.QF_GROUPIDS), default_val=default)
def GET(self): userid = int(self.user.userid) # 获取活动信息 r = self.get_info(userid) r['now'] = time.strftime(DATETIME_FMT) r['promotion_url'] = get_qd_conf_value(userid, 'coupon', groupid=self.get_groupid()) return self.write(success(r))
def GET(self): userid = self.user.userid now = time.strftime(DTM_FMT) # 开始时间 和 引用计数 info = ( redis_pool.hget(receipt_key, userid) or future(days = -1, fmt_type = 'str', fmt = DTM_FMT) + ',' + '1' ) start_time, ref_num = info.split(',') log.debug(start_time) if str_diffdays(now, start_time, DTM_FMT) >= RECEIPT_MAX_DAYS: start_time = future(days = -1, fmt_type = 'str', fmt = DTM_FMT) # 支付方式 groupid = self.get_groupid() pay_seq = get_qd_conf_value( groupid = groupid, mode = 'service', key = 'PAY_SEQUENCE', default_key = int(groupid not in config.QF_GROUPIDS), default_val = config.PAY_SEQUENCE ) ret = { 'start_time': start_time, 'end_time': now, 'ref_num': ref_num, 'stat': [], } for i in receipt_pay_type: if i['name'] in pay_seq: tmp = {'paytype': i['name']} tmp.update(self.get_stat( i['busicd'], i['refund_busicd'], start_time, now )) ret['stat'].append(tmp) # 如果大于1种支付方式, 需要加总结列 if len(ret['stat']) >= 1: tmp = {} fields = ( 'consume_num', 'consume_amt', 'refund_num', 'refund_amt', 'net_amount_num', 'net_amount_amt' ) for field in fields: tmp[field] = sum(i.get(field, 0) for i in ret['stat']) tmp['paytype'] = 'total' ret['stat'].append(tmp) return success(ret)
def get_advice_seqs(self): advice_num = len(config.ADVICES) mode = self.validator.data['mode'] seqs = get_qd_conf_value(mode='advice_sequence', key='service', groupid=self.get_groupid(), default=range(advice_num)) advice_num = len(seqs) if mode == 'random': random.shuffle(seqs) elif mode == 'normal': index = (self.validator.data['index'] % advice_num) + 1 seqs = seqs[index:] + seqs[:index] return seqs
def GET(self): userid = self.user.userid mode = self.validator.data['filter_key'] ret = {} summary = {} summary['total_num'] = summary['td_num'] = 0 with get_connection('qf_mchnt') as db: where = {'userid': userid} if mode in ('all', 'lose'): # 总数 if mode == 'lose': where['last_txdtm'] = ('<=', future(days=-60, fmt_type='timestamp')) summary['total_num']= db.select_one( table= 'member', where= where, fields= 'count(1) as num')['num'] elif mode in ('card', 'prepaid', 'submit'): summary['total_num'] = db.select_one( 'member_tag', where= { 'userid': userid, mode: ('>=', 1) }, fields= 'count(1) as num')['num'] summary['td_num']= db.select_one( table= 'member', where= { 'userid': userid, 'ctime': ('>', get_day_begin_ts()) }, fields= 'count(1) as num')['num'] ret['summary'] = summary for k in ('filters', 'sorts', 'flags'): ret[k] = get_qd_conf_value(mode='member_'+k, key='service', groupid=self.get_groupid()) ret['filters'] = ret['filters'] or config.MEMBER_FILTERS ret['sorts'] = ret['sorts'] or config.MEMBER_SORTS ret['flags'] = ret['flags'] or config.MEMBER_FLAGS return self.write(success(ret))
def GET(self): userid = int(self.user.userid) r = {} r['mchnt_info'] = self.mchnt_info(userid) r['now'] = time.strftime(DTM_FMT) # 活动信息 actv = total_num = None with get_connection('qf_mchnt') as db: where = {'userid': self.get_userid_condition()} actv = db.select_one('card_actv', fields= ( 'id, start_time, expire_time, exchange_num, ' 'total_pt, status, goods_amt, goods_name, ' 'obtain_amt, exchange_pt, obtain_limit' ), where= where, other= 'order by expire_time desc') if actv: total_num = db.select_one('card_actv', where= where, fields= 'count(1) as num', )['num'] # 更新customers 和 customer_num actv.update(self.get_customers(actv)) actv['id'] = str(actv['id']) actv['state'] = self.get_state(str(actv['expire_time'])) actv['left_day'] = max(str_diffdays( time.strftime(DATE_FMT), str(actv['expire_time'])[:10]), 0) actv['left_warn'] = 0 if actv['left_day'] > 5 else 1 actv['promotion_url'] = get_qd_conf_value(userid, 'card') actv['lost_customer_num'] = 0 if str(r['mchnt_info']['expire_time']) < time.strftime(DTM_FMT): actv['lost_customer_num'] = db.select_one('member', where= {'userid': userid}, fields= 'count(1) as num')['num'] r['actv_info'] = actv or {} r['total_num'] = total_num or 0 r['max_expire_day'] = config.CARD_ACTV_MAX_EXPIRE r['max_start_day'] = config.CARD_ACTV_MAX_START return self.write(success(r))
def GET(self): userid = int(self.user.userid) actv = None with get_connection('qf_mchnt') as db: actv = db.select_one( 'member_actv', where= { 'userid': userid, 'type': MemDefine.ACTV_TYPE_PRIVI }, fields= 'id, status, content') if actv: actv['promotion_url'] = get_qd_conf_value(userid, 'privilege', groupid=self.get_groupid()) return self.write(success({'privilege': actv or {}}))
def GET(self): actv = self.check_allow_query(self.validator.data['id']) fields = [ 'id', 'start_time', 'expire_time', 'exchange_num', 'total_pt', 'status', 'goods_amt', 'goods_name', 'obtain_amt', 'obtain_limit', 'exchange_pt', 'statement', 'mchnt_id_list' ] actv_info = {field:actv[field] for field in fields} actv_info['id'] = str(actv_info['id']) actv_info['state'] = self.get_state(str(actv_info['expire_time'])) actv_info['big_create'] = int(actv['userid'] != int(self.user.userid)) actv['promotion_url'] = get_qd_conf_value( self.user.userid, 'card', groupid=self.get_groupid() ) actv_info.update(self.get_customers(actv)) return success(actv_info)
def get_user_modules(self, pos='all', addon=None, modules=None, **kw): ''' 获取用户功能模块 参数: pos all:全部功能 home_page:首页 addon 功能多加载的数据 modules 模块(默认config.MODULES) ''' language = self.get_language() # 用户所有功能 services = self.get_user_services(pos, addon) services.sort(key=lambda x: x.get('weight', 0), reverse=True) # 用户模块定义 gmodules = get_qd_conf_value( None, 'modules', 'service', groupid=self.get_groupid(), default=config.MODULES, ) modules = copy.deepcopy(modules or gmodules) for i in modules: i['services'] = [] if 'name' in i: i['name'] = get_constant(i['name'], language) module_dict = { module['module']: idx for idx, module in enumerate(modules) } # 分组 for i in services: idx = module_dict[i.pop('module', None) or 'default'] if 'fields' in kw: modules[idx]['services'].append({ field: i.get(field, '') for field in kw['fields'] if field != 'tip' or i.get(field) }) else: modules[idx]['services'].append(i) return [i for i in modules if i['services']]
def GET(self): d = {k: v.strip() for k, v in self.req.input().iteritems()} email = d.get('email', '') if not re.match(EMAIL_PATTERN, email): raise ParamError('邮箱不合法') user = None with get_connection('qf_core') as db: user = db.select_join_one( 'auth_user', 'profile', on={'auth_user.id': 'profile.userid'}, where={'auth_user.email': email}, fields='profile.groupid, profile.nickname, profile.userid') if not user: raise ParamError('邮箱不存在') # 邮箱相关配置 email_conf = get_qd_conf_value(mode='email_conf', key='ext', groupid=user['groupid'], default=config.EMAIL_CODE_CONF) # 获取验证码 try: smsexpires = email_conf.get('expires', 6 * 50) smslength = email_conf.get('length', 6) smsmode = email_conf.get('mode', 1) limit_time = email_conf.get('limit_time', 60) code = thrift_callex(config.CAPTCHA_SERVERS, CaptchaServer, 'captcha_get_ex', ucode=email, src=config.CAPTCHA_SRC, expires=smsexpires, length=smslength, mode=smsmode, limit_time=limit_time) log.debug('获取验证码:%s' % code) except CaptchaException, e: raise ParamError(str(e.respmsg))
def GET(self): groupid = self.get_groupid() version, platform = get_app_info( self.req.environ.get('HTTP_USER_AGENT', '')) platform = platform or 'ios' # tabs配置 menus = get_qd_conf_value( mode=platform + '_tabs', key='service', groupid=groupid) or [] menus = copy.deepcopy(menus) language = self.get_language() for menu in menus: # 語言控制 if 'name' in menu: menu['name'] = get_constant(menu['name'], language) return self.write(success({ 'tabs': menus, }))
def get_overdue(self, limit, offset): ''' 会员服务过期 ''' member_limit = get_qd_conf_value(mode='member_limit', key='service', groupid=self.get_groupid(), default=10) overdue = {'limit': member_limit, 'warn': 0, 'note': ''} if limit+offset < member_limit: return overdue payinfo = adjust_payinfo_ex(self.user.userid, service_code= 'member_manage', groupid= self.get_groupid()) if payinfo['overdue']: overdue['warn'] = 1 overdue['note'] = ('未开通会员服务,仅可显示{}个会' '员信息'.format(member_limit)) overdue['limit'] = max(min(member_limit-offset, limit), 0) return overdue
def app_conf(self, qdmode, qdkey='service', user_jugge=False, **kw): '''从app_conf数据库查询数据''' # qdconf配置权重最高 groupid = self.get_groupid() qdcustom = get_qd_conf_value( mode=qdmode, key=qdkey, groupid=groupid, default_key=int(groupid not in config.QF_GROUPIDS), default_val=None) if qdcustom is not None: return qdcustom userid = int(self.user.userid) custom = get_custom_value(userid, groupid, self.appid, qdmode) try: custom = json.loads(custom) except: pass return custom
def GET(self): userid = self.user.userid # 先获取当前商户的 如果等于0 则去获取渠道的 如果渠道的也未设置 则给赋值配置文件的 member_auth = self.get_member_auth(userid) if member_auth == MEMBER_AUTH_UNSET: groupid = self.get_groupid(userid=userid) qd_ext = get_qd_conf_value(groupid, mode=None, key='ext') if qd_ext: member_auth = qd_ext.get('need_auth', MEMBER_AUTH_OFF) else: member_auth = getattr(config, "DEFAULT_MEMBER_AUTH", MEMBER_AUTH_OFF) count, real_count = self.get_real_count(userid) return self.write( success( data={ "is_real_auth": 1 if member_auth == MEMBER_AUTH_ON else 0, "count": count, "real_count": real_count }))
class Send(BaseHandler): ''' 获取验证码, 发验证码 ''' _base_err = '获取验证码失败' def check_signup(self, mobile): ''' 登录验证码验证 ''' # 验证手机号是否注册 user = apcli.user_by_mobile(mobile) if user: raise ParamError('该手机已经注册') # 验证登录信息 if self.check_login(): self._groupid = self.get_groupid() # saleman_mobile d = self.req.input() if (not getattr(self, '_groupid', None) and 'saleman_mobile' in d and d['saleman_mobile']): user = apcli.user_by_mobile(d['saleman_mobile']) if user: self._groupid = user['groupid'] def check_reset_pwd(self, mobile): user = apcli.user_by_mobile(mobile) if not user: raise ParamError('该手机号还未注册') self._groupid = user['groupid'] def check_customer(self, mobile): ''' 消费者补充会员休息 ''' enuserid = self.req.input().get('enuserid') if enuserid: try: userid = hids.decode(enuserid)[0] except: if not is_valid_int(enuserid): return userid = int(enuserid) user = apcli('findUserBriefById', userid) if user: self._groupid = user.groupid @login def check_modify_username_grant(self, mobile): userid = int(self.user.userid) user = apcli_ex('findUserBriefById', userid) if not user: raise ParamError('商户不存在') if mobile != user.mobile: raise ParamError('账号信息错误, 联系客服更改') self._groupid = user.groupid @login def check_modify_username_verify(self, mobile): with get_connection_exception('qf_core') as db: new_user = db.select_one('auth_user', where={'mobile': mobile}) if new_user: raise ParamError('该手机已经注册') userid = int(self.user.userid) user = apcli_ex('findUserBriefById', userid) if not user: raise ParamError('商户不存在') self._groupid = user.groupid def check(self, mobile, mode): if not is_valid_mobile(mobile): raise ParamError('手机号码不合法') if mode not in PRESMS_FMT: raise ParamError('发送验证码模式错误') # 验证ip是否受限 ip = self.req.clientip() log.debug('ip:%s' % ip) if redis_pool.sismember('_mchnt_api_sms_code_ip_', ip): raise ParamError('ip受限') # 手机号码是不是频繁获取验证码 key = '_mchnt_api_sms_code_get_{}_'.format(mobile) if int(redis_pool.get(key) or 0) >= config.SMS_CODE_RULE['count_limit']: raise ParamError('该手机号频繁获取验证码') self._rkey = key self._groupid = None if mode.startswith('signup'): self.check_signup(mobile) elif callable(getattr(self, 'check_' + mode, None)): getattr(self, 'check_' + mode)(mobile) @dec_check() def GET(self): d = {k: v.strip() for k, v in self.req.input().iteritems()} mobile = d.get('mobile') mode = d.get('mode', 'signup') # 验证信息 self.check(mobile, mode) # 获取验证码 try: smsexpires = config.SMS_CODE_RULE.get('expires', 6 * 50) smslength = config.SMS_CODE_RULE.get('length', 6) smsmode = config.SMS_CODE_RULE.get('mode', 1) limit_time = config.SMS_CODE_RULE.get('limit_time', 60) code = thrift_callex(config.CAPTCHA_SERVERS, CaptchaServer, 'captcha_get_ex', ucode=mobile, src=config.CAPTCHA_SRC, expires=smsexpires, length=smslength, mode=smsmode, limit_time=limit_time) log.debug('获取验证码:%s' % code) except CaptchaException, e: raise ParamError(str(e.respmsg)) # 短信内容 groupid = getattr(self, '_groupid', None) if 'group' in d and d['group']: group = d['group'] else: group = redis_pool.get( '_mchnt_api_group_{}_'.format(groupid)) or 'hjsh' log.debug('groupid:{} group:{}'.format(groupid, group)) fmt = PRESMS_FMT.get(mode + '_' + group, PRESMS_FMT[mode]) csinfo = get_qd_conf_value( userid=None, mode=None, key='csinfo', groupid=groupid) or {} csinfo = {k: unicode_to_utf8_ex(v) for k, v in csinfo.iteritems()} content = fmt.format(code=code, **csinfo) log.debug('content:%s' % content) # 短信tag tags = config.PRESMS_TAG tag = tags.get(groupid or group, tags['hjsh']) r, respmsg = smscli.sendSms(mobile=mobile, content=str(content), tag=tag, source='merchant', target=mode) if not r: log.debug('调起发送短信服务失败:%s' % respmsg) raise ThirdError('发送验证码失败') # 设置获取验证码限制 if not redis_pool.exists(self._rkey): redis_pool.set(self._rkey, 0, config.SMS_CODE_RULE['expire_limit']) redis_pool.incr(self._rkey) return self.write(success({}))
def ret_userinfo(userinfo, user_ext=None, qdinfo=None, **cf): r = { 'mobile': userinfo['mobile'], 'userid': userinfo['uid'], 'profile': {}, 'shop_info': {}, 'is_creat_shop': 0, } # 是否是白牌渠道下的商户 if 'groupid' in userinfo: groupid = userinfo['groupid'] r['is_bpgroup'] = int(groupid in config.BAIPAI_GROUPIDS) r['is_qfgroup'] = int(groupid in config.QF_GROUPIDS) r['channel_info'] = get_qd_conf_value(mode=None, key='csinfo', groupid=groupid) if qdinfo: r['channel_info'].update(qdinfo) else: r['channel_info'].update(get_qudaoinfo(groupid)) # 店铺信息 r['shop_info']['shopname'] = userinfo['shopname'] r['shop_info']['province'] = userinfo['province'] r['shop_info']['city'] = userinfo['city'] r['shop_info']['address'] = userinfo['address'] r['shop_info']['telephone'] = userinfo['telephone'] # 用户信息 r['profile']['uid'] = userinfo['uid'] r['profile']['mobile'] = userinfo['mobile'] r['profile']['jointime'] = userinfo['jointime'] r['profile']['cate'] = cf.get('cate') or 'merchant' r['profile']['bind_id'] = userinfo['uid'] r['profile']['need_change_pwd'] = 0 if get_qd_conf_value(groupid=groupid, key='ext', mode='change_pwd_control', default=0): r['profile']['need_change_pwd'] = int( redis_pool.sismember(redis_new_sign, userinfo['uid'])) # 如果有线下店铺信息 if user_ext: if (getattr(config, 'NEED_CREATE_USER_EXT', True) and not user_ext.shoptype_id): r['is_creat_shop'] = 1 default_head_img = (getattr(config, 'BP_DEFAULT_AVATR', '') if r.get('is_bpgroup') else config.APP_DEFAULT_AVATR) r['shop_info']['head_img'] = user_ext.head_img or default_head_img r['shop_info']['logo_url'] = user_ext.logo_url or '' # 若果有操作员信息 if 'opinfo' in cf and cf['opinfo']: r['opinfo'] = cf['opinfo'] if getattr(config, 'BIND_OPUSER', True): r['profile']['bind_id'] = (int(userinfo['uid']) * 10000 + int(cf['opinfo']['opuid'])) r.update(cf) return r
def get_user_services(self, pos='all', addon=None, limit=None): ''' 获取用户功能列表 参数: pos all:全部功能 home_page:首页 head: 头部 addon 功能多加载的数据 limit 限制数量 ''' userid = int(self.user.userid) language = self.get_language() # 获取用户的信息 user = apcli('findUserBriefById', userid) if not user: raise ThirdError('商户不存在') user = user.__dict__ self._user = user # 获取用户的登录角色 user_cate = self.get_user_cate() # 获取渠道配置 qd_conf = get_qd_conf() # 用户服务列表 groupid = user['groupid'] default_services = get_qd_conf_value(userid, 'default', 'service', groupid=groupid, default=config.DEFAULT_SERVICES, qd_confs=qd_conf) user_service = apcli.user_service(userid) self._user_service = {i['code'] for i in user_service} | set(default_services) # 根据版本号和平台获取服务列表 version, platform = get_app_info( self.req.environ.get('HTTP_USER_AGENT', '')) log.info('user_agent:%s version:%s platform:%s userid:%s' % (self.req.environ.get('HTTP_USER_AGENT', ''), version, platform, userid)) sys_services = get_qd_conf_value(userid, 'services', 'service', groupid=groupid, default=config.SYSTEM_SERVICES, qd_confs=qd_conf) must_addon = [ 'recharge_link', 'group_link', 'condition', 'dis_groupids', 'nodis_groupids', 'dis_service', 'dis_condition', 'show_cate' ] addon = (addon or []) + must_addon services = get_services(version, platform, addon=addon, sys_services=sys_services) # 调整返回值 ret = [] payinfo = None user_open_service = {i['code'] for i in user_service} for service in services: # 若不满足条件, 直接跳过 if service['code'] not in self._user_service: continue # 指定角色才展示 show_cates = service.pop('show_cate') or [ 'merchant', 'submerchant' ] if user_cate not in show_cates: continue # 显示位置判断 tpos = service.pop('pos') or ['all'] if pos not in tpos: continue dis_condition = service.pop('dis_condition', None) if dis_condition: try: if not eval( dis_condition, { 'user': user, 'user_open': service['code'] in user_open_service }): continue except: log.warn(traceback.format_exc()) continue # 条件 condition = service.pop('condition', None) # 渠道link group_link = service.pop('group_link', None) # 渠道link # 根据grouid配置是否展示 dis_groupids = service.pop('dis_groupids') or config.QF_GROUPIDS nodis_groupids = service.pop( 'nodis_groupids') or config.QF_GROUPIDS # 付费后的链接 recharge_link = service.pop('recharge_link', None) # 余额提现链接 dis_service = service.pop('dis_service', '') # 根据条件判断 if condition: # 如果指定服务存在将不展示 if ('dis_service' in condition and dis_service in self._user_service): continue # 根据渠道判断 # 白牌渠道不展示 if 'group_dis' in condition: if groupid in qd_conf: continue # 根据渠道id来控制展示 if 'group_control' in condition: if groupid not in dis_groupids: continue # 根据渠道id来控制展示 if 'nogroup_control' in condition: if groupid in nodis_groupids: continue # 白牌渠道link if 'group_link' in condition: if groupid in qd_conf: service['link'] = group_link # 开通点餐服务 if 'diancan_service' in condition: if payinfo is None: payinfo = get_mchnt_paying(userid, code='diancan') if payinfo and str(payinfo['expire_time']) > time.strftime( DATETIME_FMT): service['link'] = recharge_link # 链接带上参数 service['link'] = service['link'].format(**user) # name根据语言可控制 if 'name' in service: service['name'] = get_constant(service['name'], language) ret.append(service) return ret[:limit]
def GET(self): userid = int(self.user.userid) price = get_qd_conf_value(mode='msg_price', key='ext', groupid=self.get_groupid()) template = config.MESSAGE_TEMPLATE user = apcli_ex('findUserBriefById', userid) log.info(user) shopname = user.shopname if user else '' log.info(shopname) coupon = self.coupon_actvs(userid) card = self.card_actv() prepaid = self.prepaid_actv() vip_template = [] common_temp = [] if coupon: coupon_content = template['coupon'].format( max(coupon) / 100.0, shopname) vip_template.append({ 'title': '红包模板', 'content': coupon_content, 'type': 1 }) if card: exchange_pt = unicode_to_utf8(card.get('exchange_pt', '')) goods_name = unicode_to_utf8(card.get('goods_name', '')) card_content = template['card'].format(exchange_pt, goods_name, shopname) vip_template.append({ 'content': card_content, 'title': '集点模板', 'type': 2 }) if prepaid: card_content = template['prepaid'].format(prepaid / 100.0, shopname) vip_template.append({ 'content': card_content, 'title': '储值模板', 'type': 3 }) for i in template['common_template']: content = i['content'].format(shopname) title = i['title'] common_temp.append({ 'title': title, 'content': content, 'type': i['type'] }) with get_connection('qf_mchnt') as db: total = db.select_one('member_tag', where={ 'userid': userid, 'submit': ('>=', 1) }, fields='count(1) as num')['num'] return self.write( success({ 'now': time.strftime(DATETIME_FMT), 'vip_temp': vip_template, 'common_temp': common_temp, 'price': price if price else config.DEFAULT_PRICE, 'total_auth': total, 'send_total': total, 'items': config.ITEM_1 if total else config.ITEM_0 }))
def GET(self): mode = self.req.input().get('mode') if mode not in ('main', 'settings'): mode = 'main' # 版本号, 平台 version, platform = get_app_info( self.req.environ.get('HTTP_USER_AGENT', '')) platform = platform or 'ios' prefix = platform + ('' if mode == 'main' else '_' + mode) # 用户角色 user_cate = self.get_user_cate() # 用户groupid groupid = self.get_groupid() # 用户信息 userinfo = {} user = apcli_ex('findUserByid', int(self.user.userid)) if user: userinfo = user.__dict__ userinfo['userid'] = userinfo['uid'] # 菜单配置 menus = get_qd_conf_value_ex( mode=prefix + '_menu', key='service', groupid=groupid) or [] menus = copy.deepcopy(menus) language = self.get_language() # 根据条件配置 ret_menus = [] for group in menus: t = [] for menu in group['menu']: # 操作员管理不展示 if (menu['tag'] == 'operator' and user_cate == 'opuser'): continue # 根据角色控制展示 cate_control = menu.pop('cate_control', None) if (cate_control is not None and user_cate not in cate_control): continue # 根据版本号控制 app_control = menu.pop('app_control', None) if app_control is None: tmp_menu = menu elif (app_control and get_value(app_control, platform, version)): tmp_menu = { k: get_value(v, platform, version) for k, v in menu.iteritems() } else: continue # 如果需要展示联系业务员 if menu['tag'] == 'contact_salesman': slsm_info = self.get_slsm_info(int(self.user.userid)) if not slsm_info: continue tmp_menu['content'] = slsm_info['telephone'] or slsm_info[ 'mobile'] if not tmp_menu['content']: continue tmp_menu['link'] = str(tmp_menu['link']).format(**userinfo) # 語言控制 if 'title' in tmp_menu: tmp_menu['title'] = get_constant(tmp_menu['title'], language) t.append(tmp_menu) if t: ret_menus.append({'menu': t}) # 能否修改基本信息 # 国家不是中国的, 暂不支持修改 qdinfo = get_qudaoinfo(groupid) support_cates = getattr(config, 'EDIT_INFO_CATES', ['bigmerchant', 'merchant', 'submerchant']) if qdinfo['country'] != "CN" or user_cate not in support_cates: edit_info = 0 else: edit_info = get_qd_conf_value(mode=platform + '_edit_info', key='service', groupid=groupid, default=1) return success({'menus': ret_menus, 'edit_info': edit_info})
def _list(self, mid): '''获取商户可参加的报名活动''' r = {'ondated': [], 'outdated': []} # 获取用户信息 userinfo = None with get_connection('qf_core') as db: userinfo = db.select_one('profile', where={'userid': mid}) if not userinfo: raise ParamError('用户信息不存在') # 对userinfo进行编码处理 userinfo = {k: unicode_to_utf8_ex(v) for k, v in userinfo.iteritems()} # 渠道严格控制 group_control = get_qd_conf_value(mode='official_actv_control', key='ext', groupid=userinfo['groupid'], default=False) or {} # 获取用户的相关活动 now = int(time.time()) acts, ids = get_all_apply_act() or [], [] for act in acts: try: if not eval(act['condition'] or 'True', {'userinfo': userinfo}): continue if group_control: groupids = self.analyze_condition(act['condition']).get( 'groupid', []) if userinfo['groupid'] not in set(groupids): continue ids.append(act['id']) except: log.warn('error:%s' % traceback.format_exc()) # 如果列表为空直接返回 if not ids: return r actvs = None with get_connection('qf_mchnt') as db: actvs = db.select( table='official_actv', where={ 'status': 1, 'id': ('in', ids) }, fields=('cast(id as char) as id,title,bg_url,rule,' 'content, start_time, expire_time, poster_url,' 'poster_content'), other='order by ctime desc') or [] if not actvs: return r now = datetime.datetime.now() for actv in actvs: et = actv['expire_time'] actv['rule'] = actv['rule'].split('\n') actv['poster_content'] = actv['poster_content'].split('\n') actv['start_time'] = actv['start_time'].strftime(DATE_FMT) actv['expire_time'] = actv['expire_time'].strftime(DATE_FMT) if et > now: r['ondated'].append(actv) else: r['outdated'].append(actv) return r
def get_actvs(self, userid): ''' 获取活动列表 ''' def get_where(): now = int(time.time()) big_actvids = self.get_big_actvids() where = '(create_mchnt_id={userid} {bigids}) '.format( userid=userid, bigids=('' if not big_actvids else ' or id in ({})'.format( ','.join(str(int(i)) for i in big_actvids)))) where += ('and src="{src}" and type={type} '.format( src=ACTIVITY_SRC, type=ACTIVITY_TYPE_PAYMENT)) # 启用的 if self.validator.data['state'] == '1': where += ('and expire_time>={now} and status=2 and ' 'used_amt<total_amt'.format(now=now)) # 关闭的 else: where += ('and ((expire_time<{now}) or (used_amt>=total_amt) ' 'or (status=3))'.format(now=now)) return where data = self.validator.data actvs = None with get_connection('qf_marketing') as db: sql = ('select {fields} from activity where {where} ' 'order by create_time desc limit {limit} ' 'offset {offset}'.format( fields=('id, mchnt_id, type, title, total_amt, ' 'obtain_xx_id, obtain_num, sponsor_award_num, ' 'sponsor_xx_id, rule, start_time, expire_time, ' 'create_time, create_mchnt_id'), where=get_where(), limit=data['pagesize'], offset=data['pagesize'] * data['page'])) actvs = db.query(sql) if not actvs: return [] cids = {i['sponsor_xx_id'] or i['obtain_xx_id'] for i in actvs} coupons = {} if cids: if cids: cps = None with get_connection('qf_marketing') as db: cps = db.select(table='coupon_rule', fields='id, amt_max, amt_min', where={'id': ('in', cids)}) for cp in cps: coupons[cp['id']] = { 'coupon_amt_max': cp['amt_max'], 'coupon_amt_min': cp['amt_min'] } # 获取统计信息 actids = [i['id'] for i in actvs] stats = CouponUtil.get_actv_stats(actids) # 整理数据 promotion_url = get_qd_conf_value(userid, 'coupon', groupid=self.get_groupid()) for act in actvs: # 加入优惠劵信息 act.update(coupons.get(act['sponsor_xx_id'] or act['obtain_xx_id'])) # 活动rule act['num'] = act['total_amt'] / max(act['coupon_amt_min'], act['coupon_amt_max'], 1) # 活动统计 act.update(stats.get(act['id'])) # 活动类型 act['type'] = 21 if act['obtain_xx_id'] else 20 # 物料信息 act['promotion_url'] = promotion_url # 活动obtain_limit_amt if act['type'] == 20: rule = rule_json2dic(act.pop('rule', ''), 'obtain_rule') act['obtain_limit_amt'] = rule.get('amt', 0) else: rule = rule_json2dic(act.pop('rule', ''), 'share') act['obtain_limit_amt'] = rule.get('amt', 0) act['obtain_num'] += act['award_num'] act['obtain_amt'] += act['award_amt'] # 大商户创建的标记 act['big_create'] = int(act['create_mchnt_id'] != str(userid)) return actvs