# Copyright Sage Vaillancourt 2021 import os import subprocess import threading import urllib.parse from flask import (Blueprint, render_template, request, make_response, session, redirect) from wtforms import Form, StringField, TextAreaField, validators import undercover.db as db from undercover.pdf_builder import CLData writing_blueprint = Blueprint('writing', __name__,) class CLForm(Form): username = StringField( 'Username:', [validators.Length(min=4, max=99)], default="Sage" ) company = StringField( 'Company:', [validators.Length(min=2, max=99)], default="BananaCorp" ) jobAndPronoun = StringField( 'Job and Pronoun (a/an):', [validators.Length(min=4, max=99)], default="a banana stocker" ) skillTypes = StringField( 'Skill Type:', [validators.Length(min=2, max=99)], default="practical" ) mySkills = StringField( 'My Skills:', [validators.Length(min=2, max=99)], default="stocking bananas" ) closingText = TextAreaField( 'Closing Text:', [validators.Length(min=2, max=99)], default="I look forward to hearing from you" ) body = TextAreaField( 'Body:', [validators.Length(min=4, max=9999)], default=( "My name is {\\username}. I'm excited for the opportunity to work as " "{\\jobAndPronoun} with your company. I think my {\\skillTypes} knowledge " "of {\\mySkills} could contribute well to your team.\n\n" "I am passionate about what I do, and I think we would work well together.\n\n" "Thank you for your consideration." ) ) @writing_blueprint.route('/login', methods=['POST', 'GET']) def login(): if request.method == 'POST': username = request.form['username'] if db.login(username, request.form['password']): session['username'] = username return redirect('/') return make_response("", 401) return '''
''' @writing_blueprint.route('/logout', methods=['POST', 'GET']) def logout(): session.pop('username', None) return redirect('/') @writing_blueprint.route('/', methods=['GET']) def index_get(): return render_template( 'writing.jinja2', form=CLForm(), username=session.get('username') ) @writing_blueprint.route('/dbtest', methods=['GET']) def db_test_get(): response = make_response(db.get_user_letters(1)[0].contents, 200) response.mimetype = "text/plain" return response @writing_blueprint.route('/update', methods=['POST']) def update_get(): if os.environ['GITLAB_HOOK_TOKEN'] == request.headers['X-Gitlab-Token'] and request.headers['X-Gitlab-Event'] == "Push Hook": print("Update notification received.") response = make_response("", 200) response.mimetype = "text/plain" threading.Timer(5, git_update, []).start() return response else: return make_response("", 404) def git_update(): script = os.environ['UPDATE_SCRIPT_PATH'] if not script: return subprocess.run(['bash', '-c', "test -f " + script + " && " + script]) @writing_blueprint.route('/', methods=['POST']) def index_post(): form = CLForm(request.form) if form.validate(): data = CLData( username=form.username.data, company=form.company.data, jobAndPronoun=form.jobAndPronoun.data, skillTypes=form.skillTypes.data, mySkills=form.mySkills.data, closingText=form.closingText.data, body=form.body.data, ) (resp, errors) = data.generate_pdf() if errors: resp = make_response(render_template( 'writing.jinja2', form=form, errors=errors, )) # Save entered data as cookies on user's machine for pair in data.get_pairs(): resp.set_cookie(pair[0], urllib.parse.quote(pair[1])) return resp return render_template( 'writing.jinja2', form=form, )