From 060b2f2d700cd0d7e4aaf8d97159f58a2eeffc0b Mon Sep 17 00:00:00 2001 From: Artem Date: Sat, 21 Jun 2025 23:41:57 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D0=B8=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=BD=D0=BE=D0=B2=D1=8B=D1=85=20=D1=82=D0=B8=D0=BF?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20=D0=B8=20?= =?UTF-8?q?=D1=83=D0=BB=D1=83=D1=87=D1=88=D0=B8=D1=82=D1=8C=20=D0=B2=D0=B0?= =?UTF-8?q?=D0=BB=D0=B8=D0=B4=D0=B0=D1=86=D0=B8=D1=8E=20=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +- pyproject.toml | 2 +- remnawave_api/models/users_bulk_actions.py | 51 +++++++++++++++++----- 3 files changed, 44 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 9c33cab..28e6c21 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,8 @@ pip install git+https://github.com/sm1ky/remnawave-api.git@development | Contract Version | Remnawave Panel Version | | ---------------- | ----------------------- | -| 1.1.2 | >=1.6.3,<=1.6.8 | +| 1.1.3 | >=1.6.12 | +| 1.1.2 | >=1.6.3,<=1.6.11 | | 1.1.1 | 1.6.1, 1.6.2 | | 1.1.0 | 1.6.0 | | 1.0.8 | 1.5.7 | diff --git a/pyproject.toml b/pyproject.toml index ebf352e..917cf61 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "remnawave-api" -version = "1.1.2" +version = "1.1.3" description = "A Python SDK for interacting with the Remnawave API." authors = [ {name = "Artem",email = "sm1ky@forestsnet.com"} diff --git a/remnawave_api/models/users_bulk_actions.py b/remnawave_api/models/users_bulk_actions.py index 1a4efaa..55b450b 100644 --- a/remnawave_api/models/users_bulk_actions.py +++ b/remnawave_api/models/users_bulk_actions.py @@ -1,8 +1,8 @@ from datetime import datetime -from typing import List, Optional +from typing import Annotated, List, Literal, Optional from uuid import UUID -from pydantic import BaseModel, Field +from pydantic import BaseModel, EmailStr, Field, constr from remnawave_api.enums import UserStatus from remnawave_api.enums.users import TrafficLimitStrategy @@ -12,6 +12,10 @@ class BulkUpdateUsersInboundsRequestDto(BaseModel): uuids: List[UUID] active_user_inbounds: List[UUID] = Field(serialization_alias="activeUserInbounds") +TagStr = Annotated[ + str, + Field(min_length=1, max_length=16, pattern=r"^[A-Z0-9_]+$") +] class UpdateUserFields(BaseModel): status: Optional[UserStatus] = None @@ -23,25 +27,52 @@ class UpdateUserFields(BaseModel): ) expire_at: Optional[datetime] = Field(None, serialization_alias="expireAt") description: Optional[str] = None - tag: Optional[str] = None + tag: Optional[TagStr] = Field( + None, + description="Tag for user. Must be uppercase, alphanumeric, and can include underscores. Max length 16 characters." + ) telegram_id: Optional[int] = Field(None, serialization_alias="telegramId") email: Optional[str] = None class BulkAllUpdateUsersRequestDto(BaseModel): - status: Optional[str] = None + status: Optional[Literal["ACTIVE", "DISABLED", "LIMITED", "EXPIRED"]] = Field( + "ACTIVE" + ) + traffic_limit_bytes: Optional[int] = Field( - None, serialization_alias="trafficLimitBytes", strict=True, ge=0 + None, + serialization_alias="trafficLimitBytes", + ge=0, + description="Traffic limit in bytes. 0 - unlimited" ) - traffic_limit_strategy: Optional[str] = Field( - None, serialization_alias="trafficLimitStrategy" + + traffic_limit_strategy: Optional[Literal["NO_RESET", "DAY", "WEEK", "MONTH"]] = Field( + None, + serialization_alias="trafficLimitStrategy", + description="Traffic limit reset strategy" ) - expire_at: Optional[datetime] = Field(None, serialization_alias="expireAt") + + expire_at: Optional[datetime] = Field( + None, + serialization_alias="expireAt", + description="Expiration date" + ) + description: Optional[str] = None - tag: Optional[str] = None - telegram_id: Optional[int] = Field(None, serialization_alias="telegramId") + + telegram_id: Optional[int] = Field( + None, + serialization_alias="telegramId" + ) + email: Optional[str] = None + tag: Optional[TagStr] = Field( + None, + description="Tag for user. Must be uppercase, alphanumeric, and can include underscores. Max length 16 characters." + ) + class BulkResponseDto(BaseModel): affected_rows: int = Field(alias="affectedRows")