Files
GostGenerator/web/backend/app/services/espd/models.py
T
2026-09-08 10:10:30 +03:00

141 lines
3.5 KiB
Python

"""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 = ""