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