repair translations

This commit is contained in:
parent 98581132dd
commit 84adc5d941
18 changed files with 304 additions and 122 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())):
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())):
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())):
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())):
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())):
async def check_users_file(translations: Translations = Depends(get_translations)):
"""Проверяет, существует ли файл users.json и содержит ли он пользователей.
Возвращает информацию о состоянии файла и наличии пользователей.
@ -180,4 +180,4 @@ async def check_users_file(translations: Translations = Depends(get_translations
}
except Exception as e:
logger.error(f"Ошибка при проверке файла: {type(e).__name__} - {str(e)}")
raise HTTPException(status_code=500, detail=translations.gettext("Ошибка при проверке файла"))
raise HTTPException(status_code=500, detail=translations.gettext("Ошибка при проверке файла"))

View file

@ -8,7 +8,7 @@ router = APIRouter()
ip_service = IPService()
@router.post("/check_ip")
async def check_ip_config(data: Dict[str, Any] = Body(...), translations: Translations = Depends(get_translations())):
async def check_ip_config(data: Dict[str, Any] = Body(...), translations: Translations = Depends(get_translations)):
"""Проверяет доступность IP-адреса перед его применением.
Выполняет ARP-сканирование для проверки, занят ли указанный IP-адрес,
@ -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())):
async def apply_ip_config(data: Dict[str, Any] = Body(...), translations: Translations = Depends(get_translations)):
"""Применяет проверенные IP-настройки к указанному сетевому профилю.
Обновляет настройки соединения через NetworkManager, отключает и
@ -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())):
async def save_ip_config(data: Dict[str, Any] = Body(...), translations: Translations = Depends(get_translations)):
"""Применяет проверенные IP-настройки для отката сетевого профиля.
Используется для сохранения и отката настроек сетевого профиля к предыдущему
@ -108,4 +108,4 @@ async def save_ip_config(data: Dict[str, Any] = Body(...), translations: Transla
raise HTTPException(
status_code=500,
detail=translations.gettext("Ошибка проверки IP конфигурации: {error}").format(error=str(e))
)
)

View file

