Exemple #1
0
def get_platforms():
    """
    获取所有平台配置

    :return:
    {
        平台ID: {
            is_sms:bool, # 是否允许发短信
            is_open:bool, # 是否允许开通
            is_setprofile: bool, # 是否允许个人设置
            open_type:[] # 开通方式: 1微信 2支付宝 3验证码开通
        }
    }
    """
    global _platforms
    global _platforms_expire

    now = time.time()
    if now < _platforms_expire:
        return _platforms or {}

    hub = tbktapi.Hub()
    r = hub.com.get('/system/platforms')
    if not r:
        return {}
    data = r.data
    data = map(Struct, data)
    _platforms = {r.id: r for r in data}
    _platforms_expire = now + PLATFORM_CACHE_TIMEOUT
    return _platforms
Exemple #2
0
def p_cancel(request):
    """
    @api {post} /account/cancelsms [短信]取消定时短信
    @apiGroup account
    @apiParamExample {json} 请求示例
        {"id":短信ID, "schedule_time":定时时间}
    @apiSuccessExample {json} 成功返回
        {
            "message": "",
            "next": "",
            "data": {
                "success": true
            },
            "response": "ok",
            "error": ""
        }
    """
    args = request.QUERY.casts(id=int, schedule_time=str)
    object_id = args.id
    schedule_time = args.schedule_time
    if not object_id:
        return ajax.jsonp_fail(request, message='缺少参数: id')
    if not schedule_time:
        return ajax.jsonp_fail(request, message='缺少参数: schedule_time')
    hub = tbktapi.Hub(request)
    url = '/sms/cancel'
    d = dict(id=object_id,
             schedule_time=schedule_time,
             platform_id=request.user.platform_id)
    r = hub.sms.post(url, d)
    if not r:
        return ajax.jsonp_fail(request, message='服务器开小差')
    return ajax.jsonp_ok(request, r)
Exemple #3
0
def p_qg_tiyan(request):
    """
    @api {post} /account/third/qg_tiyan [个人设置]北京免费体验
    @apiGroup account
    @apiParamExample {json} 请求示例
    {"third_id": 第三方,
     "groupId": 子组合ID,
     "province_id": 第三方省份id,
    }
    @apiSuccessExample {json} 成功返回
    {
        "message": "",
        "next": "",
        "data": {
        },
        "response": "ok",
        "error": ""
    }
    """
    args = request.QUERY.casts(third_id=str, groupId=str, province_id=int)
    third_id = args.third_id
    groupId = args.groupId
    province_id = args.province_id
    hub = tbktapi.Hub()
    url = '/api/openFree/'
    data = dict(third_id=third_id,
                groupId=groupId,
                provinceId=province_id,
                terminalType=4,
                serviceType=2)
    r = hub.qg.post(url, data)
    data = {}
    if r['response'] == 'fail':
        return ajax.jsonp_fail(request, data)
    return ajax.jsonp_ok(request, data)
Exemple #4
0
def p_password(request):
    """
    @api {post} /account/password [个人设置]修改密码
    @apiGroup account
    @apiParamExample {json} 请求示例
        {"old_pwd":"111111","new_pwd":"2222222"}
    @apiSuccessExample {json} 成功返回
        {"message": "", "error": "", "data": "", "response": "ok", "next": ""}
    @apiSuccessExample {json} 失败返回
        {"message": "两次输入密码不一致", "error": "", "data": "", "response": "fail", "next": ""}
    """
    args = request.QUERY.casts(old_pwd=str, new_pwd=str)
    old_pwd = args.old_pwd or ''
    new_pwd = args.new_pwd or ''
    if len(new_pwd) < 6 or len(new_pwd) > 16:
        return ajax.jsonp_fail(request, message='密码长度为6-16个字符')
    user = request.user
    if old_pwd and not user.check_password(old_pwd):
        return ajax.jsonp_fail(request, message="当前密码错误")

    users = user.set_password(new_pwd)
    # 发短信
    content = u"密码修改成功," + ','.join(u'账号%s的新密码为%s' % (u.username, new_pwd)
                                    for u in users) + u",请牢记!"
    hub = tbktapi.Hub(request)
    hub.sms.post('/sms/send', {
        'platform_id': user.platform_id,
        'phone': user.phone,
        'content': content
    })

    return ajax.jsonp_ok(request)
