import jinja2 import src.models as models import html from weasyprint import HTML import io import pathlib def generate_html_contract( contract: models.Contract, cheques: list[dict], occasionals: list[dict], reccurents: list[dict], recurrent_price: float | None = None, total_price: float | None = None ): template_dir = pathlib.Path("./src/contracts/templates").resolve() template_loader = jinja2.FileSystemLoader(searchpath=template_dir) template_env = jinja2.Environment(loader=template_loader, autoescape=jinja2.select_autoescape(["html", "xml"])) template_file = "layout.html" template = template_env.get_template(template_file) output_text = template.render( contract_name=contract.form.name, contract_type=contract.form.productor.type, contract_season=contract.form.season, referer_name=contract.form.referer.name, referer_email=contract.form.referer.email, productor_name=contract.form.productor.name, productor_address=contract.form.productor.address, payment_methods_map={"cheque": "Ordre du chèque", "transfer": "virements"}, productor_payment_methods=contract.form.productor.payment_methods, member_name=f'{html.escape(contract.firstname)} {html.escape(contract.lastname)}', member_email=html.escape(contract.email), member_phone=html.escape(contract.phone), contract_start_date=contract.form.start, contract_end_date=contract.form.end, occasionals=occasionals, recurrents=reccurents, recurrent_price=recurrent_price, total_price=total_price, contract_payment_method={"cheque": "chèque", "transfer": "virements"}[contract.payment_method], cheques=cheques ) # options = { # 'page-size': 'Letter', # 'margin-top': '0.5in', # 'margin-right': '0.5in', # 'margin-bottom': '0.5in', # 'margin-left': '0.5in', # 'encoding': "UTF-8", # 'print-media-type': True, # "disable-javascript": True, # "disable-external-links": True, # 'enable-local-file-access': False, # "disable-local-file-access": True, # "no-images": True, # } return HTML( string=output_text, base_url=template_dir, ).write_pdf() from odfdo import Document, Table, Row, Cell def generate_recap( contracts: list[models.Contract], form: models.Form, ): data = [ ["nom", "email"], ] doc = Document("spreadsheet") sheet = Table(name="Recap") sheet.set_values(data) doc.body.append(sheet) buffer = io.BytesIO() doc.save(buffer) return buffer.getvalue()