Init commit
TODO: Collect form data, process data into latex renderables, generate unique id when submitting, styling, etc.
This commit is contained in:
commit
8a15cc524f
|
@ -0,0 +1,19 @@
|
||||||
|
venv/
|
||||||
|
|
||||||
|
*.pyc
|
||||||
|
__pycache__/
|
||||||
|
|
||||||
|
*.aux
|
||||||
|
*.log
|
||||||
|
*.pdf
|
||||||
|
|
||||||
|
instance/
|
||||||
|
outputs
|
||||||
|
|
||||||
|
.pytest_cache/
|
||||||
|
.coverage
|
||||||
|
htmlcov/
|
||||||
|
|
||||||
|
dist/
|
||||||
|
build/
|
||||||
|
*.egg-info/
|
|
@ -0,0 +1,44 @@
|
||||||
|
# Copyright Sage Vaillancourt 2021
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
from flask import (
|
||||||
|
Flask, redirect, url_for, render_template, send_from_directory
|
||||||
|
)
|
||||||
|
|
||||||
|
import subprocess
|
||||||
|
import time
|
||||||
|
|
||||||
|
from writing import writing_blueprint
|
||||||
|
from latty import generate
|
||||||
|
|
||||||
|
def create_app(test_config=None):
|
||||||
|
app = Flask(__name__, instance_relative_config=True)
|
||||||
|
app.config.from_mapping(
|
||||||
|
SECRET_KEY='dev',
|
||||||
|
DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite'),
|
||||||
|
)
|
||||||
|
|
||||||
|
if test_config is None:
|
||||||
|
app.config.from_pyfile('config.py', silent=True)
|
||||||
|
else:
|
||||||
|
app.config.from_mapping(test_config)
|
||||||
|
|
||||||
|
try:
|
||||||
|
os.makedirs(app.instance_path)
|
||||||
|
except OSError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
@app.route('/outputs/<unique>')
|
||||||
|
def output(unique):
|
||||||
|
root_dir = os.path.dirname(os.getcwd())
|
||||||
|
download = root_dir + '/undercover/outputs/'
|
||||||
|
generate(unique)
|
||||||
|
return send_from_directory(download, unique + ".pdf", as_attachment=True)
|
||||||
|
|
||||||
|
app.register_blueprint(
|
||||||
|
writing_blueprint,
|
||||||
|
#url_prefix='/writing',
|
||||||
|
)
|
||||||
|
|
||||||
|
return app
|
|
@ -0,0 +1,12 @@
|
||||||
|
{% macro render_field(field) %}
|
||||||
|
<dt>{{ field.label }}
|
||||||
|
<dd>{{ field(**kwargs)|safe }}
|
||||||
|
{% if field.errors %}
|
||||||
|
<ul class=errors>
|
||||||
|
{% for error in field.errors %}
|
||||||
|
<li>{{ error }}</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% endif %}
|
||||||
|
</dd>
|
||||||
|
{% endmacro %}
|
|
@ -0,0 +1,23 @@
|
||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>UnderCover: The secret cover letter generator</h1>
|
||||||
|
|
||||||
|
{% from "_formhelpers.html" import render_field %}
|
||||||
|
<form method=post>
|
||||||
|
<dl>
|
||||||
|
{{ render_field(form.username) }}
|
||||||
|
{{ render_field(form.company) }}
|
||||||
|
{{ render_field(form.jobandpronoun) }}
|
||||||
|
{{ render_field(form.skilltypes) }}
|
||||||
|
{{ render_field(form.myskills) }}
|
||||||
|
{{ render_field(form.body) }}
|
||||||
|
{{ render_field(form.closingtext) }}
|
||||||
|
</dl>
|
||||||
|
<p><input type=submit value="Submit"></p>
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
|
@ -0,0 +1,29 @@
|
||||||
|
# Copyright Sage Vaillancourt 2021
|
||||||
|
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
from dataclasses import dataClass
|
||||||
|
|
||||||
|
|
||||||
|
# latex /home/sage/Documents/latex/coverLetter/temp.tex'
|
||||||
|
# dvipdf /home/sage/Documents/latex/coverLetter/temp.dvi ~/Documents/SageVaillancourt_CoverLetter.pdf'
|
||||||
|
# rm -r /home/sage/Documents/latex/coverLetter/temp*'
|
||||||
|
# cp "$HOME/Documents/SageVaillancourt_CoverLetter.pdf" "$HOME/Documents/CoverLetters/.pdf"'
|
||||||
|
# qpdfview $HOME/Documents/SageVaillancourt_CoverLetter.pdf'
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class CLData():
|
||||||
|
username: str
|
||||||
|
company: str
|
||||||
|
jobandpronoun: str
|
||||||
|
skilltypes: str
|
||||||
|
myskills: str
|
||||||
|
closingtext: str
|
||||||
|
body: str
|
||||||
|
|
||||||
|
def generate(unique):
|
||||||
|
template_dir = os.path.dirname(os.getcwd()) + '/undercover/writing_templates'
|
||||||
|
base_tex = template_dir + '/base.tex'
|
||||||
|
com = "pdflatex -jobname=outputs/" + unique + " " + base_tex
|
||||||
|
subprocess.run(['bash', '-c', com])
|
||||||
|
return base_tex
|
|
@ -0,0 +1,76 @@
|
||||||
|
# Copyright Sage Vaillancourt 2021
|
||||||
|
|
||||||
|
from flask import (Blueprint, render_template, request)
|
||||||
|
from wtforms import Form, BooleanField, StringField, TextAreaField, validators
|
||||||
|
|
||||||
|
|
||||||
|
writing_blueprint = Blueprint('writing', __name__,)
|
||||||
|
|
||||||
|
default_defines = [
|
||||||
|
("username", "Sage"),
|
||||||
|
("company", "BananaCorp"),
|
||||||
|
("jobandpronoun", "Banana Stocker"),
|
||||||
|
("skilltypes", "practical"),
|
||||||
|
("myskills", "stocking"),
|
||||||
|
("closingtext", "I am looking forward to hearing from you"),
|
||||||
|
("body", """
|
||||||
|
My name is \\username. I would like to work as \\jobandpronoun with your
|
||||||
|
company. I think my knowledge of \\myskills will contribute well to your
|
||||||
|
team.
|
||||||
|
|
||||||
|
I am passionate about my work, and think we would work well together.
|
||||||
|
|
||||||
|
Thank you for your consideration."""),
|
||||||
|
]
|
||||||
|
|
||||||
|
class CLForm(Form):
|
||||||
|
username = StringField('Username',
|
||||||
|
[validators.Length(min=4, max=99)],
|
||||||
|
default="Sage Bongos"
|
||||||
|
)
|
||||||
|
company = StringField('Company',
|
||||||
|
[validators.Length(min=4, max=99)],
|
||||||
|
default="BananaCorp"
|
||||||
|
)
|
||||||
|
jobandpronoun = StringField('Job and Pronoun',
|
||||||
|
[validators.Length(min=4, max=99)],
|
||||||
|
default="Banana Stocker"
|
||||||
|
)
|
||||||
|
skilltypes = StringField('Skill Type',
|
||||||
|
[validators.Length(min=4, max=99)],
|
||||||
|
default="practical"
|
||||||
|
)
|
||||||
|
myskills = StringField('My Skills',
|
||||||
|
[validators.Length(min=4, max=99)],
|
||||||
|
default="stocking"
|
||||||
|
)
|
||||||
|
closingtext = StringField('Closing Text',
|
||||||
|
[validators.Length(min=4, max=99)],
|
||||||
|
default="I am looking forward to hearing from you"
|
||||||
|
)
|
||||||
|
body = TextAreaField('Body',
|
||||||
|
[validators.Length(min=4, max=9999)],
|
||||||
|
default="""
|
||||||
|
My name is \\username. I would like to work as \\jobandpronoun with your
|
||||||
|
company. I think my knowledge of \\myskills will contribute well to your
|
||||||
|
team.
|
||||||
|
|
||||||
|
I am passionate about my work, and think we would work well together.
|
||||||
|
|
||||||
|
Thank you for your consideration."""
|
||||||
|
)
|
||||||
|
|
||||||
|
@writing_blueprint.route('/', methods=('GET', 'POST'))
|
||||||
|
def index():
|
||||||
|
form = CLForm(request.form)
|
||||||
|
if request.method == 'POST' and form.validate():
|
||||||
|
username = form.username.data
|
||||||
|
return 'Thank ' + username
|
||||||
|
|
||||||
|
for define in default_defines:
|
||||||
|
print("\\def \\" + define[0] + " {xxx}")
|
||||||
|
return render_template('writing.html',
|
||||||
|
form=form,
|
||||||
|
unique="abcdef",
|
||||||
|
defines=default_defines
|
||||||
|
)
|
|
@ -0,0 +1,34 @@
|
||||||
|
|
||||||
|
\def \username {Sage Vaillancourt}
|
||||||
|
\def \thecompany {BananCorp}
|
||||||
|
\def \jobandpronoun {PusherBoy }
|
||||||
|
\def \skilltypes {broad, practical }
|
||||||
|
\def \myskills {software design principles }
|
||||||
|
\def \closingtext {I am looking forward to hearing from you}
|
||||||
|
|
||||||
|
\def \body {
|
||||||
|
My name is \username. I would like to work as \jobandpronoun with your
|
||||||
|
company. I think my knowledge of \myskills will contribute well to your
|
||||||
|
team.
|
||||||
|
|
||||||
|
I am passionate about my work, and think we would work well together.
|
||||||
|
|
||||||
|
Thank you for your consideration.
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
\documentclass[12pt]{letter}
|
||||||
|
\signature{\username}
|
||||||
|
|
||||||
|
\longindentation=0pt
|
||||||
|
\begin{document}
|
||||||
|
\begin{letter}{}
|
||||||
|
|
||||||
|
\opening{Dear \thecompany,}
|
||||||
|
|
||||||
|
\body
|
||||||
|
|
||||||
|
\closing{\closingtext,}
|
||||||
|
|
||||||
|
\end{letter}
|
||||||
|
\end{document}
|
|
@ -0,0 +1,48 @@
|
||||||
|
|
||||||
|
\def \thecompany {BananCorp}
|
||||||
|
\def \jobandpronoun {PusherBoy }
|
||||||
|
\def \skilltypes {broad, practical }
|
||||||
|
\def \myskills {software design principles}
|
||||||
|
% CoverLetter.tex - Create a cover letter using an included vars.tex
|
||||||
|
|
||||||
|
% \def \username {Sage Vaillancourt}
|
||||||
|
% \def \thecompany {Travelers}
|
||||||
|
% \def \jobandpronoun {a Software Engineer }
|
||||||
|
% \def \skilltypes {broad, practical }
|
||||||
|
% \def \myskills {computer systems}
|
||||||
|
|
||||||
|
\include{vars}
|
||||||
|
|
||||||
|
\documentclass[12pt]{letter}
|
||||||
|
\signature{Sage Vaillancourt}
|
||||||
|
|
||||||
|
\longindentation=0pt
|
||||||
|
\begin{document}
|
||||||
|
\begin{letter}{}
|
||||||
|
|
||||||
|
\opening{Dear \thecompany,}
|
||||||
|
|
||||||
|
My name is Sage Vaillancourt. I'm excited for the opportunity to work as
|
||||||
|
\jobandpronoun with your company. It's clear that you're looking for a hard worker who
|
||||||
|
has a \skilltypes knowledge of \myskills, so I'm certain that I'd be a
|
||||||
|
perfect fit to work with you.
|
||||||
|
|
||||||
|
I am someone who has been passionate about computers my whole life, and I have
|
||||||
|
spent a substantial amount of my own time working to make them better. I've
|
||||||
|
endeavored to learn about programming, hardware, and networking, as well as
|
||||||
|
running Linux on my own machines, and helping others with theirs. With this
|
||||||
|
knowledge, I’m more than capable of solving my own problems on the job, and I
|
||||||
|
pride myself on an ability to work quickly and calmly through difficult
|
||||||
|
situations. I hope I can further utilize these skills with your company.
|
||||||
|
|
||||||
|
After looking over my resume, I hope that you will find me to be the type
|
||||||
|
of person you're looking for. I would be happy to elaborate on any of my
|
||||||
|
information or provide some references if it would be useful to you. I can be
|
||||||
|
contacted by phone at (850) 405-7164 or via email at sagev9000@tutanota.com.
|
||||||
|
|
||||||
|
Thank you for your consideration.
|
||||||
|
|
||||||
|
\closing{I look forward to hearing from you,}
|
||||||
|
|
||||||
|
\end{letter}
|
||||||
|
\end{document}
|
Loading…
Reference in New Issue