178 lines
5.0 KiB
Python
178 lines
5.0 KiB
Python
"""This is the main flask library page"""
|
|
|
|
|
|
from datetime import timedelta
|
|
import datetime
|
|
import json
|
|
import os
|
|
|
|
import bcrypt
|
|
from app import create_app, login_manager
|
|
from application.csvparser import CsvParser
|
|
from application.user.loginuser import LoginUser
|
|
from application.user.registeruser import RegisterUser
|
|
from application.user.forgotpassword import ForgotPassword
|
|
from application.user.resetpassword import ResetPassword
|
|
|
|
from flask import Blueprint, redirect, render_template, request, session
|
|
from flask_wtf.csrf import CSRFProtect, CSRFError
|
|
from flask_login import (
|
|
logout_user,
|
|
login_required,
|
|
current_user,
|
|
)
|
|
from forms.borrowform import BorrowForm
|
|
from forms.uploadform import PublicationForm
|
|
from icalendar import Calendar
|
|
from PIL import Image
|
|
from requests import get
|
|
from search import search
|
|
from werkzeug.utils import secure_filename
|
|
|
|
|
|
|
|
APP = create_app()
|
|
csrf = CSRFProtect()
|
|
csrf.init_app(APP)
|
|
files = Blueprint("files", __name__, static_folder="files")
|
|
APP.register_blueprint(files)
|
|
csvparser = CsvParser(
|
|
APP.config["LIBRARY_FILENAME"], APP.config["IMAGE_FOLDER"]
|
|
)
|
|
|
|
|
|
@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
|
|
based on year, type"""
|
|
pubtypes = csvparser.gettypes()
|
|
pubyears = csvparser.getyears()
|
|
publicenses = csvparser.getlicenses()
|
|
publicatons = csvparser.getpublications()
|
|
template = render_template(
|
|
"index.html",
|
|
title=APP.config["TITLE"],
|
|
publications=publicatons,
|
|
pubtypes=pubtypes,
|
|
pubyears=pubyears,
|
|
publicenses=publicenses,
|
|
)
|
|
return template
|
|
|
|
|
|
@APP.route("/upload", methods=["GET", "POST"])
|
|
@login_required
|
|
def upload():
|
|
"""Upload route, a page to upload a book to the csv"""
|
|
uploadform = PublicationForm()
|
|
if request.method == "POST":
|
|
if uploadform.validate_on_submit():
|
|
id = csvparser.writepublication(uploadform)
|
|
saveimage(uploadform.image.data, id)
|
|
return redirect(str(id), code=303)
|
|
else:
|
|
return render_template("upload.html", uploadform=uploadform)
|
|
return render_template(
|
|
"upload.html", title=APP.config["TITLE"], uploadform=uploadform
|
|
)
|
|
|
|
|
|
@APP.route("/<publicationID>", methods=["GET", "POST"])
|
|
def show_book(publicationID):
|
|
"""route for a single publication, shows full info and allows borrowing"""
|
|
fullpublication = csvparser.getfullpublication(publicationID)
|
|
borrowform = BorrowForm()
|
|
if request.method == "POST":
|
|
if borrowform.validate_on_submit() and checksecret(
|
|
borrowform.secret.data
|
|
):
|
|
editborrowedby(publicationID, borrowform.borrowed.data)
|
|
fullpublication["Borrowed"] = borrowform.borrowed.data
|
|
return render_template(
|
|
"publication.html",
|
|
fullpublication=fullpublication,
|
|
publicationID=publicationID,
|
|
borrowform=borrowform,
|
|
)
|
|
# return a full publication with or without form errors
|
|
return render_template(
|
|
"publication.html",
|
|
fullpublication=fullpublication,
|
|
publicationID=publicationID,
|
|
borrowform=borrowform,
|
|
)
|
|
|
|
|
|
@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))
|
|
orig_image = Image.open(
|
|
os.path.join(APP.config["UPLOAD_FOLDER"], image.filename)
|
|
)
|
|
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))
|
|
|
|
|
|
@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():
|
|
return ForgotPassword(mail)
|
|
|
|
|
|
@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)
|