Esempio n. 1
0
    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)
Esempio n. 2
0
 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)
Esempio n. 3
0
    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)
Esempio n. 4
0
    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']]
Esempio n. 5
0
    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)
Esempio n. 6
0
    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))
Esempio n. 7
0
    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)
Esempio n. 8
0
    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
Esempio n. 9
0
    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))
Esempio n. 10
0
    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))
Esempio n. 11
0
    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 {}}))
Esempio n. 12
0
    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)
Esempio n. 13
0
    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']]
Esempio n. 14
0
    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))
Esempio n. 15
0
    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,
        }))
Esempio n. 16
0
    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
Esempio n. 17
0
    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
Esempio n. 18
0
    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
                }))
Esempio n. 19
0
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({}))
Esempio n. 20
0
    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
Esempio n. 21
0
    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]
Esempio n. 22
0
    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
            }))
Esempio n. 23
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})
Esempio n. 24
0
    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
Esempio n. 25
0
    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