Beispiel #1
0
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
Beispiel #2
0
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
Beispiel #3
0
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
Beispiel #4
0
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)
Beispiel #5
0
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
Beispiel #6
0
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
Beispiel #7
0
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
Beispiel #8
0
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
Beispiel #9
0
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
Beispiel #10
0
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