Spaces:
Paused
Paused
| import re | |
| import aiohttp | |
| import pandas as pd | |
| from io import StringIO | |
| from constants.constants import ( | |
| vtop_process_attendance_url, | |
| vtop_process_attendance_detail_url, | |
| ) | |
| from utils.payloads import ( | |
| get_attendance_payload, | |
| get_attendance_detail_payload, | |
| ) | |
| async def _get_attendance_page( | |
| sess: aiohttp.ClientSession, username: str, semID: str, csrf: str | |
| ): | |
| async with sess.post( | |
| vtop_process_attendance_url, data=get_attendance_payload(username, semID, csrf) | |
| ) as req: | |
| return await req.text() | |
| async def _get_attendance_detail_page( | |
| sess: aiohttp.ClientSession, csrf, semID, username, courseID, courseType | |
| ): | |
| async with sess.post( | |
| vtop_process_attendance_detail_url, | |
| data=get_attendance_detail_payload(csrf, semID, username, courseID, courseType), | |
| ) as req: | |
| return await req.text() | |
| def _get_class_type(classType: str): | |
| if classType == "Embedded Theory": | |
| return "ETH" | |
| elif classType == "Embedded Lab": | |
| return "ELA" | |
| elif classType == "Theory Only": | |
| return "TH" | |
| elif classType == "Lab Only": | |
| return "LO" | |
| def _parse_attendance_detail(attendance_detail_page: str): | |
| attendance_detail_table = pd.read_html(StringIO(attendance_detail_page)) | |
| if len(attendance_detail_table) < 2: | |
| return {} | |
| attendance_detail_table = attendance_detail_table[1] | |
| attendance_detail = {} | |
| for index, row in attendance_detail_table.iterrows(): | |
| attendance_detail[str(row["Sl.No."])] = { | |
| "status": row["Status"], | |
| "date": row["Date"], | |
| "time": row["Day / Time"], | |
| } | |
| return attendance_detail | |
| async def _parse_attendance( | |
| attendance_page: str, | |
| sess: aiohttp.ClientSession, | |
| username: str, | |
| csrf: str, | |
| semID: str, | |
| ): | |
| table_df = pd.read_html(StringIO(attendance_page))[0] | |
| attendance = [] | |
| for index, row in table_df.iterrows(): | |
| code = row["Course Detail"].split("-")[0].strip() | |
| slot = row["Class Detail"].split("-")[1].strip() | |
| if "Total Number Of Credits" in code: | |
| if "0" in code: | |
| raise Exception | |
| continue | |
| attendance.append( | |
| { | |
| "classID": row["Class Detail"].split("-")[0].strip(), | |
| "name": row["Course Detail"].split("-")[1].strip(), | |
| "courseType": row["Course Detail"].split("-")[2].strip(), | |
| "slot": slot, | |
| "totalClasses": str(row["Total Classes"]), | |
| "attendedClasses": str(row["Attended Classes"]), | |
| "attendancePercentage": row["Attendance Percentage"][:-1], | |
| "attendanceDetail": _parse_attendance_detail( | |
| await _get_attendance_detail_page( | |
| sess, | |
| csrf, | |
| semID, | |
| username, | |
| re.search(f";(\w*_{code}_\d*)&", attendance_page).group(1), | |
| _get_class_type(row["Course Detail"].split("-")[2].strip()), | |
| ) | |
| ), | |
| } | |
| ) | |
| return attendance | |
| async def get_attendance_data( | |
| sess: aiohttp.ClientSession, username: str, semID: str, csrf: str | |
| ): | |
| return await _parse_attendance( | |
| await _get_attendance_page(sess, username, semID, csrf), | |
| sess, | |
| username, | |
| csrf, | |
| semID, | |
| ) | |