示例#1
0
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
示例#2
0
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')
示例#3
0
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)
示例#4
0
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')
示例#5
0
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)
示例#6
0
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)
示例#7
0
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']
示例#8
0
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
示例#9
0
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')
示例#10
0
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')
示例#11
0
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')
示例#12
0
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)
示例#13
0
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)
示例#14
0
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']
示例#15
0
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
示例#16
0
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']
示例#17
0
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']
示例#18
0
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
示例#19
0
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)
示例#20
0
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
示例#21
0
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)
示例#22
0
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')
示例#23
0
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
示例#24
0
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
示例#25
0
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
示例#26
0
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
示例#27
0
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
示例#28
0
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')
示例#29
0
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
示例#30
0
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