Exemple #5
0
def send_open(request):
    """
    @api {post} /huodong/summer_word/t/send_open [暑假活动-教师] 开通班级下学生学科
    @apiGroup summer_word
    @apiParamExample {json} 请求示例
       {}
    @apiSuccessExample {json} 成功返回
       {"message": "", "error": "", "data": ', "response": "ok", "next": ""}
    @apiSuccessExample {json} 失败返回
       {"message": "", "error": "", "data": "", "response": "fail", "next": ""}
    """
    user = request.user
    # 发开通短信
    unit_class_id = [u.id for u in user.units]
    hub = tbktapi.Hub(request)
    student = []
    for i in unit_class_id:
        r = hub.com.post('/class/students', {"unit_id": i})
        if r and r.response == 'ok':
            data = r.data
            student += (data.get('students', []))
    phones = ','.join(str(s['phone_number']) for s in student if s.get('status',0) not in [2,9])
    platform_id = int(user.platform_id) if user and user.platform_id else 1
    r = hub.bank.post('/cmcc/open', {'phone_number': phones, 'subject_id': 9, "platform_id": platform_id})
    if not r:
        return ajax_json.jsonp_fail(request, message='服务器开小差了')
    if r.response == 'fail':
        return ajax_json.jsonp_fail(request, message=r.message)
    return ajax_json.jsonp_ok(request, message='已发送开通短信')
Exemple #6
0
def p_send_sms(request):
    """
    @api {post} /huodong/sx_summer/t/send_sms [暑假活动 教师]发送短信
    @apiGroup sx_summer
    @apiParamExample {json} 请求示例
       {'content':'家长您好....'}
    @apiSuccessExample {json} 成功返回
        {"message": "", "error": "", "data": ', "response": "ok", "next": ""}
    @apiSuccessExample {json} 失败返回
       {"message": "", "error": "", "data": "", "response": "fail", "next": ""}
    """

    user = request.user
    args = request.QUERY.casts(content=unicode)
    if not args.content.strip():
        return ajax_json.jsonp_fail(request, message=u'请输入短息内容')
    open_num = common.get_score_add_num(APP_ID_TEA, user.id, 'send_sms')
    if open_num < SEND_SMS_NUM:
        common.add_score(APP_ID_TEA, user.id, SEND_SMS_SCORE, 'send_sms', u'发送通知短信', user.city or 0)
    content = args.content
    unit_class_id = ','.join(str(u.id) for u in user.units)

    hub = tbktapi.Hub(request)
    hub.sms.post('/sms/send', {'unit_id': unit_class_id, 'content': content})
    return ajax_json.jsonp_ok(request)
Exemple #7
0
def p_vcode(request):
    """
    @api {post} /account/vcode [登录]发验证码
    @apiDescription 
        输入手机号, 发送验证码到手机
    @apiGroup account
    @apiParamExample {json} 请求示例
        {"platform_id": 平台ID, "phone_number":"15981867201"}
    @apiSuccessExample {json} 成功返回
    {
        "message": "密码将发送到你的手机上,请注意查收",
        "error": "",
        "data": "",
        "response": "ok",
        "next": ""
    }
    @apiSuccessExample {json} 失败返回
    {
        "message": "请填写移动手机号",
        "error": "",
        "data": "",
        "response": "fail",
        "next": ""
    }
    """
    args = request.QUERY.casts(platform_id=int, phone_number=str)
    platform_id = args.platform_id or 1
    phone = args.phone_number

    # if not platform_id:
    #     return ajax.jsonp_fail(request, message='请选择省份')
    if not phone:
        return ajax.jsonp_fail(request, message='请输入正确的移动手机号')
    if not is_chinamobile(phone):
        return ajax.jsonp_fail(request, message='请输入正确的移动手机号')
    if validate_phone_platform(phone, platform_id) == False:
        return ajax.jsonp_fail(request, message='手机号与省份不匹配')

    # 今日获取次数
    today = datetime.date.today()
    times = cache.vcode_sendtimes.get((phone, today)) or 0
    if times >= 3 and phone != "13525352553":
        return ajax.jsonp_fail(request, message='今日获取次数已达上限')
    cache.vcode_sendtimes.set((phone, today), times + 1)

    user = request.user
    code = ''.join(random.sample('0123456789', 6))
    cache.vcode.set(phone, code)
    real_code = cache.vcode.get(phone)
    print real_code, platform_id
    hub = tbktapi.Hub(request)
    r = hub.sms.post("/sms/send",
                     {"platform_id": platform_id, "phone": phone, "content": "同步课堂验证码为:%s, 5分钟内输入有效" % code})
    if not r:
        return ajax.jsonp_fail(request, message='系统异常')
    elif r.response == 'fail':
        return ajax.jsonp_fail(request, message=r.message)
    data = {'code': code}
    return ajax.jsonp_ok(request, data, message='')
