|
|
|
"""This is the main flask library page"""
|
|
|
|
|
|
|
|
|
|
|
|
import datetime
|
|
|
|
import json
|
|
|
|
import os
|
|
|
|
|
|
|
|
import bcrypt
|
|
|
|
from flask import redirect, render_template, request, Blueprint
|
|
|
|
from flask_wtf.csrf import CSRFProtect
|
|
|
|
from icalendar import Calendar
|
|
|
|
from PIL import Image
|
|
|
|
from requests import get
|
|
|
|
from werkzeug.utils import secure_filename
|
|
|
|
|
|
|
|
from app import create_app
|
|
|
|
from application.csvparser import CsvParser
|
|
|
|
from forms.borrowform import BorrowForm
|
|
|
|
from forms.uploadform import PublicationForm
|
|
|
|
from search import search
|
|
|
|
|
|
|
|
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("/<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))
|
|
|
|
|
|
|
|
|
|
|
|
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)
|