/
slsh
/
agent_register
Обзор
Документация
Войти
/
slsh
/
agent_register
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
app/sections.py
296 строк
11 KB
Igor Tveritin
stats update
14 июл 2026, 15:17
14 июл 2026, 15:17
ca81789
Код
Авторство
О чём код?
from dataclasses import dataclass from app.config import get_settings from app.schema import FILE_FIELDS, TEXT_FIELDS, Field @dataclass(frozen=True) class SectionConfig: key: str active_page: str table_name: str list_path: str base_path: str title: str heading: str record_label: str text_fields: tuple[Field, ...] file_fields: tuple[Field, ...] = () short_columns: tuple[dict[str, str], ...] = () form_groups: dict[str, str] | None = None preview_summary: tuple[str, ...] = () preview_details: tuple[str, ...] = () preview_badges: tuple[str, ...] = () badge_columns: dict[str, str] | None = None sort_fields: tuple[str, ...] = ("id",) show_import: bool = False file_name_in_field: bool = False full_column_order: tuple[str, ...] = () @property def text_field_names(self) -> tuple[str, ...]: return tuple(field.name for field in self.text_fields) @property def file_field_names(self) -> tuple[str, ...]: return tuple(field.name for field in self.file_fields) @property def file_name_columns(self) -> tuple[str, ...]: return tuple(self.file_filename_column(field.name) for field in self.file_fields) @property def file_content_columns(self) -> tuple[str, ...]: return tuple(self.file_content_column(field.name) for field in self.file_fields) def file_filename_column(self, field_name: str) -> str: return field_name if self.file_name_in_field else f"{field_name}_filename" def file_content_column(self, field_name: str) -> str: return f"{field_name}_content" if self.file_name_in_field else field_name @property def full_columns(self) -> tuple[dict[str, str], ...]: columns = tuple( {"key": field.name, "label": field.label, "kind": field.kind} for field in self.text_fields ) + tuple( {"key": field.name, "label": field.label, "kind": field.kind} for field in self.file_fields ) if not self.full_column_order: return columns columns_by_key = {column["key"]: column for column in columns} return tuple(columns_by_key[key] for key in self.full_column_order) @property def table_columns(self) -> tuple[dict[str, str], ...]: return self.short_columns or self.full_columns @property def new_path(self) -> str: return f"{self.base_path}/new" @property def export_path(self) -> str: return f"{self.list_path}/export.xlsx" @property def import_path(self) -> str: return f"{self.list_path}/import.xlsx" settings = get_settings() REGISTRY_COLUMNS = ( {"key": "id", "label": "ID"}, {"key": "display_name", "label": "Название"}, {"key": "ci", "label": "CI"}, {"key": "prom", "label": "ПРОМ"}, {"key": "status_lc", "label": "Статус ЖЦ"}, {"key": "criticality_level", "label": "Уровень критичности"}, {"key": "block_owner", "label": "Блок-владелец"}, ) REGISTRY_SECTION = SectionConfig( key="registry", active_page="registry", table_name=settings.table_name, list_path="/agents/register", base_path="/agents/register", title=settings.app_title, heading="AI-агенты", record_label="запись", text_fields=TEXT_FIELDS, file_fields=FILE_FIELDS, short_columns=REGISTRY_COLUMNS, form_groups={ "id": "Основные данные", "criticality_level": "Аудит и тестирование", "prom": "Статусы и владельцы", "responsible": "Ответственные", }, preview_summary=("id", "ci", "block_owner", "owner", "responsible"), preview_details=("audit_reason", "test_reason", "mitigation_list", "comments"), preview_badges=("criticality_level", "prom", "status_lc", "test_estimate"), badge_columns={ "criticality_level": "level", "test_estimate": "level", "prom": "prom", "status_lc": "status", }, sort_fields=("shortname", "id"), show_import=True, ) TEST_AGENT_FIELDS = ( Field("id", "ID агента", required=True), Field("agent_name", "Название агента"), Field("ci", "CI"), Field("agent_from", "Откуда передан агент"), Field("status", "Статус"), Field("prom", "Статус PROM", kind="select", options=("Да", "Нет", "-")), Field("responsible", "Ответственный за тестирование"), Field("access_date", "Дата получения доступов", kind="date"), Field("completion_date", "Дата завершения тестирования", kind="date"), Field("comments", "Комментарии", kind="textarea"), ) TEST_AGENT_COLUMNS = ( {"key": "id", "label": "ID агента"}, {"key": "agent_name", "label": "Название агента"}, {"key": "ci", "label": "CI"}, {"key": "status", "label": "Статус"}, {"key": "prom", "label": "Статус PROM"}, {"key": "responsible", "label": "Ответственный"}, {"key": "completion_date", "label": "Дата завершения"}, ) TESTING_SECTION = SectionConfig( key="testing", active_page="agent_testing", table_name=settings.test_agents_table_name, list_path="/agents/testing", base_path="/agents/testing", title="Тестирование Агентов", heading="Тестирование Агентов", record_label="запись тестирования", text_fields=TEST_AGENT_FIELDS, short_columns=TEST_AGENT_COLUMNS, form_groups={ "id": "Основные данные", "from": "Тестирование", "comments": "Комментарии", }, preview_summary=("id", "agent_name", "ci", "from", "responsible"), preview_details=("access_date", "completion_date", "comments"), preview_badges=("status", "prom"), badge_columns={"status": "status", "prom": "prom"}, sort_fields=("agent_name", "id"), show_import=True, ) PSI_AGENT_FIELDS = ( Field("id", "ID ПСИ", required=True), Field("agent_name", "Название агента"), Field("link", "Ссылка на релиз"), Field("description", "Описание ПСИ", kind="textarea"), Field("ci", "CI агента", kind="textarea"), Field("type", "Тип исследуемой сущности", kind="select", options=("агент", "МАС")), Field("date", "Дата ПСИ", kind="date"), Field("status", "Статус"), Field("comments", "Комментарии AIRT", kind="textarea"), Field("notes", "Заметки по встрече", kind="textarea"), ) PSI_AGENT_COLUMNS = ( {"key": "id", "label": "ID ПСИ"}, {"key": "agent_name", "label": "Название агента"}, {"key": "link", "label": "Ссылка на релиз"}, {"key": "type", "label": "Тип"}, {"key": "date", "label": "Дата ПСИ"}, {"key": "status", "label": "Статус"}, ) PSI_SECTION = SectionConfig( key="psi", active_page="psi", table_name=settings.psi_agents_table_name, list_path="/agents/psi", base_path="/agents/psi", title="ПСИ Агентов", heading="ПСИ Агентов", record_label="запись ПСИ", text_fields=PSI_AGENT_FIELDS, short_columns=PSI_AGENT_COLUMNS, form_groups={ "id": "Основные данные", "link": "ПСИ", "comments": "Комментарии", }, preview_summary=("id", "agent_name", "ci", "type", "date"), preview_details=("link", "description", "comments", "notes"), preview_badges=("status", "type"), badge_columns={"status": "status", "type": "status"}, sort_fields=("agent_name", "id"), show_import=True, ) RISK_AGENT_FIELDS = ( Field("id", "ID риска", required=True), Field("agent_id", "ID агента"), Field("agent_name", "Название агента"), Field("order_number", "Номер распоряжения о принятии рисков"), Field("as_id", "Идентификатор АС Киберметодология"), Field("risk_type", "Тип риска"), Field("risk_level", "Уровень риска", kind="select", options=("Низкий", "Средний", "Высокий")), Field("mitigation_plan", "План митигации", kind="textarea"), Field("mitigation_period", "Срок митигации"), Field("responsible_unit", "Ответственное подразделение"), Field("responsible_person", "Ответственный (ФИО)"), Field("comments", "Комментарии", kind="textarea"), ) RISK_AGENT_FILES = ( Field("file", "Файл распоряжения о принятии рисков"), ) RISK_AGENT_COLUMNS = ( {"key": "id", "label": "ID риска"}, {"key": "agent_id", "label": "ID агента"}, {"key": "agent_name", "label": "Название агента"}, {"key": "order_number", "label": "Номер распоряжения"}, {"key": "risk_type", "label": "Тип риска"}, {"key": "risk_level", "label": "Уровень риска"}, {"key": "responsible_person", "label": "Ответственный"}, ) RISKS_SECTION = SectionConfig( key="risks", active_page="agent_risks", table_name=settings.risk_agents_table_name, list_path="/agents/risks", base_path="/agents/risks", title="Риски Агентов", heading="Риски Агентов", record_label="риск", text_fields=RISK_AGENT_FIELDS, file_fields=RISK_AGENT_FILES, short_columns=RISK_AGENT_COLUMNS, form_groups={ "id": "Основные данные", "order_number": "Риск", "mitigation_plan": "Митигация", "responsible_unit": "Ответственные", }, preview_summary=("id", "agent_id", "agent_name", "order_number", "as_id"), preview_details=("risk_type", "risk_level", "mitigation_plan", "mitigation_period", "responsible_unit", "responsible_person", "comments"), preview_badges=("risk_level", "risk_type"), badge_columns={"risk_level": "level", "risk_type": "status"}, sort_fields=("agent_name", "id"), show_import=True, file_name_in_field=True, full_column_order=( "id", "agent_id", "agent_name", "order_number", "file", "as_id", "risk_type", "risk_level", "mitigation_plan", "mitigation_period", "responsible_unit", "responsible_person", "comments", ), ) SECTIONS: tuple[SectionConfig, ...] = ( REGISTRY_SECTION, TESTING_SECTION, PSI_SECTION, RISKS_SECTION, ) SECTIONS_BY_KEY = {section.key: section for section in SECTIONS} SECTIONS_BY_ACTIVE_PAGE = {section.active_page: section for section in SECTIONS}