import enum import uuid from datetime import date from typing import Annotated from pydantic import BaseModel, Field from pydantic_extra_types.phone_numbers import PhoneNumberValidator from pydantic_filters import BaseFilter PhoneNumber = Annotated[str, PhoneNumberValidator(number_format="E164")] class BankEnum(enum.Enum): T_BANK = "t-bank" SBER = "sber" ALFA_BANK = "alfa-bank" class PaymentData(BaseModel): phone: PhoneNumber bank: BankEnum class User(BaseModel): id: uuid.UUID = Field(default_factory=uuid.uuid4) name: str | None = None birthday: date | None = None gift_payment_data: PaymentData | None = None phone: PhoneNumber | None = None telegram_id: int | None = None class UserFilter(BaseFilter): id: set[uuid.UUID] id__gt: uuid.UUID phone: set[PhoneNumber] telegram_id: set[int] class Pool(BaseModel): id: uuid.UUID = Field(default_factory=uuid.uuid4) owner_id: uuid.UUID birthday_user_id: uuid.UUID description: str | None = None payment_data: PaymentData owner: User | None = None birthday_user: User | None = None class PoolFilter(BaseFilter): id: set[uuid.UUID] id__gt: uuid.UUID owner_id: set[uuid.UUID] birthday_user_id: set[uuid.UUID] class Subscription(BaseModel): from_user_id: uuid.UUID to_user_id: uuid.UUID name: str pool_id: uuid.UUID | None = None from_user: User | None = None to_user: User | None = None pool: Pool | None = None class SubscriptionFilter(BaseFilter): from_user_id: set[uuid.UUID] from_user_id__gt: uuid.UUID to_user_id: set[uuid.UUID] to_user_id__gt: uuid.UUID pool_id: set[uuid.UUID] pool_id__null: bool