UnderCover/undercover/pdf_builder.py

109 lines
3.1 KiB
Python
Raw Normal View History

# Copyright Sage Vaillancourt 2021
import os
import subprocess
2021-07-23 23:09:08 -04:00
from dataclasses import dataclass
from flask import send_from_directory, Response
def get_unique():
import uuid
unique = str(uuid.uuid1().hex)
return unique
2022-09-22 15:43:36 -04:00
def get_datetime():
from datetime import datetime
now = datetime.now()
return now.strftime("%Y-%m-%d %H:%M:%S")
2022-09-22 15:43:36 -04:00
2021-07-29 22:15:07 -04:00
root_dir = os.path.dirname(os.getcwd())
proj_dir = root_dir + '/undercover/'
output_dir = proj_dir + 'outputs/'
base_tex_text = open(proj_dir + "/letter_templates/base.tex", "r").read()
2021-07-29 22:15:07 -04:00
2022-09-22 15:43:36 -04:00
@dataclass
class CLData:
selectedLetter: int # Metadata
username: str
company: str
jobAndPronoun: str
skillTypes: str
mySkills: str
closingText: str
body: str
2021-07-24 01:08:18 -04:00
def get_pairs(self):
return [
2021-07-24 01:08:18 -04:00
("username", self.username),
("company", self.company),
("jobAndPronoun", self.jobAndPronoun),
("skillTypes", self.skillTypes),
("mySkills", self.mySkills),
("closingText", self.closingText),
2021-07-24 01:08:18 -04:00
("body", self.body),
]
def generate_pdf(self) -> Response:
"""
:return: Response when successful
:raise ValueError: e.args[0] is a list of error strings, if generation fails
"""
import threading
unique_id = get_unique()
unique_file = output_dir + unique_id + ".tex"
f = open(unique_file, "w")
for pair in self.get_pairs():
f.write("\\def \\" + pair[0] + "{" + pair[1] + "}\n")
2021-07-29 22:15:07 -04:00
f.write(base_tex_text)
f.close()
2021-07-23 23:09:08 -04:00
output_arg = "-jobname=outputs/" + unique_id + " " + unique_file
2021-07-27 23:39:30 -04:00
com = "pdflatex -halt-on-error " + output_arg
build_text = "[" + get_datetime() + "] Building for " + unique_id + " "
result = subprocess.run(
['bash', '-c', com],
stdout=subprocess.PIPE,
text=True
)
2021-07-27 23:39:30 -04:00
if result.returncode == 0:
print(build_text + "[SUCCESS]")
compress_com = "gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.5 -dNOPAUSE -dQUIET -dBATCH -dPrinted=false -sOutputFile=outputs/" + unique_id + ".compressed.pdf outputs/" + unique_id + ".pdf"
result = subprocess.run(
['bash', '-c', compress_com],
stdout=subprocess.PIPE,
text=True
)
2021-07-23 23:09:08 -04:00
threading.Timer(60 * 5, cleanup, [output_dir + unique_id]).start()
output_file = unique_id
if result.returncode == 0:
output_file += ".compressed.pdf"
else:
output_file += ".pdf"
return send_from_directory(
output_dir,
output_file,
download_name=self.username.replace(" ", "") + "_CoverLetter.pdf",
as_attachment=True
)
2021-07-27 23:39:30 -04:00
else:
print(build_text + "[FAIL]")
# Collect output but delete boilerplate text
errors = list(map(str.strip, result.stdout.split("\n")))
2021-07-27 23:39:30 -04:00
del errors[:13]
del errors[-2:]
raise ValueError(errors)
2022-09-22 15:43:36 -04:00
def cleanup(unique):
subprocess.run(['bash', '-c', "rm " + unique + ".*"])