Exemple #8
0
def p_findpwd(request):
    """
    @api {post} /account/findpwd [登录]找回密码
    @apiDescription 
        输入手机号和验证码, 发送帐号和明文密码到手机
    @apiGroup account
    @apiParamExample {json} 请求示例
        {"platform_id": 平台ID, "phone_number":"15981867201", "code":"6402"}
    @apiSuccessExample {json} 成功返回
    {
        "message": "",
        "error": "",
        "data": "",
        "response": "ok",
        "next": ""
    }
    @apiSuccessExample {json} 失败返回
    {
        "message": "验证码错误,请重新获取",
        "error": "",
        "data": "",
        "response": "fail",
        "next": ""
    }
    """
    args = request.QUERY.casts(platform_id=int, phone_number=str, code=str)
    platform_id = args.platform_id or 1
    phone = args.phone_number
    code = args.code

    if not phone:
        return ajax.jsonp_fail(request, message='请填写手机号')
    if not is_chinamobile(phone):
        return ajax.jsonp_fail(request, message='请输入正确的手机号')
    if not code:
        return ajax.jsonp_fail(request, message='请填写验证码')
    if validate_phone_platform(phone, platform_id) == False:
        return ajax.jsonp_fail(request, message='手机号与省份不匹配')

    real_code = cache.vcode.get(phone)
    print real_code, "real_code"
    if not code or code != real_code:
        return ajax.jsonp_fail(request, message='验证码错误,请重新获取')
    cache.vcode.delete(phone)  # 删除缓存

    user_ids = db.user_slave.auth_user.filter(phone=phone, platform_id=platform_id).select('id').flat('id')[:]
    if not user_ids:
        return ajax.jsonp_fail(request, message='该手机号未注册')
    userd = com_user.get_users(user_ids)
    text = u"您的帐号和密码是:\n"
    for u in userd.itervalues():
        password = u.plain_password
        text += u"%s,%s\n" % (u.username, password)
    text += u"请注意查收."
    hub = tbktapi.Hub(request)
    hub.sms.post('/sms/send', {'platform_id': platform_id, 'phone': phone, 'content': text})
    return ajax.jsonp_ok(request, message='密码将发到您手机上,请注意查收')
Exemple #9
0
 def openstatus(self, subject_id):
     """获取指定科目开通状态"""
     hub = tbktapi.Hub(self.request)
     param = dict(subject_id=subject_id, platform_id=self.platform_id)
     r = hub.bank.get('/status', param)
     if not r:
         return 0
     data = Struct(r.data[0])
     return data.status
Exemple #10
0
def send_sms(request, user, content):
    # 群发短信
    unit_class_id = [u.id for u in user.units]  # user.units 教师所在年级的班级
    unit_ids = ','.join(str(t) for t in unit_class_id)
    hub = tbktapi.Hub(request)
    hub.sms.post('/sms/send', {
        'platform_id': user.platform_id,
        'unit_id': unit_ids,
        'content': content
    })
Exemple #11
0
def p_send_open(request):
    """
    @api {post} /huodong/sx_summer/t/send_open [暑假活动 教师]发送开通短信
    @apiGroup sx_summer
    @apiParamExample {json} 请求示例
       {}
    @apiSuccessExample {json} 成功返回
        {"message": "", "error": "", "data": ', "response": "ok", "next": ""}
    @apiSuccessExample {json} 失败返回
       {"message": "", "error": "", "data": "", "response": "fail", "next": ""}
    """

    user = request.user
    args = request.QUERY.casts(content=unicode)
    if not args.content.strip():
        return ajax_json.jsonp_fail(request, message=u'请输入短息内容')
    open_num = common.get_score_add_num(APP_ID_TEA, user.id, 'send_open')
    if open_num < SEND_OPEN_NUM:
        common.add_score(APP_ID_TEA, user.id, SEND_OPEN_SCORE, 'send_open', u'发送开通短信', user.city or 0)
    content = args.content
    unit_class_id = [u.id for u in user.units]

    hub = tbktapi.Hub(request)
    student = []
    for i in unit_class_id:
        r = hub.com.post('/class/students', {"unit_id": i})
        if r and r.response == 'ok':
            data = r.data
            student += (data.get('students', []))
    platform_id = int(user.platform_id) if user and user.platform_id else 1
    phones = ','.join(str(s['phone_number']) for s in student if s.get('status',0) not in [2,9])
    r = hub.bank.post('/cmcc/open', {'phone_number': phones, 'subject_id': 2, "platform_id": platform_id})
    # if not r:
    #     return ajax_json.jsonp_fail(request, message='服务器开小差了')
    # if r.response == 'fail':
    #     return ajax_json.jsonp_fail(request, message=r.message)

    hub = tbktapi.Hub(request)
    hub.sms.post('/sms/send', {'phone': phones, 'unit_id': unit_class_id, 'content': content})
    return ajax_json.jsonp_ok(request)
