def quarter_grades(): s = find_session(request.cookies.get('PHPSESSID'), sessions) if s is None or s.expired(): abort(403) # calling the API does not work if you don't get this page first (focus plz) if not s.can_invoke_api: r = requests.get(urls['final_grades'], cookies=request.cookies) s.can_invoke_api = True s.student_id = parser.get_student_id(r.text) s.last_accessed = time() headers = {'Content-Type': 'application/x-www-form-urlencoded'} data = { 'accessID': s.student_id, 'api': 'finalGrades', 'method': 'requestGrades', 'modname': 'Grades/StudentRCGrades.php', 'arguments[]': 'all_QTR', 'arguments[1][**FIRST-REQUEST**]': 'true', } sign_request(data) r = requests.post(urls['api'], cookies=request.cookies, data=data, headers=headers) if r.status_code != 200: abort(500) d = simplify_final_grades(r.json(), 'grades') resp = jsonify(d) set_cookies(resp, s) return resp
def absences(): s = find_session(request.cookies.get('PHPSESSID'), sessions) if s is None or s.expired(): abort(403) r = requests.get(urls['absences'], cookies=request.cookies) if r.status_code != 200: abort(500) s.last_accessed = time() resp = jsonify( dict(parser.parse_absences(r.text), **parser.get_marking_periods(r.text))) set_cookies(resp, s) return resp
def demographic(): s = find_session(request.cookies.get('PHPSESSID'), sessions) if s is None or s.expired(): abort(403) r = requests.get(urls['demographic'], cookies=request.cookies) if r.status_code != 200: abort(500) ret = parser.parse_demographic(r.text) img = requests.get(tld + ret[1].replace('../', ''), cookies=request.cookies) ret[0]['picture'] = base64.b64encode(img.content).decode('utf-8') s.last_accessed = time() resp = jsonify(dict(ret[0], **parser.get_marking_periods(r.text))) set_cookies(resp, s) return resp
def occasion(id): s = find_session(request.cookies.get('PHPSESSID'), sessions) if s is None or s.expired(): abort(403) r = requests.get(urls['event_pre'] + str(id), cookies=request.cookies) if r.status_code != 200: abort(500) ret = parser.parse_calendar_event(r.text) ret['id'] = str(id) if ret: s.last_accessed = time() resp = jsonify(ret) set_cookies(resp, s) return resp abort(400)
def calendar_by_month(year, month): s = find_session(request.cookies.get('PHPSESSID'), sessions) if s is None or s.expired(): abort(403) if not month > 0 or not month < 13: abort(400) query = "month={}&year={}".format(month, year) r = requests.get(urls['calendar_pre'] + query, cookies=request.cookies) if r.status_code != 200: abort(500) s.last_accessed = time() resp = jsonify( dict(parser.parse_calendar(r.text), **parser.get_marking_periods(r.text))) set_cookies(resp, s) return resp
def referral(id): s = find_session(request.cookies.get('PHPSESSID'), sessions) if s is None or s.expired(): abort(403) r = requests.get(urls['referrals'], cookies=request.cookies) if r.status_code != 200: abort(500) parsed = parser.parse_referrals(r.text) target = None for ref in parsed['referrals']: if ref['id'] == id: target = ref break if target == None: abort(404) s.last_accessed = time() resp = jsonify(dict(target, **parser.get_marking_periods(r.text))) set_cookies(resp, s) return resp
def calendar_by_day(year, month, day): s = find_session(request.cookies.get('PHPSESSID'), sessions) if s is None or s.expired(): abort(403) if month < 1 or month > 12 or day < monthrange( year, month)[0] or day > monthrange(year, month)[1]: abort(400) query = "month={}&year={}".format(month, year) r = requests.get(urls['calendar_pre'] + query, cookies=request.cookies) if r.status_code != 200: abort(500) parsed = parser.parse_calendar(r.text) parsed['events'] = [ i for i in parsed['events'] if parse(i['date']).day == day ] parsed['day'] = day s.last_accessed = time() resp = jsonify(dict(parsed, **parser.get_marking_periods(r.text))) set_cookies(resp, s) return resp
def calendar_by_year(year): s = find_session(request.cookies.get('PHPSESSID'), sessions) if s is None or s.expired(): abort(403) query = "month={}&year={}".format(1, year) r = requests.get(urls['calendar_pre'] + query, cookies=request.cookies) if r.status_code != 200: abort(500) parsed = parser.parse_calendar(r.text) d = parsed d.pop('month') for i in range(2, 13): query = "month={}&year={}".format(i, year) r = requests.get(urls['calendar_pre'] + query, cookies=request.cookies) if r.status_code != 200: abort(500) parsed = parser.parse_calendar(r.text) d['events'] = d['events'] + parsed['events'] s.last_accessed = time() resp = jsonify(dict(d), **parser.get_marking_periods(r.text)) set_cookies(resp, s) return resp
def courses(): s = find_session(request.cookies.get('PHPSESSID'), sessions) if s is None or s.expired(): abort(403) r = requests.get(urls['portal'] + str(id), cookies=request.cookies) if r.status_code != 200: abort(500) portal = parser.parse_portal(r.text) d = {} d['courses'] = {} for c in portal['courses'].values(): r = requests.get(urls['course_pre'] + str(c['id']), cookies=request.cookies) if r.status_code != 200: abort(500) parsed = parser.parse_course(r.text) parsed['days'] = c['days'] d['courses'][parsed['id']] = parsed s.last_accessed = time() resp = jsonify(dict(d, **parser.get_marking_periods(r.text))) set_cookies(resp, s) return resp
def session(): if request.method == 'GET': s = find_session(request.cookies.get('PHPSESSID'), sessions) if s is None or s.expired(): abort(403) resp = jsonify({'timeout': int(s.timeout), 'username': s.user}) set_cookies(resp, s) return resp elif request.method == 'POST': if not request.json or not 'username' in request.json or not 'password' in request.json: abort(400) data = { 'login': '******', 'data': 'username={}&password={}'.format(request.json.get('username'), request.json.get('password')) } r = requests.post(urls['login'], data) if r.status_code == 200 and r.json()['success']: s = Session(request.json.get('username'), r.cookies['PHPSESSID']) sessions.append(s) resp = jsonify({'timeout': int(s.timeout), 'username': s.user}) set_cookies(resp, s) return resp elif r.status_code == 200: abort(401) else: abort(500) elif request.method == 'PUT': s = find_session(request.cookies.get('PHPSESSID'), sessions) if s is None or s.expired(): abort(403) if not request.json or not 'year' in request.json or not 'mp_id' in request.json \ or not isinstance(request.json['year'], int) or not isinstance(request.json['mp_id'], int): abort(400) d = { 'side_syear': request.json['year'], 'side_mp': request.json['mp_id'] } api_re = '(' + re.escape(api_url) + '){0,1}' valid_redirects = { 'PORTAL': api_re + 'portal', 'COURSE': api_re + 'courses\/[0-9]+', 'SCHEDULE': api_re + 'schedule', 'DEMOGRAPHIC': api_re + 'demographic', 'ADDRESS': api_re + 'address', 'REFERRALS': api_re + 'referrals', 'ABSENCES': api_re + 'absences' } if 'redirect' in request.json: redirect = request.json['redirect'] picked = None for r in valid_redirects: p = re.compile(valid_redirects[r], re.IGNORECASE) m = p.match(redirect) if m is not None and len(m.string) == len(redirect): picked = r break if picked == 'COURSE': id = redirect.split('/')[1] r = requests.post(urls['course_pre'] + id, data=d, cookies=request.cookies) if r.status_code != 200: abort(500) parsed = parser.parse_course(r.text) elif picked == 'SCHEDULE': r = requests.post(urls['schedule'], data=d, cookies=request.cookies) if r.status_code != 200: abort(500) parsed = parser.parse_schedule(r.text) elif picked == 'DEMOGRAPHIC': r = requests.post(urls['demographic'], data=d, cookies=request.cookies) if r.status_code != 200: abort(500) parsed = parser.parse_demographic(r.text) elif picked == 'ADDRESS': r = requests.post(urls['address'], data=d, cookies=request.cookies) if r.status_code != 200: abort(500) parsed = parser.parse_address(r.text) elif picked == 'REFERRALS': r = requests.post(urls['referrals'], data=d, cookies=request.cookies) if r.status_code != 200: abort(500) parsed = parser.parse_referrals(r.text) elif picked == 'ABSENCES': r = requests.post(urls['absences'], data=d, cookies=request.cookies) if r.status_code != 200: abort(500) parsed = parser.parse_absences(r.text) else: r = requests.post(urls['portal'], data=d, cookies=request.cookies) if r.status_code != 200: abort(500) parsed = parser.parse_portal(r.text) else: r = requests.post(urls['portal'], data=d, cookies=request.cookies) if r.status_code != 200: abort(500) parsed = parser.parse_portal(r.text) s.last_accessed = time() resp = jsonify(dict(parsed, **parser.get_marking_periods(r.text))) set_cookies(resp, s) return resp