host-fastapi / get_exam_schedule.py
sanjay7178's picture
Upload 31 files
5161c7a verified
raw
history blame
2.08 kB
import re
import aiohttp
import pandas as pd
from io import StringIO
from utils.payloads import get_examSchedule_payload
from constants.constants import vtop_doExamSchedule_url
async def _get_examSchedule_page(
sess: aiohttp.ClientSession, username: str, semID: str, csrf: str
) -> str:
async with sess.post(
vtop_doExamSchedule_url, data=get_examSchedule_payload(username, semID, csrf)
) as req:
return await req.text()
def _return_dash_if_not_str(value):
if isinstance(value, str):
return value
else:
return "-"
async def _parse_examSchedule(examSchedule_page: str):
try:
examSchedule_table = pd.read_html(StringIO(examSchedule_page))[0]
except ValueError:
return {}
examSchedule_data = {}
current_exam = ""
for index, row in examSchedule_table.iterrows():
if index == 0:
continue
if re.search("\D", row[0]):
current_exam = row[0]
examSchedule_data[current_exam] = {}
else:
examSchedule_data[current_exam][row[1]] = {
"name": row[2],
"type": row[3],
"classID": row[4],
"slot": row[5],
"date": _return_dash_if_not_str(row[6]),
"session": _return_dash_if_not_str(row[7]),
"reportingTime": _return_dash_if_not_str(row[8]),
"duration": _return_dash_if_not_str(row[9]),
"venue": row[10].split("-")[0],
"roomNo": row[10].split("-")[1],
"seatLocation": row[11],
"seatNo": row[12],
}
examSchedule_data.pop("S.No.")
return examSchedule_data
async def get_examSchedule_data(
sess: aiohttp.ClientSession, username: str, semID: str, csrf: str
) -> dict:
examSchedule_page = await _get_examSchedule_page(sess, username, semID, csrf)
examSchedule_data = await _parse_examSchedule(examSchedule_page)
return examSchedule_data