Exemple #12
0
def send_sms(phone_num, user_id, request, user):
    nowt = int(time.time())

    # 获取当月第一天的时间戳
    nowt_month = get_month(nowt)
    nowt_year = get_year(nowt)
    nowt_month_first_day = get_first_day_in_month(nowt_year, nowt_month)

    send_homework_status = db.slave.message.select('id').get(type__in=(2, 7, 8, 9), add_time__gt=nowt_month_first_day,
                                                             add_user=user_id)
    if not send_homework_status:
        return u'不满足条件'

    invited_people = db.tbkt_user.auth_user.select('id').filter(phone=str(phone_num), type=3).order_by('-last_login')[:]
    if not invited_people:
        return u'无效号码'
    else:
        invited_people = invited_people[0].id

    print invited_people, user_id
    if invited_people == user_id:
        return u'不能邀请自己'

    # 获取发送者姓名
    teacher_name = db.tbkt_user.auth_user.select('real_name').get(id=user_id)
    teacher_name = teacher_name.real_name

    region = db.ketang_slave.mobile_order_region.get(user_id=user_id)
    if region and region.city == "411200":
        return u"三门峡用户暂无法邀请"

    invited_status = db.tbkt_active.excita_invite_tea.select('id').get(invite_phone=phone_num,
                                                                       add_time__gt=nowt_month_first_day, )
    if invited_status:
        return u'已被邀请'
    else:
        content = u'''我在参加同步课堂抽奖活动,有机会抽到空气净化器,华为手机等礼品,你也一起来参加吧!去发作业还有抽奖券可以领呢,下载地址m.tbkt.cn【%s老师】''' % teacher_name
        hub = tbktapi.Hub(request)
        r = hub.sms.post("/sms/send", {"platform_id": user.platform_id, "phone": phone_num, "content": content})
        print r
        if r:
            if r.response == "ok":
                db.tbkt_active.excita_invite_tea.create(
                    invite_phone=phone_num,
                    invite_user_id=invited_people,
                    user_id=user_id,
                    add_time=nowt
                )
            else:
                return r.message
    return ''
Exemple #13
0
def send_pwd(request, user_id):
    """
    下发短信
    :param request:
    :param user_id:
    :return:
    """
    try:
        url = '/class/sendpwd'
        data = dict(user_id=user_id)
        hub = tbktapi.Hub(request)
        hub.com.post(url, data)
    except Exception as e:
        logging.error("send_pwd ERROR %s:%s" % (inspect.stack()[0][3], e))
Exemple #14
0
def sendpwd(request, phone, username, password, platform_id=1):
    """
    发送帐号密码短信
    ----------------------
    王晨光    2017-5-27
    ----------------------
    """
    if not isinstance(username, unicode):
        username = username.decode('utf-8')
    content = u"您的同步课堂账号是:{} 密码是:{},做作业(除数学知识点视频作业外)功能免费,请放心使用。客户端点此m.tbkt.cn下载安装。咨询电话:12556185".format(
        username, password
    )
    hub = tbktapi.Hub(request)
    hub.sms.post('/sms/send', {'phone': phone, 'content': content})
Exemple #15
0
def p_sendmany(request):
    """
    @api {post} /account/sendmany [短信]发多条短信
    @apiGroup account
    @apiParamExample {json} 请求示例
        {"phone":"15981867201,15981867202", "content":"您的验证码是111", "schedule_time":"140415112622"}

        *schedule_time: 可选, 定时发送时间, 如: 140415112622 代表14年04月15日11点26分22秒
    @apiSuccessExample {json} 成功返回
        {
            "message": "",
            "next": "",
            "data": {
                "id": 2787448,  # 短信ID
                "success": true
            },
            "response": "ok",
            "error": ""
        }
    @apiSuccessExample {json} 失败返回
        {
            "message": "请填写短信内容",
            "next": "",
            "data": "",
            "response": "fail",
            "error": ""
        }
    """
    args = request.QUERY.casts(phone=str, content=unicode, schedule_time=str)
    phones = args.phone or ''
    content = args.content or ''
    schedule_time = args.schedule_time or ''
    phones = phones.split(',')
    phones = [s for s in phones if is_chinamobile(s)]
    if not phones:
        return ajax.jsonp_fail(request, message='请输入移动手机号')
    if not content:
        return ajax.jsonp_fail(request, message='请填写短信内容')

    hub = tbktapi.Hub(request)
    url = '/sms/send'
    d = dict(phone=join(phones),
             content=content,
             schedule_time=schedule_time,
             platform_id=request.user.platform_id)
    r = hub.sms.post(url, d)
    if not r:
        return ajax.jsonp_fail(request, message='服务器开小差')
    return ajax.jsonp_ok(request, r.data)
