"""ESPD document types and request models (ported from GostGenerator2).""" from __future__ import annotations from enum import Enum from typing import Any, Optional from pydantic import BaseModel, ConfigDict, Field class DocumentType(str, Enum): SPEC = "spec" TEXT = "text" RSP = "rsp" RP = "rp" RO = "ro" PMI = "pmi" IMP = "imp" DOC_TYPE_CONFIG: dict[DocumentType, dict[str, Any]] = { DocumentType.SPEC: { "name": "Спецификация", "code": "", "suffix": "", "template": "nSpec.docx", "order": 0, }, DocumentType.TEXT: { "name": "Текст программы", "code": "12", "suffix": " 12", "template": "nText.docx", "order": 1, }, DocumentType.RSP: { "name": "Руководство системного программиста", "code": "32", "suffix": " 32", "template": "rsp.docx", "order": 2, }, DocumentType.RP: { "name": "Руководство программиста", "code": "33", "suffix": " 33", "template": "rp.docx", "order": 3, }, DocumentType.RO: { "name": "Руководство оператора", "code": "34", "suffix": " 34", "template": "nRo.docx", "order": 4, }, DocumentType.PMI: { "name": "Программа и методика испытаний", "code": "51", "suffix": " 51", "template": "pmi.docx", "order": 5, }, DocumentType.IMP: { "name": "Исполняемые модули программы", "code": "91", "suffix": " 91", "template": "nImp.docx", "order": 6, }, } class SpecItem(BaseModel): decimal: str name: str note: str = "" class SelectedDocument(BaseModel): model_config = ConfigDict(populate_by_name=True) doc_type: DocumentType with_dvd: bool = Field(default=False, alias="withDvd") class CommonFields(BaseModel): decimal: str = "" progname: str = "" author: str = "" checker: str = "" ncontrol: str = "" approver: str = "" year: str = "2026" class ImpZipInfo(BaseModel): folder_table_rows: list[list[str]] zip_checksum: str class GenerateRequest(BaseModel): doc_type: DocumentType common: CommonFields spec_items: list[SpecItem] = Field(default_factory=list) imp_zip_info: Optional[ImpZipInfo] = None extra_context: Optional[dict[str, Any]] = None class EspdState(BaseModel): """Persisted ESPD form state for a project.""" common: CommonFields = Field(default_factory=CommonFields) selected_docs: list[SelectedDocument] = Field(default_factory=list) spec_items: list[SpecItem] = Field(default_factory=list) ro_description: str = "" ro_ai_content: str = "" imp_zip_info: Optional[ImpZipInfo] = None class EspdGenerateOneRequest(BaseModel): doc_type: DocumentType common: Optional[CommonFields] = None spec_items: Optional[list[SpecItem]] = None imp_zip_info: Optional[ImpZipInfo] = None ro_ai_content: Optional[str] = None class EspdGenerateAllRequest(BaseModel): selected_docs: Optional[list[SelectedDocument]] = None common: Optional[CommonFields] = None spec_items: Optional[list[SpecItem]] = None imp_zip_info: Optional[ImpZipInfo] = None ro_ai_content: Optional[str] = None class EspdRoTextRequest(BaseModel): progname: str = "" decimal: str = "" ro_description: str = ""