Edit on GitHub

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))
class Reports(sqlalchemy.inspection.Inspectable[sqlalchemy.orm.state.InstanceState[typing.Any]]):
 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))

Модель отчетов.

Эта модель представляет собой структуру данных для хранения отчетов, связанных с пользователями.

Reports(**kwargs)

Инициализирует модель отчетов.

Arguments:
  • **kwargs: Дополнительные параметры для инициализации модели.
id: sqlalchemy.orm.base.Mapped[int]

int: Уникальный идентификатор отчета.

user_id: sqlalchemy.orm.base.Mapped[int]

int: Идентификатор пользователя в Telegram, связанный с отчетом.

user_name: sqlalchemy.orm.base.Mapped[str | None]

str | None: Имя пользователя, связанное с отчетом (по умолчанию None).

info: sqlalchemy.orm.base.Mapped[str]

str: Информация о отчете.

pictures: sqlalchemy.orm.base.Mapped[dict | None]

dict | None: Словарь с изображениями, связанными с отчетом (по умолчанию None).

status: sqlalchemy.orm.base.Mapped[db.models.enums.ReportStatus]

ReportStatus: Статус отчета (по умолчанию 'создан').

create_date: sqlalchemy.orm.base.Mapped[datetime.date]

date_cls: Дата создания отчета (по умолчанию - текущая дата).

updated: sqlalchemy.orm.base.Mapped[datetime.datetime]

datetime: Дата и время последнего обновления отчета.

rep_connect: sqlalchemy.orm.base.Mapped[ForwardRef('UserData')]

UserData: Связанные обращения пользователя

site_display = [DisplayLookup(mode=None, title=None, on_click=GoToEvent(url='/bot/tables/reports/?report_id={id}&telegram_id={user_id}', query=None, target=None, type='go-to'), field='id', table_width_percent=None), DisplayLookup(mode=<DisplayMode.plain: 'plain'>, title=None, on_click=GoToEvent(url='/bot/tables/userdata/?telegram_id={user_id}', query=None, target=None, type='go-to'), field='user_id', table_width_percent=None), DisplayLookup(mode=<DisplayMode.as_title: 'as_title'>, title=None, on_click=None, field='user_name', table_width_percent=None), DisplayLookup(mode=None, title=None, on_click=None, field='status', table_width_percent=None), DisplayLookup(mode=<DisplayMode.date: 'date'>, title=None, on_click=None, field='create_date', table_width_percent=None)]

list[DisplayLookup]: Отображение отчетов на сайте.

site_display_all = [DisplayLookup(mode=None, title=None, on_click=GoToEvent(url='/bot/tables/reports/?report_id={id}&telegram_id={user_id}', query=None, target=None, type='go-to'), field='id', table_width_percent=None), DisplayLookup(mode=<DisplayMode.plain: 'plain'>, title=None, on_click=GoToEvent(url='/bot/tables/userdata/?telegram_id={user_id}', query=None, target=None, type='go-to'), field='user_id', table_width_percent=None), DisplayLookup(mode=<DisplayMode.as_title: 'as_title'>, title=None, on_click=None, field='user_name', table_width_percent=None), DisplayLookup(mode=None, title=None, on_click=None, field='status', table_width_percent=None), DisplayLookup(mode=<DisplayMode.date: 'date'>, title=None, on_click=None, field='create_date', table_width_percent=None), DisplayLookup(mode=None, title=None, on_click=None, field='site_updated', table_width_percent=None), DisplayLookup(mode=None, title=None, on_click=None, field='info', table_width_percent=None)]

list[DisplayLookup]: Полное отображение отчетов на сайте.

class Reports.ValidationSchema(pydantic.main.BaseModel):
 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")

Схема валидации для модели отчетов.

Эта схема используется для валидации данных, связанных с отчетами.

id: int | None

Уникальный идентификатор отчета.

user_id: int

Идентификатор пользователя в Telegram.

user_name: str | None

Имя пользователя.

info: str

Информация о отчете.

pictures: dict | None

Словарь с изображениями, связанными с отчетом.

status: db.models.enums.ReportStatus

Статус отчета.

create_date: datetime.date

Дата создания отчета.

updated: datetime.datetime | None

Дата и время последнего обновления отчета.

site_updated: str

Строковое представление последнего обновления (не инициализируется при создании).

@model_validator(mode='after')
def set_updated(cls, values: pydantic.main.BaseModel):
 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: Обновленные значения.

model_config = {'extra': 'ignore'}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

model_fields: ClassVar[Dict[str, pydantic.fields.FieldInfo]] = {'id': FieldInfo(annotation=Union[int, NoneType], required=False, default=None, title='ID'), 'user_id': FieldInfo(annotation=int, required=True, title='Telegram ID'), 'user_name': FieldInfo(annotation=Union[str, NoneType], required=False, default=None, title='Name'), 'info': FieldInfo(annotation=str, required=True, title='Info'), 'pictures': FieldInfo(annotation=Union[dict, NoneType], required=False, default={}, title='Pictures'), 'status': FieldInfo(annotation=ReportStatus, required=False, default=<ReportStatus.created: 'created'>, title='Status'), 'create_date': FieldInfo(annotation=date, required=True, title='Create date'), 'updated': FieldInfo(annotation=Union[datetime, NoneType], required=False, default=None, title='Last update'), 'site_updated': FieldInfo(annotation=str, required=False, default='00:00', title='Last update', init=False)}

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.

model_computed_fields: ClassVar[Dict[str, pydantic.fields.ComputedFieldInfo]] = {}

A dictionary of computed field names and their corresponding ComputedFieldInfo objects.