Exemple #16
0
def get_qg_tiyan_day(user, subject_ids):
    if not user:
        return {}
    third = db.user_slave.third_user.select('third_id').get(user_id=user.id, platform_id=6)
    ord_province = user.get_mobile_order_region().select('province').order_by('-add_date').get(user_id=user.id)
    province = db.user_slave.third_common_provincecity.select('third_cityid').get(cityid=ord_province.province,
                                                                                  platform_id=6)
    if not third or not ord_province or not province:
        return {}

    hub = tbktapi.Hub()
    url = '/api/getopentotal/'
    data = dict(
        third_id=third.third_id,
        province_id=province.third_cityid,
        from_type=4,
        platform_id=6
    )
    r = hub.qg.post(url, data)
    if not r:
        return {}
    if r.respones == 'fail':
        return {}
    try:
        logging.info(r.data)
        data = r.data.get('productInfos', '')

        if not data:
            r = hub.qg.post(url, data)
            data = r.data.get('productInfos', '')
        if not data:
            return {}

        data = map(Struct, data)
        out = []
        for i in data:
            arg = Struct()
            produce_id = int(i.productId)
            sid = PRODUCT.get(produce_id, 0)
            if int(sid) != int(subject_ids):
                continue
            else:
                arg.sid = sid
                arg.status, arg.tiyan_day = get_qg_tiyan_range(i, user)
            out.append(arg)
        return out
    except Exception as e:
        logging.error('/api/getopentotal/ ERROR %s' % e)
    return []
Exemple #17
0
def send_sms_user_id(request, user_id, content, schedule_time=''):
    """
    发送短信
    :param request:
    :param user_id: 以逗号分割
    :param schedule_time: 可选, 定时发送时间, 如: 140415112622 代表14年04月15日11点26分22秒
    :param content:
    :return:
    """
    try:
        url = '/sms/send'
        data = dict(user_id=user_id, content=content, schedule_time=schedule_time)
        hub = tbktapi.Hub(request)
        hub.sms.post(url, data)
    except Exception as e:
        logging.error("send_sms ERROR %s:%s" % (inspect.stack()[0][3], e))
Exemple #18
0
def send_sms(request):
    """
    @api {post} /huodong/summer_word/t/send_sms [暑假活动-教师] 发短信给班级下学生
    @apiGroup summer_word
    @apiParamExample {json} 请求示例
       {'content':'家长您好....',type:1 开通短信 0 普通短息}
    @apiSuccessExample {json} 成功返回
       {"message": "积分成功", "error": "", "data": ', "response": "ok" , "next": ""}
    @apiSuccessExample {json} 失败返回
       {"message": "发送短信,每天只能加分一次", "error": "", "data": "null", "response": "fail", "next": ""}
    """
    # 普通短信
    item_no = 'send_sms'
    add_score = 50

    user = request.user
    user_id = user.id
    args = request.QUERY.casts(content=unicode, type=int)

    if not args.content.strip():
        return ajax_json.jsonp_fail(request, message='内容不能为空')
    # 开通短信
    if args.type == 1:
        item_no = 'send_open'
        add_score = 100

    # 群发短信
    unit_class_id = [u.id for u in user.units]           # user.units 教师所在年级的班级
    unit_ids = ','.join(str(t) for t in unit_class_id)
    hub = tbktapi.Hub(request)
    hub.sms.post('/sms/send', {'platform_id': user.platform_id, 'unit_id': unit_ids, 'content': args.content})

    # 积分明细查当天发送短信次数
    cut_time = time.time()
    ling_time = cut_time - cut_time % 86400
    sql = """ SELECT count(id) FROM score_user_detail
                  WHERE user_id = %s AND item_no = '%s' AND app_id=%s AND add_date > '%s';""" \
          % (user_id, item_no, APP_ID_TEA, ling_time)
    rs = db.slave.fetchone_dict(sql)

    # 是否更新积分主表
    if rs and rs['count(id)'] > 0:
        return ajax_json.jsonp_ok(request, message='发送短信,每天只能加分一次')
    else:
        # 写积分明细表、主表
        update_score(user, APP_ID_TEA, item_no, add_score=add_score)
    return ajax_json.jsonp_ok(request, message='积分成功')
