Draft for contract printing

This commit is contained in:
2023-02-17 19:46:22 +01:00
parent 749794a5f8
commit 7ac89f1bb3
15 changed files with 592 additions and 4 deletions

View File

@@ -0,0 +1,155 @@
from fastapi import APIRouter, Request
from fastapi.responses import HTMLResponse, FileResponse
from fastapi.templating import Jinja2Templates
import pdfkit
from PyPDF2 import PdfMerger
from pathlib import Path
from app.entity.models import Entity
from app.template.models import ProvisionTemplate
from ..schemas import ContractDraft
async def build_model(model):
parties = []
for p in model.parties:
party = {
"entity": await Entity.get(p.entity_id),
"part": p.part
}
if p.representative_id:
party['representative'] = await Entity.get(p.representative_id)
parties.append(party)
model.parties = parties
provisions = []
for p in model.provisions:
if p.provision.type == "template":
provisions.append(await ProvisionTemplate.get(p.provision.provision_template_id))
else:
provisions.append(p.provision)
model.provisions = provisions
model.location = "Toulouse"
model.date = "01/01/1970"
return model
BASE_PATH = Path(__file__).resolve().parent
print_router = APIRouter()
templates = Jinja2Templates(directory=str(BASE_PATH / "templates"))
options = {
'encoding': 'UTF-8',
'margin-left': '20mm',
'margin-right': '20mm',
'margin-bottom': '20mm',
'margin-top': '20mm'
}
options_content = options.copy()
options_content['footer-html'] = 'footer.html'
options_content['margin-bottom'] = '60mm'
async def render_template(host):
draft = await ContractDraft.get("63e92534aafed8b509f229c4")
lawyer = {
"firstname": "Nathaniel",
"lastname": "Toshi",
}
template = templates.get_template("print.html")
return template.render({
"draft": await build_model(draft),
"lawyer": lawyer,
"static_host": host
})
async def render_frontpage(host, draft, lawyer, ):
template = templates.get_template("frontpage.html")
return template.render({
"draft": draft,
"lawyer": lawyer,
"static_host": host
})
async def render_content(host, draft, ):
template = templates.get_template("content.html")
return template.render({
"draft": draft,
"static_host": host
})
async def render_footer(host, draft, ):
template = templates.get_template("footer.html")
return template.render({
"draft": draft,
"static_host": host
})
@print_router.get("/frontpage", response_class=HTMLResponse)
async def frontpage() -> str:
draft = await build_model(await ContractDraft.get("63e92534aafed8b509f229c4"))
lawyer = {
"firstname": "Nathaniel",
"lastname": "Toshi",
}
return await render_frontpage('localhost', draft, lawyer)
@print_router.get("/content", response_class=HTMLResponse)
async def content() -> str:
draft = await build_model(await ContractDraft.get("63e92534aafed8b509f229c4"))
return await render_content('localhost', draft)
@print_router.get("/footer", response_class=HTMLResponse)
async def footer() -> str:
draft = await build_model(await ContractDraft.get("63e92534aafed8b509f229c4"))
return await render_footer('localhost', draft)
@print_router.get("/", response_class=HTMLResponse)
async def create() -> str:
return await render_template('localhost')
@print_router.get("/pdf", response_class=FileResponse)
async def create_pdf() -> str:
draft = await build_model(await ContractDraft.get("63e92534aafed8b509f229c4"))
lawyer = {
"firstname": "Nathaniel",
"lastname": "Toshi",
}
merger = PdfMerger()
pdfkit.from_string(await render_frontpage('nginx', draft, lawyer), 'front.pdf', options=options)
merger.append('front.pdf')
with open('footer.html', 'w') as f:
f.write(await render_footer('nginx', draft))
pdfkit.from_string(await render_content('nginx', draft), 'content.pdf', options=options_content)
merger.append('content.pdf')
merger.write("out.pdf")
merger.close()
print(options)
return FileResponse(
"out.pdf",
media_type="application/pdf",
filename=draft.name)