Edit on GitHub

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))
name_gen = <random_word.random_word.RandomWords object>
class WgConfig(sqlalchemy.inspection.Inspectable[sqlalchemy.orm.state.InstanceState[typing.Any]]):
 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, связанных с пользователями.

WgConfig(**kwargs)

Инициализирует модель конфигурации WireGuard.

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

int: Уникальный идентификатор конфигурации WireGuard.

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

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

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

str: Название конфигурации (по умолчанию генерируется случайным образом).

freeze: sqlalchemy.orm.base.Mapped[db.models.enums.FreezeSteps]

FreezeSteps: Статус заморозки конфигурации (по умолчанию 'no').

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

str: Приватный ключ пользователя для WireGuard.

address: sqlalchemy.orm.base.Mapped[ipaddress.IPv4Interface]

IPv4Interface: IP-адрес конфигурации WireGuard.

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

str: DNS-серверы для конфигурации (по умолчанию '10.0.0.1,9.9.9.9').

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

str: Публичный ключ сервера для WireGuard.

allowed_ips: sqlalchemy.orm.base.Mapped[ipaddress.IPv4Interface]

IPv4Interface: Разрешенные IP-адреса для конфигурации (по умолчанию '0.0.0.0/0').

endpoint_ip: sqlalchemy.orm.base.Mapped[ipaddress.IPv4Address]

IPv4Address: IP-адрес конечной точки WireGuard (по умолчанию из настроек).

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

int: Порт конечной точки WireGuard (по умолчанию из настроек).

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

UserData: Связанные данные пользователя для конфигурации WireGuard.

site_display = [DisplayLookup(mode=None, title=None, on_click=None, 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=GoToEvent(url='/bot/tables/wg_config/?name={name}', query=None, target=None, type='go-to'), field='name', table_width_percent=None), DisplayLookup(mode=None, title=None, on_click=None, field='freeze', table_width_percent=None), DisplayLookup(mode=None, title=None, on_click=None, field='address', table_width_percent=None)]

list[DisplayLookup]: Отображение конфигураций WireGuard на сайте.

site_display_all = [DisplayLookup(mode=None, title=None, on_click=None, 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=GoToEvent(url='/bot/tables/wg_config/?name={name}', query=None, target=None, type='go-to'), field='name', table_width_percent=None), DisplayLookup(mode=None, title=None, on_click=None, field='freeze', table_width_percent=None), DisplayLookup(mode=None, title=None, on_click=None, field='address', table_width_percent=None), DisplayLookup(mode=<DisplayMode.inline_code: 'inline_code'>, title=None, on_click=None, field='user_private_key', table_width_percent=None), DisplayLookup(mode=<DisplayMode.inline_code: 'inline_code'>, title=None, on_click=None, field='server_public_key', table_width_percent=None), DisplayLookup(mode=None, title=None, on_click=None, field='dns', table_width_percent=None), DisplayLookup(mode=None, title=None, on_click=None, field='allowed_ips', table_width_percent=None), DisplayLookup(mode=None, title=None, on_click=None, field='endpoint_ip', table_width_percent=None), DisplayLookup(mode=None, title=None, on_click=None, field='endpoint_port', table_width_percent=None)]

list[DisplayLookup]: Полное отображение конфигураций WireGuard на сайте.

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

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

id: int | None

Уникальный идентификатор конфигурации WireGuard.

user_id: int

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

name: str

Название конфигурации.

freeze: db.models.enums.FreezeSteps

Статус заморозки конфигурации.

user_private_key: str

Приватный ключ пользователя для WireGuard.

address: ipaddress.IPv4Interface

IP-адрес конфигурации WireGuard.

dns: str

DNS-серверы для конфигурации.

server_public_key: str

Публичный ключ сервера для WireGuard.

allowed_ips: ipaddress.IPv4Interface

Разрешенные IP-адреса для конфигурации.

endpoint_ip: ipaddress.IPv4Address

IP-адрес конечной точки WireGuard.

endpoint_port: int

Порт конечной точки WireGuard.

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'), 'name': FieldInfo(annotation=str, required=True, title='Title'), 'freeze': FieldInfo(annotation=FreezeSteps, required=False, default=<FreezeSteps.no: 'no'>, title='Freeze'), 'user_private_key': FieldInfo(annotation=str, required=True, title='User Priv Key'), 'address': FieldInfo(annotation=IPv4Interface, required=True, title='Address'), 'dns': FieldInfo(annotation=str, required=False, default='10.0.0.1,9.9.9.9', title='DNS'), 'server_public_key': FieldInfo(annotation=str, required=True, title='Server Pub Key'), 'allowed_ips': FieldInfo(annotation=IPv4Interface, required=False, default='0.0.0.0/0', title='Allowed IPs'), 'endpoint_ip': FieldInfo(annotation=IPv4Address, required=False, default='185.242.107.63', title='Endpoint IP'), 'endpoint_port': FieldInfo(annotation=int, required=False, default=51830, title='Endpoint Port')}

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.