Единая интернационализация сервера без доменов

This commit is contained in:
parent f0d5481dfe
commit ec054bbaad
29 changed files with 1313 additions and 1412 deletions

View file

@ -16,7 +16,7 @@ auth_service = AuthService()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/auth/login")
@router.post("/register", response_model=UserResponse)
async def register(user: UserCreate, translations: Translations = Depends(get_translations("api_v1"))):
async def register(user: UserCreate, translations: Translations = Depends(get_translations())):
"""Регистрирует нового пользователя.
Создаёт нового пользователя на основе предоставленных данных и возвращает
@ -44,7 +44,7 @@ async def register(user: UserCreate, translations: Translations = Depends(get_tr
raise HTTPException(status_code=500, detail=translations.gettext("Не удалось зарегистрировать пользователя"))
@router.post("/login", response_model=Token)
async def login(user: UserLogin, request: Request, translations: Translations = Depends(get_translations("api_v1"))):
async def login(user: UserLogin, request: Request, translations: Translations = Depends(get_translations())):
"""Авторизует пользователя и создаёт сессию.
Проверяет учетные данные пользователя и возвращает токен и session_id для
@ -75,7 +75,7 @@ async def login(user: UserLogin, request: Request, translations: Translations =
raise HTTPException(status_code=500, detail=translations.gettext("Не удалось авторизовать пользователя"))
@router.get("/me")
async def get_current_user(request: Request, translations: Translations = Depends(get_translations("api_v1"))):
async def get_current_user(request: Request, translations: Translations = Depends(get_translations())):
"""Возвращает данные текущего пользователя и токен.
Проверяет активную сессию по client_id и возвращает информацию о пользователе
@ -109,7 +109,7 @@ async def get_current_user(request: Request, translations: Translations = Depend
raise HTTPException(status_code=500, detail=translations.gettext("Не удалось получить данные пользователя"))
@router.get("/logout")
async def logout(request: Request, translations: Translations = Depends(get_translations("api_v1"))):
async def logout(request: Request, translations: Translations = Depends(get_translations())):
"""Выход из системы, удаление сессии.
Удаляет активную сессию пользователя по client_id.
@ -136,7 +136,7 @@ async def logout(request: Request, translations: Translations = Depends(get_tran
raise HTTPException(status_code=500, detail=translations.gettext("Не удалось выйти из системы"))
@router.get("/check_json")
async def check_users_file(translations: Translations = Depends(get_translations("api_v1"))):
async def check_users_file(translations: Translations = Depends(get_translations())):
"""Проверяет, существует ли файл users.json и содержит ли он пользователей.
Возвращает информацию о состоянии файла и наличии пользователей.

View file

@ -1,14 +1,14 @@
from typing import Dict, Any
from fastapi import APIRouter, Body, HTTPException, Depends
from services.ip_service import IPService
from utils.i18n import get_translations, _
from utils.i18n import get_translations
from babel.support import Translations
router = APIRouter()
ip_service = IPService()
@router.post("/check_ip")
async def check_ip_config(data: Dict[str, Any] = Body(...), translations: Translations = Depends(get_translations("api_v1"))):
async def check_ip_config(data: Dict[str, Any] = Body(...), translations: Translations = Depends(get_translations())):
"""Проверяет доступность IP-адреса перед его применением.
Выполняет ARP-сканирование для проверки, занят ли указанный IP-адрес,
@ -28,7 +28,7 @@ async def check_ip_config(data: Dict[str, Any] = Body(...), translations: Transl
HTTPException: Если произошла внутренняя ошибка (status_code=500).
"""
try:
result = await ip_service.check_ip_config(data)
result = await ip_service.check_ip_config(data, translations)
return result
except Exception as e:
raise HTTPException(
@ -37,7 +37,7 @@ async def check_ip_config(data: Dict[str, Any] = Body(...), translations: Transl
)
@router.post("/apply_ip")
async def apply_ip_config(data: Dict[str, Any] = Body(...), translations: Translations = Depends(get_translations("api_v1"))):
async def apply_ip_config(data: Dict[str, Any] = Body(...), translations: Translations = Depends(get_translations())):
"""Применяет проверенные IP-настройки к указанному сетевому профилю.
Обновляет настройки соединения через NetworkManager, отключает и
@ -58,7 +58,7 @@ async def apply_ip_config(data: Dict[str, Any] = Body(...), translations: Transl
произошла внутренняя ошибка (status_code=500).
"""
try:
await ip_service.apply_ip_config(data)
await ip_service.apply_ip_config(data, translations)
return {
"success": True,
"message": translations.gettext("Настройки сетевого профиля для {connection_id} применены").format(
@ -74,7 +74,7 @@ async def apply_ip_config(data: Dict[str, Any] = Body(...), translations: Transl
)
@router.post("/save_ip")
async def save_ip_config(data: Dict[str, Any] = Body(...), translations: Translations = Depends(get_translations("api_v1"))):
async def save_ip_config(data: Dict[str, Any] = Body(...), translations: Translations = Depends(get_translations())):
"""Применяет проверенные IP-настройки для отката сетевого профиля.
Используется для сохранения и отката настроек сетевого профиля к предыдущему
@ -95,7 +95,7 @@ async def save_ip_config(data: Dict[str, Any] = Body(...), translations: Transla
произошла внутренняя ошибка (status_code=500).
"""
try:
await ip_service.apply_ip_config(data)
await ip_service.apply_ip_config(data, translations)
return {
"success": True,
"message": translations.gettext("Настройки сетевого профиля для {connection_id} применены").format(

View file

@ -44,7 +44,7 @@ class ContainerPositionManager:
},
}
def get_position_and_state(self, container_name: str, translations: Translations = Depends(get_translations("api_v1"))) -> Tuple[int, int, bool]:
def get_position_and_state(self, container_name: str, translations: Translations = Depends(get_translations())) -> Tuple[int, int, bool]:
"""Получает текущие координаты и состояние указанного контейнера.
Args:
@ -79,7 +79,7 @@ class ContainerPositionManager:
container_manager = ContainerPositionManager()
async def get_network_data(translations: Translations = Depends(get_translations("api_v1"))) -> Dict[str, Dict]:
async def get_network_data(translations: Translations = Depends(get_translations())) -> Dict[str, Dict]:
"""Возвращает текущие сетевые данные в виде словаря.
Получает данные о сетевых интерфейсах, разделяет их на активные и неактивные,
@ -150,7 +150,7 @@ def _split_interfaces(
return activation_interfaces, deactivation_interfaces
@router.post("/update_container_position")
async def update_container_position(data: Dict[str, Union[int, bool]] = Body(...), translations: Translations = Depends(get_translations("api_v1"))):
async def update_container_position(data: Dict[str, Union[int, bool]] = Body(...), translations: Translations = Depends(get_translations())):
"""Обновляет позицию и состояние контейнера.
Принимает данные о новом положении и состоянии контейнера и обновляет их
@ -203,7 +203,7 @@ async def update_container_position(data: Dict[str, Union[int, bool]] = Body(...
raise HTTPException(status_code=400, detail=translations.gettext("Не удалось обновить положение контейнера: {error}").format(error=str(e)))
@router.get("/get_hostname")
async def get_hostname(translations: Translations = Depends(get_translations("api_v1"))):
async def get_hostname(translations: Translations = Depends(get_translations())):
"""Возвращает имя хоста системы.
Выполняет запрос к сервису для получения имени хоста.

View file

@ -3,10 +3,9 @@ import logging
from fastapi import APIRouter, HTTPException, Depends, Response, Request
from starlette.responses import FileResponse
from services.settings_service import SettingsService
from utils.i18n import get_translations, _
from utils.i18n import get_translations
from babel.support import Translations
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
@ -14,7 +13,7 @@ router = APIRouter()
settings_service = SettingsService()
@router.post("/clear_subnet")
def clear_subnet(translations: Translations = Depends(get_translations("api_v1"))):
def clear_subnet(translations: Translations = Depends(get_translations())):
"""Очищает данные узлов подсети, сохранённые в devices.json.
Удаляет все записи об узлах подсети, оставляя файл пустым.
@ -39,7 +38,7 @@ def clear_subnet(translations: Translations = Depends(get_translations("api_v1")
raise HTTPException(status_code=500, detail=translations.gettext("Ошибка очистки: {error}").format(error=str(e)))
@router.post("/clear_wifi")
def clear_wifi(translations: Translations = Depends(get_translations("api_v1"))):
def clear_wifi(translations: Translations = Depends(get_translations())):
"""Очищает данные точек доступа Wi-Fi, сохранённые в wifi.json.
Удаляет все записи о точках доступа, оставляя файл пустым.
@ -64,7 +63,7 @@ def clear_wifi(translations: Translations = Depends(get_translations("api_v1")))
raise HTTPException(status_code=500, detail=translations.gettext("Ошибка очистки: {error}").format(error=str(e)))
@router.post("/clear_all_data")
def clear_all_data(translations: Translations = Depends(get_translations("api_v1"))):
def clear_all_data(translations: Translations = Depends(get_translations())):
"""Очищает данные узлов подсети и точек доступа Wi-Fi в обоих файлах.
Удаляет все записи из devices.json и wifi.json.
@ -92,7 +91,7 @@ DEVICE_PATH = "storage/devices/devices.json"
WIFI_PATH = "storage/wifi/wifi.json"
@router.get("/export_devices", response_class=FileResponse)
async def export_devices(translations: Translations = Depends(get_translations("api_v1"))):
async def export_devices(translations: Translations = Depends(get_translations())):
"""
Экспортирует файл с данными устройств в формате JSON.
@ -116,7 +115,7 @@ async def export_devices(translations: Translations = Depends(get_translations("
)
@router.get("/export_wifi", response_class=FileResponse)
async def export_wifi(translations: Translations = Depends(get_translations("api_v1"))):
async def export_wifi(translations: Translations = Depends(get_translations())):
"""
Экспортирует файл с данными устройств в формате JSON.
@ -140,7 +139,7 @@ async def export_wifi(translations: Translations = Depends(get_translations("api
)
@router.post("/set_language")
def set_language(locale: str, response: Response, translations: Translations = Depends(get_translations("api_v1"))):
def set_language(locale: str, response: Response, translations: Translations = Depends(get_translations())):
"""
Устанавливает куку locale для смены языка пользователя.

View file

@ -16,7 +16,7 @@ logger = logging.getLogger(__name__)
@router.post("/devices", response_model=SubnetScanResult)
def scan_subnet(request: SubnetScanRequest = Body(...), translations: Translations = Depends(get_translations("api_v1"))):
def scan_subnet(request: SubnetScanRequest = Body(...), translations: Translations = Depends(get_translations())):
"""Сканирует локальную подсеть и возвращает данные об устройствах.
Выполняет сканирование указанной подсети для обнаружения активных устройств.
@ -45,7 +45,7 @@ def scan_subnet(request: SubnetScanRequest = Body(...), translations: Translatio
raise HTTPException(status_code=500, detail=translations.gettext("Ошибка сканирования: {error}").format(error=str(e)))
@router.get("/wifi", response_model=WifiScanResult)
def scan_wifi(timeout: int = 30, translations: Translations = Depends(get_translations("api_v1"))):
def scan_wifi(timeout: int = 30, translations: Translations = Depends(get_translations())):
"""Сканирует Wi-Fi точки доступа и возвращает данные о них.
Выполняет сканирование доступных Wi-Fi сетей с указанным таймаутом.
@ -68,7 +68,7 @@ def scan_wifi(timeout: int = 30, translations: Translations = Depends(get_transl
raise HTTPException(status_code=500, detail=translations.gettext("Ошибка сканирования Wi-Fi: {error}").format(error=str(e)))
@router.post("/devices/{mac}/note")
def add_note(mac: str, request: NoteRequest, translations: Translations = Depends(get_translations("api_v1"))):
def add_note(mac: str, request: NoteRequest, translations: Translations = Depends(get_translations())):
"""Добавляет заметку для устройства по MAC-адресу.
Привязывает заметку к устройству, идентифицируемому по MAC-адресу.
@ -100,7 +100,7 @@ def add_note(mac: str, request: NoteRequest, translations: Translations = Depend
raise HTTPException(status_code=500, detail=translations.gettext("Ошибка добавления заметки: {error}").format(error=str(e)))
@router.put("/devices/{mac}/note")
def update_note(mac: str, request: NoteRequest, translations: Translations = Depends(get_translations("api_v1"))):
def update_note(mac: str, request: NoteRequest, translations: Translations = Depends(get_translations())):
"""Обновляет заметку для устройства по MAC-адресу.
Изменяет существующую заметку, привязанную к устройству.
@ -132,7 +132,7 @@ def update_note(mac: str, request: NoteRequest, translations: Translations = Dep
raise HTTPException(status_code=500, detail=translations.gettext("Ошибка обновления заметки: {error}").format(error=str(e)))
@router.delete("/devices/{mac}/note")
def delete_note(mac: str, translations: Translations = Depends(get_translations("api_v1"))):
def delete_note(mac: str, translations: Translations = Depends(get_translations())):
"""Удаляет заметку для устройства по MAC-адресу.
Удаляет привязанную заметку для указанного устройства.
@ -163,7 +163,7 @@ def delete_note(mac: str, translations: Translations = Depends(get_translations(
raise HTTPException(status_code=500, detail=translations.gettext("Ошибка удаления заметки: {error}").format(error=str(e)))
@router.post("/wifi/{ssid}/note")
def add_wifi_note(ssid: str, request: NoteRequest, translations: Translations = Depends(get_translations("api_v1"))):
def add_wifi_note(ssid: str, request: NoteRequest, translations: Translations = Depends(get_translations())):
"""Добавляет заметку для сети Wi-Fi по SSID.
Привязывает заметку к Wi-Fi сети, идентифицируемой по SSID.
@ -195,7 +195,7 @@ def add_wifi_note(ssid: str, request: NoteRequest, translations: Translations =
raise HTTPException(status_code=500, detail=translations.gettext("Ошибка добавления заметки: {error}").format(error=str(e)))
@router.put("/wifi/{ssid}/note")
def update_wifi_note(ssid: str, request: NoteRequest, translations: Translations = Depends(get_translations("api_v1"))):
def update_wifi_note(ssid: str, request: NoteRequest, translations: Translations = Depends(get_translations())):
"""Обновляет заметку для сети Wi-Fi по SSID.
Изменяет существующую заметку, привязанную к Wi-Fi сети.
@ -227,7 +227,7 @@ def update_wifi_note(ssid: str, request: NoteRequest, translations: Translations
raise HTTPException(status_code=500, detail=translations.gettext("Ошибка обновления заметки: {error}").format(error=str(e)))
@router.delete("/wifi/{ssid}/note")
def delete_wifi_note(ssid: str, translations: Translations = Depends(get_translations("api_v1"))):
def delete_wifi_note(ssid: str, translations: Translations = Depends(get_translations())):
"""Удаляет заметку для сети Wi-Fi по SSID.
Удаляет привязанную заметку для указанной Wi-Fi сети.
@ -258,7 +258,7 @@ def delete_wifi_note(ssid: str, translations: Translations = Depends(get_transla
raise HTTPException(status_code=500, detail=translations.gettext("Ошибка удаления заметки: {error}").format(error=str(e)))
@router.post("/wifi/connect")
def connect_to_wifi(request: WifiConnectRequest, translations: Translations = Depends(get_translations("api_v1"))):
def connect_to_wifi(request: WifiConnectRequest, translations: Translations = Depends(get_translations())):
"""Подключается к Wi-Fi сети по SSID и паролю.
Выполняет подключение к указанной Wi-Fi сети с использованием предоставленных
@ -286,7 +286,7 @@ def connect_to_wifi(request: WifiConnectRequest, translations: Translations = De
raise HTTPException(status_code=500, detail=translations.gettext("Ошибка подключения к Wi-Fi: {error}").format(error=str(e)))
@router.post("/wifi/disconnect")
def disconnect_from_wifi(request: WifiDisconnectRequest, translations: Translations = Depends(get_translations("api_v1"))):
def disconnect_from_wifi(request: WifiDisconnectRequest, translations: Translations = Depends(get_translations())):
"""Отключается от Wi-Fi сети по указанному SSID.
Выполняет отключение от указанной Wi-Fi сети.
@ -313,7 +313,7 @@ def disconnect_from_wifi(request: WifiDisconnectRequest, translations: Translati
raise HTTPException(status_code=500, detail=translations.gettext("Ошибка отключения от Wi-Fi: {error}").format(error=str(e)))
@router.get("/wifi/status")
def get_wifi_status(translations: Translations = Depends(get_translations("api_v1"))):
def get_wifi_status(translations: Translations = Depends(get_translations())):
"""Проверяет статус текущего подключения к Wi-Fi.
Возвращает информацию о текущем состоянии подключения и SSID, если подключение активно.

View file

@ -78,7 +78,7 @@ class WebSocketManager:
manager = WebSocketManager()
@router.websocket("/api/v1")
async def websocket_endpoint(websocket: WebSocket, translations: Translations = Depends(get_translations("api_v1"))):
async def websocket_endpoint(websocket: WebSocket, translations: Translations = Depends(get_translations())):
"""Обработчик WebSocket-соединения.
Управляет соединением клиента, принимает данные для обновления позиций
@ -126,7 +126,7 @@ async def startup_event():
"""
asyncio.create_task(broadcast_data())
async def broadcast_data(translations: Translations = Depends(get_translations("api_v1"))):
async def broadcast_data(translations: Translations = Depends(get_translations())):
"""Таск для периодической трансляции сетевых данных.
Выполняет сканирование сети и отправляет данные всем подключённым клиентам