added external squad
This commit is contained in:
@@ -118,6 +118,8 @@ USER_TRAFFIC_STRATEGY="NO_RESET" # Tr
|
|||||||
|
|
||||||
# Default Internal Squads for Users (Optional, comma-separated UUIDs)
|
# Default Internal Squads for Users (Optional, comma-separated UUIDs)
|
||||||
USER_SQUAD_UUIDS=uuid1,uuid2,uuid3
|
USER_SQUAD_UUIDS=uuid1,uuid2,uuid3
|
||||||
|
# Default External Squad for Users (Optional, single UUID)
|
||||||
|
USER_EXTERNAL_SQUAD_UUID= # Optional: UUID from Remnawave External Squads to auto-link new panel users
|
||||||
|
|
||||||
# Trial Settings
|
# Trial Settings
|
||||||
TRIAL_ENABLED=True # Enable the trial period
|
TRIAL_ENABLED=True # Enable the trial period
|
||||||
|
|||||||
@@ -118,6 +118,7 @@
|
|||||||
| `PANEL_API_KEY` | API ключ для доступа к панели. |
|
| `PANEL_API_KEY` | API ключ для доступа к панели. |
|
||||||
| `PANEL_WEBHOOK_SECRET`| Секретный ключ для проверки вебхуков от панели. |
|
| `PANEL_WEBHOOK_SECRET`| Секретный ключ для проверки вебхуков от панели. |
|
||||||
| `USER_SQUAD_UUIDS` | ID отрядов для новых пользователей. |
|
| `USER_SQUAD_UUIDS` | ID отрядов для новых пользователей. |
|
||||||
|
| `USER_EXTERNAL_SQUAD_UUID` | Опционально. UUID внешнего отряда (External Squad) из [документации Remnawave](https://docs.rw/api), куда автоматически добавляются новые пользователи. |
|
||||||
| `USER_TRAFFIC_LIMIT_GB`| Лимит трафика в ГБ (0 - безлимит). |
|
| `USER_TRAFFIC_LIMIT_GB`| Лимит трафика в ГБ (0 - безлимит). |
|
||||||
| `USER_HWID_DEVICE_LIMIT`| Лимит устройств (HWID) для новых пользователей (0 - безлимит). |
|
| `USER_HWID_DEVICE_LIMIT`| Лимит устройств (HWID) для новых пользователей (0 - безлимит). |
|
||||||
|
|
||||||
|
|||||||
@@ -339,6 +339,7 @@ class PanelApiService:
|
|||||||
default_traffic_limit_strategy: str = "NO_RESET",
|
default_traffic_limit_strategy: str = "NO_RESET",
|
||||||
hwid_device_limit: Optional[int] = None,
|
hwid_device_limit: Optional[int] = None,
|
||||||
specific_squad_uuids: Optional[List[str]] = None,
|
specific_squad_uuids: Optional[List[str]] = None,
|
||||||
|
external_squad_uuid: Optional[str] = None,
|
||||||
description: Optional[str] = None,
|
description: Optional[str] = None,
|
||||||
tag: Optional[str] = None,
|
tag: Optional[str] = None,
|
||||||
status: str = "ACTIVE",
|
status: str = "ACTIVE",
|
||||||
@@ -383,6 +384,8 @@ class PanelApiService:
|
|||||||
)
|
)
|
||||||
if specific_squad_uuids:
|
if specific_squad_uuids:
|
||||||
payload["activeInternalSquads"] = specific_squad_uuids
|
payload["activeInternalSquads"] = specific_squad_uuids
|
||||||
|
if external_squad_uuid:
|
||||||
|
payload["externalSquadUuid"] = external_squad_uuid
|
||||||
if telegram_id is not None: payload["telegramId"] = telegram_id
|
if telegram_id is not None: payload["telegramId"] = telegram_id
|
||||||
if email: payload["email"] = email
|
if email: payload["email"] = email
|
||||||
if description: payload["description"] = description
|
if description: payload["description"] = description
|
||||||
|
|||||||
@@ -125,6 +125,7 @@ class SubscriptionService:
|
|||||||
(db_user.last_name or "") if db_user else "",
|
(db_user.last_name or "") if db_user else "",
|
||||||
]),
|
]),
|
||||||
specific_squad_uuids=self.settings.parsed_user_squad_uuids,
|
specific_squad_uuids=self.settings.parsed_user_squad_uuids,
|
||||||
|
external_squad_uuid=self.settings.parsed_user_external_squad_uuid,
|
||||||
default_traffic_limit_bytes=self.settings.user_traffic_limit_bytes,
|
default_traffic_limit_bytes=self.settings.user_traffic_limit_bytes,
|
||||||
default_traffic_limit_strategy=self.settings.USER_TRAFFIC_STRATEGY,
|
default_traffic_limit_strategy=self.settings.USER_TRAFFIC_STRATEGY,
|
||||||
)
|
)
|
||||||
@@ -153,6 +154,7 @@ class SubscriptionService:
|
|||||||
(db_user.last_name or "") if db_user else "",
|
(db_user.last_name or "") if db_user else "",
|
||||||
]),
|
]),
|
||||||
specific_squad_uuids=self.settings.parsed_user_squad_uuids,
|
specific_squad_uuids=self.settings.parsed_user_squad_uuids,
|
||||||
|
external_squad_uuid=self.settings.parsed_user_external_squad_uuid,
|
||||||
default_traffic_limit_bytes=self.settings.user_traffic_limit_bytes,
|
default_traffic_limit_bytes=self.settings.user_traffic_limit_bytes,
|
||||||
default_traffic_limit_strategy=self.settings.USER_TRAFFIC_STRATEGY,
|
default_traffic_limit_strategy=self.settings.USER_TRAFFIC_STRATEGY,
|
||||||
)
|
)
|
||||||
@@ -915,4 +917,6 @@ class SubscriptionService:
|
|||||||
payload["trafficLimitStrategy"] = self.settings.USER_TRAFFIC_STRATEGY
|
payload["trafficLimitStrategy"] = self.settings.USER_TRAFFIC_STRATEGY
|
||||||
if self.settings.parsed_user_squad_uuids:
|
if self.settings.parsed_user_squad_uuids:
|
||||||
payload["activeInternalSquads"] = self.settings.parsed_user_squad_uuids
|
payload["activeInternalSquads"] = self.settings.parsed_user_squad_uuids
|
||||||
|
if self.settings.parsed_user_external_squad_uuid:
|
||||||
|
payload["externalSquadUuid"] = self.settings.parsed_user_external_squad_uuid
|
||||||
return payload
|
return payload
|
||||||
|
|||||||
@@ -133,6 +133,10 @@ class Settings(BaseSettings):
|
|||||||
default=None,
|
default=None,
|
||||||
description=
|
description=
|
||||||
"Comma-separated UUIDs of internal squads to assign to new panel users")
|
"Comma-separated UUIDs of internal squads to assign to new panel users")
|
||||||
|
USER_EXTERNAL_SQUAD_UUID: Optional[str] = Field(
|
||||||
|
default=None,
|
||||||
|
description=
|
||||||
|
"UUID of the external squad to assign to new panel users (optional)")
|
||||||
|
|
||||||
TRIAL_ENABLED: bool = Field(default=True)
|
TRIAL_ENABLED: bool = Field(default=True)
|
||||||
TRIAL_DURATION_DAYS: int = Field(default=3)
|
TRIAL_DURATION_DAYS: int = Field(default=3)
|
||||||
@@ -215,6 +219,15 @@ class Settings(BaseSettings):
|
|||||||
]
|
]
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
@computed_field
|
||||||
|
@property
|
||||||
|
def parsed_user_external_squad_uuid(self) -> Optional[str]:
|
||||||
|
if self.USER_EXTERNAL_SQUAD_UUID:
|
||||||
|
cleaned = self.USER_EXTERNAL_SQUAD_UUID.strip()
|
||||||
|
if cleaned:
|
||||||
|
return cleaned
|
||||||
|
return None
|
||||||
|
|
||||||
@computed_field
|
@computed_field
|
||||||
@property
|
@property
|
||||||
def yookassa_webhook_path(self) -> str:
|
def yookassa_webhook_path(self) -> str:
|
||||||
|
|||||||
Reference in New Issue
Block a user