src.db.models.reports
1from datetime import date as date_cls 2from datetime import datetime 3 4from fastui.components.display import DisplayLookup, DisplayMode 5from fastui.events import GoToEvent 6from pydantic import BaseModel, ConfigDict, Field, model_validator 7from sqlalchemy import BigInteger, Date, DateTime, Enum, ForeignKey, func 8from sqlalchemy.dialects.postgresql import JSONB 9from sqlalchemy.orm import Mapped, mapped_column, relationship 10 11from core.config import Base 12from db.models import ReportStatus 13 14 15class Reports(Base): 16 """Модель отчетов. 17 18 Эта модель представляет собой структуру данных для хранения отчетов, 19 связанных с пользователями. 20 """ 21 22 __tablename__ = "reports" 23 __table_args__ = {"extend_existing": True} 24 25 id: Mapped[int] = mapped_column(primary_key=True) 26 """int: Уникальный идентификатор отчета.""" 27 28 user_id: Mapped[int] = mapped_column( 29 ForeignKey("userdata.telegram_id", ondelete="CASCADE"), type_=BigInteger 30 ) 31 """int: Идентификатор пользователя в Telegram, связанный с отчетом.""" 32 33 user_name: Mapped[str | None] = mapped_column(default=None) 34 """str | None: Имя пользователя, связанное с отчетом (по умолчанию None).""" 35 36 info: Mapped[str] 37 """str: Информация о отчете.""" 38 39 pictures: Mapped[dict | None] = mapped_column(type_=JSONB, default=None) 40 """dict | None: Словарь с изображениями, связанными с отчетом (по умолчанию None).""" 41 42 status: Mapped[ReportStatus] = mapped_column( 43 Enum(ReportStatus, values_callable=lambda obj: [e.value for e in obj]), 44 default=ReportStatus.created, 45 ) 46 """ReportStatus: Статус отчета (по умолчанию 'создан').""" 47 48 create_date: Mapped[date_cls] = mapped_column(type_=Date, server_default=func.now()) 49 """date_cls: Дата создания отчета (по умолчанию - текущая дата).""" 50 51 updated: Mapped[datetime] = mapped_column( 52 type_=DateTime(timezone=True), 53 server_default=func.now(), 54 onupdate=func.current_timestamp(), 55 ) 56 """datetime: Дата и время последнего обновления отчета.""" 57 58 rep_connect: Mapped["UserData"] = relationship( # noqa: F821 # type: ignore 59 back_populates="reports", lazy="subquery" 60 ) 61 """UserData: Связанные обращения пользователя""" 62 63 class ValidationSchema(BaseModel): 64 """Схема валидации для модели отчетов. 65 66 Эта схема используется для валидации данных, связанных с отчетами. 67 """ 68 69 id: int | None = Field(default=None, title="ID") 70 """Уникальный идентификатор отчета.""" 71 72 user_id: int = Field(title="Telegram ID") 73 """Идентификатор пользователя в Telegram.""" 74 75 user_name: str | None = Field(default=None, title="Name") 76 """Имя пользователя.""" 77 78 info: str = Field(title="Info") 79 """Информация о отчете.""" 80 81 pictures: dict | None = Field(default={}, title="Pictures") 82 """Словарь с изображениями, связанными с отчетом.""" 83 84 status: ReportStatus = Field(default=ReportStatus.created, title="Status") 85 """Статус отчета.""" 86 87 create_date: date_cls = Field(title="Create date") 88 """Дата создания отчета.""" 89 90 updated: datetime | None = Field(default=None, title="Last update") 91 """Дата и время последнего обновления отчета.""" 92 93 site_updated: str = Field(init=False, title="Last update", default="00:00") 94 """Строковое представление последнего обновления (не инициализируется при создании).""" 95 96 @model_validator(mode="after") 97 def set_updated(cls, values: BaseModel): 98 """Устанавливает строковое представление последнего обновления. 99 100 Args: 101 cls: Класс схемы. 102 values (BaseModel): Значения для валидации. 103 104 Returns: 105 BaseModel: Обновленные значения. 106 """ 107 if hasattr(values, "updated") and hasattr(values.updated, "ctime"): 108 values.site_updated = values.updated.astimezone().ctime() 109 return values 110 111 model_config = ConfigDict(extra="ignore") 112 113 # INTERFACE (fastui) 114 site_display = [ 115 DisplayLookup( 116 field="id", 117 on_click=GoToEvent( 118 url="/bot/tables/reports/?report_id={id}&telegram_id={user_id}" 119 ), 120 ), 121 DisplayLookup( 122 field="user_id", 123 mode=DisplayMode.plain, 124 on_click=GoToEvent(url="/bot/tables/userdata/?telegram_id={user_id}"), 125 ), 126 DisplayLookup(field="user_name", mode=DisplayMode.as_title), 127 DisplayLookup(field="status"), 128 DisplayLookup(field="create_date", mode=DisplayMode.date), 129 ] 130 """list[DisplayLookup]: Отображение отчетов на сайте.""" 131 132 site_display_all = site_display + [ 133 DisplayLookup(field="site_updated"), 134 DisplayLookup(field="info"), 135 ] 136 """list[DisplayLookup]: Полное отображение отчетов на сайте.""" 137 138 def __init__(self, **kwargs): 139 """Инициализирует модель отчетов. 140 141 Args: 142 **kwargs: Дополнительные параметры для инициализации модели. 143 """ 144 if kwargs: 145 validated_data = self.ValidationSchema(**kwargs).model_dump( 146 exclude={"site_updated"} 147 ) 148 super().__init__(**(validated_data)) 149 else: 150 super().__init__(**(kwargs))
16class Reports(Base): 17 """Модель отчетов. 18 19 Эта модель представляет собой структуру данных для хранения отчетов, 20 связанных с пользователями. 21 """ 22 23 __tablename__ = "reports" 24 __table_args__ = {"extend_existing": True} 25 26 id: Mapped[int] = mapped_column(primary_key=True) 27 """int: Уникальный идентификатор отчета.""" 28 29 user_id: Mapped[int] = mapped_column( 30 ForeignKey("userdata.telegram_id", ondelete="CASCADE"), type_=BigInteger 31 ) 32 """int: Идентификатор пользователя в Telegram, связанный с отчетом.""" 33 34 user_name: Mapped[str | None] = mapped_column(default=None) 35 """str | None: Имя пользователя, связанное с отчетом (по умолчанию None).""" 36 37 info: Mapped[str] 38 """str: Информация о отчете.""" 39 40 pictures: Mapped[dict | None] = mapped_column(type_=JSONB, default=None) 41 """dict | None: Словарь с изображениями, связанными с отчетом (по умолчанию None).""" 42 43 status: Mapped[ReportStatus] = mapped_column( 44 Enum(ReportStatus, values_callable=lambda obj: [e.value for e in obj]), 45 default=ReportStatus.created, 46 ) 47 """ReportStatus: Статус отчета (по умолчанию 'создан').""" 48 49 create_date: Mapped[date_cls] = mapped_column(type_=Date, server_default=func.now()) 50 """date_cls: Дата создания отчета (по умолчанию - текущая дата).""" 51 52 updated: Mapped[datetime] = mapped_column( 53 type_=DateTime(timezone=True), 54 server_default=func.now(), 55 onupdate=func.current_timestamp(), 56 ) 57 """datetime: Дата и время последнего обновления отчета.""" 58 59 rep_connect: Mapped["UserData"] = relationship( # noqa: F821 # type: ignore 60 back_populates="reports", lazy="subquery" 61 ) 62 """UserData: Связанные обращения пользователя""" 63 64 class ValidationSchema(BaseModel): 65 """Схема валидации для модели отчетов. 66 67 Эта схема используется для валидации данных, связанных с отчетами. 68 """ 69 70 id: int | None = Field(default=None, title="ID") 71 """Уникальный идентификатор отчета.""" 72 73 user_id: int = Field(title="Telegram ID") 74 """Идентификатор пользователя в Telegram.""" 75 76 user_name: str | None = Field(default=None, title="Name") 77 """Имя пользователя.""" 78 79 info: str = Field(title="Info") 80 """Информация о отчете.""" 81 82 pictures: dict | None = Field(default={}, title="Pictures") 83 """Словарь с изображениями, связанными с отчетом.""" 84 85 status: ReportStatus = Field(default=ReportStatus.created, title="Status") 86 """Статус отчета.""" 87 88 create_date: date_cls = Field(title="Create date") 89 """Дата создания отчета.""" 90 91 updated: datetime | None = Field(default=None, title="Last update") 92 """Дата и время последнего обновления отчета.""" 93 94 site_updated: str = Field(init=False, title="Last update", default="00:00") 95 """Строковое представление последнего обновления (не инициализируется при создании).""" 96 97 @model_validator(mode="after") 98 def set_updated(cls, values: BaseModel): 99 """Устанавливает строковое представление последнего обновления. 100 101 Args: 102 cls: Класс схемы. 103 values (BaseModel): Значения для валидации. 104 105 Returns: 106 BaseModel: Обновленные значения. 107 """ 108 if hasattr(values, "updated") and hasattr(values.updated, "ctime"): 109 values.site_updated = values.updated.astimezone().ctime() 110 return values 111 112 model_config = ConfigDict(extra="ignore") 113 114 # INTERFACE (fastui) 115 site_display = [ 116 DisplayLookup( 117 field="id", 118 on_click=GoToEvent( 119 url="/bot/tables/reports/?report_id={id}&telegram_id={user_id}" 120 ), 121 ), 122 DisplayLookup( 123 field="user_id", 124 mode=DisplayMode.plain, 125 on_click=GoToEvent(url="/bot/tables/userdata/?telegram_id={user_id}"), 126 ), 127 DisplayLookup(field="user_name", mode=DisplayMode.as_title), 128 DisplayLookup(field="status"), 129 DisplayLookup(field="create_date", mode=DisplayMode.date), 130 ] 131 """list[DisplayLookup]: Отображение отчетов на сайте.""" 132 133 site_display_all = site_display + [ 134 DisplayLookup(field="site_updated"), 135 DisplayLookup(field="info"), 136 ] 137 """list[DisplayLookup]: Полное отображение отчетов на сайте.""" 138 139 def __init__(self, **kwargs): 140 """Инициализирует модель отчетов. 141 142 Args: 143 **kwargs: Дополнительные параметры для инициализации модели. 144 """ 145 if kwargs: 146 validated_data = self.ValidationSchema(**kwargs).model_dump( 147 exclude={"site_updated"} 148 ) 149 super().__init__(**(validated_data)) 150 else: 151 super().__init__(**(kwargs))
Модель отчетов.
Эта модель представляет собой структуру данных для хранения отчетов, связанных с пользователями.
Инициализирует модель отчетов.
Arguments:
- **kwargs: Дополнительные параметры для инициализации модели.
int: Идентификатор пользователя в Telegram, связанный с отчетом.
str | None: Имя пользователя, связанное с отчетом (по умолчанию None).
dict | None: Словарь с изображениями, связанными с отчетом (по умолчанию None).
ReportStatus: Статус отчета (по умолчанию 'создан').
date_cls: Дата создания отчета (по умолчанию - текущая дата).
datetime: Дата и время последнего обновления отчета.
UserData: Связанные обращения пользователя
list[DisplayLookup]: Отображение отчетов на сайте.
list[DisplayLookup]: Полное отображение отчетов на сайте.
64 class ValidationSchema(BaseModel): 65 """Схема валидации для модели отчетов. 66 67 Эта схема используется для валидации данных, связанных с отчетами. 68 """ 69 70 id: int | None = Field(default=None, title="ID") 71 """Уникальный идентификатор отчета.""" 72 73 user_id: int = Field(title="Telegram ID") 74 """Идентификатор пользователя в Telegram.""" 75 76 user_name: str | None = Field(default=None, title="Name") 77 """Имя пользователя.""" 78 79 info: str = Field(title="Info") 80 """Информация о отчете.""" 81 82 pictures: dict | None = Field(default={}, title="Pictures") 83 """Словарь с изображениями, связанными с отчетом.""" 84 85 status: ReportStatus = Field(default=ReportStatus.created, title="Status") 86 """Статус отчета.""" 87 88 create_date: date_cls = Field(title="Create date") 89 """Дата создания отчета.""" 90 91 updated: datetime | None = Field(default=None, title="Last update") 92 """Дата и время последнего обновления отчета.""" 93 94 site_updated: str = Field(init=False, title="Last update", default="00:00") 95 """Строковое представление последнего обновления (не инициализируется при создании).""" 96 97 @model_validator(mode="after") 98 def set_updated(cls, values: BaseModel): 99 """Устанавливает строковое представление последнего обновления. 100 101 Args: 102 cls: Класс схемы. 103 values (BaseModel): Значения для валидации. 104 105 Returns: 106 BaseModel: Обновленные значения. 107 """ 108 if hasattr(values, "updated") and hasattr(values.updated, "ctime"): 109 values.site_updated = values.updated.astimezone().ctime() 110 return values 111 112 model_config = ConfigDict(extra="ignore")
Схема валидации для модели отчетов.
Эта схема используется для валидации данных, связанных с отчетами.
97 @model_validator(mode="after") 98 def set_updated(cls, values: BaseModel): 99 """Устанавливает строковое представление последнего обновления. 100 101 Args: 102 cls: Класс схемы. 103 values (BaseModel): Значения для валидации. 104 105 Returns: 106 BaseModel: Обновленные значения. 107 """ 108 if hasattr(values, "updated") and hasattr(values.updated, "ctime"): 109 values.site_updated = values.updated.astimezone().ctime() 110 return values
Устанавливает строковое представление последнего обновления.
Arguments:
- cls: Класс схемы.
- values (BaseModel): Значения для валидации.
Returns:
BaseModel: Обновленные значения.
Configuration for the model, should be a dictionary conforming to [ConfigDict
][pydantic.config.ConfigDict].
Metadata about the fields defined on the model,
mapping of field names to [FieldInfo
][pydantic.fields.FieldInfo] objects.
This replaces Model.__fields__
from Pydantic V1.