"""This is the main flask library page""" import datetime import json import os import bcrypt from app import create_app from application.csvparser import CsvParser from flask import Blueprint, redirect, render_template, request from flask_wtf.csrf import CSRFProtect 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.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"]) def upload(): """Upload route, a page to upload a book to the csv""" uploadform = PublicationForm() if request.method == "POST": if uploadform.validate_on_submit() and checksecret( uploadform.secret.data ): 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("/", 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/", 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)) def checksecret(secret): """small simple check to a secret, library group members can upload""" with open("secret") as f: secrethash = f.readline().rstrip() if bcrypt.checkpw(secret.encode("utf-8"), secrethash.encode("utf-8")): return True else: return False if __name__ == "__main__": APP.debug = True APP.run(port=5000)