Exemple #19
0
def p_givesms(request):
    """
    老板语文 作业短信接口
    :param request: 
    :return: 
    """
    args = request.QUERY.casts(classes='json',
                               content=unicode,
                               begin_time='datetime')
    classes = args.classes or []
    content = args.content or u''
    begin_time = args.begin_time

    if not classes:
        return ajax.jsonp_fail(request, message='请选择您要发布的班级')

    content = content.strip()
    if not content:
        return ajax.jsonp_fail(request, message='短信内容不能为空')

    if len(content) > 200:
        return ajax.jsonp_fail(request, message='短信内容不能超过200字')

    unit_ids = []
    user_ids = []
    for i in classes:
        unit_id = str(i.get('unit_id'))
        if unit_id in unit_ids:
            continue
        unit_ids.append(unit_id)
        bind_ids = i.get('bind_id', '')
        user_ids += [str(i) for i in bind_ids.split(',') if i]

    hub = tbktapi.Hub(request)
    url = '/sms/send'
    if unit_ids and not user_ids:
        user_ids += get_student_ids(unit_ids)

    args = dict(user_id=join(user_ids))
    r = hub.sms.post(url, args)

    if not r:
        return ajax.jsonp_fail(request, message='服务器开小差')

    com_sys.send_im(user_ids, 2, '新作业', '你的老师布置作业了,快来看看吧!', {'type': 1})
    return ajax.jsonp_ok(request, r.data)
Exemple #20
0
def get_user(request, user_id):
    """
    成功返回User对象
    失败返回None

    王晨光     2016-12-22
    """
    data = cache.user_profile.get(user_id)
    if not data:
        url = '/account/profile'
        hub = tbktapi.Hub(request)
        r = hub.com.post(url)
        if r['response'] == 'fail':
            return
        data = Struct(r['data'])
        cache.user_profile.set(user_id, data)
    user = User(data, request)
    return user
Exemple #21
0
def get_source(week_id, grade_id):
    """
    获取知识点信息
    :param week_id: 
    :param grade_id: 
    :return: 
    """
    source = db.tbkt_active.full_score_week_detail.select("knowledge_id", "week_id") \
        .get(week_id=week_id, grade_id=grade_id)
    if not source:
        return []
    kids = set(source.knowledge_id.split(","))
    hub = tbktapi.Hub()
    url = "/sx/knowledges"
    r = hub.sx.post(url, {"kid": join(list(kids))})
    if not r or r.response != "ok":
        return []
    return map(Struct, r.data)
Exemple #22
0
def invite_open(request, user, subject_id, sn_code, invite_user_id):
    """邀请开通"""
    sid = subject_id.split(',')
    hub = tbktapi.Hub(request)
    open_status = 0
    error = None

    open_info = get_open_status(user.id, sid)
    for o in open_info:
        if o['status'] == 1:
            sid.remove(o['subject_id'])
    if not sid:
        return False, u'该学科已开通!'
    for s in sid:
        r = hub.bank.post('/cmcc/open', {
            'phone_number': user.phone,
            'subject_id': s,
            'sn_code': sn_code
        })
        if r.response == 'ok':
            open_status = 1
        else:
            error = r.message
    if open_status != 1:
        return False, error

    is_invite = db.tbkt_active.active_user_invite.filter(
        user_id=invite_user_id, stu_id=user.id, active_id=ACTIVE_ID).first()
    if is_invite:
        sid = list(set(is_invite.subject_id.split(',') + sid))
        _sid = ','.join(str(i) for i in sid)
        db.tbkt_active.active_user_invite.filter(
            active_id=ACTIVE_ID, user_id=invite_user_id,
            stu_id=user.id).update(subject_id=_sid)
    else:
        _sid = ','.join(str(i) for i in sid)
        db.tbkt_active.active_user_invite.create(user_id=invite_user_id,
                                                 stu_id=user.id,
                                                 subject_id=_sid,
                                                 status=0,
                                                 active_id=ACTIVE_ID,
                                                 update_time=int(time.time()))

    return True, None
Exemple #23
0
def qg_open_subject(third_id, product_id, pay_type, success_url, fail_url):
    """
    开通接口
    :param third_id: 
    :param product_id: 
    :param success_url:
    :param fail_url: 
    :return: 
    """
    url = '/api/open/'
    data = dict(
        third_id=third_id,
        groupBillingId=product_id,
        pay_type=pay_type,
        successUrl=success_url,
        failUrl=fail_url
    )
    r = tbktapi.Hub().qg.post(url, data)
    return r.data
Exemple #24
0
def message_send_sms(unit_ids, stu_ids, content, platform_id):
    """
    发送短信
    :param unit_ids: 
    :param stu_ids: 
    :param content: 
    :param platform_id: 
    :return: 
    """
    try:
        hub = tbktapi.Hub()
        d = {
            'unit_id': join(unit_ids),
            'user_id': join(stu_ids),
            'content': content,
            'platform_id': platform_id
        }
        hub.sms.post('/sms/send', d)
    except Exception as e:
        logging.error("send msg ERROR %s:%s" % (inspect.stack()[0][3], e))
