def get(url): try: print url gen_log.info("GET: URL[%s]", url) return utils.urlopen(url).read() except: gen_log.info(traceback.format_exc()) print traceback.format_exc() return None
def ssoed(uid): """ Check if user is registered int """ url = config.moodle_url + '/speiyou/check_sso.php?uid=' + uid rs = get(url) if rs and "EMPTY_USER" != rs: gen_log.info("Token User Exists uid=[%s], moodleUserId[%s]", uid, rs) return rs
def sms(uid, content): """ 短信接口: """ md5 = mk_md5(uid) url = url_prefix + "/huanxun/v1/sms.json?uid=%s&content=%s" logger.info("Invoke %s ", url) x = get_with_header({"sys": _sys, "plat": _plat, "md5": md5}, url % (uid, urllib.quote(content))) return log_it(x)
def send_enrol_file(uid, cla_id): url = set_file_url(uid, cla_id) if ssoed(uid): rs = get(url) if rs == "True": exe_cron() return True else: gen_log.info("Failed to send enrol file [%s], result[%s]", uid + cla_id, rs) return False
def http_post(host, api, method, param, headers): try: conn = httplib.HTTPConnection(host) conn.request(method, api, param, headers) res = conn.getresponse() data = res.read() conn.close() return data except: gen_log.info(traceback.format_exc()) return False
def cla_build_status(cla_id): """ http://phpapi.cakephp.com/huanxun/v1/cla_build_status.json 修改班级构建状态 """ url = url_prefix + "/huanxun/v1/cla_build_status.json?claId=%s" summary = cla_id md5 = mk_md5(summary) logger.info("Invoke %s ", url) x = get_with_header({"sys": _sys, "plat": _plat, "md5": md5}, url % cla_id) return log_it(x)
def reg_plan_status(uid, cla_id): """ 更新报课的排课状态接口: http://phpapi.cakephp.com/huanxun/v1/reg_plan_status.json """ summary = uid + cla_id md5 = mk_md5(summary) url = url_prefix + "/huanxun/v1/reg_plan_status.json?uid=%s&claId=%s" logger.info("Invoke %s ", url) x = get_with_header({"sys": _sys, "plat": _plat, "md5": md5}, url % (uid, cla_id)) return log_it(x)
def check_locked(row): """ 检查有没有预考勤 """ for r in row: #有预考勤 if r.check_roll == CheckRoll.LOCKED: gen_log.info("[%s][%s] was locked", r.class_date, r.time_id) return True, "[%s] will start after [%s] our" % (r.class_date, pre_check) #未考勤的课程是否即将开始 if r.check_roll == CheckRoll.NORMAL or r.check_roll == CheckRoll.TRAIL: if not BaseDBModel.check_time(r.class_date, r.start_time): gen_log.info("[%s] will start after [%s] our" % (r.class_date, pre_check)) return True, "[%s] will start after [%s] our" % (r.class_date, pre_check) return False, "None"
def attendances(uid, cla_id, cuc_id, status): """ # 修改考勤状态接口: uid: cuc_id:课时Id status:考勤状态 # http://phpapi.cakephp.com/huanxun/v1/attendances.json """ # status = '0' # cuc_id = "16" summary = str(uid) + str(cuc_id) + str(status) md5 = mk_md5(summary) url = url_prefix + "/huanxun/v1/attendances.json?uid=%s&cucId=%s&claId=%s&Status=%s" logger.info("Invoke %s ", url) x = get_with_header({"sys": _sys, "plat": _plat, "md5": md5}, url % (uid, cuc_id, cla_id, status)) return log_it(x)
def get(self, *args, **kwargs): uname = self.get_argument("uname") uid = self.get_argument("uid") if isinstance(uname, unicode): uname = uname.encode("utf-8") sso = single_login(uid, uname) gen_log.info(sso) email = "Student From LJL id=%s, name=%s\n" \ "Payed for:%s \n" \ "Class Table Link: http://yueke.speiyou.com/timetable/list/moodle?uid=%s&claId=%s\n" \ "SSO URL: %s" \ % (uid, uname, "test 000", uid, "classId", sso) gen_log.info(email) sendmail(msg=email, subject="%s Student Pay For Class" % datetime.now()) self.write("world") else: self.write("Hello")
def courses(uid, cla_id, datas): """ 修改课程信息接口: http://phpapi.cakephp.com/huanxun/v1/courses.json datas: [dict, dict] 原课程和目标课程的对应关系 """ result = dict() result["uid"] = uid result["claId"] = cla_id data_str = ujson.dumps(datas) result["datas"] = data_str url = url_prefix + "/huanxun/v1/courses.json" summary = uid + cla_id md5 = mk_md5(summary) logger.info("Invoke %s ", url) if debug: return Row({"rlt": True, "data": "Skip invoke "}) x = post_u8(url, result, {"sys": _sys, "plat": _plat, "md5": md5}) return log_it(x)
def update_moodle_course_name(src, target): if config.url_prefix == "http://ft.speiyou.com": gen_log.info("Skip Update coures name in moodle ") return True src_c = get_course(src) target_c = get_course(target) try: db._db.autocommit(False) rs1 = db.execute_rowcount("update mdl_course set fullname=%s, idnumber=%s " "where id=%s ", target, target, src_c.id) if rs1: rs2 = db.execute_rowcount("update mdl_course set fullname=%s, shortname=%s, idnumber=%s " "where id=%s ", src, src, src, target_c.id) if rs2: db._db.commit() return True db._db.rollback() except: db._db.rollback() finally: db._db.autocommit(True)
def _sendmail(msg='', subject='', to='*****@*****.**'): """send a email with msg and subject :param msg: :param subject: """ try: frm_user = '******' frm_passwd = '106yh!@#$' # smtpserver = smtplib.SMTP("smtp.gmail.com",587) smtpserver = smtplib.SMTP("smtp.163.com", 25) smtpserver.ehlo() smtpserver.starttls() smtpserver.ehlo() smtpserver.login(frm_user, frm_passwd) for m in mails: to = m header = 'To:%s\nFrom:%s\nSubject:%s\n' % (to, frm_user, subject) message = header + '\n %s\n\n' % msg.encode("utf-8") smtpserver.sendmail(frm_user, to, message) smtpserver.close() except: gen_log.info(traceback.format_exc())
def list_class(self, cla_id, teacher='', t_interval='', p_no=1, size=p_size, wr_status="normal"): """ 分页查询课表 """ q_sql = """ select cwr.workroom, cwr.cla_id, wr.id, wr.start_time, wr.description, t.id as teacher, t.fullname, t.shortname, group_concat(wrd.time_id, '=',wrd.class_date,"=", wrd.class_type) as id_dates from mid_course_workroom cwr join mid_workroom wr on cwr.workroom=wr.id join mid_teacher t on t.id=wr.teacher join mid_workroom_dates wrd on wr.id= wrd.workroom """ group = " group by wrd.workroom order by wr.start_time" limit = "" where = " where cwr.cla_id=%s and wr.status=%s " params = [cla_id, wr_status] if teacher: where += " and (t.fullname=%s or t.shortname=%s) " params.append(teacher) params.append(teacher) if t_interval and t_interval != u'0': t1, t2 = t_interval.split('-') where += " and wr.start_time between %s and %s " params.append(t1) params.append(t2) if size > 0: limit = " limit %s, %s " % ((p_no - 1) * size, size) results = self.db.query(q_sql + where + group + limit, *params) for r in results: r["id_dates"] = split_sort(r.id_dates) if config.debug: gen_log.info("query sql[%s], param[%s]", q_sql + where, params) return results
def select_class(self, uid='', cla_id='', workroom=''): """ 选课 1.check if selected 2.update workroom flag as used """ flag, dt = self.models.mss.check_select(uid, cla_id) if flag: #判断workroom是否可选 if self.models.mwr.used_exists(workroom): gen_log.info("select a used workroom [%s]", workroom) return msg(False, "Class is used By others") # Reselect if dt: if workroom == dt.workroom: return msg() rs = self.models.mss.update_by(_id=dt.id, cla_id=cla_id, uid=uid, fields=["workroom"], values=[workroom]) rs1 = self.models.mwr.free_lock(dt.workroom, "normal") rs2 = self.models.mwr.free_lock(workroom, "used") if rs and rs1 and rs2: gen_log.info("Reselect class uid[%s], OldWR[%s], NewWR[%s], Success", uid, dt.workroom, workroom) return msg() else: return msg(False, "Failed on Reselect class") # Select Class else: rs = self.models.mss.add([(uid, "", cla_id, workroom, "selected", "N", 1)]) rs2 = self.models.mwr.free_lock(workroom, "used") if rs and rs2: return msg() else: message = "Failed on select class" if rs or rs2: if rs: message = "Failed on select class, Failed to lock workroom[%s]" % workroom else: message = "Failed on select class, Failed to insert to select table" gen_log.info(message) return msg(False, message) else: gen_log.info(msg(False, "Have Classes already")) return msg(False, "Have Classes already")
def pay(self, cla_id='', uid='', uname='NotSupply'): """ 支付课程 1. insert into student_classes 2. update student_class_select deal as payed 3. return class data """ flag, selected = self.models.mss.get_selected_for_pay(uid, cla_id) dt, valid_time = BaseDBModel.get_valid_date() if flag: if selected: rows = self.models.mwrd.get_valid_dates(selected.workroom, status="used", date_now=dt) p = [] for r in rows: if BaseDBModel.check_time(r.class_date, r.start_time): if r.class_type == CheckRoll.TRAIL: p.append((uid, cla_id, r.time_id, r.workroom, r.teacher, r.class_date, CheckRoll.TRAIL)) else: p.append((uid, cla_id, r.time_id, r.workroom, r.teacher, r.class_date, CheckRoll.NORMAL)) rs = self.models.msc.add(p) rs1 = self.models.mss.update_by(_id=selected.id, uid=uid, cla_id=cla_id, fields=["uname", "deal", "lastupdate"], values=[uname, "payed", datetime.now()]) if rs and rs1: try: if isinstance(uname, unicode): uname = uname.encode("utf-8") sso = single_login(uid, uname) # teacher_number = self.models.mss.get_teacher_number(rows[0].teacher) # #set flat enrol file # line = "add, student, %s, %s\nadd, teacher, %s, %s"\ # % (uid, selected.workroom, # # uid, rows[0].teacher.upper(), # teacher_number, selected.workroom # # teacher_number, rows[0].teacher.upper() # ) # write_to_file(uid, cla_id, line) # enrol_file = set_file_url(uid, cla_id) # #get moodle cron exe url # cron = get_cron_url() # edit_url = get_edit_classtable(selected.workroom) classtable = get_classtable_url(uid=uid, cla_id=cla_id) #update class table # update_class_table(classtable, selected.workroom) # update_course_shortname(selected.workroom, uname) # set_when_payed(uid, cla_id, uname, selected.workroom) email = "Student From LJL id=%s, name=%s\n" \ "Payed for:%s \n" \ "Class Table Link:\n %s \n" \ "Step 1:\n %s\nStep 2:\n %s\nStep 3:\n %s\n"\ "Step 4(Open is different Browser):\n %s" \ % (uid, uname, rows[0].workroom, classtable, "Handler", "Handler", "Handler", sso) sendmail(msg=email, subject="%s Student Pay For Class" % datetime.now()) except: gen_log.info(traceback.format_exc()) return {"rlt": True, "msg": "Success", "data": self.set_response(rows, cla_id, uid)} else: return {"rlt": False, "msg": "Failed", "data": "支付失败"} else: return {"rlt": False, "msg": "Success", "data": "没有选课"} else: #重复调用 rows = self.models.mwrd.get_by_workroom(selected.workroom) return {"rlt": True, "msg": "Repeat Invoke", "data": self.set_response(rows, cla_id, uid)}
def get_tip(message): gen_log.info("Refund Failed When %s ,uid[%s], cla_id[%s]", message, uid, cla_id) return msg(False, "Refund Failed When %s ,uid[%s], cla_id[%s]" % (message, uid, cla_id))
def change_class(self, cla_id='', uid='', target_wr='', manager=False): """ 转班: 1.判断可否转(客服可以随时来转班) 2.查询现在所属班级 3.查询新班级 3.1查询调课记录(check_roll=7) 4.设置专版对应关系 5.更新student_class表 6.插入专版记录 7.插入新选班级到student_select 8.锁定新课 9.释放愿课 """ can_change = True selected_row = None # 如果不是客服,检查是否可以转班 if not manager: flag, selected_row = self.models.mss.check_will_change(cla_id=cla_id, uid=uid) if not flag: can_change = False if can_change: if self.models.mwr.used_exists(target_wr): gen_log.info("select a used workroom [%s]", target_wr) return msg(False, "Class is used by others or not exists") #查询原班数据,新班数据 src_data = self.models.msc.full_query(uid=uid, cla_id=cla_id) target_data = self.models.mwrd.get_by_workroom(target_wr, status='normal') if not src_data: gen_log.info("Get class_table failed,cla_id[%s], uid=[%s]", cla_id, uid) return msg(False, "Get class_table failed,cla_id[%s], uid=[%s]" % (cla_id, uid)) #检查是否有预考勤的课程, 或者12小时内有上课 locked, message = self.check_locked(src_data) if locked: gen_log.info("Can change classes check ,uid[%s], cla_id[%s], message[%s]", uid, cla_id, message) return msg(False, "Can change classes check message[%s]" % message) if not target_data: gen_log.info("Get new WorkRoom failed,cla_id[%s], uid=[%s], workroom[%s]", cla_id, uid, target_wr) return msg(False, "Get new WorkRoom failed,cla_id[%s], uid=[%s], workroom[%s]" % (cla_id, uid, target_wr)) #寻找对应关系 dlt, ist, ist_records, datas = self.get_change_relation(src_data, target_data, selected_row.id) if dlt and ist and ist_records: #删除原来课表 _rs0 = self.models.msc.del_many(time_ids=dlt, cla_id=cla_id, uid=uid) if not _rs0: gen_log.info("Change classes failed when delete old datas. " "uid=[%s],cla_id[%s], times[%s]", uid, cla_id, dlt) return msg(False, "Change Classes Failed") #插入新课表 _rs1 = self.models.msc.add(ist) if not _rs1: gen_log.info("Change classes failed when insert new datas. " "uid=[%s],cla_id[%s]", uid, cla_id) return msg(False, "Change Classes Failed") #记录调课内容 _rs2 = self.models.mscc.add(ist_records) if not _rs2: gen_log.info("Change classes failed when insert records datas. " "selected_id=[%s]", selected_row.id) return msg(False, "Change Classes Failed") #释放原来的课程 _rs3 = self.models.mwr.free_lock(selected_row.workroom, "normal") if not _rs3: gen_log.info("Change classes failed when relase old workroom. " "workroom=[%s]", selected_row.workroom) return msg(False, "Change Classes Failed") #锁定新课程 _rs4 = self.models.mwr.free_lock(target_wr, "used") if not _rs4: gen_log.info("Change classes failed when lock new workroom. " "workroom=[%s]", target_wr) return msg(False, "Change Classes Failed") _rs5 = self.models.mss.add([(uid, selected_row.uname, cla_id, target_wr, "payed", "N", selected_row.version + 1)]) _rs51 = self.models.mss.update_by(_id=selected_row.id, cla_id=cla_id, uid=uid, fields=["deal", "lastupdate"], values=["changed", datetime.now()]) if not _rs5 or not _rs51: gen_log.info("Change classes failed when update select records. " "select_id=[%s]", selected_row.id) return msg(False, "Change Classes Failed") r6 = update_moodle_course_name(selected_row.workroom, target_wr) if not r6: gen_log.info("Course Names Update Failed src[%s], target[%s]", selected_row.workroom, target_wr) return msg(False, "Change Classes Failed, Course Names Update Failed") email = "Set Email Error, Concat to Windy" try: src_teacher = self.models.mss.get_teacher_number(src_data[0].teacher) target_teacher = self.models.mss.get_teacher_number(target_data[0].teacher) line = "del, teacher, %s, %s\n" \ "add, teacher, %s, %s" \ % (src_teacher, target_wr, target_teacher, target_wr) write_to_file(uid, cla_id + "_change" + src_data[0].teacher + target_data[0].teacher, line) enrol_file = set_file_url(uid, cla_id + "_change" + src_data[0].teacher + target_data[0].teacher) cron = get_cron_url() if src_data[0].teacher == target_data[0].teacher: email = "Student Change Teacher From LJL id=%s\n" \ "Step 1:\n %s\nStep 2:\n %s\n" \ % (uid, enrol_file, cron) else: course_url_1 = get_course_url(target_wr) course_url_2 = get_course_url(selected_row.workroom) # src_lab, target_lab = get_labels(selected_row.workroom, target_wr) # src_lab_edit = get_edit_label(src_lab.edit) # target_lab_edit = get_edit_label(target_lab.edit) # src_vc = src_lab.intro # target_vc = target_lab.intro email = "Student Change Teacher From LJL id=%s\n" \ "Step 1:\n %s\nStep 2:\n %s\n" \ "Step 3:\n Change Teacher ID as: %s\n %s\n" \ "Step 4:\n Change Teacher ID as: %s\n %s\n" \ % (uid, enrol_file, cron, target_data[0].teacher, course_url_1, src_data[0].teacher, course_url_2) except: gen_log.info("Failed set Email info") gen_log.info(traceback.format_exc()) return Row({"rlt": True, "msg": datas, "email": email}) else: gen_log.info("uid=[%s],cla_id[%s] No classes can be change.", uid, cla_id) return msg(False, "No classes can be change.") else: gen_log.info("uid=[%s],cla_id[%s] Can not change workroom Again.", uid, cla_id) return msg(False, "Can not change workroom Again.")
def change_date(self, cla_id='', uid='', src_time_id=0, target_time_id=0, manager=False): """ 1.判断是否可以调课 2.查询新旧课程 3.插入到调课记录表 4.更新原课状态(check_roll=Changed) 5.更新新课状态(status=used) """ can_change = True # 如果不是客服,检查是否已经调过课了 if not manager: rows = self.models.msdc.check_has_changed(cla_id=cla_id, uid=uid) if rows: can_change = False #可以调课 if can_change: #查询调课需要的信息MidStudentClasses src_data = self.models.msc.query_one(time_id=src_time_id, cla_id=cla_id, uid=uid) current_selected = self.models.mss.get_current_select(cla_id=cla_id, uid=uid, workroom=src_data.workroom) target_data = self.models.mwrs.get_by_time_id(time_id=target_time_id) if src_data and target_data and current_selected: if self.models.mwrs.used_exists(target_data.id): gen_log.info("select a used workroom [%s]", target_data.id) return msg(False, "Class is used By others") if src_data.class_type == CheckRoll.TRAIL: gen_log.info("Trail Class Can not change [%s]", target_data.id) return msg(False, "Trail Class Can not change") #删除旧课表 rs = self.models.msc.del_one(time_id=src_data.time_id, cla_id=cla_id, uid=uid) if not rs: gen_log.info("Failed to delete old class:uid=[%s], cla_id=[%s], time_id=[%s]", uid, cla_id, src_data.time_id) return msg(False, "Failed on delete data") #插入新课表 # ["uid", "cla_id", "time_id", "workroom", "teacher", "class_date", "check_roll"] rs1 = self.models.msc.add([(uid, cla_id, target_data.time_id, target_data.id, target_data.teacher, target_data.class_date, CheckRoll.CHANGE)]) if not rs1: gen_log.info("Failed to Insert to student_classes:uid=[%s], cla_id=[%s], time_id=[%s]" ", new_time_id[%s], new_workroom[%s]", uid, cla_id, src_data.time_id, target_data.time_id, target_data.id) return msg(False, "Failed on insert data to student_classes") # 插入调课记录 # ["select_id", "uid", "cla_id", "src_workroom", "target_workroom", # "src_date", "target_date", "src_time_id", "target_time_id", # "handle", "operate_by"] operate_by = "student" if manager: operate_by = "manager" rs2 = self.models.msdc.add([(current_selected.id, uid, cla_id, src_data.workroom, target_data.id, src_data.class_date, target_data.class_date, src_data.time_id, target_data.time_id, "N", operate_by)]) if not rs2: gen_log.info("Failed to Insert to student_date_changed:uid=[%s], cla_id=[%s], time_id=[%s]" ", new_time_id[%s], new_workroom[%s], old_time_id[%s], old_workroom[%s]", uid, cla_id, src_data.time_id, target_data.time_id, target_data.id, src_data.time_id, src_data.workroom) return msg(False, "Failed on insert data to student_date_changed") #更新被调课的状态为used rs3 = self.models.mwrs.free_lock(target_data.id, "used") if not rs3: gen_log.info("Failed to Lock workroom_single:uid=[%s], cla_id=[%s], new_workroom[%s]", uid, cla_id, target_data.id) return msg(False, "Failed to Lock workroom workroom_single") #返回更改数据对应关系 rep = self.set_change_date(src_data, target_data) email = "Student %s\n" \ "src workroom: %s, date:%s time:%s\n" \ "target workroom: %s, date:%s time:%s\n"\ % (uid, src_data.workroom, src_data.class_date, src_data.start_time, target_data.id, target_data.class_date, target_data.start_time) return Row({"rlt": True, "msg": rep, "email": unicode(email)}) else: gen_log.info("Query Change Date Failed src_data, target_data, current_selected") gen_log.debug(src_data) gen_log.debug(target_data) gen_log.debug(current_selected) return msg(False, "No Class Can be Changed") else: gen_log.info("uid=[%s], Can not change class Again.", uid) return msg(False, "Can not change class Again.")
def log_it(rs): rlt = Row(ujson.loads(rs)) logger.info("Result: rlt:[%s], data:[%s]", rlt.rlt, rlt.data) return rlt
def single_login(uid, uname): sso_url = url_sso + '?uname=%s&user=%s' % (uname, uid) try: rs = None try: rs = urlopen(sso_url) logger.info("Single Result--->") logger.info(rs) except: logger.info("1-Single Login Failed, %s", traceback.format_exc()) if not rs: try: print url_sso + '?uname=%s&user=%s' % (urllib.quote(uname), uid) rs = urlopen(url_sso + '?uname=%s&user=%s' % (urllib.quote(uname), uid)) logger.info(rs) except: logger.info("2-Single Login Failed, %s", traceback.format_exc()) except: logger.info("Single Login Failed, %s", traceback.format_exc()) finally: return sso_url # single_login(uid='987654321000', uname=u'李华人')