Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

added flask app #132

Merged
merged 13 commits into from
Jul 23, 2024
63 changes: 17 additions & 46 deletions server.py
Original file line number Diff line number Diff line change
@@ -1,74 +1,45 @@
import requests
# from flask import Flask
from flask import Flask, request, render_template , send_file
import iitkgp_erp_login.erp as erp
from utils import ERPSession
from timetable import delete_calendar, create_calendar, build_courses, generate_ics
from flask import Flask, request,send_file
from timetable import build_courses, generate_ics
import io

from flask_cors import CORS
from session_manager import SessionManager

app = Flask(__name__)
CORS(app, support_credentials=True)
session = requests.Session()
headers = {
'timeout': '20',
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/51.0.2704.79 Chrome/51.0.2704.79 Safari/537.36',
}

dict = {
'rollNo': 'sessionToken',
}


loginDetailsList = []

@app.route("/get_secret_question", methods=["POST"])

@app.route("/secret-question", methods=["POST"])
def get_secret_question():
tanush-128 marked this conversation as resolved.
Show resolved Hide resolved
data = request.form
roll = data.get("roll")
print(roll)
sessionToken = erp.get_sessiontoken(session)
secret_question = erp.get_secret_question(headers, session, roll)
dict[roll] = sessionToken
secret_question = SessionManager.get_secret_question(roll)
return secret_question
tanush-128 marked this conversation as resolved.
Show resolved Hide resolved

@app.route("/sendOTP", methods=["POST"])
def login():

@app.route("/send-otp", methods=["POST"])
def sendOTP():
data = request.form
roll = data.get("roll")
passw = data.get("pass")
print(roll, passw)
print(dict)
sessionToken = dict[roll]
secret_answer = data.get("secret_answer")
loginDetails = erp.get_login_details(roll, passw, secret_answer, sessionToken)
loginDetails["roll"] = roll
loginDetailsList.append(loginDetails)
erp.request_otp(headers, session, loginDetails)

print(loginDetails)

SessionManager.send_otp(roll, passw, secret_answer)

return "OTP sent"
tanush-128 marked this conversation as resolved.
Show resolved Hide resolved


@app.route("/verifyOTP", methods=["POST"])
def verifyOTP():
@app.route("/verify-otp-and-download", methods=["POST"])
def verifyOTPAndDownloadICS():
data = request.form
roll = data.get("roll")
email_otp = data.get("email_otp")
loginDetails = loginDetailsList[0]
for i in loginDetailsList:
if i["roll"] == roll:
loginDetails = i
break
loginDetails["email_otp"] = email_otp
ssoToken = erp.signin(headers, session, loginDetails)

print(ssoToken)

#send .ics file
erp_session = ERPSession.create_erp_session(session, ssoToken, roll)
erp_session = SessionManager.create_erp_session(roll, email_otp)

timetable_page = erp_session.post(erp_session.ERP_TIMETABLE_URL, cookies=True,
tanush-128 marked this conversation as resolved.
Show resolved Hide resolved
data=erp_session.get_timetable_details())
course_names = erp_session.get_course_names()
Expand All @@ -82,8 +53,8 @@ def verifyOTP():
ics_file.write(ics_content.encode('utf-8'))
ics_file.seek(0) # Reset file pointer to the beginning

#remove loginDetails from list
loginDetailsList.remove(loginDetails)
SessionManager.end_session(roll)
tanush-128 marked this conversation as resolved.
Show resolved Hide resolved

# Return the ics file
return send_file(ics_file, mimetype='text/calendar', as_attachment=True, download_name='timetable.ics')

Expand Down
44 changes: 44 additions & 0 deletions session_manager.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import iitkgp_erp_login.erp as erp
import requests
from utils import ERPSession

headers = {
'timeout': '20',
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/51.0.2704.79 Chrome/51.0.2704.79 Safari/537.36',
}
session = requests.Session()


class SessionManager:
rollTologinDetailsMap = {}
rollToSessionTokenMap = {}
tanush-128 marked this conversation as resolved.
Show resolved Hide resolved

@staticmethod
def get_secret_question(roll):
sessionToken = erp.get_sessiontoken(session)
SessionManager.rollToSessionTokenMap[roll] = sessionToken
secret_question = erp.get_secret_question(headers, session, roll)
return secret_question

@staticmethod
def send_otp(roll, passw, secret_answer):
sessionToken = SessionManager.rollToSessionTokenMap[roll]
loginDetails = erp.get_login_details(roll, passw, secret_answer, sessionToken)
SessionManager.rollTologinDetailsMap[roll] = loginDetails
erp.request_otp(headers, session, loginDetails)


@staticmethod
def create_erp_session(roll, email_otp):
loginDetails = SessionManager.rollTologinDetailsMap[roll]
loginDetails["email_otp"] = email_otp
ssoToken = erp.signin(headers, session, loginDetails)
erp_session = ERPSession.create_erp_session(session, ssoToken, roll)
return erp_session

@staticmethod
def end_session(roll):
SessionManager.rollTologinDetailsMap.pop(roll)
SessionManager.rollToSessionTokenMap.pop(roll)
return "Session ended"