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
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)
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)
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)
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='已发送开通短信')
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)
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='')
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='密码将发到您手机上,请注意查收')
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
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 })
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)
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 ''
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))
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})
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)
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 []
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))
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='积分成功')
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)
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
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)
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
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
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))
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})
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)
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))
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
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
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 {}