Files
dinlo f624fee5e0 Initial commit: Debian Manager — управление Debian-серверами
- SSH/SFTP управление без агентов
- Пакеты (apt), Docker, файлы, systemd, ufw, cron
- Плейбуки, групповые операции, планировщик
- Бэкапы, отчёты, Portainer, Proxmox VE, Gitea Deploy
- Терминал, Telegram-уведомления, тёмная/светлая тема
2026-09-05 19:46:45 +08:00

77 lines
3.4 KiB
Python

"""Настройки: Telegram, Gitea."""
import flet as ft
from app.core import notify
from app.ui.components import snack
class SettingsPage(ft.Column):
def __init__(self, page: ft.Page, go):
super().__init__(expand=True, scroll=ft.ScrollMode.AUTO, spacing=12)
self._page = page
cfg = notify.get_config()
self.tg_token = ft.TextField(label="Bot token", value=cfg["token"],
password=True, width=400)
self.tg_chat = ft.TextField(label="Chat ID", value=cfg["chat_id"], width=400)
self.tg_enabled = ft.Checkbox(label="Уведомления включены", value=cfg["enabled"])
self.tg_alert = ft.Checkbox(label="Алерты мониторинга", value=cfg["on_alert"])
self.tg_task = ft.Checkbox(label="Завершение задач", value=cfg["on_task_done"])
self.tg_status = ft.Text("", size=12)
self.controls = [
ft.Text("Настройки", size=28, weight=ft.FontWeight.BOLD),
ft.Card(content=ft.Container(padding=16, content=ft.Column([
ft.Text("Интерфейс", weight=ft.FontWeight.BOLD, size=16),
ft.Row([
ft.Text("Тема:", size=13),
ft.FilledButton(
"Сменить тему (тёмная/светлая)",
icon=ft.Icons.BRIGHTNESS_6,
on_click=self._toggle_theme,
),
]),
], spacing=10))),
ft.Card(content=ft.Container(padding=16, content=ft.Column([
ft.Text("Telegram-уведомления", weight=ft.FontWeight.BOLD, size=16),
ft.Text("Создайте бота через @BotFather, узнайте chat_id через @userinfobot",
size=12, color=ft.Colors.GREY_500),
self.tg_token,
self.tg_chat,
self.tg_enabled,
self.tg_alert,
self.tg_task,
ft.Row([
ft.FilledButton("Сохранить", icon=ft.Icons.SAVE, on_click=self._save),
ft.OutlinedButton("Тест", icon=ft.Icons.SEND, on_click=self._test),
]),
self.tg_status,
], spacing=10))),
]
def _toggle_theme(self, e):
from app.db.database import get_session
from app.db.models import Setting
new = "light" if self._page.theme_mode == ft.ThemeMode.DARK else "dark"
self._page.theme_mode = ft.ThemeMode.LIGHT if new == "light" else ft.ThemeMode.DARK
with get_session() as s:
row = s.get(Setting, "theme") or Setting(key="theme")
row.value = new
s.add(row)
s.commit()
self._page.update()
def _save(self, e):
notify.save_config(self.tg_token.value, self.tg_chat.value,
self.tg_enabled.value, self.tg_alert.value, self.tg_task.value)
snack(self._page, "Настройки сохранены")
def _test(self, e):
self._save(e)
async def _t():
ok, msg = await notify.test()
self.tg_status.value = ("✅ " if ok else "❌ ") + msg
self.tg_status.color = ft.Colors.GREEN_300 if ok else ft.Colors.RED_300
self._page.update()
self._page.run_task(_t)