From a4986a2e845b776f074bc6b9af3ae1b2d9f1ff6c Mon Sep 17 00:00:00 2001 From: crunk Date: Sat, 17 Apr 2021 23:34:28 +0200 Subject: [PATCH] added photo upload functionality but this is a work in progress --- library/csvparser/csvparser.py | 6 ++++-- library/csvparser/varlib.csv | 1 + library/page.py | 11 ++++++++++- library/static/css/upload.css | 12 ++++++++++++ library/static/images/image-64.jpg | Bin 0 -> 37058 bytes library/templates/upload.html | 12 ++++++++++-- library/uploadform.py | 7 ++++++- 7 files changed, 43 insertions(+), 6 deletions(-) create mode 100644 library/static/images/image-64.jpg diff --git a/library/csvparser/csvparser.py b/library/csvparser/csvparser.py index 4f6d81b..db93946 100644 --- a/library/csvparser/csvparser.py +++ b/library/csvparser/csvparser.py @@ -54,8 +54,10 @@ def getpublications(): def hasimage(id): - image_file = os.path.join(image_dir, "image-{0}.jpg".format(id)) - if os.path.exists(image_file): + image_jpg = os.path.join(image_dir, "image-{0}.jpg".format(id)) + image_png = os.path.join(image_dir, "image-{0}.png".format(id)) + image_gif = os.path.join(image_dir, "image-{0}.gif".format(id)) + if os.path.exists(image_jpg): return True else: return False diff --git a/library/csvparser/varlib.csv b/library/csvparser/varlib.csv index fee5f51..b140e3c 100644 --- a/library/csvparser/varlib.csv +++ b/library/csvparser/varlib.csv @@ -53,3 +53,4 @@ Id,Publication,Author,Year,Custodian,Fields,Type,Publishers,License,LicenseShort 61,Mots de la cage aux ours - woorden uit de berenkuil,Constant,2012,Varia,"words, language, Bruxelles",Softcover,Constant,Copyleft,Copyleft,,, 62,Snake rituals and switching circuits,Florian Cramer,2009,Danny,"mass communication, personal communication, new media",paperback,Piet Zwart Institute,Creative Commons Attribution-Share Alike 3.0,Creative Commons,The function of a medium is ultimately decided by its users and not by its creators,, 63,Magium issue 1: On Eating in isolation,Alice Strete,2020,Varia,"food, sharing, personal stories, consumption",zine,Self Published,Free Art License,Free Art License,,,No one +64,Networks of One's Own: three takes on taking care,"Varia, Constant and Colm O’Neill",2019,Varia,"Software, internet, taking care, homebrew",paperback,Varia,Copyleft,Copyleft,,Networks Of One’s Own is a periodic para-nodal1 publication that is itself collectively within a network2., diff --git a/library/page.py b/library/page.py index 09c5468..ff7220d 100644 --- a/library/page.py +++ b/library/page.py @@ -1,6 +1,7 @@ """This is the main flask library page""" +import os import flask from requests import get from icalendar import Calendar @@ -11,6 +12,8 @@ from flask import ( redirect, request, ) +from flask_wtf.csrf import CSRFProtect +from werkzeug.utils import secure_filename from rnrfeed.rnrfeeder import getevents, getlatestevent from uploadform import PublicationForm from borrowform import BorrowForm @@ -23,7 +26,7 @@ from csvparser.csvparser import ( writepublication, editborrowedby, ) -from flask_wtf.csrf import CSRFProtect + csrf = CSRFProtect() @@ -56,6 +59,7 @@ def upload(): if (uploadform.validate_on_submit() and checksecret(uploadform.secret.data)): id = writepublication(uploadform) + saveimage(uploadform.image.data, id) return redirect(str(id), code=303) else: return render_template("upload.html", uploadform=uploadform) @@ -120,6 +124,11 @@ def upcoming_or_latest(): return dict(upcoming=upcoming) +def saveimage(image, id): + print(image.filename) + filename = secure_filename("image-{0}.jpg".format(id)) + image.save(os.path.join("static/images/", filename)) + def checksecret(secret): with open("secret") as f: diff --git a/library/static/css/upload.css b/library/static/css/upload.css index 1e271c9..4a1af5d 100644 --- a/library/static/css/upload.css +++ b/library/static/css/upload.css @@ -28,6 +28,18 @@ input[type=text], select { box-sizing: border-box; } +input[type="file"] { + width: 100%; + background-color: #F1F1F1; + z-index: -1; + border: none; + margin: 1em 0; + font-size: 17px; + color: black; + cursor: pointer; +} + + input[type=submit] { background-color: #DD4F77; text-align: right; diff --git a/library/static/images/image-64.jpg b/library/static/images/image-64.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eb524019268afbef604f6cb1fd03752eba8920bb GIT binary patch literal 37058 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 HRFD7J^o$JD literal 0 HcmV?d00001 diff --git a/library/templates/upload.html b/library/templates/upload.html index 4a040f9..83c4bfd 100644 --- a/library/templates/upload.html +++ b/library/templates/upload.html @@ -15,7 +15,7 @@ {% endfor %}

Upload a new book

-
+ {{ uploadform.csrf_token }}
{{ uploadform.uploadpublication.label }} @@ -89,7 +89,15 @@ {{ uploadform.borrowed }}
-
+
+ {{ uploadform.image.label }} + {{ uploadform.image }} + {% for message in uploadform.image.errors %} +
{{ message }}
+ {% endfor %} +
+ +
{{ uploadform.secret.label }} {{ uploadform.secret }} {% for message in uploadform.secret.errors %} diff --git a/library/uploadform.py b/library/uploadform.py index 9397318..d1b7686 100644 --- a/library/uploadform.py +++ b/library/uploadform.py @@ -1,5 +1,8 @@ """Form object declaration.""" from flask_wtf import FlaskForm +from flask_wtf.file import FileField, FileAllowed +from werkzeug.utils import secure_filename +from wtforms import validators from wtforms import ( StringField, IntegerField, @@ -7,7 +10,6 @@ from wtforms import ( RadioField, SubmitField, ) -from wtforms import validators from wtforms.validators import ( Length, NumberRange, @@ -77,6 +79,9 @@ class PublicationForm(FlaskForm): highlights = TextField("Highlights from the publication:") comments = TextField("Comments on the publication:") borrowed = StringField("Currently borrowed by:") + image = FileField('Image of the book:', validators=[ + FileAllowed(['jpg', 'png', 'gif'], 'Images only!') + ]) secret = StringField( "Librarians secret:", [