def render(): exam = json.loads(request.form["exam"]) with render_latex(exam) as pdf: response = make_response(pdf) response.headers["Content-Type"] = "application/pdf" response.headers["Content-Disposition"] = "inline; filename=exam.pdf" return response
def compile_all(exam, subtitle, out, do_twice, email, exam_type, semester, deadline): """ Compile individualized PDFs for the specified exam. Exam must have been deployed first. """ if not out: out = "out/latex/" + exam pathlib.Path(out).mkdir(parents=True, exist_ok=True) exam_data = get_exam(exam=exam) password = exam_data.pop("secret")[:-1] print(password) exam_str = json.dumps(exam_data) roster = get_roster(exam=exam) if email: roster = [line_info for line_info in roster if line_info[0] == email] if len(roster) == 0: if deadline: roster = [(email, deadline)] else: raise ValueError("Email does not exist in the roster!") for email, deadline in roster: if not deadline: continue exam_data = json.loads(exam_str) scramble(email, exam_data) deadline_utc = datetime.utcfromtimestamp(int(deadline)) deadline_pst = pytz.utc.localize(deadline_utc).astimezone( pytz.timezone("America/Los_Angeles")) deadline_string = deadline_pst.strftime("%I:%M%p") with render_latex( exam_data, { "emailaddress": sanitize_email(email), "deadline": deadline_string, "coursecode": prettify(exam.split("-")[0]), "description": subtitle, "examtype": exam_type, "semester": semester, }, do_twice=do_twice, ) as pdf: pdf = Pdf.open(BytesIO(pdf)) pdf.save( os.path.join( out, "exam_" + email.replace("@", "_").replace(".", "_") + ".pdf"), encryption=Encryption(owner=password, user=password), ) pdf.close()
def compile(exam, json, md, seed, json_out, out): """ Compile one PDF or JSON (from Markdown), unencrypted. The exam may be deployed or local (in Markdown or JSON). If a seed is specified, it will scramble the exam. """ if not out: out = "" pathlib.Path(out).mkdir(parents=True, exist_ok=True) if json: print("Loading exam...") exam_data = load(json) elif md: print("Compiling exam...") exam_text_data = md.read() exam_data = convert(exam_text_data) else: print("Fetching exam...") exam_data = get_exam(exam=exam) if seed: print("Scrambling exam...") exam_data = scramble( seed, exam_data, ) if json_out: print("Dumping json...") dump(exam_data, json_out) return print("Rendering exam...") with render_latex(exam_data, { "coursecode": prettify(exam.split("-")[0]), "description": "Sample Exam." }) as pdf: pdf = Pdf.open(BytesIO(pdf)) pdf.save(os.path.join(out, exam + ".pdf")) pdf.close()
def compile( exam, json, md, seed, subtitle, with_solutions, exam_type, semester, json_out, merged_md, draft, out, ): """ Compile one PDF or JSON (from Markdown), unencrypted. The exam may be deployed or local (in Markdown or JSON). If a seed is specified, it will scramble the exam. """ if not out: out = "" pathlib.Path(out).mkdir(parents=True, exist_ok=True) if json: print("Loading exam...") exam_data = load(json) elif md: exam_text_data = md.read() if merged_md: buff = LineBuffer(exam_text_data) handle_imports(buff, path=os.path.dirname(md.name)) merged_md.write("\n".join(buff.lines)) return print("Compiling exam...") exam_data = convert(exam_text_data, path=os.path.dirname(md.name), draft=draft) else: print("Fetching exam...") exam_data = get_exam(exam=exam) if seed: print("Scrambling exam...") exam_data = scramble(seed, exam_data, keep_data=with_solutions) def remove_solutions_from_groups(groups): for group in groups: # if isinstance(group, dict): group.pop("solution", None) if group.get("type") == "group": remove_solutions_from_groups(group.get("elements", [])) if not seed and not with_solutions: print("Removing solutions...") groups = exam_data.get("groups", []) remove_solutions_from_groups(groups) if json_out: print("Dumping json...") dump(exam_data, json_out, indent=4, sort_keys=True) return print("Rendering exam...") settings = { "coursecode": prettify(exam.split("-")[0]), "description": subtitle, "examtype": exam_type, "semester": semester, } if seed: settings["emailaddress"] = sanitize_email(seed) with render_latex(exam_data, settings) as pdf: pdf = Pdf.open(BytesIO(pdf)) pdf.save(os.path.join(out, exam + ".pdf")) pdf.close()