Exemple #25
0
def send_password(user_ids, sender={}):
    """
    功能说明:发送账号密码
    -------------------------------------------
    修改人     修改时间        修改原因
    -------------------------------------------
    徐威       2015-03-22
    王晨光     2017-6-14   支持批量发送
    -------------------------------------------
    """
    if not user_ids:
        return
    users = db.user.auth_user.select('id', 'username', 'phone').filter(id__in=user_ids)[:]
    profiles = db.user.auth_profile.select('user_id', 'password').filter(user_id__in=user_ids)[:]
    profiled = {p.user_id:p.password for p in profiles}
    for user in users:
        plain_password = profiled.get(user.id) or ""
        password = auth.decode_plain_password(plain_password)
        sms_content = u"您的同步课堂账号是:%s 密码是:%s,做作业(除数学知识点视频作业外)功能免费,请放心使用。客户端点此m.tbkt.cn下载安装。咨询电话:12556185" % (user.username, password)
        hub = tbktapi.Hub(user_id=user.id)
        hub.sms.post('/sms/send', {'phone':user.phone, 'content':sms_content})
Exemple #26
0
def p_sendsms(request):
    """
    @api {post} /class/sendsms [班级]发送班级短信
    @apiGroup class
    @apiParamExample {json} 请求示例
        {"unit_id": 班级ID, "content":短信内容}
    @apiSuccessExample {json} 失败返回
        {
            "message": "您没有该班级的发送权限",
            "next": "",
            "data": null,
            "response": "fail",
            "error": ""
        }
    @apiSuccessExample {json} 成功返回
        {"message": "", "next": "", "data": "", "response": "ok", "error": ""}
    """
    args = request.QUERY.casts(unit_id=int, content=unicode)
    unit_id = args.unit_id
    content = args.content
    if not unit_id:
        return ajax.jsonp_fail(request, message='缺少参数: unit_id')
    if not content:
        return ajax.jsonp_fail(request, message='短信内容不能为空')
    if len(content) > 200:
        return ajax.jsonp_fail(request, message='短信内容不能超过200字')

    user = request.user
    unit_ids = [u.id for u in user.all_units]
    if unit_id not in unit_ids:
        return ajax.jsonp_fail(request, message='您没有该班级的发送权限')

    students = common.get_unit_students(user, unit_id)
    phones = [s.phone_number for s in students]
    phones = list(set(phones))
    if phones:
        phones_s = ','.join(phones)
        hub = tbktapi.Hub(request)
        hub.sms.post('/sms/send', {'platform_id': user.platform_id, 'phone': phones_s, 'content': content})
    return ajax.jsonp_ok(request)
Exemple #27
0
def send_im(request, unit_ids, user_ids, title, content, type):
    """
    发送IM短信
    :param request:
    :param unit_ids:
    :param user_ids:
    :param title:
    :param content:
    :return:
    """
    try:
        url = '/im/sendim'
        data = dict(unit_id=unit_ids,
                    user_id=user_ids,
                    config_id=2,
                    title=title,
                    type=type,
                    content=content)
        hub = tbktapi.Hub(request)
        hub.com.post(url, data)
    except Exception as e:
        logging.error("send_im ERROR %s:%s" % (inspect.stack()[0][3], e))
Exemple #28
0
def get_unit_students(request, unit_id):
    """
    获取班级学生信息
    :param request: 
    :param unit_id: 
    :return: 
    """
    url = '/class/students'
    args = dict(unit_id=unit_id)
    hub = tbktapi.Hub(request)
    r = hub.com.post(url, args)
    out = []
    if r.response == 'ok':
        stu = map(Struct, r.data.get('students'))
        for i in stu:
            info = Struct()
            info.phone = i.phone_number
            info.id = int(i.user_id)
            info.is_open = 1 if i.status in (2, 9) else 0
            info.user_name = i.user_name
            info.portrait = i.portrait  # i.units
            out.append(info)
    return out
