def miniprogram_announcement_announcementId_get(announcementId): # 获取通知的详情 db_session = None if "DEVMODE" in os.environ: if os.environ["DEVMODE"] == "True": db_session = orm.init_db(os.environ["DEV_DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) learner = weapp.getLearner() if not learner: db_session.remove() return {'code': -1001, 'message': '没有找到对应的Learner'}, 200 announcement = db_session.query(orm.Announcement_db).filter(orm.Announcement_db.id == announcementId).one_or_none() try: response = { "id": announcement.id, "initiatorId": announcement.initiatorId, "initiatorDisplayName": announcement.initiatorDisplayName, "recipients": json.loads(announcement.recipients), "sentDateTime": EWSDateTime.from_datetime(tzinfo.localize(announcement.sentDateTime)).ewsformat(), "modifiedDateTime": EWSDateTime.from_datetime(tzinfo.localize(announcement.modifiedDateTime)).ewsformat(), "thumbnail": json.loads(announcement.thumbnail), "title": announcement.title, "description": announcement.description, "body": json.loads(announcement.body), "attachment": json.loads(announcement.attachment), } db_session.remove() return {'code': 0, 'data': response, 'message': '成功'}, 200 except Exception as e: db_session.remove() return {'code': -5003, 'message': '获取通知详情失败', 'log': str(e)}, 200
def miniprogram_booking_roomCode_get(roomCode, monthToLoad): # noqa: E501 # 按房间信息和月份(query中)获取所有的预约信息 db_session = None if "DEVMODE" in os.environ: if os.environ["DEVMODE"] == "True": db_session = orm.init_db(os.environ["DEV_DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) responseList = [] learner = weapp.getLearner() if not learner: db_session.remove() return {'code': -1001, 'message': '没有找到对应的Learner'}, 200 try: room_account = Account( primary_smtp_address=('*****@*****.**' % roomCode), credentials=credentials, config=config ) except Exception as e: db_session.remove() return {'code': -2002, 'message': '代理用的Office Account初始化失败', "log": str(e)}, 200 monthToLoad_year = int(monthToLoad.split("-")[0]) monthToLoad_month = int(monthToLoad.split("-")[1]) if monthToLoad_month == 1: start = room_account.default_timezone.localize(EWSDateTime(monthToLoad_year - 1, 12, 1)) else: start = room_account.default_timezone.localize(EWSDateTime(monthToLoad_year, monthToLoad_month - 1, 1)) if monthToLoad_month == 11: end = room_account.default_timezone.localize(EWSDateTime(monthToLoad_year + 1, 1, 1)) elif monthToLoad_month == 12: end = room_account.default_timezone.localize(EWSDateTime(monthToLoad_year + 1, 2, 1)) else: end = room_account.default_timezone.localize(EWSDateTime(monthToLoad_year, monthToLoad_month + 2, 1)) try: for item in room_account.calendar.view(start=start, end=end).all().order_by('start'): notes = db_session.query(orm.BookingNotes_db).filter(orm.BookingNotes_db.changekey == item.changekey).one_or_none() localizedStart = item.start.astimezone(get_localzone()) localizedEnd = item.end.astimezone(get_localzone()) bookedByID = getattr(notes, "bookedByID", 0) bookedByName = getattr(notes, "bookedByName", "") responseList.append({ 'startDate': ("%d-%0*d-%0*d" % (localizedStart.year, 2, localizedStart.month, 2, localizedStart.day)), 'endDate': ("%d-%0*d-%0*d" % (localizedEnd.year, 2, localizedEnd.month, 2, localizedEnd.day)), 'startTime': ("%0*d:%0*d" % (2, localizedStart.hour, 2, localizedStart.minute)), 'endTime': ("%0*d:%0*d" % (2, localizedEnd.hour, 2, localizedEnd.minute)), 'subject': item.subject, 'changekey': item.changekey, 'bookedByID': bookedByID, 'bookedByName': bookedByName, 'description': '' if not getattr(item, 'text_body') else getattr(item, 'text_body'), 'type': 'appointment' }) except Exception as e: db_session.remove() return {'code': -2003, 'message': '获取房间事件列表失败', 'log': str(e)}, 200 db_session.remove() return {'code': 0, 'data': responseList, 'message': '成功'}, 200
def miniprogram_picture_get(uid, pictureType): # noqa: E501 db_session = None if "DEVMODE" in os.environ: if os.environ["DEVMODE"] == "True": db_session = orm.init_db(os.environ["DEV_DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) learner = weapp.getLearner() if not learner: db_session.remove() return {'code': -1001, 'message': '没有找到对应的Learner'}, 200 if pictureType not in [ "event", "announcement", "project", "course", "club" ]: return {'code': -4001, "message": "图片类别不支持"}, 200 img_local_path = os.path.join(os.environ["STORAGEURL"], pictureType, uid) img_stream = '' try: with open(img_local_path, 'rb') as img_f: img_stream = img_f.read() response = make_response(img_stream) response.headers['Content-Type'] = 'image' except Exception as e: db_session.remove() return {'code': -4004, 'message': '图片文件读取失败', 'log': str(e)}, 200 db_session.remove() return response, 200
def getLearner() -> Learner_db or None: db_session = None if "DEVMODE" in os.environ: if os.environ["DEVMODE"] == "True": db_session = orm.init_db(os.environ["DEV_DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) headers = connexion.request.headers try: sessionKey = headers['token'] except Exception as e: current_app.logger.error(str(e)) db_session.remove() return None if db_session.query(orm.Config_db).filter( orm.Config_db.name == 'mode').one_or_none().value == "audit": auditAccountList = json.loads( db_session.query(orm.Config_db).filter( orm.Config_db.name == 'auditAccountList').one_or_none().value) auditAccount = None for account in auditAccountList: if account['sessionKey'] == sessionKey: auditAccount = db_session.query(orm.Learner_db).filter( orm.Learner_db.id == account['learnerId']).one_or_none() return auditAccount learner: Learner_db = db_session.query(orm.Learner_db).filter( orm.Learner_db.sessionKey == sessionKey).one_or_none() db_session.remove() return learner
def miniprogram_learner_get(): db_session = None if "DEVMODE" in os.environ: if os.environ["DEVMODE"] == "True": db_session = orm.init_db(os.environ["DEV_DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) learner = weapp.getLearner() if not learner: db_session.remove() return {'code': -1001, 'message': '没有找到对应的Learner'}, 200 result_list = [] query: List[orm.Learner_db] = db_session.query(orm.Learner_db).filter(orm.Learner_db.validated == True).all() for learner in query: result_list.append({ "id": learner.id, "givenName": learner.givenName, "familyName": learner.familyName, "isMentor": learner.isMentor, "role": learner.role, "branch": learner.branch }) db_session.remove() return {'code': 0, 'data': result_list, 'message': '成功'}, 200
def miniprogram_login_post(loginPostBody): # 处理授权用于获取unionid,openid,sessionKey并记入数据库内 db_session = None if "DEVMODE" in os.environ: if os.environ["DEVMODE"] == "True": db_session = orm.init_db(os.environ["DEV_DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) MINIPROGRAM_APPID: str = os.environ['MINIPROGRAM_APPID'] loginPostBody_dict = connexion.request.get_json() sessionKey = connexion.request.headers['token'] try: decrypter = weapp.WXBizDataCrypt(MINIPROGRAM_APPID, sessionKey) decryptedData = decrypter.decrypt(loginPostBody_dict['encryptedData'], loginPostBody_dict['iv']) unionid = decryptedData['unionId'] except Exception as e: print(e) db_session.remove() return {'code': -1004, 'message': '解析微信认证加密信息失败', 'log': str(e)}, 200 learner = db_session.query(orm.Learner_db).filter(orm.Learner_db.unionid == unionid).one_or_none() if not learner: db_session.remove() return {'code': -1001, 'message': '没有找到对应的Learner'}, 200 learner.openidWeApp = decryptedData['openId'] learner.sessionKey = sessionKey db_session.commit() response = {"unionid": unionid, "learnerFullName": learner.familyName + learner.givenName, "isAdmin": learner.isAdmin} db_session.remove() return {'code': 0, 'data': response, 'message': '成功'}, 200
def project_project_id_get(projectId): # noqa: E501 """返回一个Project的详细信息 # noqa: E501 :param projectId: :type projectId: int :rtype: Learner """ db_session = None if "DEVMODE" in os.environ: if os.environ["DEVMODE"] == "True": db_session = orm.init_db(os.environ["DEV_DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) validation_result = wxLogin.validateUser() if not validation_result["result"]: db_session.remove() return {"error": "Failed to validate access token"}, 401 learner = db_session.query(orm.Learner_db).filter( orm.Learner_db.openid == validation_result["openid"]).one_or_none() if not learner.validated: db_session.remove() return {"error": "Learner not validated"}, 401 project = db_session.query( orm.Project_db).filter(orm.Project_db.id == projectId).one_or_none() projectInfo = { "id": project.id, "name": project.name, "status": project.status, "createdTime": project.createdTime, "createdByID": project.createdByID, "createdBy": project.createdBy, "relatedCourseId": project.relatedCourseId, "relatedCourse": project.relatedCourse, "projectTerm": project.projectTerm, "projectTermLength": project.projectTermLength, "projectStartDate": project.projectStartDate, "averageIntendedCreditHourPerWeek": project.averageIntendedCreditHourPerWeek, "totalIntendedCreditHour": project.totalIntendedCreditHour, "projectMentorID": project.projectMentorID, "projectMentor": project.projectMentor, "averageGuidingHourPerWeek": project.averageGuidingHourPerWeek, "projectMeta": json.loads(project.projectMeta), "projectApprovalInfo": json.loads(project.projectApprovalInfo), "content": json.loads(project.content), "conclusionInfo": json.loads(project.conclusionInfo), "lastUpdatedTime": project.lastUpdatedTime, "coverImageURL": project.coverImageURL } db_session.remove() return projectInfo, 200, { "Authorization": validation_result["access_token"], "refresh_token": validation_result["refresh_token"] }
def miniprogram_pushMessage_get(isGetAll: bool = False): db_session = None if "DEVMODE" in os.environ: if os.environ["DEVMODE"] == "True": db_session = orm.init_db(os.environ["DEV_DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) learner = weapp.getLearner() if not learner: db_session.remove() return {'code': -1001, 'message': '没有找到对应的Learner'}, 200 response = [] if isGetAll: pushMessageList = db_session.query(orm.PushMessage_db).all() else: pushMessageList = db_session.query(orm.PushMessage_db).filter(orm.PushMessage_db.expireDateTime > datetime.datetime.utcnow()).all() for pushMessage in pushMessageList: if util.isRecipient(learner, json.loads(pushMessage.recipients)): response.append({ "id": pushMessage.id, "messageType": pushMessage.messageType, "entityId": pushMessage.entityId, "senderId": pushMessage.senderId, "recipients": json.loads(pushMessage.recipients), "rsvp": json.loads(pushMessage.rsvp), "sentDateTime": EWSDateTime.from_datetime(tzinfo.localize(pushMessage.sentDateTime)).ewsformat(), "modifiedDateTime": EWSDateTime.from_datetime(tzinfo.localize(pushMessage.modifiedDateTime)).ewsformat(), "expireDateTime": EWSDateTime.from_datetime(tzinfo.localize(pushMessage.expireDateTime)).ewsformat(), "content": json.loads(pushMessage.content) }) db_session.remove() return {'code': 0, 'data': response, 'message': '成功'}, 200
def project_get(): # noqa: E501 db_session = None if "DEVMODE" in os.environ: if os.environ["DEVMODE"] == "True": db_session = orm.init_db(os.environ["DEV_DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) validation_result = wxLogin.validateUser() if not validation_result["result"]: db_session.remove() return {"error": "Failed to validate access token"}, 401 result_list = [] query = db_session.query(orm.Project_db).all() for project in query: result_list.append({ "id": project.id, "name": project.name, "createdTime": project.createdTime, "createdBy": project.createdBy, "createdByID": project.createdByID, "relatedCourse": project.relatedCourse, "projectMentorID": project.projectMentorID, "projectMentor": project.projectMentor, "status": project.status, "coverImageURL": project.coverImageURL }) db_session.remove() return result_list, 200, { "Authorization": validation_result["access_token"], "refresh_token": validation_result["refresh_token"] }
def learner_get(): # noqa: E501 """返回所有Learner的全部信息 # noqa: E501 # 权限限定:mentor限定(未实装) :rtype: InlineResponse2001 """ db_session = None if "DEVMODE" in os.environ: if os.environ["DEVMODE"] == "True": db_session = orm.init_db(os.environ["DEV_DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) validation_result = wxLogin.validateUser() if not validation_result["result"]: return {"error": "Failed to validate access token"}, 401 result_list = [] query = db_session.query(orm.Learner_db).filter(orm.Learner_db.validated == True).all() for learner in query: result_list.append({ "id": learner.id, "givenName": learner.givenName, "familyName": learner.familyName, "isMentor": learner.isMentor }) db_session.remove() return result_list, 200, {"Authorization": validation_result["access_token"], "refresh_token": validation_result["refresh_token"]}
def miniprogram_announcement_announcementId_delete(announcementId): # 根据announcementId删除announcement和相关的pushMessage db_session = None if "DEVMODE" in os.environ: if os.environ["DEVMODE"] == "True": db_session = orm.init_db(os.environ["DEV_DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) learner = weapp.getLearner() if not learner: db_session.remove() return {'code': -1001, 'message': '没有找到对应的Learner'}, 200 announcement = db_session.query(orm.Announcement_db).filter(orm.Announcement_db.id == announcementId).one_or_none() pushMessage = db_session.query(orm.PushMessage_db).filter(orm.PushMessage_db.id == announcement.pushMessageId).one_or_none() try: if announcement.initiatorId == learner.id or learner.isAdmin: db_session.delete(announcement) db_session.commit() if pushMessage: db_session.delete(pushMessage) else: return {'code': -1007, 'message': '需要管理员权限', 'detail': '只有管理员或该活动创建人可以删除该活动'}, 200 db_session.commit() db_session.remove() return {'code': 0, 'message': '成功'}, 200 except Exception as e: db_session.remove() return {'code': -3005, 'message': '删除通知失败', 'log': str(e)}, 200
def learner_post(learner): # noqa: E501 """创建一个Learner # noqa: E501 :param learner: :type learner: dict | bytes :rtype: InlineResponse201 """ db_session = None if "DEVMODE" in os.environ: if os.environ["DEVMODE"] == "True": db_session = orm.init_db(os.environ["DEV_DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) validation_result = wxLogin.validateUser() if not validation_result["result"]: return {"error": "Failed to validate access token"}, 401 if connexion.request.is_json: learner = Learner.from_dict(connexion.request.get_json()) # noqa: E501 learner_dict = connexion.request.get_json() # 获取unionid try: userInfo = requests.get("https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s" % (validation_result["access_token"], connexion.request.headers['openid'])) db_session.add(orm.Learner_db( validated=False, openid=connexion.request.headers['openid'], unionid=userInfo.json()['unionid'], sessionKey='0', openidWeApp='0', isAdmin=False, status=learner.status, isMentor=learner.is_mentor, givenName=learner.given_name, familyName=learner.family_name, nickname=learner.nickname, gender=learner.gender, ethnicity=learner.ethnicity, birthday=learner.birthday, mainPersonalIdType=learner.main_personal_id_type, mainPersonalId=learner.main_personal_id, dateOfRegistration=learner.date_of_registration, reasonOfRegistration=learner.reason_of_registration, previousStatus=learner.previous_status, custodianInfo=json.dumps(learner_dict["custodianInfo"]), emergentContact=json.dumps(learner_dict["emergentContact"]), contactInfo=json.dumps(learner_dict["contactInfo"]), medicalInfo=json.dumps(learner_dict["medicalInfo"]), notes=json.dumps(learner_dict["notes"]), )) db_session.commit() except Exception as e: db_session.remove() return {"error": str(e)}, 401, {"Authorization": validation_result["access_token"], "refresh_token": validation_result["refresh_token"]} db_session.remove() return {}, 201, {"Authorization": validation_result["access_token"], "refresh_token": validation_result["refresh_token"]}
def miniprogram_notification_get(isGetAll: bool = False): def constructContent(notification: Notification_db): if notification.notificationType == "活动日程": event: Event_db = db_session.query(orm.Event_db).filter( orm.Event_db.id == notification.entityId).one_or_none() return { "startDateTime": json.loads(event.eventInfo)["startDateTime"], "endDateTime": json.loads(event.eventInfo)["endDateTime"], "initiatorId": event.initiatorId, "initiatorDisplayName": event.initiatorDisplayName } db_session = None if "DEVMODE" in os.environ: if os.environ["DEVMODE"] == "True": db_session = orm.init_db(os.environ["DEV_DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) learner = weapp.getLearner() if not learner: db_session.remove() return {'code': -1001, 'message': '没有找到对应的Learner'}, 200 response = [] if isGetAll: notificationList: List[Notification_db] = db_session.query( orm.Notification_db).filter( orm.Notification_db.learnerId == learner.id).all() else: notificationList = db_session.query(orm.Notification_db).filter( orm.Notification_db.learnerId == learner.id).filter( orm.Notification_db.expireDateTime > datetime.datetime.utcnow()).all() for notification in notificationList: response.append({ "notificationType": notification.notificationType, "entityId": notification.entityId, "createdDateTime": EWSDateTime.from_datetime( tzinfo.localize(notification.createdDateTime)).ewsformat(), "expireDateTime": EWSDateTime.from_datetime( tzinfo.localize(notification.expireDateTime)).ewsformat(), "status": notification.status, "title": notification.title, "description": notification.description, "content": constructContent(notification) }) db_session.remove() return {'code': 0, 'data': response, 'message': '成功'}, 200
def miniprogram_learner_post(learnerPostBody): db_session = None if "DEVMODE" in os.environ: if os.environ["DEVMODE"] == "True": db_session = orm.init_db(os.environ["DEV_DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) MINIPROGRAM_APPID: str = os.environ['MINIPROGRAM_APPID'] learnerPostBody_dict = connexion.request.get_json() sessionKey = connexion.request.headers['token'] try: decrypter = weapp.WXBizDataCrypt(MINIPROGRAM_APPID, sessionKey) decryptedData = decrypter.decrypt(learnerPostBody_dict['encryptedData'], learnerPostBody_dict['iv']) unionid = decryptedData['unionId'] except Exception as e: print(e) db_session.remove() return {'code': -1004, 'message': '解析微信认证加密信息失败', 'log': str(e)}, 200 learner = db_session.query(orm.Learner_db).filter(orm.Learner_db.unionid == unionid).one_or_none() if learner: db_session.remove() return {'code': -1003, 'message': "用户已存在注册记录"}, 200 try: db_session.add(orm.Learner_db( validated=False, branch=learnerPostBody_dict['branch'], openid="", unionid=unionid, sessionKey=sessionKey, openidWeApp=decryptedData['openId'], isAdmin=False, status="", role=learnerPostBody_dict['role'], isMentor=learnerPostBody_dict['isMentor'], givenName=learnerPostBody_dict['givenName'], familyName=learnerPostBody_dict['familyName'], gender="", ethnicity="", birthday=learnerPostBody_dict['birthday'], mainPersonalIdType="", mainPersonalId="", dateOfRegistration="", reasonOfRegistration="", previousStatus="", emergentContact="[]", contactInfo="[]", medicalInfo="[]", )) db_session.commit() except Exception as e: db_session.remove() return {'code': -1002, 'message': '数据有误,创建成员失败', 'log': str(e)}, 200 response = {"unionid": unionid} db_session.remove() return {'code': 0, 'data': response, 'message': '成功创建'}, 200
def miniprogram_booking_roomCode_post(roomCode, appointment): # noqa: E501 # 添加预约信息 db_session = None if "DEVMODE" in os.environ: if os.environ["DEVMODE"] == "True": db_session = orm.init_db(os.environ["DEV_DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) learner = weapp.getLearner() if not learner: db_session.remove() return {'code': -1001, 'message': '没有找到对应的Learner'}, 200 room_account = Account( primary_smtp_address=('*****@*****.**' % roomCode), credentials=credentials, config=config ) startDateTime = room_account.default_timezone.localize(EWSDateTime( appointment['startYear'], appointment['startMonth'], appointment['startDay'], appointment['startHour'], appointment['startMinute'] )) endDateTime = room_account.default_timezone.localize(EWSDateTime( appointment['endYear'], appointment['endMonth'], appointment['endDay'], appointment['endHour'], appointment['endMinute'] )) try: item = CalendarItem( account=room_account, folder=room_account.calendar, start=startDateTime, end=endDateTime, subject=appointment['subject'], body=appointment['description'], ) item.save(send_meeting_invitations=SEND_TO_ALL_AND_SAVE_COPY) db_session.add(orm.BookingNotes_db( changekey=item.changekey, bookedByID=learner.id, bookedByName=learner.familyName + learner.givenName )) db_session.commit() except Exception as e: db_session.remove() return {'code': -2004, 'message': '房间预约失败', 'log': str(e)}, 200 db_session.remove() return {'code': 0, 'message': 'success'}, 200
def miniprogram_announcement_post(announcementPostBody): db_session = None if "DEVMODE" in os.environ: if os.environ["DEVMODE"] == "True": db_session = orm.init_db(os.environ["DEV_DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) announcementPostBody_dict = connexion.request.get_json() learner = weapp.getLearner() if not learner: db_session.remove() return {'code': -1001, 'message': '没有找到对应的Learner'}, 200 # 自定义鉴权 if not learner.isAdmin: db_session.remove() return {'code': -1007, 'message': '需要管理员权限', "detail": "只有管理员有权限发送通知"}, 200 try: newAnnouncement = orm.Announcement_db( initiatorId=learner.id, initiatorDisplayName=announcementPostBody_dict['initiatorDisplayName'], recipients=json.dumps(announcementPostBody_dict['recipients']), sentDateTime=util.EWSDateTimeToDateTime(account.default_timezone.localize(EWSDateTime.now())), modifiedDateTime=util.EWSDateTimeToDateTime(account.default_timezone.localize(EWSDateTime.now())), expireDateTime=util.EWSDateTimeToDateTime(EWSDateTime.from_string(announcementPostBody_dict["expireDateTime"])), thumbnail=json.dumps(announcementPostBody_dict['thumbnail']), title=announcementPostBody_dict['title'], description=announcementPostBody_dict['description'], body=json.dumps(announcementPostBody_dict['body']), attachment=json.dumps(announcementPostBody_dict['attachment']), ) db_session.add(newAnnouncement) db_session.commit() newPushMessage = orm.PushMessage_db( messageType="Announcement", entityId=newAnnouncement.id, senderId=learner.id, senderDisplayName=announcementPostBody_dict['initiatorDisplayName'], recipients=json.dumps(announcementPostBody_dict['recipients']), sentDateTime=util.EWSDateTimeToDateTime(account.default_timezone.localize(EWSDateTime.now())), modifiedDateTime=util.EWSDateTimeToDateTime(account.default_timezone.localize(EWSDateTime.now())), expireDateTime=util.EWSDateTimeToDateTime(EWSDateTime.from_string(announcementPostBody_dict["expireDateTime"])), content=json.dumps(announcementPostBody_dict["content"]) ) db_session.add(newPushMessage) db_session.commit() newAnnouncement.pushMessageId = newPushMessage.id db_session.commit() except Exception as e: db_session.remove() return {'code': -5001, 'message': '创建通知失败', 'log': str(e)}, 200 response = {'pushMessage_id': newPushMessage.id, 'announcment_id': newAnnouncement.id} return {'code': 0, 'data': response, 'message': '成功'}, 200
def miniprogram_picture_post(pictureType: str): # noqa: E501 ALLOWED_EXTENSIONS = set(['png', 'jpg', 'JPG', 'PNG', 'gif', 'GIF']) def allowed_file(filename): return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS def create_uuid(): # 生成唯一的图片的名称字符串,防止图片显示时的重名问题 nowTime = datetime.datetime.now().strftime("%Y%m%d%H%M%S") # 生成当前时间 randomNum = random.randint(0, 100) # 生成的随机整数n,其中0<=n<=100 if randomNum <= 10: randomNum = str(0) + str(randomNum) uniqueNum = str(nowTime) + str(randomNum) return uniqueNum db_session = None if "DEVMODE" in os.environ: if os.environ["DEVMODE"] == "True": db_session = orm.init_db(os.environ["DEV_DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) learner = weapp.getLearner() if not learner: db_session.remove() return {'code': -1001, 'message': '没有找到对应的Learner'}, 200 if pictureType not in [ "event", "announcement", "project", "course", "club" ]: return {'code': -4001, "message": "图片类别不支持"}, 200 img = connexion.request.files.get('picture') extension = os.path.splitext(img.filename)[-1] uid = create_uuid() if not allowed_file(img.filename): db_session.remove() return {'code': -4002, 'message': '文件类型不支持'}, 200 path = os.path.join(os.environ["STORAGEURL"], pictureType) if not os.path.exists(path): os.makedirs(path) try: file_path = os.path.join(path, uid + extension) url = uid + extension img.save(file_path) except Exception as e: db_session.remove() return {'code': -4003, 'message': '文件储存失败', 'log': str(e)}, 200 db_session.remove() return {'code': 0, 'data': {"url": url}, 'message': '成功'}, 200
def miniprogram_ping(): db_session = None if "DEVMODE" in os.environ: if os.environ["DEVMODE"] == "True": db_session = orm.init_db(os.environ["DEV_DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) mode = db_session.query(orm.Config_db).filter(orm.Config_db.name == 'mode').one_or_none().value prodVer = db_session.query(orm.Config_db).filter(orm.Config_db.name == 'prodVer').one_or_none().value response = {'mode': mode, 'prodVer': prodVer} db_session.remove() return {'code': 0, 'message': 'pinged!', 'data': response}, 200
def booking_get(): # noqa: E501 # 获取所有的房间信息 db_session = None if "DEVMODE" in os.environ: if os.environ["DEVMODE"] == "True": db_session = orm.init_db(os.environ["DEV_DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) validation_result = wxLogin.validateUser() if not validation_result["result"]: db_session.remove() return {"error": "Failed to validate access token"}, 401 response = [] roomLists = db_session.query(orm.Config_db).filter( orm.Config_db.name == 'roomLists').one_or_none().value roomDescriptions = db_session.query(orm.Config_db).filter( orm.Config_db.name == 'roomDescriptions').one_or_none().value try: for roomList in roomLists: roomsEWS = GetRooms(protocol=account.protocol).call( roomlist=RoomList(email_address=roomList['email'])) rooms = [] for room in roomsEWS: roomCode = room.email_address.split("@")[0] rooms.append({ 'name': room.name, 'roomCode': roomCode, 'email': room.email_address, 'description': roomDescriptions.get(roomCode, "") }) entry = {'listname': roomList['name'], 'rooms': rooms} response.append(entry) except Exception as e: db_session.remove() return { "error": str(e) }, 400, { "Authorization": validation_result["access_token"], "refresh_token": validation_result["refresh_token"] } db_session.remove() return response, 200, { "Authorization": validation_result["access_token"], "refresh_token": validation_result["refresh_token"] }
def miniprogram_announcement_announcementId_patch(announcementId, announcementPatchBody): # 修改通知接口 db_session = None if "DEVMODE" in os.environ: if os.environ["DEVMODE"] == "True": db_session = orm.init_db(os.environ["DEV_DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) announcementPatchBody_dict = connexion.request.get_json() learner = weapp.getLearner() if not learner: db_session.remove() return {'code': -1001, 'message': '没有找到对应的Learner'}, 200 announcement = db_session.query(orm.Announcement_db).filter(orm.Announcement_db.id == announcementId).one_or_none() pushMessage = db_session.query(orm.PushMessage_db).filter(orm.PushMessage_db.id == announcement.pushMessageId).one_or_none() try: for itemKey in announcementPatchBody_dict: if itemKey == "initiatorDisplayName": announcement.initiatorDisplayName = announcementPatchBody_dict[itemKey] if itemKey == "recipients": announcement.recipients = json.dumps(announcementPatchBody_dict[itemKey]) if itemKey == "thumbnail": announcement.thumbnail = json.dumps(announcementPatchBody_dict[itemKey]) if itemKey == "content": pushMessage.content = json.dumps(announcementPatchBody_dict[itemKey]) if itemKey == "body": announcement.body = json.dumps(announcementPatchBody_dict[itemKey]) if itemKey == "attachment": announcement.attachment = json.dumps(announcementPatchBody_dict[itemKey]) if itemKey == "title": announcement.title = announcementPatchBody_dict[itemKey] if itemKey == "description": announcement.description = announcementPatchBody_dict[itemKey] if itemKey == "expireDateTime": newExpireDateTime = util.EWSDateTimeToDateTime(EWSDateTime.from_string(announcementPatchBody_dict[itemKey])), setattr(pushMessage, itemKey, newExpireDateTime) newModifiedDateTime = util.EWSDateTimeToDateTime(account.default_timezone.localize(EWSDateTime.now())), pushMessage.modifiedDateTime = newModifiedDateTime db_session.commit() db_session.remove() return {'code': 0, 'message': '成功'}, 200 except Exception as e: db_session.remove() return {'code': -5002, 'message': '更新通知失败', 'log': str(e)}, 200
def project_cover_post(): # noqa: E501 ALLOWED_EXTENSIONS = set(['png', 'jpg', 'JPG', 'PNG', 'gif', 'GIF']) def allowed_file(filename): return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS def create_uuid(): # 生成唯一的图片的名称字符串,防止图片显示时的重名问题 nowTime = datetime.datetime.now().strftime("%Y%m%d%H%M%S") # 生成当前时间 randomNum = random.randint(0, 100) # 生成的随机整数n,其中0<=n<=100 if randomNum <= 10: randomNum = str(0) + str(randomNum) uniqueNum = str(nowTime) + str(randomNum) return uniqueNum db_session = None if "DEVMODE" in os.environ: if os.environ["DEVMODE"] == "True": db_session = orm.init_db(os.environ["DEV_DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) validation_result = wxLogin.validateUser() if not validation_result["result"]: db_session.remove() return {"error": "Failed to validate access token"}, 401, {"Authorization": validation_result["access_token"], "refresh_token": validation_result["refresh_token"]} learner = db_session.query(orm.Learner_db).filter(orm.Learner_db.openid == validation_result["openid"]).one_or_none() if not learner.validated: db_session.remove() return {"error": "Learner not validated"}, 401, {"Authorization": validation_result["access_token"], "refresh_token": validation_result["refresh_token"]} img = connexion.request.files.get('project_cover') extension = os.path.splitext(img.filename)[-1] uid = create_uuid() if not allowed_file(img.filename): db_session.remove() return {"error": "文件类型错误"}, 403, {"Authorization": validation_result["access_token"], "refresh_token": validation_result["refresh_token"]} path = os.path.join(os.environ["STORAGEURL"], str(learner.id)) if not os.path.exists(path): os.makedirs(path) file_path = os.path.join(path, uid + extension) url = uid + extension img.save(file_path) db_session.remove() return {"url": url}, 201, {"Authorization": validation_result["access_token"], "refresh_token": validation_result["refresh_token"]}
def miniprogram_event_eventId_delete(eventId): # 根据eventId删除event和相关的pushMessage db_session = None if "DEVMODE" in os.environ: if os.environ["DEVMODE"] == "True": db_session = orm.init_db(os.environ["DEV_DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) learner = weapp.getLearner() if not learner: db_session.remove() return {'code': -1001, 'message': '没有找到对应的Learner'}, 200 event = db_session.query( orm.Event_db).filter(orm.Event_db.id == eventId).one_or_none() pushMessage = db_session.query(orm.PushMessage_db).filter( orm.PushMessage_db.id == event.pushMessageId).one_or_none() try: if event.initiatorId == learner.id or learner.isAdmin: db_session.delete(event) db_session.commit() if pushMessage: db_session.delete(pushMessage) else: return { 'code': -1007, 'message': '需要管理员权限', 'detail': '只有管理员或该活动创建人可以删除该活动' }, 200 db_session.commit() notificationToDelete = db_session.query(orm.Notification_db).filter( orm.Notification_db.learnerId == learner.id).filter( orm.Notification_db.notificationType == "活动日程").filter( orm.Notification_db.entityId == event.id).one_or_none() if notificationToDelete: db_session.delete(notificationToDelete) db_session.commit() db_session.remove() return {'code': 0, 'message': '成功'}, 200 except Exception as e: db_session.remove() return {'code': -3005, 'message': '删除活动失败', 'log': str(e)}, 200
def miniprogram_event_eventId_get(eventId): # 获取活动的详情以及相关的rsvp详情 db_session = None if "DEVMODE" in os.environ: if os.environ["DEVMODE"] == "True": db_session = orm.init_db(os.environ["DEV_DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) learner = weapp.getLearner() if not learner: db_session.remove() return {'code': -1001, 'message': '没有找到对应的Learner'}, 200 event = db_session.query( orm.Event_db).filter(orm.Event_db.id == eventId).one_or_none() pushMessage = db_session.query(orm.PushMessage_db).filter( orm.PushMessage_db.id == event.pushMessageId).one_or_none() try: response = { "id": event.id, "initiatorId": event.initiatorId, "initiatorDisplayName": event.initiatorDisplayName, "eventInfo": json.loads(event.eventInfo), "invitee": json.loads(event.invitee), "thumbnail": json.loads(event.thumbnail), "rsvp": json.loads(pushMessage.rsvp), "expireDatetime": EWSDateTime.from_datetime(tzinfo.localize( event.expireDateTime)).ewsformat() } db_session.remove() return {'code': 0, 'data': response, 'message': '成功'}, 200 except Exception as e: db_session.remove() return {'code': -3004, 'message': '获取活动详情失败', 'log': str(e)}, 200
def connectToMicrosoft(connectToMicrosoftBody): MICROSOFT_CLIENT_ID: str = os.environ['MICROSOFT_CLIENT_ID'] MICROSOFT_CLIENT_SECRET: str = os.environ['MICROSOFT_CLIENT_SECRET'] db_session = None if "DEVMODE" in os.environ: if os.environ["DEVMODE"] == "True": db_session = orm.init_db(os.environ["DEV_DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) connectToMicrosoftBody_dict = connexion.request.get_json() validation_result = wxLogin.validateUser() if not validation_result["result"]: db_session.remove() return {"error": "Failed to validate access token"}, 401 learner = db_session.query(orm.Learner_db).filter(orm.Learner_db.openid == validation_result["openid"]).one_or_none() if not learner.validated: db_session.remove() return {"error": "Learner not validated"}, 401 try: tokenPostBody = { "client_id": MICROSOFT_CLIENT_ID, "scope": "offline_access openid profile https://graph.microsoft.com/calendars.readwrite https://graph.microsoft.com/user.readwrite", "code": connectToMicrosoftBody_dict["code"], "redirect_uri": "http://localhost:8000/connectToMicrosoft", # TODO: 此处redirect_uri应当存入config "grant_type": "authorization_code", "client_secret": MICROSOFT_CLIENT_SECRET } tokenResponse = requests.post("https://login.microsoftonline.com/common/oauth2/v2.0/token", data=tokenPostBody) microsoftAccessToken = tokenResponse.json()["access_token"] microsoftRefreshToken = tokenResponse.json()["refresh_token"] learner.microsoftAccessToken = microsoftAccessToken learner.microsoftRefreshToken = microsoftRefreshToken me = graphAPI.getMe(microsoftAccessToken) learner.microsoftId = me['id'] learner.microsoftUserPrincipalName = me['userPrincipalName'] db_session.commit() except Exception as e: db_session.remove() return {'error': str(e)}, 400 db_session.remove() return {"message": "成功写入Microsoft账号相关信息", "microsoftId": me['id']}, 200
def miniprogram_login_get(js_code): db_session = None if "DEVMODE" in os.environ: if os.environ["DEVMODE"] == "True": db_session = orm.init_db(os.environ["DEV_DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) MINIPROGRAM_APPID: str = os.environ['MINIPROGRAM_APPID'] MINIPROGRAM_APPSECRET: str = os.environ['MINIPROGRAM_APPSECRET'] try: result = requests.get("https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code" % (MINIPROGRAM_APPID, MINIPROGRAM_APPSECRET, js_code)) resultjson = result.json() except Exception as e: db_session.remove() return {'code': -1005, 'message': 'Code换取SessionKey失败', "log": str(e)}, 200 if "openid" not in resultjson or "session_key" not in resultjson: db_session.remove() return {'code': -1005, 'message': 'Code换取SessionKey失败', "log": resultjson['errmsg']}, 200 learner = db_session.query(orm.Learner_db).filter(orm.Learner_db.openidWeApp == resultjson['openid']).one_or_none() if not learner: response = { 'token': resultjson['session_key'], } db_session.remove() return {'code': -1008, 'message': '在调用login GET后,Code换取SessionKey成功,但没有找到对应的learner', 'data': response}, 200 try: learner.sessionKey = resultjson['session_key'] db_session.commit() except Exception as e: db_session.remove() return {'code': -1006, 'message': 'SessionKey写入失败', "log": str(e), "code2sessionResult": resultjson}, 200 response = { 'token': resultjson['session_key'], 'unionid': learner.unionid if learner else '', 'learnerFullName': learner.familyName + learner.givenName if learner else '', "isAdmin": learner.isAdmin if learner else '', "learnerId": learner.id if learner else '', "branch": learner.branch if learner else '' } db_session.remove() return {'code': 0, 'data': response, 'message': '成功'}, 200
def miniprogram_booking_roomCode_delete(roomCode, monthToLoad, deleteInfo): # noqa: E501 # 按照月份、changekey、房间号删除预约信息 db_session = None if "DEVMODE" in os.environ: if os.environ["DEVMODE"] == "True": db_session = orm.init_db(os.environ["DEV_DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) learner = weapp.getLearner() if not learner: db_session.remove() return {'code': -1001, 'message': '没有找到对应的Learner'}, 200 changekey = deleteInfo['changekey'] try: room_account = Account( primary_smtp_address=('*****@*****.**' % roomCode), credentials=credentials, config=config ) except Exception as e: db_session.remove() return {'code': -2002, 'message': '代理用的Office Account初始化失败', "log": str(e)}, 200 start_year = int(monthToLoad.split("-")[0]) start_month = int(monthToLoad.split("-")[1]) start = room_account.default_timezone.localize(EWSDateTime(start_year, start_month, 1)) if start_month == 12: end = room_account.default_timezone.localize(EWSDateTime(start_year + 1, 1, 1)) else: end = room_account.default_timezone.localize(EWSDateTime(start_year, start_month + 1, 1)) try: for item in room_account.calendar.filter(start__range=(start, end)).all().order_by('start'): if item.changekey == changekey: notes = db_session.query(orm.BookingNotes_db).filter(orm.BookingNotes_db.changekey == item.changekey).one_or_none() if notes.bookedByID == learner.id: db_session.delete(notes) except Exception as e: db_session.remove() return {'code': -2005, 'message': '房间预约删除失败', 'error': str(e)}, 200 db_session.remove() return {'code': 0, 'message': 'success'}, 200
def miniprogram_booking_get(): db_session = None if "DEVMODE" in os.environ: if os.environ["DEVMODE"] == "True": db_session = orm.init_db(os.environ["DEV_DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) if not weapp.getLearner(): db_session.remove() return {'code': -1001, 'message': '没有找到对应的Learner'}, 200 response = [] roomLists = json.loads(db_session.query(orm.Config_db).filter(orm.Config_db.name == 'roomLists').one_or_none().value) roomDescriptions = json.loads(db_session.query(orm.Config_db).filter(orm.Config_db.name == 'roomDescriptions').one_or_none().value) try: for roomList in roomLists: roomsEWS = GetRooms(protocol=account.protocol).call( roomlist=RoomList( email_address=roomList['email']) ) rooms = [] for room in roomsEWS: roomCode = room.email_address.split("@")[0] rooms.append({ 'name': room.name, 'roomCode': roomCode, 'email': room.email_address, 'description': roomDescriptions.get(roomCode, "") }) entry = { 'listname': roomList['name'], 'rooms': rooms } response.append(entry) except Exception as e: db_session.remove() return {'code': -2001, 'message': '获取房间列表失败', "log": str(e)}, 200 db_session.remove() return {'code': 0, 'data': response, 'message': '成功'}, 200
def config_get(): # 获取基本设置。没有加密,切勿放置敏感信息。 db_session = None if "DEVMODE" in os.environ: if os.environ["DEVMODE"] == "True": db_session = orm.init_db(os.environ["DEV_DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) validation_result = wxLogin.validateUser() if not validation_result["result"]: db_session.remove() return {"error": "Failed to validate access token"}, 401, {"Authorization": validation_result["access_token"], "refresh_token": validation_result["refresh_token"]} config = db_session.query(orm.Config_db).all() response = [] for item in config: response.append({ item.name: item.value }) db_session.remove() return response, 200, {"Authorization": validation_result["access_token"], "refresh_token": validation_result["refresh_token"]}
def getSchedule(dateToLoad: str, nameList=[]): db_session = None if "DEVMODE" in os.environ: if os.environ["DEVMODE"] == "True": db_session = orm.init_db(os.environ["DEV_DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) learner = weapp.getLearner() if not learner: db_session.remove() return {"message": "learner not found"}, 401 nameList.append(learner.microsoftUserPrincipalName) headers = { "Content-Type": "application/json", "Authorization": "Bearer %s" % getValidMicrosoftToken(learner, db_session), "Prefer": 'outlook.timezone="China Standard Time"' } dateToLoad_year = int(dateToLoad.split("-")[0]) dateToLoad_month = int(dateToLoad.split("-")[1]) dateToLoad_day = int(dateToLoad.split("-")[2]) start = admin_account.default_timezone.localize(EWSDateTime(dateToLoad_year, dateToLoad_month, dateToLoad_day)) end = start + datetime.timedelta(days=1) myScheduleBody = { "schedules": nameList, "startTime": { "dateTime": start.ewsformat()[:19], "timeZone": "China Standard Time" }, "endTime": { "dateTime": end.ewsformat()[:19], "timeZone": "China Standard Time" }, "availabilityViewInterval": "60" } myScheduleResponse = requests.post("https://graph.microsoft.com/v1.0/me/calendar/getSchedule ", headers=headers, data=json.dumps(myScheduleBody)) return myScheduleResponse.json()
def miniprogram_announcement_get(): # 获取通知列表,目前暂时默认为返回全部条目 db_session = None if "DEVMODE" in os.environ: if os.environ["DEVMODE"] == "True": db_session = orm.init_db(os.environ["DEV_DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) else: db_session = orm.init_db(os.environ["DATABASEURI"]) learner = weapp.getLearner() if not learner: db_session.remove() return {'code': -1001, 'message': '没有找到对应的Learner'}, 200 try: announcementList = db_session.query(orm.Announcement_db).all() response = [] for announcement in announcementList: response.append({ "id": announcement.id, "pushMessageId": announcement.pushMessageId, "initiatorId": announcement.initiatorId, "initiatorDisplayName": announcement.initiatorDisplayName, "recipients": json.loads(announcement.recipients), "sentDateTime": EWSDateTime.from_datetime(tzinfo.localize(announcement.sentDateTime)).ewsformat(), "modifiedDateTime": EWSDateTime.from_datetime(tzinfo.localize(announcement.modifiedDateTime)).ewsformat(), "expireDateTime": EWSDateTime.from_datetime(tzinfo.localize(announcement.expireDateTime)).ewsformat(), "thumbnail": json.loads(announcement.thumbnail), "title": announcement.title, "description": announcement.description, "body": json.loads(announcement.body), "attachment": json.loads(announcement.attachment) }) db_session.remove() except Exception as e: db_session.remove() return {'code': -3006, 'message': '获取通知列表失败', 'log': str(e)}, 200 return {'code': 0, 'data': response, 'message': '成功'}, 200