Draft for contract printing
This commit is contained in:
155
back/app/contract/print/__init__.py
Normal file
155
back/app/contract/print/__init__.py
Normal 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)
|
||||
Reference in New Issue
Block a user