Портал технической службы: наряды и чек-листы, задачи, отказы и неисправности, анализ надёжности, карты, склады, приложение для Android

This commit is contained in:
darkorion
2026-10-13 09:09:53 +03:00
commit 67e411eea8
246 changed files with 23152 additions and 0 deletions
+59
View File
@@ -0,0 +1,59 @@
"""Настройки сервера, хранящиеся в БД (меняются админом в панели)."""
import secrets
from pathlib import Path
from sqlalchemy.orm import Session
from . import config
from .models import Setting
DEFAULTS = {
"photo_dir": config.PHOTO_DIR,
"max_photo_mb": "10",
"vapid_contact": "mailto:admin@example.com",
"fcm_credentials_path": "",
"public_incidents": "1",
"backup_auto_hours": "24", # автокопия раз в N часов (0 — выключено)
"backup_keep": "14", # сколько автокопий хранить
"backup_media": "0", # включать ли в автокопию фото и картинки
"setup_done": "",
"crane_map": "0", # отдельная карта кранов
"reliability": "1", # раздел «Анализ надёжности» для инженеров и руководителей
"crane_map_image": "", # картинка карты кранов (пусто — используется карта завода) # мастер первичной настройки: отмеченные шаги (через запятую)
# AI-помощник (не входит в EDITABLE: ключ не отдаётся в общих настройках, правится через /assistant/config)
"assistant_enabled": "0",
"assistant_provider": "openai",
"assistant_base_url": "",
"assistant_model": "",
"assistant_api_key": "",
"assistant_scope": "",
}
EDITABLE = ("photo_dir", "max_photo_mb", "vapid_contact", "fcm_credentials_path", "public_incidents",
"backup_auto_hours", "backup_keep", "backup_media", "setup_done", "crane_map", "reliability")
def get(db: Session, key: str) -> str:
row = db.get(Setting, key)
return row.value if row and row.value != "" else DEFAULTS.get(key, "")
def set_(db: Session, key: str, value: str):
row = db.get(Setting, key)
if row:
row.value = value
else:
db.add(Setting(key=key, value=value))
def all_editable(db: Session) -> dict:
return {k: get(db, k) for k in EDITABLE}
def photo_root(db: Session) -> Path:
p = Path(get(db, "photo_dir"))
p.mkdir(parents=True, exist_ok=True)
return p
def new_name() -> str:
return secrets.token_hex(16)