Exemple #29
0
def import_student(request,
                   teacher,
                   unit_class_id,
                   real_name,
                   sex,
                   phone_number,
                   open_option='',
                   sncode='',
                   send_pwd=1,
                   send_open_msg=0):
    """
    导入学生
    -------------------------
    王晨光     2016-12-08
    -------------------------
    参数说明:
    teacher: 教师User对象
    unit_class_id: 要加入的班级unit_class_id
    real_name: 学生姓名
    sex: 性别 1男 2女
    phone_number: 家长手机号
    open_option: 'open'表示短信开通(和 sn_code都为空则暂不开通)
    sncode: 验证码开通
    send_pwd: 是否发送账号密码
    send_open_msg 是否发送开通科目短信 0:不发送 1:发送
    :return: error
    """
    subject_id = teacher.sid

    # 班级学生ID
    user_ids = teacher.get_mobile_order_region().filter(
        unit_class_id=unit_class_id,
        user_type=1).select('user_id').flat('user_id')[:]
    if user_ids:
        if db.user_slave.auth_user.filter(id__in=user_ids,
                                          real_name=real_name).exists():
            return '添加学生失败。您所添加的学生与班内学生有重名, 您可进行如下操作:<br>1. 移除班内重名学生<br>2. 变更需要添加的学生姓名再添加'

    nowt = int(time.time())
    user = db.user_slave.auth_user.get(phone=phone_number,
                                       type=1,
                                       real_name=real_name)
    if not user:
        user = db.user_slave.auth_user.get(phone=phone_number, type=1)
    if user:
        # 是否开通
        opened = db.ketang_slave.mobile_subject.filter(
            "cancel_date<=0 or cancel_date>%s" % nowt,
            open_date__gte=nowt,
            user_id=user.id,
            subject_id=subject_id).exists()

        # 遇到同一班级同一手机号, 直接改名字
        reg = teacher.get_mobile_order_region().filter(
            unit_class_id=unit_class_id, user_id=user.id).exists()
        if reg:
            if opened:
                return '添加失败, 该用户已存在并且已开通'
            else:
                return update_student_info(user.id, real_name, sex)

        # 添加学生用户是否已开通过指定科目,如果已开通则不在下发开通短信
        if opened or not is_chinamobile(phone_number):
            open_option = ''
            sncode = ''

        region = teacher.get_mobile_order_region().get(user_id=user.id)
        if region:
            # 是否有开通过的学科
            if region.unit_class_id != unit_class_id and opened:
                return '该学生已在其他班级,无法添加'

        # 加入班级
        com_class.join_unit_class_by_id(user, unit_class_id)
        # 修改姓名
        if user.real_name != real_name or user.sex != sex:
            update_student_info(user.id, real_name, sex)
    else:
        user_id, error = com_class.import_user(
            1,
            phone_number,
            real_name,
            gender=sex,
            join_unit_id=unit_class_id,
            subject_id=subject_id if open_option == 'open' else 0,
            sn_code=sncode,
            send_pwd=send_pwd,
        )
        # 开通科目
        if open_option == "open" or sncode:
            hub = tbktapi.Hub(request)
            open_dict = {
                "phone_number": phone_number,
                "subject_id": subject_id,
                "sn_code": sncode,
                "platform_id": teacher.platform_id
            }
            out = hub.bank.post('/cmcc/open', open_dict)
        if error:
            return error
Exemple #30
0
def get_user_info(province_id, third_id, from_type, user):
    if not province_id or not third_id or not from_type:
        return {}

    hub = tbktapi.Hub()
    url = '/api/getopentotal/'
    data = dict(
        third_id=third_id,
        province_id=province_id,
        from_type=from_type,
        platform_id=6
    )
    r = hub.qg.post(url, data)
    if not r:
        return {}
    if r.respones == 'fail':
        return {}

    try:
        data = r.data.get('productInfos')
        if not data:
            r = hub.qg.post(url, data)
            data = r.data.get('productInfos')
        if not data:
            return {}
        data = map(Struct, data)

        out = Struct()
        out.third_id = third_id,
        out.province_id = province_id,
        out.list = []
        user_type = user.dept_id
        user_id = user.id
        for i in data:
            productId_tmp = int(i.productId)

            if productId_tmp in (2001023, 2001024, 114, 130):
                continue

            if int(user_type) == 2 and productId_tmp not in (111, 2001020):
                continue

            arg = Struct()
            arg.status = 1 if int(i.state) in open_status else 0  # 当前是否开通
            arg.group = []  # 开通资费信息
            arg.productId = productId_tmp
            arg.sid = PRODUCT.get(productId_tmp, 0)
            if int(i.state) != 3:
                arg.tiyan_day = 0
            else:
                arg.tiyan_day = qg_get_yiyan_days(i, user_id)

            group = map(Struct, i.groupList)
            for g in group:
                arg.subject_name = g.groupName  # 科目名称(第三方提供)
                arg.groupId = g.groupId  # 子组合ID
                billings = map(Struct, g.groupBillings)
                for bill in billings:
                    gup = Struct()
                    gup.product_id = bill.groupBillingId  # 资费id(套餐id,开通接口需要)
                    gup.day_num = bill.billingDay  # 开通时间
                    gup.open_type = open_type.get(int(bill.billingType))  # 开通类型 1: 包月  2:按天点播
                    gup.price = bill.price
                    arg.group.append(gup)
            out.list.append(arg)
        out.list.sort(lambda x, y: cmp(x["productId"], y["productId"]))
        out.third_id = third_id
        return out
    except Exception as e:
        print e
        return {}