You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
174 lines
5.2 KiB
174 lines
5.2 KiB
import os
|
|
import random
|
|
import shutil
|
|
import string
|
|
import subprocess
|
|
from pathlib import Path
|
|
|
|
import petname
|
|
from flask import Flask, flash, redirect, render_template, request, url_for
|
|
from flask_wtf import FlaskForm
|
|
from flask_wtf.csrf import CSRFProtect
|
|
from flask_wtf.file import FileAllowed, FileField, FileRequired
|
|
from temp_index import make_cards
|
|
from werkzeug.utils import secure_filename
|
|
from wtforms import HiddenField, RadioField, StringField
|
|
from wtforms.validators import DataRequired
|
|
|
|
|
|
def rand(length=30):
|
|
"""Generated random secret."""
|
|
return "".join(random.choices(string.ascii_uppercase + string.digits, k=length))
|
|
|
|
|
|
app = Flask(__name__)
|
|
app.config["SECRET_KEY"] = os.environ.get("SECRET_KEY", rand())
|
|
app.config["WTF_CSRF_SECRET_KEY"] = os.environ.get("WTF_CSRF_SECRET_KEY", rand())
|
|
|
|
|
|
CWD = Path().resolve()
|
|
|
|
|
|
class UploadForm(FlaskForm):
|
|
metadata = FileField(
|
|
"Metadata file",
|
|
validators=[FileAllowed(["db"], "Metadata databases only")],
|
|
)
|
|
title = RadioField(
|
|
"Title", choices=[("side a", "side a"), ("side b", "side b")], default="side a"
|
|
)
|
|
authors = RadioField(
|
|
"Authors",
|
|
choices=[("side a", "side a"), ("side b", "side b")],
|
|
default="side a",
|
|
)
|
|
comments = RadioField(
|
|
"Comments",
|
|
choices=[("side a", "side a"), ("side b", "side b")],
|
|
default="side a",
|
|
)
|
|
timestamp = RadioField(
|
|
"Timestamp",
|
|
choices=[("side a", "side a"), ("side b", "side b")],
|
|
default="side a",
|
|
)
|
|
tags = RadioField(
|
|
"Tags", choices=[("side a", "side a"), ("side b", "side b")], default="side b"
|
|
)
|
|
petname = HiddenField("petname")
|
|
|
|
|
|
def impose_cards(fpath):
|
|
"""Impose the cards with pdfcpu."""
|
|
if shutil.which("pdfcpu"):
|
|
old_fpath = "{}.old.pdf".format(fpath)
|
|
shutil.move(fpath, old_fpath)
|
|
cmd = 'pdfcpu booklet -- "p:A4, border:on" {} 4 {}'.format(fpath, old_fpath)
|
|
subprocess.run(cmd, shell=True)
|
|
|
|
|
|
@app.route("/")
|
|
def home():
|
|
upload_form = UploadForm()
|
|
pname = petname.generate()
|
|
pname_msg = "Index of/~{}".format(pname)
|
|
# pname_msg = "You are now {}".format(pname)
|
|
return render_template(
|
|
"index.html",
|
|
upload_form=upload_form,
|
|
petname=pname,
|
|
petname_message=pname_msg,
|
|
)
|
|
|
|
@app.route("/about")
|
|
def about():
|
|
return render_template(
|
|
"about.html",
|
|
)
|
|
|
|
@app.route("/upload", methods=["POST"])
|
|
def upload():
|
|
upload_form = UploadForm()
|
|
|
|
if upload_form.validate_on_submit():
|
|
if not upload_form.metadata.data:
|
|
pname = upload_form.petname.data
|
|
metadata_name = "metadata-{}.db".format(pname)
|
|
if not Path(os.path.join(CWD, "metadatum", metadata_name)).exists():
|
|
flash("Oops, you forgot to upload a metadata file...")
|
|
# pname_msg = "You are still {}".format(pname)
|
|
pname_msg = "Index of/~{}".format(pname)
|
|
|
|
return render_template(
|
|
"index.html",
|
|
upload_form=upload_form,
|
|
petname_message=pname_msg,
|
|
petname=pname,
|
|
)
|
|
|
|
pname = upload_form.petname.data
|
|
# pname_msg = "You are still {}".format(pname)
|
|
pname_msg = "Index of/~{}".format(pname)
|
|
|
|
|
|
metadata_name = "metadata-{}.db".format(pname)
|
|
if upload_form.metadata.data:
|
|
f = upload_form.metadata.data
|
|
f.save(os.path.join(CWD, "metadatum", metadata_name))
|
|
|
|
pdf_name = "index-{}.pdf".format(pname)
|
|
# pdf_view = "{}.pdf#view=FitH".join(pname)
|
|
pdf_path = os.path.join(CWD, "static", "generated", pdf_name)
|
|
metadata_conn = "sqlite:///{}".format(
|
|
os.path.join(CWD, "metadatum", metadata_name)
|
|
)
|
|
|
|
fields = ["title", "authors", "comments", "timestamp", "tags"]
|
|
side_a = [
|
|
field
|
|
for field in upload_form.data.keys()
|
|
if field in fields and upload_form.data[field] == "side a"
|
|
]
|
|
side_b = [
|
|
field
|
|
for field in upload_form.data.keys()
|
|
if field in fields and upload_form.data[field] == "side b"
|
|
]
|
|
|
|
make_cards(
|
|
pdf_path,
|
|
metadata_conn,
|
|
side_a,
|
|
side_b,
|
|
)
|
|
|
|
impose_cards(pdf_path)
|
|
|
|
gen_msg = (
|
|
"Currently working on {}, click 'generate' to re-generate the same PDF"
|
|
).format(pdf_name)
|
|
pdf_url = url_for("static", filename="generated/{}".format(pdf_name))
|
|
|
|
return render_template(
|
|
"index.html",
|
|
upload_form=upload_form,
|
|
pdf=pdf_url,
|
|
petname=pname,
|
|
petname_message=pname_msg,
|
|
generation_message=gen_msg,
|
|
)
|
|
else:
|
|
pname = upload_form.petname.data
|
|
pname_msg = "You are still {}".format(pname)
|
|
return render_template(
|
|
"index.html",
|
|
upload_form=upload_form,
|
|
petname_message=pname_msg,
|
|
petname=pname,
|
|
)
|
|
|
|
pname = petname.generate()
|
|
pname_msg = "You have become {}".format(pname)
|
|
return render_template(
|
|
"index.html", upload_form=upload_form, petname_message=pname_msg, petname=pname
|
|
)
|
|
|