"""This is the main flask library page""" import datetime import json import os from datetime import timedelta import bcrypt from flask import ( Blueprint, redirect, render_template, request, session, url_for, ) from flask_login import current_user, login_required, logout_user from flask_wtf.csrf import CSRFError, CSRFProtect 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 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 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", 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""" publicationform = PublicationForm() if request.method == "POST": if publicationform.validate_on_submit(): id = csvparser.writepublication(publicationform) saveimage(publicationform.image.data, id) return redirect(str(id), code=303) else: return render_template("upload.html", publicationform=publicationform) return render_template("upload.html", publicationform=publicationform) @APP.route("/", 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(): 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/", 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.confmailig["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() @APP.route("/resetpassword/", 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)