Spaces:
Running
Running
| """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() | |