src.db.models.wg_config
1from ipaddress import IPv4Address, IPv4Interface 2 3from fastui.components.display import DisplayLookup, DisplayMode 4from fastui.events import GoToEvent 5from pydantic import BaseModel, ConfigDict, Field 6from random_word import RandomWords 7from sqlalchemy import BigInteger, Enum, ForeignKey, String 8from sqlalchemy.dialects.postgresql import CIDR, INET 9from sqlalchemy.orm import Mapped, mapped_column, relationship 10 11from core.config import Base, settings 12from db.models import FreezeSteps 13 14name_gen = RandomWords() 15 16 17class WgConfig(Base): 18 """Модель конфигурации WireGuard. 19 20 Эта модель представляет собой структуру данных для хранения конфигураций 21 WireGuard, связанных с пользователями. 22 """ 23 24 __tablename__ = "wg_config" 25 __table_args__ = {"extend_existing": True} 26 27 id: Mapped[int] = mapped_column(primary_key=True) 28 """int: Уникальный идентификатор конфигурации WireGuard.""" 29 30 user_id: Mapped[int] = mapped_column( 31 ForeignKey("userdata.telegram_id", ondelete="CASCADE"), 32 type_=BigInteger, 33 ) 34 """int: Идентификатор пользователя в Telegram, связанный с конфигурацией.""" 35 36 name: Mapped[str] = mapped_column(default=name_gen.get_random_word, unique=True) 37 """str: Название конфигурации (по умолчанию генерируется случайным образом).""" 38 39 freeze: Mapped[FreezeSteps] = mapped_column( 40 Enum(FreezeSteps, values_callable=lambda obj: [e.value for e in obj]), 41 default=FreezeSteps.no, 42 ) 43 """FreezeSteps: Статус заморозки конфигурации (по умолчанию 'no').""" 44 45 user_private_key: Mapped[str] = mapped_column(String(44)) 46 """str: Приватный ключ пользователя для WireGuard.""" 47 48 address: Mapped[IPv4Interface] = mapped_column(type_=CIDR) 49 """IPv4Interface: IP-адрес конфигурации WireGuard.""" 50 51 dns: Mapped[str] = mapped_column(default="10.0.0.1,9.9.9.9") 52 """str: DNS-серверы для конфигурации (по умолчанию '10.0.0.1,9.9.9.9').""" 53 54 server_public_key: Mapped[str] = mapped_column(String(44)) 55 """str: Публичный ключ сервера для WireGuard.""" 56 57 allowed_ips: Mapped[IPv4Interface] = mapped_column(type_=CIDR, default="0.0.0.0/0") 58 """IPv4Interface: Разрешенные IP-адреса для конфигурации (по умолчанию '0.0.0.0/0').""" 59 60 endpoint_ip: Mapped[IPv4Address] = mapped_column( 61 type_=INET, default=settings.WG_HOST 62 ) 63 """IPv4Address: IP-адрес конечной точки WireGuard (по умолчанию из настроек).""" 64 65 endpoint_port: Mapped[int] = mapped_column(default=settings.WG_PORT) 66 """int: Порт конечной точки WireGuard (по умолчанию из настроек).""" 67 68 conf_connect: Mapped["UserData"] = relationship( # noqa: F821 # type: ignore 69 back_populates="configs", lazy="subquery" 70 ) 71 """UserData: Связанные данные пользователя для конфигурации WireGuard.""" 72 73 class ValidationSchema(BaseModel): 74 """Схема валидации для модели конфигурации WireGuard. 75 76 Эта схема используется для валидации данных, связанных с конфигурациями. 77 """ 78 79 id: int | None = Field(default=None, title="ID") 80 """Уникальный идентификатор конфигурации WireGuard.""" 81 82 user_id: int = Field(title="Telegram ID") 83 """Идентификатор пользователя в Telegram.""" 84 85 name: str = Field(title="Title") 86 """Название конфигурации.""" 87 88 freeze: FreezeSteps = Field(default=FreezeSteps.no, title="Freeze") 89 """Статус заморозки конфигурации.""" 90 91 user_private_key: str = Field(title="User Priv Key") 92 """Приватный ключ пользователя для WireGuard.""" 93 94 address: IPv4Interface = Field(title="Address") 95 """IP-адрес конфигурации WireGuard.""" 96 97 dns: str = Field(default="10.0.0.1,9.9.9.9", title="DNS") 98 """DNS-серверы для конфигурации.""" 99 100 server_public_key: str = Field(title="Server Pub Key") 101 """Публичный ключ сервера для WireGuard.""" 102 103 allowed_ips: IPv4Interface = Field(default="0.0.0.0/0", title="Allowed IPs") 104 """Разрешенные IP-адреса для конфигурации.""" 105 106 endpoint_ip: IPv4Address = Field(default=settings.WG_HOST, title="Endpoint IP") 107 """IP-адрес конечной точки WireGuard.""" 108 109 endpoint_port: int = Field(default=settings.WG_PORT, title="Endpoint Port") 110 """Порт конечной точки WireGuard.""" 111 112 model_config = ConfigDict(extra="ignore") 113 114 # INTERFACE (fastui) 115 site_display = [ 116 DisplayLookup(field="id"), 117 DisplayLookup( 118 field="user_id", 119 mode=DisplayMode.plain, 120 on_click=GoToEvent(url="/bot/tables/userdata/?telegram_id={user_id}"), 121 ), 122 DisplayLookup( 123 field="name", 124 mode=DisplayMode.as_title, 125 on_click=GoToEvent(url="/bot/tables/wg_config/?name={name}"), 126 ), 127 DisplayLookup(field="freeze"), 128 DisplayLookup(field="address"), 129 ] 130 """list[DisplayLookup]: Отображение конфигураций WireGuard на сайте.""" 131 132 site_display_all = site_display + [ 133 DisplayLookup(field="user_private_key", mode=DisplayMode.inline_code), 134 DisplayLookup(field="server_public_key", mode=DisplayMode.inline_code), 135 DisplayLookup(field="dns"), 136 DisplayLookup(field="allowed_ips"), 137 DisplayLookup(field="endpoint_ip"), 138 DisplayLookup(field="endpoint_port"), 139 ] 140 """list[DisplayLookup]: Полное отображение конфигураций WireGuard на сайте.""" 141 142 def __init__(self, **kwargs): 143 """Инициализирует модель конфигурации WireGuard. 144 145 Args: 146 **kwargs: Дополнительные параметры для инициализации модели. 147 """ 148 if kwargs: 149 validated_data = self.ValidationSchema(**kwargs).__dict__ 150 super().__init__(**(validated_data)) 151 else: 152 super().__init__(**(kwargs))
18class WgConfig(Base): 19 """Модель конфигурации WireGuard. 20 21 Эта модель представляет собой структуру данных для хранения конфигураций 22 WireGuard, связанных с пользователями. 23 """ 24 25 __tablename__ = "wg_config" 26 __table_args__ = {"extend_existing": True} 27 28 id: Mapped[int] = mapped_column(primary_key=True) 29 """int: Уникальный идентификатор конфигурации WireGuard.""" 30 31 user_id: Mapped[int] = mapped_column( 32 ForeignKey("userdata.telegram_id", ondelete="CASCADE"), 33 type_=BigInteger, 34 ) 35 """int: Идентификатор пользователя в Telegram, связанный с конфигурацией.""" 36 37 name: Mapped[str] = mapped_column(default=name_gen.get_random_word, unique=True) 38 """str: Название конфигурации (по умолчанию генерируется случайным образом).""" 39 40 freeze: Mapped[FreezeSteps] = mapped_column( 41 Enum(FreezeSteps, values_callable=lambda obj: [e.value for e in obj]), 42 default=FreezeSteps.no, 43 ) 44 """FreezeSteps: Статус заморозки конфигурации (по умолчанию 'no').""" 45 46 user_private_key: Mapped[str] = mapped_column(String(44)) 47 """str: Приватный ключ пользователя для WireGuard.""" 48 49 address: Mapped[IPv4Interface] = mapped_column(type_=CIDR) 50 """IPv4Interface: IP-адрес конфигурации WireGuard.""" 51 52 dns: Mapped[str] = mapped_column(default="10.0.0.1,9.9.9.9") 53 """str: DNS-серверы для конфигурации (по умолчанию '10.0.0.1,9.9.9.9').""" 54 55 server_public_key: Mapped[str] = mapped_column(String(44)) 56 """str: Публичный ключ сервера для WireGuard.""" 57 58 allowed_ips: Mapped[IPv4Interface] = mapped_column(type_=CIDR, default="0.0.0.0/0") 59 """IPv4Interface: Разрешенные IP-адреса для конфигурации (по умолчанию '0.0.0.0/0').""" 60 61 endpoint_ip: Mapped[IPv4Address] = mapped_column( 62 type_=INET, default=settings.WG_HOST 63 ) 64 """IPv4Address: IP-адрес конечной точки WireGuard (по умолчанию из настроек).""" 65 66 endpoint_port: Mapped[int] = mapped_column(default=settings.WG_PORT) 67 """int: Порт конечной точки WireGuard (по умолчанию из настроек).""" 68 69 conf_connect: Mapped["UserData"] = relationship( # noqa: F821 # type: ignore 70 back_populates="configs", lazy="subquery" 71 ) 72 """UserData: Связанные данные пользователя для конфигурации WireGuard.""" 73 74 class ValidationSchema(BaseModel): 75 """Схема валидации для модели конфигурации WireGuard. 76 77 Эта схема используется для валидации данных, связанных с конфигурациями. 78 """ 79 80 id: int | None = Field(default=None, title="ID") 81 """Уникальный идентификатор конфигурации WireGuard.""" 82 83 user_id: int = Field(title="Telegram ID") 84 """Идентификатор пользователя в Telegram.""" 85 86 name: str = Field(title="Title") 87 """Название конфигурации.""" 88 89 freeze: FreezeSteps = Field(default=FreezeSteps.no, title="Freeze") 90 """Статус заморозки конфигурации.""" 91 92 user_private_key: str = Field(title="User Priv Key") 93 """Приватный ключ пользователя для WireGuard.""" 94 95 address: IPv4Interface = Field(title="Address") 96 """IP-адрес конфигурации WireGuard.""" 97 98 dns: str = Field(default="10.0.0.1,9.9.9.9", title="DNS") 99 """DNS-серверы для конфигурации.""" 100 101 server_public_key: str = Field(title="Server Pub Key") 102 """Публичный ключ сервера для WireGuard.""" 103 104 allowed_ips: IPv4Interface = Field(default="0.0.0.0/0", title="Allowed IPs") 105 """Разрешенные IP-адреса для конфигурации.""" 106 107 endpoint_ip: IPv4Address = Field(default=settings.WG_HOST, title="Endpoint IP") 108 """IP-адрес конечной точки WireGuard.""" 109 110 endpoint_port: int = Field(default=settings.WG_PORT, title="Endpoint Port") 111 """Порт конечной точки WireGuard.""" 112 113 model_config = ConfigDict(extra="ignore") 114 115 # INTERFACE (fastui) 116 site_display = [ 117 DisplayLookup(field="id"), 118 DisplayLookup( 119 field="user_id", 120 mode=DisplayMode.plain, 121 on_click=GoToEvent(url="/bot/tables/userdata/?telegram_id={user_id}"), 122 ), 123 DisplayLookup( 124 field="name", 125 mode=DisplayMode.as_title, 126 on_click=GoToEvent(url="/bot/tables/wg_config/?name={name}"), 127 ), 128 DisplayLookup(field="freeze"), 129 DisplayLookup(field="address"), 130 ] 131 """list[DisplayLookup]: Отображение конфигураций WireGuard на сайте.""" 132 133 site_display_all = site_display + [ 134 DisplayLookup(field="user_private_key", mode=DisplayMode.inline_code), 135 DisplayLookup(field="server_public_key", mode=DisplayMode.inline_code), 136 DisplayLookup(field="dns"), 137 DisplayLookup(field="allowed_ips"), 138 DisplayLookup(field="endpoint_ip"), 139 DisplayLookup(field="endpoint_port"), 140 ] 141 """list[DisplayLookup]: Полное отображение конфигураций WireGuard на сайте.""" 142 143 def __init__(self, **kwargs): 144 """Инициализирует модель конфигурации WireGuard. 145 146 Args: 147 **kwargs: Дополнительные параметры для инициализации модели. 148 """ 149 if kwargs: 150 validated_data = self.ValidationSchema(**kwargs).__dict__ 151 super().__init__(**(validated_data)) 152 else: 153 super().__init__(**(kwargs))
Модель конфигурации WireGuard.
Эта модель представляет собой структуру данных для хранения конфигураций WireGuard, связанных с пользователями.
Инициализирует модель конфигурации WireGuard.
Arguments:
- **kwargs: Дополнительные параметры для инициализации модели.
int: Идентификатор пользователя в Telegram, связанный с конфигурацией.
str: Название конфигурации (по умолчанию генерируется случайным образом).
FreezeSteps: Статус заморозки конфигурации (по умолчанию 'no').
IPv4Interface: IP-адрес конфигурации WireGuard.
str: DNS-серверы для конфигурации (по умолчанию '10.0.0.1,9.9.9.9').
IPv4Interface: Разрешенные IP-адреса для конфигурации (по умолчанию '0.0.0.0/0').
IPv4Address: IP-адрес конечной точки WireGuard (по умолчанию из настроек).
int: Порт конечной точки WireGuard (по умолчанию из настроек).
UserData: Связанные данные пользователя для конфигурации WireGuard.
list[DisplayLookup]: Отображение конфигураций WireGuard на сайте.
list[DisplayLookup]: Полное отображение конфигураций WireGuard на сайте.
74 class ValidationSchema(BaseModel): 75 """Схема валидации для модели конфигурации WireGuard. 76 77 Эта схема используется для валидации данных, связанных с конфигурациями. 78 """ 79 80 id: int | None = Field(default=None, title="ID") 81 """Уникальный идентификатор конфигурации WireGuard.""" 82 83 user_id: int = Field(title="Telegram ID") 84 """Идентификатор пользователя в Telegram.""" 85 86 name: str = Field(title="Title") 87 """Название конфигурации.""" 88 89 freeze: FreezeSteps = Field(default=FreezeSteps.no, title="Freeze") 90 """Статус заморозки конфигурации.""" 91 92 user_private_key: str = Field(title="User Priv Key") 93 """Приватный ключ пользователя для WireGuard.""" 94 95 address: IPv4Interface = Field(title="Address") 96 """IP-адрес конфигурации WireGuard.""" 97 98 dns: str = Field(default="10.0.0.1,9.9.9.9", title="DNS") 99 """DNS-серверы для конфигурации.""" 100 101 server_public_key: str = Field(title="Server Pub Key") 102 """Публичный ключ сервера для WireGuard.""" 103 104 allowed_ips: IPv4Interface = Field(default="0.0.0.0/0", title="Allowed IPs") 105 """Разрешенные IP-адреса для конфигурации.""" 106 107 endpoint_ip: IPv4Address = Field(default=settings.WG_HOST, title="Endpoint IP") 108 """IP-адрес конечной точки WireGuard.""" 109 110 endpoint_port: int = Field(default=settings.WG_PORT, title="Endpoint Port") 111 """Порт конечной точки WireGuard.""" 112 113 model_config = ConfigDict(extra="ignore")
Схема валидации для модели конфигурации WireGuard.
Эта схема используется для валидации данных, связанных с конфигурациями.
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.