def token_info(moodle, token): url = f'{moodle}/webservice/rest/server.php' params = { 'moodlewsrestformat': 'json', 'wstoken': token, 'wsfunction': TOKEN_INFO } r = req.get(url, params=params) if r.status_code != 200: log.info(r.status_code, exc_info=True) raise ErrorAPI(r.status_code, r.text, 'moodle') if 'application/json' not in r.headers['content-type']: log.info(r.headers['content-type'], exc_info=True) raise ErrorAPI(500, 'incorrect content-type', 'moodle') res = r.json() if 'errorcode' in res and res['errorcode']: if res['errorcode'] == 'invalidtoken': raise ErrorAPI(401, 'invalid/expired token', 'moodle') err = {'status': 500, 'message': res['errorcode']} if res['errorcode'].isnumeric(): err['status'] = int(res['errorcode']) if 'message' in res: err['message'] = res['message'] return err return res
def create_feedback(moodle, wstoken, roomid, usertaken, userbetaken, description, image): url = f'{moodle}/webservice/rest/server.php' data = { 'moodlewsrestformat': 'json', 'wstoken': wstoken, 'wsfunction': CREATE_FEEDBACK, 'roomid': roomid, 'usertaken': usertaken, 'userbetaken': userbetaken, 'description': description, 'image': image } r = req.post(url, data=data) if r.status_code != 200: log.info(r.status_code, exc_info=True) raise ErrorAPI(r.status_code, r.text, 'moodle') if 'application/json' not in r.headers['content-type']: return res = r.json() if 'errorcode' in res and res['errorcode']: if res['errorcode'] == 'invalidtoken': raise ErrorAPI(401, 'invalid/expired token', 'moodle') err = {'status': 500, 'message': res['errorcode']} if res['errorcode'].isnumeric(): err['status'] = int(res['errorcode']) if 'message' in res: err['message'] = res['message'] raise ErrorAPI(err['status'], err['message'], 'moodle')
def login(): moodle = request.headers['moodle'] wstoken = g.wstoken if 'username' not in request.json: raise ErrorAPI(400, 'missing "username"') if 'password' not in request.json: raise ErrorAPI(400, 'missing "password"') username = request.json['username'] password = request.json['password'] user = moodle_sv.user_info( moodle=moodle, wstoken=wstoken, username=username ) if not user: raise ErrorAPI(404, 'userinfo not found') user['token'] = moodle_sv.login( moodle=moodle, username=username, password=password ) return response(200, 'success', user)
def face_feedback(): moodle = request.headers['moodle'] wstoken = g.wstoken key = g.key if 'image' not in request.json: raise ErrorAPI(400, 'missing image') if 'roomid' not in request.json: raise ErrorAPI(400, 'missing roomid') if 'usertaken' not in request.json: raise ErrorAPI(400, 'missing usertaken') if 'userbetaken' not in request.json: raise ErrorAPI(400, 'missing userbetaken') description = 'mistaken in face recognition' if 'description' in request.json: description = request.json['description'] if not face_sv.exist(key, request.json['usertaken']): raise ErrorAPI(404, 'user not registered') moodle_sv.create_feedback(moodle=moodle, wstoken=wstoken, roomid=request.json['roomid'], usertaken=request.json['usertaken'], userbetaken=request.json['userbetaken'], description=description, image=request.json['image']) return response(200, 'success')
def update_user(): moodle = request.headers['moodle'] wstoken = g.wstoken key = g.key username = g.username front = request.form.get('front') if not front: raise ErrorAPI(400, 'missing front') left = request.form.get('left') if not left: raise ErrorAPI(400, 'missing left') right = request.form.get('right') if not right: raise ErrorAPI(400, 'missing right') replace = request.form.get('replace') if not replace: raise ErrorAPI(400, 'missing replace') if not moodle_sv.user_info( moodle=moodle, wstoken=wstoken, username=username): raise ErrorAPI(404, 'user not found') exist = face_sv.exist(key, username) val_t = time() user = {'id': username, 'front': front, 'left': left, 'right': right} if not exist: code = 201 message = 'created' face = face_sv.create(key, user) else: code = 200 message = 'success' face = face_sv.update(key, user) core_t = time() res = moodle_sv.create_image(moodle=moodle, wstoken=wstoken, username=user['id'], image_front=user['front'], image_left=user['left'], image_right=user['right'], replace=replace) if not res: code = 500 message = 'failed to create image' face_sv.remove(key, username) t = { 'face': face, 'valid': val_t - g.start, 'core': core_t - val_t, 'moodle': time() - core_t, 'total': time() - g.start } return response(code, message, t=t)
def checkin(roomid): moodle = request.headers['moodle'] wstoken = g.wstoken if 'usernames' not in request.json: raise ErrorAPI(400, 'missing usernames') usernames = request.json['usernames'] users = [] for username in usernames: user = { 'username': username, 'status': 200 } res = moodle_sv.checkin( moodle=moodle, wstoken=wstoken, roomid=roomid, username=username ) if 'status' in res: user['status'] = res['status'] user['message'] = res['message'] users.append(user) return response(200, 'success', users)
def login(moodle, username, password): url = f'{moodle}/login/token.php' params = { 'moodlewsrestformat': 'json', 'service': 'moodle_mobile_app', 'username': username, 'password': password } r = req.post(url, params=params) res = res_handle(r) if 'status' in res: if res['message'] == 'invalidlogin': raise ErrorAPI(401, 'wrong username or password', 'moodle') raise ErrorAPI(res['status'], res['message'], 'moodle') return res['token']
def get_image(moodle, wstoken, username): url = f'{moodle}/webservice/rest/server.php' params = { 'moodlewsrestformat': 'json', 'wstoken': wstoken, 'wsfunction': GET_IMAGE, 'username': username } r = req.post(url, params=params) res = res_handle(r) if not res: raise ErrorAPI(404, 'images not found', 'moodle') if 'status' in res: raise ErrorAPI(res['status'], res['message'], 'moodle') if isinstance(res, list): return res[0] return res
def remove(Authorization: str, userID): headers = {'Authorization': Authorization} url = f'{server.FACE_URL}/users/{userID}' r = req.delete(url, headers=headers) res = r.json() if 'error' in res: err = res['error'] raise ErrorAPI(err['code'], err['message'], 'face')
def remove_user(): key = g.key username = g.username if not face_sv.exist(key, username): raise ErrorAPI(404, 'user not registered') face_sv.remove(key, username) return response(200, 'success')
def manual_check(sessionid): moodle = request.headers['moodle'] wstoken = g.wstoken if 'students' not in request.json: raise ErrorAPI(400, 'missing "students"') if not isinstance(request.json['students'], list): raise ErrorAPI(400, '"students" type list') students = request.json['students'] for student in students: moodle_sv.update_log( moodle=moodle, wstoken=wstoken, sessionid=sessionid, username=student['username'], statusid=student['statusid'] ) return response(200, 'success')
def room_schedule(): moodle = request.headers['moodle'] wstoken = g.wstoken if 'roomid' not in request.args: raise ErrorAPI(400, 'missing "roomid"') if 'date' not in request.args: raise ErrorAPI(400, 'missing "date"') roomid = request.args['roomid'] date = request.args['date'] schedule = moodle_sv.room_schedule( moodle=moodle, wstoken=wstoken, roomid=roomid, date=date ) if not schedule: schedule = None return response(200, 'success', schedule)
def get_student_log(): moodle = request.headers['moodle'] wstoken = g.wstoken if 'username' not in request.args: raise ErrorAPI(400, 'missing "username"') if 'courseid' not in request.args: raise ErrorAPI(400, 'missing "courseid"') username = request.args['username'] courseid = request.args['courseid'] reports = moodle_sv.student_log( moodle=moodle, wstoken=wstoken, username=username, courseid=courseid ) if not reports: reports = None return response(200, 'success', reports)
def count(Authorization: str): headers = {'Authorization': Authorization} url = f'{server.FACE_URL}/count' r = req.get(url, headers=headers) res = r.json() if 'error' in res: err = res['error'] raise ErrorAPI(err['code'], err['message'], 'face') return res['total']
def update(Authorization: str, user: dict): headers = {'Authorization': Authorization} url = f'{server.FACE_URL}/users/{user["id"]}' r = req.put(url, data=user, headers=headers) res = r.json() if 'error' in res: err = res['error'] raise ErrorAPI(err['code'], err['message'], 'face') return res
def exist(Authorization: str, userID: str): headers = {'Authorization': Authorization} url = f'{server.FACE_URL}/users/{userID}' r = req.get(url, headers=headers) res = r.json() if 'error' in res: err = res['error'] raise ErrorAPI(err['code'], err['message'], 'face') return res['status']
def verify(Authorization: str, userID, images): headers = {'Authorization': Authorization} url = f'{server.FACE_URL}/verify' data = {'userID': userID, 'images': images} r = req.post(url, data=data, headers=headers) res = r.json() if 'error' in res: err = res['error'] raise ErrorAPI(err['code'], err['message'], 'face') return res['result']
def find(Authorization: str, images: list): headers = {'Authorization': Authorization} url = f'{server.FACE_URL}/find' data = {'images': images} r = req.post(url, data=data, headers=headers) res = r.json() if 'error' in res: err = res['error'] raise ErrorAPI(err['code'], err['message'], 'face') return res
def get_student(username): moodle = request.headers['moodle'] wstoken = g.wstoken user = moodle_sv.user_info( moodle=moodle, wstoken=wstoken, username=username ) if not user: raise ErrorAPI(404, 'userinfo not found') return response(200, 'success', user)
def res_handle(r): if r.status_code != 200: log.info(r.status_code, exc_info=True) raise ErrorAPI(500, r.status_code, 'moodle') if 'application/json' not in r.headers['content-type']: log.info(r.headers['content-type'], exc_info=True) raise ErrorAPI(500, 'incorrect content-type', 'moodle') res = r.json() if 'errorcode' in res and res['errorcode']: if res['errorcode'] == 'invalidtoken': raise ErrorAPI(401, 'invalid wstoken', 'moodle') err = {'status': 500, 'message': res['errorcode']} if res['errorcode'].isnumeric(): err['status'] = int(res['errorcode']) if 'message' in res: err['message'] = res['message'] return err return res
def find(): moodle = request.headers['moodle'] wstoken = g.wstoken key = g.key if 'images' not in request.json: raise ErrorAPI(400, 'missing images') images = request.json['images'] if not isinstance(images, list): raise ErrorAPI(400, 'images not list') val_t = time() data = face_sv.find(key, images) core_t = time() usernames = data['users'] if not usernames: raise ErrorAPI(400, 'no user registered') users = [] for username in usernames: if not username: users.append({'status': 404, 'message': 'not registered'}) continue user = moodle_sv.user_info(moodle=moodle, wstoken=wstoken, username=username) user['status'] = 200 user['message'] = 'registered' users.append(user) t = { 'face': data, 'valid': val_t - g.start, 'core': core_t - val_t, 'moodle': time() - core_t, 'total': time() - g.start } return response(200, 'success', users, t=t)
def verify(): moodle = request.headers['moodle'] wstoken = g.wstoken key = g.key username = g.username if not face_sv.exist(key, username): raise ErrorAPI(404, 'user not registered') sessionid = request.form.get('sessionid') if not sessionid: raise ErrorAPI(400, 'missing sessionid') front = request.form.get('front') if not front: raise ErrorAPI(400, 'missing front') left = request.form.get('left') if not front: raise ErrorAPI(400, 'missing left') right = request.form.get('right') if not front: raise ErrorAPI(400, 'missing right') result = face_sv.verify(key, username, [front, left, right]) moodle_sv.verify(moodle=moodle, wstoken=wstoken, username=username, sessionid=sessionid, image_front=front, image_left=left, image_right=right, result=int(result)) if not result: raise ErrorAPI(400, 'invalid faces') return response(200, 'success')
def get_campus(moodle, wstoken): url = f'{moodle}/webservice/rest/server.php' params = { 'moodlewsrestformat': 'json', 'wstoken': wstoken, 'wsfunction': GET_CAMPUS, } r = req.get(url, params=params) res = res_handle(r) if 'status' in res: raise ErrorAPI(res['status'], res['message'], 'moodle') return res
def reports(moodle, wstoken, attendanceid): url = f'{moodle}/webservice/rest/server.php' params = { 'moodlewsrestformat': 'json', 'wstoken': wstoken, 'wsfunction': GET_LOG, 'attendanceid': attendanceid } r = req.get(url, params=params) res = res_handle(r) if 'status' in res: raise ErrorAPI(res['status'], res['message'], 'moodle') return res
def session(moodle, wstoken, sessionid): url = f'{moodle}/webservice/rest/server.php' params = { 'moodlewsrestformat': 'json', 'wstoken': wstoken, 'wsfunction': SESSION, 'sessionid': sessionid } r = req.get(url, params=params) res = res_handle(r) if 'status' in res: raise ErrorAPI(res['status'], res['message'], 'moodle') return res
def schedules(moodle, token, userid): url = f'{moodle}/webservice/rest/server.php' params = { 'moodlewsrestformat': 'json', 'wstoken': token, 'wsfunction': GET_COURSE, 'userid': userid } r = req.get(url, params=params) res = res_handle(r) if 'status' in res: raise ErrorAPI(res['status'], res['message'], 'moodle') return res
def log_by_course(moodle, wstoken, courseid): url = f'{moodle}/webservice/rest/server.php' params = { 'moodlewsrestformat': 'json', 'wstoken': wstoken, 'wsfunction': GET_LOG_BY_COURSE, 'courseid': courseid } r = req.get(url, params=params) res = res_handle(r) if 'status' in res: raise ErrorAPI(res['status'], res['message'], 'moodle') return res
def check_request(): g.start = time() if 'moodle' not in request.headers: raise ErrorAPI(400, 'no moodle provided') moodle = request.headers['moodle'] # Check moodle data = key_db.get_data(moodle) if not data: raise ErrorAPI(400, 'invalid moodle') g.key = data['key'] g.wstoken = data['wstoken'] if '/api/login' == request.path: return if 'Authorization' not in request.headers: raise ErrorAPI(400, 'no token provided') token = request.headers['Authorization'] # Check token res = token_info(moodle=moodle, token=token) g.username = res['username'] g.userid = res['userid'] user = user_info(moodle=moodle, wstoken=g.wstoken, username=res['username']) if not user: raise ErrorAPI(404, 'userinfo not found') # Check role if request.path in USER_ROUTES: return if user['isadmin']: return if user['roleid'] not in ROLE: raise ErrorAPI(401, 'no permission')
def room_schedule(moodle, wstoken, roomid, date): url = f'{moodle}/webservice/rest/server.php' params = { 'moodlewsrestformat': 'json', 'wstoken': wstoken, 'wsfunction': ROOM_SCHEDULE, 'roomid': roomid, 'date': date } r = req.get(url, params=params) res = res_handle(r) if 'status' in res: raise ErrorAPI(res['status'], res['message'], 'moodle') return res
def student_log(moodle, wstoken, username, courseid): url = f'{moodle}/webservice/rest/server.php' params = { 'moodlewsrestformat': 'json', 'wstoken': wstoken, 'wsfunction': GET_STUDENT_LOG, 'username': username, 'courseid': courseid } r = req.get(url, params=params) res = res_handle(r) if 'status' in res: raise ErrorAPI(res['status'], res['message'], 'moodle') return res