"""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.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 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() image_uploadform = ImageUploadForm() pdf_uploadform = PdfUploadForm() if request.method == "POST": if borrowform.validate_on_submit(): editborrowedby(publicationID, borrowform.borrowed.data) fullpublication["Borrowed"] = borrowform.borrowed.data 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, image_uploadform=image_uploadform, pdf_uploadform=pdf_uploadform, ) @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)