@ -9,7 +9,7 @@ from models.network import (
NetworkInterface,
WiFiDevice,
)
from utils.i18n import get_translations, _
from utils.i18n import get_translations, _, _load_translations
from babel.support import Translations
logging.basicConfig(level=logging.INFO)
@ -44,7 +44,7 @@ class ContainerPositionManager:
},
}
def get_position_and_state(self, container_name: str, translations: Translations = None) -> Tuple[int, int, bool]:
def get_position_and_state(self, container_name: str, translations: Translations) -> Tuple[int, int, bool]:
"""Получает текущие координаты и состояние указанного контейнера.
Args:
@ -57,7 +57,6 @@ class ContainerPositionManager:
Raises:
ValueError: Если указан неверный идентификатор контейнера.
"""
translations = translations or get_translations()()
container = self.positions.get(container_name)
if not container:
raise ValueError(translations.gettext("Неверное имя контейнера: {container_name}").format(container_name=container_name))
@ -80,7 +79,7 @@ class ContainerPositionManager:
container_manager = ContainerPositionManager()
async def get_network_data(translations: Translations = None) -> Dict[str, Dict]:
async def get_network_data(translations: Translations = Depends(get_translations)) -> Dict[str, Dict]:
"""Возвращает текущие сетевые данные в виде словаря.
Получает данные о сетевых интерфейсах, разделяет их на активные и неактивные,
@ -97,15 +96,14 @@ async def get_network_data(translations: Translations = None) -> Dict[str, Dict]
Raises:
HTTPException: Если произошла ошибка при получении данных (status_code=500).
"""
translations = translations or get_translations()()
logger.debug("Calling get_network_data()")
try:
network_data = await network_service.get_network_interfaces_container()
activation_interfaces, deactivation_interfaces = _split_interfaces(network_data.interfaces)
activation_x, activation_y, activation_is_open = (container_manager.get_position_and_state("activation"))
deactivation_x, deactivation_y, deactivation_is_open = (container_manager.get_position_and_state("deactivation"))
activation_x, activation_y, activation_is_open = container_manager.get_position_and_state("activation", translations)
deactivation_x, deactivation_y, deactivation_is_open = container_manager.get_position_and_state("deactivation", translations)
activation = Activation(
id=1,
@ -152,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 = None):
async def update_container_position(data: Dict[str, Union[int, bool]] = Body(...), translations: Translations = Depends(get_translations)):
"""Обновляет позицию и состояние контейнера.
Принимает данные о новом положении и состоянии контейнера и обновляет их
@ -175,7 +173,6 @@ async def update_container_position(data: Dict[str, Union[int, bool]] = Body(...
HTTPException: Если отсутствуют обязательные поля (status_code=400) или
типы данных неверны.
"""
translations = translations or get_translations()()
try:
required_keys = [
"container_id", "container_x", "container_y", "isOpen"
@ -206,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())):
async def get_hostname(translations: Translations = Depends(get_translations)):
"""Возвращает имя хоста системы.
Выполняет запрос к сервису для получения имени хоста.

View file

@ -16,7 +16,7 @@ router = APIRouter()
settings_service = SettingsService()
@router.post("/clear_subnet")
def clear_subnet(subnet: Optional[str] = None, translations: Translations = Depends(get_translations())):
def clear_subnet(subnet: Optional[str] = None, translations: Translations = Depends(get_translations)):
"""Очищает данные узлов подсети, сохранённые в devices.json.
Удаляет все записи об узлах подсети, оставляя файл пустым.
@ -46,7 +46,7 @@ def clear_subnet(subnet: Optional[str] = None, translations: Translations = Depe
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())):
def clear_wifi(translations: Translations = Depends(get_translations)):
"""Очищает данные точек доступа Wi-Fi, сохранённые в wifi.json.
Удаляет все записи о точках доступа, оставляя файл пустым.
@ -71,7 +71,7 @@ def clear_wifi(translations: Translations = Depends(get_translations())):
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())):
def clear_all_data(translations: Translations = Depends(get_translations)):
"""Очищает данные узлов подсети и точек доступа Wi-Fi в обоих файлах.
Удаляет все записи из devices.json и wifi.json.
@ -98,7 +98,7 @@ def clear_all_data(translations: Translations = Depends(get_translations())):
WIFI_PATH = "storage/wifi/wifi.json"
@router.post("/export_devices", response_class=FileResponse)
async def export_devices(request: SubnetScanRequest = Body(...), translations: Translations = Depends(get_translations())):
async def export_devices(request: SubnetScanRequest = Body(...), translations: Translations = Depends(get_translations)):
"""
Экспортирует файл с данными устройств в формате JSON для указанной подсети.
@ -125,7 +125,7 @@ async def export_devices(request: SubnetScanRequest = Body(...), translations: T
)
@router.get("/export_wifi", response_class=FileResponse)
async def export_wifi(translations: Translations = Depends(get_translations())):
async def export_wifi(translations: Translations = Depends(get_translations)):
"""
Экспортирует файл с данными устройств в формате JSON.
@ -149,7 +149,7 @@ async def export_wifi(translations: Translations = Depends(get_translations())):
)
@router.post("/set_language")
def set_language(locale: str, response: Response, translations: Translations = Depends(get_translations())):
def set_language(locale: str, response: Response, translations: Translations = Depends(get_translations)):
"""
Устанавливает куку locale для смены языка пользователя.
@ -177,7 +177,7 @@ def set_language(locale: str, response: Response, translations: Translations = D
return {"message": translations.gettext("Язык успешно установлен: {locale}").format(locale=locale)}
@router.get("/get_system_language")
async def get_system_language(request: Request, translations: Translations = Depends(get_translations())):
async def get_system_language(request: Request, translations: Translations = Depends(get_translations)):
"""Выводит текущий язык, установленный в системе на основе locale.
Выполняет команду 'locale' в системе и извлекает параметры LANG
@ -206,4 +206,4 @@ async def get_system_language(request: Request, translations: Translations = Dep
raise HTTPException(status_code=500, detail=translations.gettext("Не удалось определить язык в системе"))
except Exception as e:
logger.error(f"Unexpected error getting system language: {str(e)}")
raise HTTPException(status_code=500, detail=translations.gettext("Ошибка при определении языка в системе {error}").format(error=str(e)))
raise HTTPException(status_code=500, detail=translations.gettext("Ошибка при определении языка в системе {error}").format(error=str(e)))

View file

@ -15,7 +15,7 @@ logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
@router.post("/devices", response_model=SubnetScanResult)
def scan_subnet(request: SubnetScanRequest = Body(...), subnet_service: SubnetService = Depends(get_subnet_service), translations: Translations = Depends(get_translations())):
def scan_subnet(request: SubnetScanRequest = Body(...), subnet_service: SubnetService = Depends(get_subnet_service), translations: Translations = Depends(get_translations)):
"""Сканирует локальную подсеть и возвращает данные об устройствах.
Выполняет сканирование указанной подсети для обнаружения активных устройств.
@ -44,7 +44,7 @@ def scan_subnet(request: SubnetScanRequest = Body(...), subnet_service: SubnetSe
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())):
def scan_wifi(timeout: int = 30, translations: Translations = Depends(get_translations)):
"""Сканирует Wi-Fi точки доступа и возвращает данные о них.
Выполняет сканирование доступных Wi-Fi сетей с указанным таймаутом.
@ -67,7 +67,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, subnet_service: SubnetService = Depends(get_subnet_service), translations: Translations = Depends(get_translations())):
def add_note(mac: str, request: NoteRequest, subnet_service: SubnetService = Depends(get_subnet_service), translations: Translations = Depends(get_translations)):
"""Добавляет заметку для устройства по MAC-адресу.
Привязывает заметку к устройству, идентифицируемому по MAC-адресу.
@ -101,7 +101,7 @@ def add_note(mac: str, request: NoteRequest, subnet_service: SubnetService = Dep
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, subnet_service: SubnetService = Depends(get_subnet_service), translations: Translations = Depends(get_translations())):
def update_note(mac: str, request: NoteRequest, subnet_service: SubnetService = Depends(get_subnet_service), translations: Translations = Depends(get_translations)):
"""Обновляет заметку для устройства по MAC-адресу.
Изменяет существующую заметку, привязанную к устройству.
@ -135,7 +135,7 @@ def update_note(mac: str, request: NoteRequest, subnet_service: SubnetService =
raise HTTPException(status_code=500, detail=translations.gettext("Ошибка обновления заметки: {error}").format(error=str(e)))
@router.delete("/devices/{mac}/note")
def delete_note(mac: str, subnet_service: SubnetService = Depends(get_subnet_service), translations: Translations = Depends(get_translations())):
def delete_note(mac: str, subnet_service: SubnetService = Depends(get_subnet_service), translations: Translations = Depends(get_translations)):
"""Удаляет заметку для устройства по MAC-адресу.
Удаляет привязанную заметку для указанного устройства.
@ -168,7 +168,7 @@ def delete_note(mac: str, subnet_service: SubnetService = Depends(get_subnet_ser
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())):
def add_wifi_note(ssid: str, request: NoteRequest, translations: Translations = Depends(get_translations)):
"""Добавляет заметку для сети Wi-Fi по SSID.
Привязывает заметку к Wi-Fi сети, идентифицируемой по SSID.
@ -202,7 +202,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())):
def update_wifi_note(ssid: str, request: NoteRequest, translations: Translations = Depends(get_translations)):
"""Обновляет заметку для сети Wi-Fi по SSID.
Изменяет существующую заметку, привязанную к Wi-Fi сети.
@ -236,7 +236,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())):
def delete_wifi_note(ssid: str, translations: Translations = Depends(get_translations)):
"""Удаляет заметку для сети Wi-Fi по SSID.
Удаляет привязанную заметку для указанной Wi-Fi сети.
@ -269,7 +269,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())):
def connect_to_wifi(request: WifiConnectRequest, translations: Translations = Depends(get_translations)):
"""Подключается к Wi-Fi сети по SSID и паролю.
Выполняет подключение к указанной Wi-Fi сети с использованием предоставленных
@ -297,7 +297,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())):
def disconnect_from_wifi(request: WifiDisconnectRequest, translations: Translations = Depends(get_translations)):
"""Отключается от Wi-Fi сети по указанному SSID.
Выполняет отключение от указанной Wi-Fi сети.
@ -324,7 +324,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())):
def get_wifi_status(translations: Translations = Depends(get_translations)):
"""Проверяет статус текущего подключения к Wi-Fi.
Возвращает информацию о текущем состоянии подключения и SSID, если подключение активно.

View file

@ -4,7 +4,7 @@ from typing import Set
from fastapi import APIRouter, WebSocket, WebSocketDisconnect, Depends
from starlette.websockets import WebSocketState
from utils.i18n import get_translations, _
from utils.i18n import get_translations_ws, _, _load_translations
from babel.support import Translations
from .network import update_container_position, get_network_data
@ -78,7 +78,7 @@ class WebSocketManager:
manager = WebSocketManager()
@router.websocket("/api/v1")
async def websocket_endpoint(websocket: WebSocket, translations: Translations = Depends(get_translations())):
async def websocket_endpoint(websocket: WebSocket, translations: Translations = Depends(get_translations_ws)):
"""Обработчик WebSocket-соединения.
Управляет соединением клиента, принимает данные для обновления позиций
@ -99,10 +99,10 @@ async def websocket_endpoint(websocket: WebSocket, translations: Translations =
logger.info(f"Received data: {data}")
if all(key in data for key in ["container_id", "container_x", "container_y"]):
await update_container_position(data)
await update_container_position(data, translations=translations)
# Внутренний вызов без DI, поэтому используем fallback-переводы
network_data = await get_network_data(translations=get_translations()(websocket))
# Для внутреннего вызова используем переводы из WebSocket зависимостии
network_data = await get_network_data(translations=translations)
logger.info(f"Current network data: {network_data}")
await manager.broadcast(network_data)
@ -139,7 +139,7 @@ async def broadcast_data(translations: Translations = None):
Raises:
Exception: Если произошла ошибка при получении данных или трансляции.
"""
translations = translations or get_translations()()
translations = translations or _load_translations("ru")
while True:
try:
network_data = await get_network_data(translations=translations)