VirtForemanBackend / scripts /generate_templates.py
Dirbol's picture
deploy: backend 2026-06-22T05:07:40Z
0c46399
Raw
History Blame Contribute Delete
4.78 kB
"""Generate legitimate Belarusian construction .docx templates with Jinja2 tags.
Run once from `backend/`:
python scripts/generate_templates.py
The resulting .docx files will be saved to `backend/templates/`.
They are recognised by `app.services.document_engine.DocumentEngine`.
"""
from __future__ import annotations
from pathlib import Path
from docx import Document
from docx.shared import Pt
from docx.enum.text import WD_ALIGN_PARAGRAPH
TEMPLATES_DIR = Path(__file__).resolve().parents[1] / "templates"
def _styled_heading(doc: Document, text: str) -> None:
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run(text)
run.bold = True
run.font.size = Pt(14)
def _add_kv(doc: Document, label: str, jinja_var: str | None = None) -> None:
value = "{{ " + (jinja_var or label) + " }}"
doc.add_paragraph(f"{label}: {value}")
def generate_act_hidden_works() -> None:
doc = Document()
_styled_heading(doc, "АКТ освидетельствования скрытых работ")
_add_kv(doc, "Объект", "object_name")
_add_kv(doc, "Заказчик", "client")
_add_kv(doc, "Подрядчик", "contractor")
_add_kv(doc, "Технадзор", "technical_supervisor")
_add_kv(doc, "Прораб", "work_producer")
_add_kv(doc, "Главный инженер", "chief_engineer")
_add_kv(doc, "Договор №", "contract_no")
doc.add_paragraph()
doc.add_paragraph("1. Описание скрытых работ:")
_add_kv(doc, " ", "work_description")
doc.add_paragraph("2. Объём работ:")
_add_kv(doc, " ", "volume")
doc.add_paragraph("3. Дата составления акта:")
_add_kv(doc, " ", "generated_at")
doc.add_paragraph()
doc.add_paragraph("Подписи сторон: _____________________ / _____________________ / _____________________")
doc.save(str(TEMPLATES_DIR / "act_hidden_works.docx"))
def generate_act_osmotr() -> None:
doc = Document()
_styled_heading(doc, "АКТ осмотра ответственных конструкций")
_add_kv(doc, "Объект", "object_name")
_add_kv(doc, "Заказчик", "client")
_add_kv(doc, "Подрядчик", "contractor")
_add_kv(doc, "Технадзор", "technical_supervisor")
_add_kv(doc, "Главный инженер", "chief_engineer")
_add_kv(doc, "Договор №", "contract_no")
doc.add_paragraph()
doc.add_paragraph("1. Перечень конструкций:")
_add_kv(doc, " ", "work_description")
doc.add_paragraph("2. Объём / кол-во:")
_add_kv(doc, " ", "volume")
doc.add_paragraph("3. Заключение:")
_add_kv(doc, " ", "verdict")
doc.add_paragraph()
doc.add_paragraph("Комиссия: ___________________ / ___________________ / ___________________")
doc.save(str(TEMPLATES_DIR / "act_osmotr_responsibility.docx"))
def generate_general_work_log() -> None:
doc = Document()
_styled_heading(doc, "Общий журнал работ")
_add_kv(doc, "Объект", "object_name")
_add_kv(doc, "Заказчик", "client")
_add_kv(doc, "Подрядчик", "contractor")
_add_kv(doc, "Производитель работ", "work_producer")
_add_kv(doc, "Договор №", "contract_no")
doc.add_paragraph()
doc.add_paragraph("Период:")
_add_kv(doc, "с ", "date_from")
_add_kv(doc, "по ", "date_to")
doc.add_paragraph("Описание работ:")
_add_kv(doc, " ", "work_description")
doc.save(str(TEMPLATES_DIR / "general_work_log.docx"))
def generate_material_certificate() -> None:
doc = Document()
_styled_heading(doc, "Сертификат / паспорт на материал")
_add_kv(doc, "Объект", "object_name")
_add_kv(doc, "Подрядчик", "contractor")
_add_kv(doc, "Договор №", "contract_no")
doc.add_paragraph()
doc.add_paragraph("1. Наименование материала:")
_add_kv(doc, " ", "material")
doc.add_paragraph("2. Объём поставки:")
_add_kv(doc, " ", "volume")
doc.add_paragraph("3. Сертификат № / партия:")
_add_kv(doc, " ", "certificate_no")
doc.save(str(TEMPLATES_DIR / "material_certificate.docx"))
def main() -> None:
TEMPLATES_DIR.mkdir(parents=True, exist_ok=True)
generate_act_hidden_works()
generate_act_osmotr()
generate_general_work_log()
generate_material_certificate()
for p in sorted(TEMPLATES_DIR.glob("*.docx")):
print(f"[generate] {p.name} ({p.stat().st_size} bytes)")
print("[done] templates ready")
if __name__ == "__main__":
main()