feat: документация из Nextcloud, график у сотрудника, автоочистка фото, мониторинг, итог мастера, фильтр по местам; доп. сервисы в docker-compose
- docker-compose.yml: профили docs (Nextcloud), office (ONLYOFFICE Document Server), ai (Ollama + скачивание модели) - автонастройка: адреса Nextcloud, ONLYOFFICE, портала и модели подставляются из .env или по именам сервисов во внутренней сети Docker; значения из интерфейса важнее - локальная модель в своей сети (имя сервиса, частный IP) подключается без ключа API - .env.example, docs/DEPLOY.md (раздел 7а), README
This commit is contained in:
+6
-4
@@ -13,7 +13,7 @@ from . import settings_store as ss
|
||||
|
||||
MAGIC = [(b"\xff\xd8\xff", "image/jpeg", ".jpg"), (b"\x89PNG\r\n\x1a\n", "image/png", ".png")]
|
||||
CT = {".jpg": "image/jpeg", ".png": "image/png", ".webp": "image/webp"}
|
||||
NAME_RE = re.compile(r"[0-9a-f]{32}\.(jpg|png|webp)")
|
||||
NAME_RE = re.compile(r"(keep/)?[0-9a-f]{32}\.(jpg|png|webp)") # keep/ — хранить долго (очистка не трогает)
|
||||
KINDS = ("equipment", "users", "map", "tasks")
|
||||
|
||||
|
||||
@@ -47,9 +47,11 @@ async def read_image(db: Session, request: Request, max_mb: int | None = None) -
|
||||
return data, kind[0], kind[1]
|
||||
|
||||
|
||||
def save(db: Session, kind: str, data: bytes, ext: str) -> str:
|
||||
name = ss.new_name() + ext
|
||||
(root(db, kind) / name).write_bytes(data)
|
||||
def save(db: Session, kind: str, data: bytes, ext: str, keep: bool = False) -> str:
|
||||
name = ("keep/" if keep else "") + ss.new_name() + ext
|
||||
f = root(db, kind) / name
|
||||
f.parent.mkdir(parents=True, exist_ok=True)
|
||||
f.write_bytes(data)
|
||||
return name
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user