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

+

+ +

+ +

+ Build Status + Python Version + Code Climate + Code Climate + Code style: black + docs + +

+

Portal for Reissuing Library Books

demo_image @@ -21,14 +38,14 @@ Steps details_entered * The user receives a One Time Password (OTP) on his/her mobile number to access the portal - -otp_entered - -(OTP RECEIVED) -otp_entered - +otp_entered + +(OTP RECEIVED) + +otp_entered + (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