src.db.models.userdata
1from datetime import datetime 2 3from fastui.components.display import DisplayLookup, DisplayMode 4from fastui.events import GoToEvent 5from pydantic import BaseModel, ConfigDict, Field, model_validator 6from sqlalchemy import BigInteger, DateTime, Enum, Numeric, func 7from sqlalchemy.orm import Mapped, mapped_column, relationship 8 9from core.config import Base 10from db.models import UserActivity 11from db.models.notifications import Notifications 12from db.models.reports import Reports 13from db.models.transactions import Transactions 14from db.models.wg_config import WgConfig 15 16 17class UserData(Base): 18 """Модель данных пользователя. 19 20 Эта модель представляет собой структуру данных для хранения информации 21 о пользователях, включая их настройки, баланс и статус. 22 """ 23 24 __tablename__ = "userdata" 25 __table_args__ = {"extend_existing": True} 26 27 id: Mapped[int] = mapped_column(primary_key=True) 28 """int: Уникальный идентификатор пользователя.""" 29 30 telegram_id: Mapped[int] = mapped_column(type_=BigInteger, unique=True) 31 """int: Идентификатор пользователя в Telegram (уникальный).""" 32 33 telegram_name: Mapped[str] 34 """str: Имя пользователя в Telegram.""" 35 36 admin: Mapped[bool] = mapped_column(default=False) 37 """bool: Является ли пользователь администратором (по умолчанию False).""" 38 39 active: Mapped[UserActivity] = mapped_column( 40 Enum(UserActivity, values_callable=lambda obj: [e.value for e in obj]), 41 default=UserActivity.inactive, 42 ) 43 """UserActivity: Статус активности пользователя (по умолчанию неактивен).""" 44 45 stage: Mapped[float] = mapped_column(default=0) 46 """float: Этап пользователя (по умолчанию 0).""" 47 48 balance: Mapped[float] = mapped_column(type_=Numeric(scale=2), default=0) 49 """float: Баланс пользователя (по умолчанию 0).""" 50 51 free: Mapped[bool] = mapped_column(default=True) 52 """bool: Доступен ли пользователь (по умолчанию True).""" 53 54 mute: Mapped[bool] = mapped_column(server_default="0") 55 """bool: Заглушен ли пользователь (по умолчанию False).""" 56 57 updated: Mapped[datetime] = mapped_column( 58 type_=DateTime(timezone=True), 59 server_default=func.now(), 60 onupdate=func.current_timestamp(), 61 ) 62 """datetime: Дата и время последнего обновления пользователя.""" 63 64 configs: Mapped[list["WgConfig"]] = relationship( 65 back_populates="conf_connect", lazy="subquery" 66 ) 67 """list[WgConfig]: Связанные конфигурации WG пользователя.""" 68 69 transactions: Mapped[list["Transactions"]] = relationship( 70 back_populates="transact_connect", lazy="subquery" 71 ) 72 """list[Transactions]: Связанные транзакции пользователя.""" 73 74 reports: Mapped[list["Reports"]] = relationship( 75 back_populates="rep_connect", lazy="subquery" 76 ) 77 """list[Reports]: Связанные обращения пользователя.""" 78 79 notifications: Mapped[list["Notifications"]] = relationship( 80 back_populates="notif_connect", lazy="subquery" 81 ) 82 """list[Notifications]: Связанные уведомления пользователя.""" 83 84 # @hybrid_property 85 def fbalance(self): 86 """Возвращает округленный баланс пользователя. 87 88 Returns: 89 float: Округленный баланс пользователя. 90 """ 91 return round(float(self.balance), 2) 92 93 class ValidationSchema(BaseModel): 94 """Схема валидации для модели данных пользователя. 95 96 Эта схема используется для валидации данных, связанных с пользователями. 97 """ 98 99 id: int | None = Field(default=None, title="ID") 100 """Уникальный идентификатор пользователя.""" 101 102 telegram_id: int = Field(title="Telegram ID") 103 """Идентификатор пользователя в Telegram.""" 104 105 telegram_name: str = Field(title="Name") 106 """Имя пользователя в Telegram.""" 107 108 admin: bool = Field(title="Admin", default=False) 109 """Является ли пользователь администратором (по умолчанию False).""" 110 111 active: UserActivity = Field(title="Active", default=UserActivity.inactive) 112 """Статус активности пользователя (по умолчанию неактивен).""" 113 114 stage: float = Field(title="Stage", default=0) 115 """Этап пользователя (по умолчанию 0).""" 116 117 balance: float = Field(title="Balance", default=0) 118 """Баланс пользователя (по умолчанию 0).""" 119 120 free: bool = Field(title="Free", default=True) 121 """Доступен ли пользователь (по умолчанию True).""" 122 123 mute: bool = Field(title="Mute", default=False) 124 """Заглушен ли пользователь (по умолчанию False).""" 125 126 updated: datetime = Field(title="Last update") 127 """Дата и время последнего обновления пользователя.""" 128 129 configs: list["WgConfig.ValidationSchema"] = Field( 130 default=[], title="User Configurations" 131 ) 132 """Конфигурации пользователя.""" 133 134 site_updated: str = Field(init=False, title="Last update", default="00:00") 135 """Строковое представление последнего обновления (не инициализируется при создании).""" 136 137 @model_validator(mode="after") 138 def set_site_date(cls, values: BaseModel): 139 """Устанавливает строковое представление даты последнего обновления. 140 141 Args: 142 cls: Класс схемы. 143 values (BaseModel): Значения для валидации. 144 145 Returns: 146 BaseModel: Обновленные значения. 147 """ 148 if hasattr(values, "updated"): 149 values.site_updated = values.updated.astimezone().ctime() 150 return values 151 152 model_config = ConfigDict(extra="ignore") 153 154 class ValidationSchemaExtended(ValidationSchema): 155 transactions: list["Transactions.ValidationSchema"] = Field( 156 default=[], title="User Transactions" 157 ) 158 """Транзакции пользователя.""" 159 160 reports: list["Reports.ValidationSchema"] = Field( 161 default=[], title="User Reports" 162 ) 163 """Обращения пользователя.""" 164 165 notifications: list["Notifications.ValidationSchema"] = Field( 166 default=[], title="User Notifications" 167 ) 168 """Уведомления пользователя.""" 169 170 # INTERFACE (fastui) 171 site_display = [ 172 DisplayLookup(field="id"), 173 DisplayLookup( 174 field="telegram_id", 175 mode=DisplayMode.plain, 176 on_click=GoToEvent(url="/bot/tables/userdata/?telegram_id={telegram_id}"), 177 ), 178 DisplayLookup(field="telegram_name", mode=DisplayMode.as_title), 179 DisplayLookup(field="admin"), 180 DisplayLookup(field="active", mode=DisplayMode.markdown), 181 DisplayLookup(field="stage"), 182 DisplayLookup(field="balance"), 183 DisplayLookup(field="free"), 184 DisplayLookup(field="mute"), 185 DisplayLookup(field="site_updated"), 186 ] 187 """list[DisplayLookup]: Отображение данных пользователя на сайте.""" 188 189 def __init__(self, **kwargs): 190 """Инициализирует модель данных пользователя. 191 192 Args: 193 **kwargs: Дополнительные параметры для инициализации модели. 194 """ 195 if kwargs: 196 validated_data = self.ValidationSchema(**kwargs).model_dump( 197 exclude={"site_updated"} 198 ) 199 super().__init__(**(validated_data)) 200 else: 201 super().__init__(**(kwargs))
18class UserData(Base): 19 """Модель данных пользователя. 20 21 Эта модель представляет собой структуру данных для хранения информации 22 о пользователях, включая их настройки, баланс и статус. 23 """ 24 25 __tablename__ = "userdata" 26 __table_args__ = {"extend_existing": True} 27 28 id: Mapped[int] = mapped_column(primary_key=True) 29 """int: Уникальный идентификатор пользователя.""" 30 31 telegram_id: Mapped[int] = mapped_column(type_=BigInteger, unique=True) 32 """int: Идентификатор пользователя в Telegram (уникальный).""" 33 34 telegram_name: Mapped[str] 35 """str: Имя пользователя в Telegram.""" 36 37 admin: Mapped[bool] = mapped_column(default=False) 38 """bool: Является ли пользователь администратором (по умолчанию False).""" 39 40 active: Mapped[UserActivity] = mapped_column( 41 Enum(UserActivity, values_callable=lambda obj: [e.value for e in obj]), 42 default=UserActivity.inactive, 43 ) 44 """UserActivity: Статус активности пользователя (по умолчанию неактивен).""" 45 46 stage: Mapped[float] = mapped_column(default=0) 47 """float: Этап пользователя (по умолчанию 0).""" 48 49 balance: Mapped[float] = mapped_column(type_=Numeric(scale=2), default=0) 50 """float: Баланс пользователя (по умолчанию 0).""" 51 52 free: Mapped[bool] = mapped_column(default=True) 53 """bool: Доступен ли пользователь (по умолчанию True).""" 54 55 mute: Mapped[bool] = mapped_column(server_default="0") 56 """bool: Заглушен ли пользователь (по умолчанию False).""" 57 58 updated: Mapped[datetime] = mapped_column( 59 type_=DateTime(timezone=True), 60 server_default=func.now(), 61 onupdate=func.current_timestamp(), 62 ) 63 """datetime: Дата и время последнего обновления пользователя.""" 64 65 configs: Mapped[list["WgConfig"]] = relationship( 66 back_populates="conf_connect", lazy="subquery" 67 ) 68 """list[WgConfig]: Связанные конфигурации WG пользователя.""" 69 70 transactions: Mapped[list["Transactions"]] = relationship( 71 back_populates="transact_connect", lazy="subquery" 72 ) 73 """list[Transactions]: Связанные транзакции пользователя.""" 74 75 reports: Mapped[list["Reports"]] = relationship( 76 back_populates="rep_connect", lazy="subquery" 77 ) 78 """list[Reports]: Связанные обращения пользователя.""" 79 80 notifications: Mapped[list["Notifications"]] = relationship( 81 back_populates="notif_connect", lazy="subquery" 82 ) 83 """list[Notifications]: Связанные уведомления пользователя.""" 84 85 # @hybrid_property 86 def fbalance(self): 87 """Возвращает округленный баланс пользователя. 88 89 Returns: 90 float: Округленный баланс пользователя. 91 """ 92 return round(float(self.balance), 2) 93 94 class ValidationSchema(BaseModel): 95 """Схема валидации для модели данных пользователя. 96 97 Эта схема используется для валидации данных, связанных с пользователями. 98 """ 99 100 id: int | None = Field(default=None, title="ID") 101 """Уникальный идентификатор пользователя.""" 102 103 telegram_id: int = Field(title="Telegram ID") 104 """Идентификатор пользователя в Telegram.""" 105 106 telegram_name: str = Field(title="Name") 107 """Имя пользователя в Telegram.""" 108 109 admin: bool = Field(title="Admin", default=False) 110 """Является ли пользователь администратором (по умолчанию False).""" 111 112 active: UserActivity = Field(title="Active", default=UserActivity.inactive) 113 """Статус активности пользователя (по умолчанию неактивен).""" 114 115 stage: float = Field(title="Stage", default=0) 116 """Этап пользователя (по умолчанию 0).""" 117 118 balance: float = Field(title="Balance", default=0) 119 """Баланс пользователя (по умолчанию 0).""" 120 121 free: bool = Field(title="Free", default=True) 122 """Доступен ли пользователь (по умолчанию True).""" 123 124 mute: bool = Field(title="Mute", default=False) 125 """Заглушен ли пользователь (по умолчанию False).""" 126 127 updated: datetime = Field(title="Last update") 128 """Дата и время последнего обновления пользователя.""" 129 130 configs: list["WgConfig.ValidationSchema"] = Field( 131 default=[], title="User Configurations" 132 ) 133 """Конфигурации пользователя.""" 134 135 site_updated: str = Field(init=False, title="Last update", default="00:00") 136 """Строковое представление последнего обновления (не инициализируется при создании).""" 137 138 @model_validator(mode="after") 139 def set_site_date(cls, values: BaseModel): 140 """Устанавливает строковое представление даты последнего обновления. 141 142 Args: 143 cls: Класс схемы. 144 values (BaseModel): Значения для валидации. 145 146 Returns: 147 BaseModel: Обновленные значения. 148 """ 149 if hasattr(values, "updated"): 150 values.site_updated = values.updated.astimezone().ctime() 151 return values 152 153 model_config = ConfigDict(extra="ignore") 154 155 class ValidationSchemaExtended(ValidationSchema): 156 transactions: list["Transactions.ValidationSchema"] = Field( 157 default=[], title="User Transactions" 158 ) 159 """Транзакции пользователя.""" 160 161 reports: list["Reports.ValidationSchema"] = Field( 162 default=[], title="User Reports" 163 ) 164 """Обращения пользователя.""" 165 166 notifications: list["Notifications.ValidationSchema"] = Field( 167 default=[], title="User Notifications" 168 ) 169 """Уведомления пользователя.""" 170 171 # INTERFACE (fastui) 172 site_display = [ 173 DisplayLookup(field="id"), 174 DisplayLookup( 175 field="telegram_id", 176 mode=DisplayMode.plain, 177 on_click=GoToEvent(url="/bot/tables/userdata/?telegram_id={telegram_id}"), 178 ), 179 DisplayLookup(field="telegram_name", mode=DisplayMode.as_title), 180 DisplayLookup(field="admin"), 181 DisplayLookup(field="active", mode=DisplayMode.markdown), 182 DisplayLookup(field="stage"), 183 DisplayLookup(field="balance"), 184 DisplayLookup(field="free"), 185 DisplayLookup(field="mute"), 186 DisplayLookup(field="site_updated"), 187 ] 188 """list[DisplayLookup]: Отображение данных пользователя на сайте.""" 189 190 def __init__(self, **kwargs): 191 """Инициализирует модель данных пользователя. 192 193 Args: 194 **kwargs: Дополнительные параметры для инициализации модели. 195 """ 196 if kwargs: 197 validated_data = self.ValidationSchema(**kwargs).model_dump( 198 exclude={"site_updated"} 199 ) 200 super().__init__(**(validated_data)) 201 else: 202 super().__init__(**(kwargs))
Модель данных пользователя.
Эта модель представляет собой структуру данных для хранения информации о пользователях, включая их настройки, баланс и статус.
Инициализирует модель данных пользователя.
Arguments:
- **kwargs: Дополнительные параметры для инициализации модели.
int: Идентификатор пользователя в Telegram (уникальный).
bool: Является ли пользователь администратором (по умолчанию False).
UserActivity: Статус активности пользователя (по умолчанию неактивен).
datetime: Дата и время последнего обновления пользователя.
list[WgConfig]: Связанные конфигурации WG пользователя.
list[Transactions]: Связанные транзакции пользователя.
list[Reports]: Связанные обращения пользователя.
list[Notifications]: Связанные уведомления пользователя.
86 def fbalance(self): 87 """Возвращает округленный баланс пользователя. 88 89 Returns: 90 float: Округленный баланс пользователя. 91 """ 92 return round(float(self.balance), 2)
Возвращает округленный баланс пользователя.
Returns:
float: Округленный баланс пользователя.
list[DisplayLookup]: Отображение данных пользователя на сайте.
94 class ValidationSchema(BaseModel): 95 """Схема валидации для модели данных пользователя. 96 97 Эта схема используется для валидации данных, связанных с пользователями. 98 """ 99 100 id: int | None = Field(default=None, title="ID") 101 """Уникальный идентификатор пользователя.""" 102 103 telegram_id: int = Field(title="Telegram ID") 104 """Идентификатор пользователя в Telegram.""" 105 106 telegram_name: str = Field(title="Name") 107 """Имя пользователя в Telegram.""" 108 109 admin: bool = Field(title="Admin", default=False) 110 """Является ли пользователь администратором (по умолчанию False).""" 111 112 active: UserActivity = Field(title="Active", default=UserActivity.inactive) 113 """Статус активности пользователя (по умолчанию неактивен).""" 114 115 stage: float = Field(title="Stage", default=0) 116 """Этап пользователя (по умолчанию 0).""" 117 118 balance: float = Field(title="Balance", default=0) 119 """Баланс пользователя (по умолчанию 0).""" 120 121 free: bool = Field(title="Free", default=True) 122 """Доступен ли пользователь (по умолчанию True).""" 123 124 mute: bool = Field(title="Mute", default=False) 125 """Заглушен ли пользователь (по умолчанию False).""" 126 127 updated: datetime = Field(title="Last update") 128 """Дата и время последнего обновления пользователя.""" 129 130 configs: list["WgConfig.ValidationSchema"] = Field( 131 default=[], title="User Configurations" 132 ) 133 """Конфигурации пользователя.""" 134 135 site_updated: str = Field(init=False, title="Last update", default="00:00") 136 """Строковое представление последнего обновления (не инициализируется при создании).""" 137 138 @model_validator(mode="after") 139 def set_site_date(cls, values: BaseModel): 140 """Устанавливает строковое представление даты последнего обновления. 141 142 Args: 143 cls: Класс схемы. 144 values (BaseModel): Значения для валидации. 145 146 Returns: 147 BaseModel: Обновленные значения. 148 """ 149 if hasattr(values, "updated"): 150 values.site_updated = values.updated.astimezone().ctime() 151 return values 152 153 model_config = ConfigDict(extra="ignore")
Схема валидации для модели данных пользователя.
Эта схема используется для валидации данных, связанных с пользователями.
138 @model_validator(mode="after") 139 def set_site_date(cls, values: BaseModel): 140 """Устанавливает строковое представление даты последнего обновления. 141 142 Args: 143 cls: Класс схемы. 144 values (BaseModel): Значения для валидации. 145 146 Returns: 147 BaseModel: Обновленные значения. 148 """ 149 if hasattr(values, "updated"): 150 values.site_updated = values.updated.astimezone().ctime() 151 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.
155 class ValidationSchemaExtended(ValidationSchema): 156 transactions: list["Transactions.ValidationSchema"] = Field( 157 default=[], title="User Transactions" 158 ) 159 """Транзакции пользователя.""" 160 161 reports: list["Reports.ValidationSchema"] = Field( 162 default=[], title="User Reports" 163 ) 164 """Обращения пользователя.""" 165 166 notifications: list["Notifications.ValidationSchema"] = Field( 167 default=[], title="User Notifications" 168 ) 169 """Уведомления пользователя."""
Схема валидации для модели данных пользователя.
Эта схема используется для валидации данных, связанных с пользователями.
Уведомления пользователя.
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.
A dictionary of computed field names and their corresponding ComputedFieldInfo
objects.