import os import logging from pathlib import Path import polib from docutils.nodes import entry from fastapi import APIRouter, HTTPException, Depends from starlette.responses import FileResponse from services.settings_service import SettingsService from utils.i18n import get_translations, _ from babel.support import Translations logging.basicConfig(level=logging.DEBUG) logger = logging.getLogger(__name__) router = APIRouter() settings_service = SettingsService() @router.post("/clear_subnet") def clear_subnet(translations: Translations = Depends(get_translations("api_v1"))): """Очищает данные узлов подсети, сохранённые в devices.json. Удаляет все записи об узлах подсети, оставляя файл пустым. Args: translations: Объект переводов для текущего языка. Returns: dict: Словарь с сообщением об успешной очистке. Raises: HTTPException: Если произошла ошибка очистки (status_code=500). """ try: success = settings_service.clear_subnet() if success: return {"message": translations.gettext("Данные узлов подсети успешно очищены")} else: raise HTTPException(status_code=500, detail=translations.gettext("Не удалось очистить данные узлов подсети")) except Exception as e: logger.error(f"Error clearing subnet data: {str(e)}") 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"))): """Очищает данные точек доступа Wi-Fi, сохранённые в wifi.json. Удаляет все записи о точках доступа, оставляя файл пустым. Args: translations: Объект переводов для текущего языка. Returns: dict: Словарь с сообщением об успешной очистке. Raises: HTTPException: Если произошла ошибка очистки (status_code=500). """ try: success = settings_service.clear_wifi() if success: return {"message": translations.gettext("Данные точек доступа Wi-Fi успешно очищены")} else: raise HTTPException(status_code=500, detail=translations.gettext("Не удалось очистить данные точек доступа Wi-Fi")) except Exception as e: logger.error(f"Error clearing wifi data: {str(e)}") 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"))): """Очищает данные узлов подсети и точек доступа Wi-Fi в обоих файлах. Удаляет все записи из devices.json и wifi.json. Args: translations: Объект переводов для текущего языка. Returns: dict: Словарь с сообщением об успешной очистке. Raises: HTTPException: Если произошла ошибка очистки (status_code=500). """ try: success = settings_service.clear_all_data() if success: return {"message": translations.gettext("Все сетевые данные успешно очищены")} else: raise HTTPException(status_code=500, detail=translations.gettext("Не удалось очистить все сетевые данные")) except Exception as e: logger.error(f"Error clearing all data: {str(e)}") raise HTTPException(status_code=500, detail=translations.gettext("Ошибка очистки: {error}").format(error=str(e))) 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"))): """ Экспортирует файл с данными устройств в формате JSON. Args: translations: Объект переводов для текущего языка. Returns: FileResponse: Файл devices.json для скачивания. Raises: HTTPException: Если файл не найден (status_code=404). """ if not os.path.exists(DEVICE_PATH): logger.warning(f"Export file not found: {DEVICE_PATH}") raise HTTPException(status_code=404, detail=translations.gettext("Файл не найден")) logger.info(f"Exporting file: {DEVICE_PATH}") return FileResponse( path=DEVICE_PATH, filename="devices.json", media_type="application/json" ) @router.get("/export_wifi", response_class=FileResponse) async def export_wifi(translations: Translations = Depends(get_translations("api_v1"))): """ Экспортирует файл с данными устройств в формате JSON. Args: translations: Объект переводов для текущего языка. Returns: FileResponse: Файл wifi.json для скачивания. Raises: HTTPException: Если файл не найден (status_code=404). """ if not os.path.exists(WIFI_PATH): logger.warning(f"Export file not found: {WIFI_PATH}") raise HTTPException(status_code=404, detail=translations.gettext("Файл не найден")) logger.info(f"Exporting file: {WIFI_PATH}") return FileResponse( path=WIFI_PATH, filename="wifi.json", media_type="application/json" ) @router.get("/{locale}/{domain}") async def get_translations(locale: str, domain: str): """ Args: locale: domain: Returns: """ try: po_file = Path(f"locales/{locale}/LC_MESSAGES/{domain}.po") if not po_file.exists(): logger.warning(f"Файл интернационализации для {locale} и домена {domain} не найдены") raise HTTPException(status_code=404, detail=f"Файл интернационализации для {locale} и домена {domain} не найдены") po = polib.pofile(str(po_file)) translations = {entry.msgid: entry.msgstr or entry.msgid for entry in po} logger.info(f"Загрузка {len(translations)} перевода для локали {locale} и домена {domain}") return translations except Exception as e: logger.error(f"Ошибка загрузки перевода для локали {locale} и домена {domain}: {str(e)}") raise HTTPException(status_code=500, detail=f"Ошибка на сервере: {str(e)}")