diff --git a/.env b/.env
new file mode 100644
index 0000000..18211ed
--- /dev/null
+++ b/.env
@@ -0,0 +1,4 @@
+app.secret_key_API = '~!@#$%^&*&^%$#$%^&'
+*/dev
+.gitignore
+.idea
diff --git a/.gitignore b/.gitignore
index 3f1087e..31bb538 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,5 @@
__pycache__/
#To ignore cache file.
+/venv
+/dev
+.env
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..8bf4d45
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,6 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/Library-Management.iml b/.idea/Library-Management.iml
new file mode 100644
index 0000000..a36b0ab
--- /dev/null
+++ b/.idea/Library-Management.iml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..2c99088
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 0000000..105ce2d
--- /dev/null
+++ b/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..95b156a
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..ee71a56
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/rSettings.xml b/.idea/rSettings.xml
new file mode 100644
index 0000000..c40e3b3
--- /dev/null
+++ b/.idea/rSettings.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Library_Management.egg-info/PKG-INFO b/Library_Management.egg-info/PKG-INFO
new file mode 100644
index 0000000..8384439
--- /dev/null
+++ b/Library_Management.egg-info/PKG-INFO
@@ -0,0 +1,6 @@
+Metadata-Version: 2.1
+Name: Library-Management
+Version: 0.0.0
+Home-page:
+Author: andrewschell
+Author-email:
diff --git a/Library_Management.egg-info/SOURCES.txt b/Library_Management.egg-info/SOURCES.txt
new file mode 100644
index 0000000..53a5dee
--- /dev/null
+++ b/Library_Management.egg-info/SOURCES.txt
@@ -0,0 +1,9 @@
+IST_Time.py
+README.md
+app.py
+db.py
+setup.py
+Library_Management.egg-info/PKG-INFO
+Library_Management.egg-info/SOURCES.txt
+Library_Management.egg-info/dependency_links.txt
+Library_Management.egg-info/top_level.txt
\ No newline at end of file
diff --git a/Library_Management.egg-info/dependency_links.txt b/Library_Management.egg-info/dependency_links.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/Library_Management.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/Library_Management.egg-info/top_level.txt b/Library_Management.egg-info/top_level.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/Library_Management.egg-info/top_level.txt
@@ -0,0 +1 @@
+
diff --git a/README.md b/README.md
index d46a003..5d836b3 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,22 @@
Library Management System
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Portal for Reissuing Library Books
@@ -21,14 +38,14 @@ Steps
* The user receives a One Time Password (OTP) on his/her mobile number to access the portal
-
-
-
-(OTP RECEIVED)
-
-
+
+
+(OTP RECEIVED)
+
+
+
(OTP ENTERED)
* VoilĂ , the user has entered the system.
diff --git a/app.py b/app.py
index ed2368f..2cc9393 100644
--- a/app.py
+++ b/app.py
@@ -1,205 +1,263 @@
+# SOURCE https://flask.palletsprojects.com/en/3.0.x/quickstart/#
+# run by python app.py from terminal of project root
+
from pickle import GET
from traceback import print_tb
from unicodedata import name
-from flask import Flask, flash, redirect, render_template, request, url_for, session
+from flask import Flask, flash, redirect, render_template, request, url_for, session
import db as fb
import requests as req
import random
import IST_Time as TIME
+# from dotenv import load_dotenv
+
+
+# load_dotenv()
+
+
app = Flask(__name__)
-app.secret_key = "~!@#$%^&*&^%$#$%^&"
+app.secret_key = "~!@#$%^&*&^%$#$%^&"
-@app.route('/', methods=['GET', 'POST'])
-@app.route('/login')
+@app.route("/", methods=["GET", "POST"])
+@app.route("/login")
def start():
- if (request.method == 'POST'):
+ if request.method == "POST":
try:
- number = int(request.form.get('mobile'))
- roll = int(request.form.get('roll'))
+ number = int(request.form.get("mobile"))
+ roll = int(request.form.get("roll"))
except:
- flash ('ENTER VAILD DETAILS')
- return render_template('form.html', title = 'home')
+ flash("ENTER VAILD DETAILS")
+ return render_template("form.html", title="home")
try:
retrive_data = dict(fb.db.child("users").child(str(roll)).get().val())
print(retrive_data)
- session['retrive_data'] = retrive_data
+ session["retrive_data"] = retrive_data
except:
- flash ('ENTER A VALID ROLL NUMBER')
- return render_template('form.html', title = 'home')
-
- if (str(retrive_data['MOB']) == str(number)):
+ flash("ENTER A VALID ROLL NUMBER")
+ return render_template("form.html", title="home")
+
+ if str(retrive_data["MOB"]) == str(number):
number = str(number)
verification = random.randint(105545, 987512)
message_var = verification
try:
- r = req.get(f'https://www.fast2sms.com/dev/bulkV2?authorization=api_key&sender_id=Cghpet&message={message_var}&language=english&flash=0&numbers={number}')
+ r = req.get(
+ f"https://www.fast2sms.com/dev/bulkV2?authorization=api_key&sender_id=Cghpet&message={message_var}&language=english&flash=0&numbers={number}"
+ )
# print(r.json())
- dict1= r.json()
+ dict1 = r.json()
except:
- flash ("SMS NOT WORKING")
- return render_template('form.html', title = 'home')
-
- if (dict1['message'] == ['SMS sent successfully.']):
+ flash("SMS NOT WORKING")
+ return render_template("form.html", title="home")
+
+ if dict1["message"] == ["SMS sent successfully."]:
# print("Success")
- flash ('OTP SENT')
- session['roll']= roll
- session['verification'] = verification
- session['count']= 0 #modify count here fix count session
+ flash("OTP SENT")
+ session["roll"] = roll
+ session["verification"] = verification
+ session["count"] = 0 # modify count here fix count session
# print("VERIFY : ", verification)
- return redirect(url_for('start1')) #url_for('start1', VERIFY= verification, DATA=roll))
+ return redirect(
+ url_for("start1")
+ ) # url_for('start1', VERIFY= verification, DATA=roll))
- elif((dict1['message'] == 'Invalid Numbers')):
- flash ('ENTER VAILD NUMBER')
- return render_template('form.html', title = 'home')
+ elif dict1["message"] == "Invalid Numbers":
+ flash("ENTER VAILD NUMBER")
+ return render_template("form.html", title="home")
else:
print(verification)
- session['roll']= roll
- session['verification'] = verification
- session['count']= 0 #modify count here fix count session
+ session["roll"] = roll
+ session["verification"] = verification
+ session["count"] = 0 # modify count here fix count session
# print("VERIFY : ", verification)
flash("SMS NOT SENT, SEE ON TERMINAL")
- return redirect(url_for('start1')) #url_for('start1', VERIFY= verification, DATA=roll))
+ return redirect(
+ url_for("start1")
+ ) # url_for('start1', VERIFY= verification, DATA=roll))
# print("FAIL")
# flash ('ENTER VAILD DETAILS')
# return render_template('form.html', title = 'home')
else:
- flash ('YOU ARE NOT ARE REGISTERED.')
- return render_template('form.html', title = 'home')
+ flash("YOU ARE NOT ARE REGISTERED.")
+ return render_template("form.html", title="home")
- else:
- if ('roll' in session and 'verification_done' in session and 'retrive_data' in session):
- flash('YOU ARE ALREADY LOGGED IN')
- return redirect (url_for('start2'))
- return render_template('form.html', title = 'home')
+ else:
+ if (
+ "roll" in session
+ and "verification_done" in session
+ and "retrive_data" in session
+ ):
+ flash("YOU ARE ALREADY LOGGED IN")
+ return redirect(url_for("start2"))
+ return render_template("form.html", title="home")
-@app.route('/OTP', methods=['GET', "POST"])
+@app.route("/OTP", methods=["GET", "POST"])
def start1():
-# session['count']= 0 #modify count here fix count session
+ # session['count']= 0 #modify count here fix count session
# VERIFY = request.args.get('VERIFY')
# DATA = request.args.get('DATA')
- if (request.method=='POST'):
- verify_token = request.form.get('OTP')
+ if request.method == "POST":
+ verify_token = request.form.get("OTP")
# print(verify_token)
# flash (f'OTP SENT TO {number}')
try:
verify_token
-# print(verify_token)
+ # print(verify_token)
except:
- flash('ENTER VALID VALUE')
- return render_template('otp.html', title='OTP VERIFY')
+ flash("ENTER VALID VALUE")
+ return render_template("otp.html", title="OTP VERIFY")
# return render_template('otp.html', title='OTP VERIFY')
- if (int(verify_token) == int(session['verification'])):
- flash ("WELCOME TO THE ISSUING SYSTEM")
- session['verification_done'] = 'DONE'
- session.pop('count', None) #fix count
+ if int(verify_token) == int(session["verification"]):
+ flash("WELCOME TO THE ISSUING SYSTEM")
+ session["verification_done"] = "DONE"
+ session.pop("count", None) # fix count
# VERIFY = 0
- return redirect(url_for('start2'))
+ return redirect(url_for("start2"))
else:
- session['count'] = int(session['count']) + 1 #modify count
- if (session['count'] == 2):
- flash ("FAILD ATTEMPT TRY AGAIN LATER") #modify count
- session.pop('retrive_data', None)
- session.pop('roll', None)
- session.pop('verification', None)
- session.pop('count', None)#fix count in session
- return redirect(url_for('start')) #count
- flash ("FAIL, TRY AGAIN")
+ session["count"] = int(session["count"]) + 1 # modify count
+ if session["count"] == 2:
+ flash("FAILD ATTEMPT TRY AGAIN LATER") # modify count
+ session.pop("retrive_data", None)
+ session.pop("roll", None)
+ session.pop("verification", None)
+ session.pop("count", None) # fix count in session
+ return redirect(url_for("start")) # count
+ flash("FAIL, TRY AGAIN")
# return redirect(url_for('start'))
- return render_template('otp.html', title='OTP VERIFY')
+ return render_template("otp.html", title="OTP VERIFY")
else:
- if ('roll' not in session):
- flash('ENTER MOBILE NUMBER FIRST.')
- return redirect(url_for('start'))
+ if "roll" not in session:
+ flash("ENTER MOBILE NUMBER FIRST.")
+ return redirect(url_for("start"))
else:
- if ('roll' in session and 'verification_done' in session and 'retrive_data' in session):
- flash('YOU ARE ALREADY LOGGED IN!')
- return redirect(url_for('start2'))
- if ('roll' in session):
+ if (
+ "roll" in session
+ and "verification_done" in session
+ and "retrive_data" in session
+ ):
+ flash("YOU ARE ALREADY LOGGED IN!")
+ return redirect(url_for("start2"))
+ if "roll" in session:
# flash(f'HI {VERIFY}')
- return render_template('otp.html', title='OTP VERIFY')
+ return render_template("otp.html", title="OTP VERIFY")
else:
- return redirect(url_for('start'))
-@app.route('/details', methods=['GET', "POST"])
+ return redirect(url_for("start"))
+
+
+@app.route("/details", methods=["GET", "POST"])
def start2():
# DATA = request.args.get('DATA')
- book = ['BOOK1', 'BOOK2','BOOK3', 'BOOK4']
- if (request.method=='POST'):
+ book = ["BOOK1", "BOOK2", "BOOK3", "BOOK4"]
+ if request.method == "POST":
# print(request.form.get('select_book'))
- a = request.form.get('select_book')
- a = str(a)
- if(a in book):
- if(int(session['retrive_data']['NOC']) > 0 and int(session['retrive_data'][f'{a}']['NO_ISSUE'])<=1):
+ a = request.form.get("select_book")
+ a = str(a)
+ if a in book:
+ if (
+ int(session["retrive_data"]["NOC"]) > 0
+ and int(session["retrive_data"][f"{a}"]["NO_ISSUE"]) <= 1
+ ):
# print(a)
ISSUE_TODAY = TIME.ISSUE()
# print(ISSUE_TODAY)
- fb.db.child("users").child(f"{session['retrive_data']['Roll_No']}").child(f'{a}').update({'DATE_REISSUE' : f'{ISSUE_TODAY}'})
- ISSUE_EXPIRE=TIME.REISSUE(ISSUE_TODAY)
+ fb.db.child("users").child(
+ f"{session['retrive_data']['Roll_No']}"
+ ).child(f"{a}").update({"DATE_REISSUE": f"{ISSUE_TODAY}"})
+ ISSUE_EXPIRE = TIME.REISSUE(ISSUE_TODAY)
# print(f'\n{ISSUE_EXPIRE}')
- fb.db.child("users").child(f"{session['retrive_data']['Roll_No']}").child(f'{a}').update({'DATE_RETURN' : f'{ISSUE_EXPIRE}'})
- session['NOC'] = int(session['retrive_data']['NOC']) - 1
- fb.db.child("users").child(f"{session['retrive_data']['Roll_No']}").update({'NOC' : f'{session["NOC"]}'})
- session['NOC_BOOK_SELECT'] = int(session['retrive_data'][f'{a}']['NO_ISSUE']) + 1
- fb.db.child("users").child(f"{session['retrive_data']['Roll_No']}").child(f'{a}').update({'NO_ISSUE' : f'{session["NOC_BOOK_SELECT"]}'})
+ fb.db.child("users").child(
+ f"{session['retrive_data']['Roll_No']}"
+ ).child(f"{a}").update({"DATE_RETURN": f"{ISSUE_EXPIRE}"})
+ session["NOC"] = int(session["retrive_data"]["NOC"]) - 1
+ fb.db.child("users").child(
+ f"{session['retrive_data']['Roll_No']}"
+ ).update({"NOC": f'{session["NOC"]}'})
+ session["NOC_BOOK_SELECT"] = (
+ int(session["retrive_data"][f"{a}"]["NO_ISSUE"]) + 1
+ )
+ fb.db.child("users").child(
+ f"{session['retrive_data']['Roll_No']}"
+ ).child(f"{a}").update({"NO_ISSUE": f'{session["NOC_BOOK_SELECT"]}'})
flash("BOOK WAS REISSUED")
- session.pop('NOC', None)
- session.pop('NOC_BOOK_SELECT', None)
- if ('retrive_data'in session and 'roll' in session and 'verification_done' in session ): #count
+ session.pop("NOC", None)
+ session.pop("NOC_BOOK_SELECT", None)
+ if (
+ "retrive_data" in session
+ and "roll" in session
+ and "verification_done" in session
+ ): # count
try:
- retrive_data = dict(fb.db.child("users").child(str(session['roll'])).get().val())
- session['retrive_data'] = retrive_data
+ retrive_data = dict(
+ fb.db.child("users").child(str(session["roll"])).get().val()
+ )
+ session["retrive_data"] = retrive_data
except:
- flash ('FAIL TRY AGAIN LATER')
- session.pop('retrive_data', None)
- session.pop('roll', None)
- session.pop('verification', None)
- session.pop('verification_done', None)
- return redirect (url_for('start'))
- return render_template('details.html', title='Details', data = session['retrive_data'], book = ['BOOK1', 'BOOK2','BOOK3', 'BOOK4'])
+ flash("FAIL TRY AGAIN LATER")
+ session.pop("retrive_data", None)
+ session.pop("roll", None)
+ session.pop("verification", None)
+ session.pop("verification_done", None)
+ return redirect(url_for("start"))
+ return render_template(
+ "details.html",
+ title="Details",
+ data=session["retrive_data"],
+ book=["BOOK1", "BOOK2", "BOOK3", "BOOK4"],
+ )
# return redirect(url_for('start2'))
else:
- flash('MAX ISSUE REACHED')
- return redirect(url_for('start2'))
-
+ flash("MAX ISSUE REACHED")
+ return redirect(url_for("start2"))
# print('TRUE')
- logout = request.form.get('logout')
- session.pop('retrive_data', None)
- session.pop('roll', None)
- session.pop('verification', None)
- session.pop('verification_done', None)
- return redirect(url_for('start'))
-
- if ('retrive_data'in session and 'roll' in session and 'verification_done' in session ): #count
- if (str(session['roll']) == str(session['retrive_data']['Roll_No'])):
+ logout = request.form.get("logout")
+ session.pop("retrive_data", None)
+ session.pop("roll", None)
+ session.pop("verification", None)
+ session.pop("verification_done", None)
+ return redirect(url_for("start"))
+
+ if (
+ "retrive_data" in session
+ and "roll" in session
+ and "verification_done" in session
+ ): # count
+ if str(session["roll"]) == str(session["retrive_data"]["Roll_No"]):
try:
- retrive_data = dict(fb.db.child("users").child(str(session['roll'])).get().val())
- session['retrive_data'] = retrive_data
- return render_template('details.html', title='Details', data = session['retrive_data'], book = ['BOOK1', 'BOOK2','BOOK3', 'BOOK4'])
+ retrive_data = dict(
+ fb.db.child("users").child(str(session["roll"])).get().val()
+ )
+ session["retrive_data"] = retrive_data
+ return render_template(
+ "details.html",
+ title="Details",
+ data=session["retrive_data"],
+ book=["BOOK1", "BOOK2", "BOOK3", "BOOK4"],
+ )
except:
- flash ('FAIL TRY AGAIN LATER')
- session.pop('retrive_data', None)
- session.pop('roll', None)
- session.pop('verification', None)
- session.pop('verification_done', None)
- return redirect (url_for('start'))
+ flash("FAIL TRY AGAIN LATER")
+ session.pop("retrive_data", None)
+ session.pop("roll", None)
+ session.pop("verification", None)
+ session.pop("verification_done", None)
+ return redirect(url_for("start"))
# return render_template('details.html', title='Details', data = session['retrive_data'], book = ['BOOK1', 'BOOK2','BOOK3', 'BOOK4'])
else:
- flash('LOGIN FIRST')
- return redirect(url_for('start'))
+ flash("LOGIN FIRST")
+ return redirect(url_for("start"))
@app.errorhandler(404)
@app.errorhandler(500)
def anything(e):
- return redirect(url_for('start'))
+ return redirect(url_for("start"))
-if(__name__ == '__main__'):
+if __name__ == "__main__":
app.run()
-
diff --git a/dev/github_issue_generator.py b/dev/github_issue_generator.py
new file mode 100644
index 0000000..c6ba142
--- /dev/null
+++ b/dev/github_issue_generator.py
@@ -0,0 +1,86 @@
+# SOURCE https://gist.github.com/JeffPaine/3145490
+import requests
+import json
+
+
+PROJECT_VERSIONS = {
+ "molstar": {
+ "owner": "molstar",
+ "repo": "molstar",
+ "custom_repo": "molstar",
+ "release": "v3.32.0",
+ },
+ "indgio": {
+ "owner": "epam",
+ "repo": "indigo",
+ "custom_repo": "Indigo",
+ "release": "indigo-1.0.7",
+ },
+ "ketcher": {
+ "owner": "epam",
+ "repo": "ketcher",
+ "custom_repo": "Ketcher",
+ "release": "v2.7.2",
+ },
+}
+
+RELEASES_URL = "https://api.github.com/repos/{owner}/{repo}/releases"
+ISSUE_URL = "https://api.github.com/repos/{owner}/{repo}/issues"
+ISSUES_ADD_LABEL = "https://api.github.com/repos/{owner}/{repo}/issues/{issue_id}"
+ORGANIZATION = "QuanMol"
+TOKEN = "" # This is the PAT token
+
+headers = {"Authorization": f"token {TOKEN}", "Accept": "application/vnd.github+json"}
+
+# Create an authenticated session to create the issue
+session = requests.Session()
+session = requests.Session()
+session.auth = ("luna215", TOKEN)
+
+
+def add_label_to_issue(custom_repo: str, issue_id: str):
+ labels = {"labels": ["P0 - Critical"]}
+ session.post(
+ ISSUES_ADD_LABEL.format(
+ owner=ORGANIZATION, repo=custom_repo, issue_id=issue_id
+ ),
+ data=json.dumps(labels),
+ )
+ print(f"Labels added to issue {issue_id}")
+
+
+def create_update_issue(latest_release: str, current_release: str, custom_repo: str):
+ """Create an issue that describes to update the project"""
+
+ issue = {
+ "title": f"Update package to {latest_release}!",
+ "body": f"The package is currently using {current_release} and we need to update it to {latest_release}",
+ }
+ response = session.post(
+ ISSUE_URL.format(owner=ORGANIZATION, repo=custom_repo), data=json.dumps(issue)
+ ).json()
+ issue_id = response["number"]
+
+ add_label_to_issue(custom_repo, issue_id)
+
+
+if __name__ == "__main__":
+ for project_name, project_info in PROJECT_VERSIONS.items():
+ owner = project_info["owner"]
+ repo = project_info["repo"]
+ custom_repo = project_info["custom_repo"]
+ current_release = project_info["release"]
+
+ response = requests.get(RELEASES_URL.format(owner=owner, repo=repo))
+
+ data = response.json()
+
+ latest_release = data[0]["tag_name"]
+
+ if latest_release != current_release:
+ # TODO: check if issue exists to update project
+
+ print(
+ f"{project_name} needs to be updated! {current_release} --> {latest_release}"
+ )
+ create_update_issue(latest_release, current_release, custom_repo)
diff --git a/dev/repo_tasks.md b/dev/repo_tasks.md
new file mode 100644
index 0000000..1afae3c
--- /dev/null
+++ b/dev/repo_tasks.md
@@ -0,0 +1,11 @@
+- [ ] create /dev folder and standard list of adds
+- [ ] find 8 levels of code
+- [ ] link 8 levels of code to tests to check for presence
+- [ ] https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/about-task-lists
+- [ ] write code to test a repo for 8 levels and generate score
+- [ ] a sample score is 1.8750 usually a 4 digit code, higher is better
+- [ ] review https://github.
+- [ ] create script to put repo_tasks on README.md
+- [ ] review https://github.com/octo-org/octo-repo/issues/740
+- [ ] find code from Data_Workbench to generate new repo code
+- [ ] Add delight to the experience when all tasks are complete :tada:
diff --git a/dist/Library-Management-0.0.0.tar.gz b/dist/Library-Management-0.0.0.tar.gz
new file mode 100644
index 0000000..71b629a
Binary files /dev/null and b/dist/Library-Management-0.0.0.tar.gz differ
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..0c62a5d
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,39 @@
+[build-system]
+requires = ["setuptools", "setuptools-scm"]
+build-backend = "setuptools.build_meta"
+
+[project]
+name = "my_package"
+
+authors = [
+ {name = "Kartikey", email = "kartikey@example.com"},
+ {name = "Hiten Samalia", email = "hiten@example.com"},
+ {name = "Uday Palecha", email = "uday@example.com"},
+ {name = "Bhavay Luthra", email = "bhavay@example.com"},
+ {name = "Andrew Schell", email = "andrewschell3@gmail.com"}
+]
+
+description = "My package description"
+readme = "README.rst"
+requires-python = ">=3.7"
+keywords = ["library", "books","fyrebase"]
+license = {text = "BSD-3-Clause"}
+classifiers = [
+ "Framework :: Flask",
+ "Programming Language :: Python :: 3",
+]
+dependencies = [
+ "requests",
+ 'importlib-metadata; python_version>"3.7"',
+]
+dynamic = ["version"]
+
+[project.optional-dependencies]
+pdf = ["ReportLab>=1.2", "RXP"]
+rest = ["docutils>=0.3", "pack ==1.1, ==1.3"]
+
+[project.scripts]
+my-script = "my_package.module:function"
+
+# ... other project metadata fields as specified in:
+# https://packaging.python.org/en/latest/specifications/declaring-project-metadata/
diff --git a/requirements.txt b/requirements.txt
index e677b32..923206c 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,35 +1,44 @@
-certifi==2021.10.8
-cffi==1.15.0
-charset-normalizer==2.0.12
-click==8.0.4
-cryptography==36.0.1
-DateTime==4.4
-Deprecated==1.2.13
-Flask==2.0.3
-gcloud==0.18.3
-googleapis-common-protos==1.55.0
-gunicorn==20.1.0
-httplib2==0.20.4
-idna==3.3
-itsdangerous==2.1.1
-Jinja2==3.0.3
-jwcrypto==1.0
-MarkupSafe==2.1.0
-oauth2client==4.1.3
-protobuf==3.20.0rc1
-pyasn1==0.4.8
-pyasn1-modules==0.2.8
-pycparser==2.21
-pycryptodome==3.14.1
-pyparsing==3.0.7
-Pyrebase4==4.5.0
-python-jwt==3.3.2
-pytz==2021.3
-requests==2.27.1
-requests-toolbelt==0.9.1
-rsa==4.8
-six==1.16.0
-urllib3==1.26.8
-Werkzeug==2.0.3
-wrapt==1.14.0
-zope.interface==5.4.0
+certifi #~=2023.7.22
+cffi #==1.15.0
+charset-normalizer #==2.0.12
+click #~=8.1.7
+cryptography #==36.0.1
+DateTime #==4.4
+Deprecated #==1.2.13
+Flask #~=2.3.3
+gcloud #~=0.17.0
+googleapis-common-protos #==1.55.0
+gunicorn #==20.1.0
+httplib2 #~=0.22.0
+idna #~=3.4
+itsdangerous #~=2.1.2
+Jinja2 #~=3.1.2
+jwcrypto #==1.0
+MarkupSafe #~=2.1.3
+oauth2client #~=3.0.0
+protobuf #==3.20.0rc1
+pyasn1 #~=0.5.0
+pyasn1-modules #==0.2.8
+pycparser #==2.21
+pycryptodome #==3.14.1
+pyparsing #~=3.1.1
+Pyrebase4 #==4.5.0
+python-jwt #==3.3.2
+pytz #==2021.3
+requests #~=2.11.1
+requests-toolbelt #==0.9.1
+rsa #~=4.9
+six #==1.16.0
+urllib3 #~=2.0.4
+Werkzeug #~=2.3.7
+wrapt #==1.14.0
+zope.interface #==5.4.0
+
+pip #~=23.2.1
+wheel #~=0.41.2
+openssl #~=3.1.2
+setuptools #~=68.1.2
+
+blinker #~=1.6.2
+pyrebase #~=3.0.27
+zipp #~=3.16.2
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000..6bbaebc
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,16 @@
+from setuptools import setup
+
+setup(
+ name="Library-Management",
+ version="",
+ packages=["wsgi"],
+ url="",
+ license="",
+ author="Kartikey",
+ "Hiten Samalia",
+ "Uday Palecha",
+ "Bhavay Luthra",
+ "Andrew Schell",
+ author_email="",
+ description="",
+)
diff --git a/static/images/internet-education-book-on-screen-icon-logo-illustration-online-library-symbol-template-for-graphic-and-web-design-collection-free-vector-2.jpg b/static/images/internet-education-book-on-screen-icon-logo-illustration-online-library-symbol-template-for-graphic-and-web-design-collection-free-vector-2.jpg
new file mode 100644
index 0000000..2a34171
Binary files /dev/null and b/static/images/internet-education-book-on-screen-icon-logo-illustration-online-library-symbol-template-for-graphic-and-web-design-collection-free-vector-2.jpg differ
diff --git a/static/images/online-library-symbol.jpg b/static/images/online-library-symbol.jpg
new file mode 100644
index 0000000..2a34171
Binary files /dev/null and b/static/images/online-library-symbol.jpg differ
diff --git a/tox.ini b/tox.ini
new file mode 100644
index 0000000..d8b139d
--- /dev/null
+++ b/tox.ini
@@ -0,0 +1,10 @@
+# content of: tox.ini , put in same dir as setup.py
+[tox]
+envlist = py37,py36
+
+[testenv]
+# install pytest in the virtualenv where commands will be executed
+deps = pytest
+commands =
+ # NOTE: you can run any command line tool here - not just tests
+ pytest