csv-library-website/library/page.py

179 lines
5.2 KiB
Python
Raw Normal View History

"""This is the main flask library page"""
2021-02-14 22:11:58 +01:00
import datetime
2023-07-14 21:16:30 +02:00
import json
import os
from datetime import timedelta
import bcrypt
from flask import (
Blueprint,
redirect,
render_template,
request,
session,
url_for,
2023-12-03 15:32:54 +01:00
)
from flask_login import current_user, login_required, logout_user
from flask_wtf.csrf import CSRFError, CSRFProtect
2023-12-03 14:19:53 +01:00
from icalendar import Calendar
from PIL import Image
from requests import get
from werkzeug.utils import secure_filename
from app import create_app, login_manager
from application.search import search
from application.csvparser import CsvParser
from application.forms.borrowform import BorrowForm
2024-03-31 12:25:53 +02:00
from application.forms.image_uploadform import ImageUploadForm
from application.forms.pdf_uploadform import PdfUploadForm
from application.forms.publicationform import PublicationForm
from application.models.usermodel import User
from application.user.forgotpassword import ForgotPassword
from application.user.loginuser import LoginUser
from application.user.registeruser import RegisterUser
from application.user.resetpassword import ResetPassword
2024-03-30 12:00:47 +01:00
APP = create_app()
csrf = CSRFProtect()
csrf.init_app(APP)
2023-11-29 23:40:12 +01:00
files = Blueprint("files", __name__, static_folder="files")
APP.register_blueprint(files)
2023-11-29 23:07:19 +01:00
csvparser = CsvParser(
APP.config["LIBRARY_FILENAME"], APP.config["IMAGE_FOLDER"]
)
2023-12-01 15:58:33 +01:00
2023-12-03 15:32:54 +01:00
@APP.before_request
def session_handler():
session.permanent = True
APP.permanent_session_lifetime = timedelta(minutes=30)
@APP.route("/")
def index():
"""Main route, shows all the books and you can filter them
2023-11-26 18:38:33 +01:00
based on year, type"""
2023-11-26 17:52:21 +01:00
pubtypes = csvparser.gettypes()
pubyears = csvparser.getyears()
publicenses = csvparser.getlicenses()
publicatons = csvparser.getpublications()
2020-12-21 18:58:46 +01:00
template = render_template(
"index.html",
publications=publicatons,
pubtypes=pubtypes,
pubyears=pubyears,
publicenses=publicenses,
2020-12-21 18:58:46 +01:00
)
return template
2021-04-05 21:42:43 +02:00
@APP.route("/upload", methods=["GET", "POST"])
2023-12-03 15:32:54 +01:00
@login_required
def upload():
"""Upload route, a page to upload a book to the csv"""
publicationform = PublicationForm()
if request.method == "POST":
if publicationform.validate_on_submit():
id = csvparser.writepublication(publicationform)
saveimage(publicationform.image.data, id)
2021-04-05 21:42:43 +02:00
return redirect(str(id), code=303)
else:
return render_template("upload.html", publicationform=publicationform)
return render_template("upload.html", publicationform=publicationform)
@APP.route("/<publicationID>", methods=["GET", "POST"])
def show_book(publicationID):
"""route for a single publication, shows full info and allows borrowing"""
2023-11-29 23:07:19 +01:00
fullpublication = csvparser.getfullpublication(publicationID)
borrowform = BorrowForm()
2024-03-31 12:25:53 +02:00
image_uploadform = ImageUploadForm()
pdf_uploadform = PdfUploadForm()
if request.method == "POST":
2024-03-30 18:22:53 +01:00
if borrowform.validate_on_submit():
editborrowedby(publicationID, borrowform.borrowed.data)
fullpublication["Borrowed"] = borrowform.borrowed.data
2024-03-31 12:25:53 +02:00
if image_uploadform.validate_on_submit():
saveimage(image_uploadform.image.data, fullpublication.id)
# return a full publication with or without form errors
return render_template(
"publication.html",
fullpublication=fullpublication,
publicationID=publicationID,
borrowform=borrowform,
2024-03-31 12:25:53 +02:00
image_uploadform=image_uploadform,
pdf_uploadform=pdf_uploadform,
)
2023-07-14 21:16:30 +02:00
@APP.route("/search/<search_query>", methods=["GET"])
def searchbooks(search_query):
print(f"Searched for {search_query}")
search_results = search(search_query)
return json.dumps(search_results)
def saveimage(image, id):
"""helper function that can save images"""
image.save(os.path.join(APP.config["UPLOAD_FOLDER"], image.filename))
2021-04-18 11:00:11 +02:00
orig_image = Image.open(
2024-03-30 18:09:04 +01:00
os.path.join(APP.confmailig["UPLOAD_FOLDER"], image.filename)
)
2021-04-18 11:00:11 +02:00
new_width = 640
new_height = int(new_width * orig_image.height / orig_image.width)
resized_image = orig_image.resize((new_width, new_height), Image.ANTIALIAS)
filename = secure_filename("image-{0}.jpg".format(id))
resized_image.save(os.path.join("static/images/", filename), "JPEG")
os.remove(os.path.join(APP.config["UPLOAD_FOLDER"], image.filename))
2021-02-14 22:11:58 +01:00
2023-12-03 15:32:54 +01:00
@APP.route("/logout")
@login_required
def logout():
logout_user()
return redirect(url_for("index"))
@APP.route("/login", methods=["GET", "POST"])
def login():
return LoginUser()
@APP.route("/register", methods=["GET", "POST"])
def register():
return RegisterUser()
@APP.route("/forgotpassword", methods=["GET", "POST"])
def forgotpassword():
2024-03-30 18:09:04 +01:00
return ForgotPassword()
2023-12-03 15:32:54 +01:00
@APP.route("/resetpassword/<path>", methods=["GET", "POST"])
def resetpassword(path):
return ResetPassword(path)
@APP.errorhandler(CSRFError)
def handle_csrf_error(e):
return render_template("csrf_error.html", reason=e.description), 400
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
@APP.errorhandler(CSRFError)
def handle_csrf_error(e):
return render_template("csrf_error.html", reason=e.description), 400
if __name__ == "__main__":
APP.debug = True
APP.run(port=5000)