"""0.9.0: Regeln kopieren – vorausgefüllt, zunächst deaktiviert.""" from __future__ import annotations from pathlib import Path from typing import Any from fastapi.testclient import TestClient from sqlalchemy import select from netmover.db import session_scope from netmover.models import ( CopiedFile, Mount, MountType, Rule, RuleAction, RuleTarget, Run, TargetKind, TargetLayout, ) from tests.webutil import post def _setup(state: Any, tmp_path: Path) -> tuple[int, int]: consume = tmp_path / "consume" consume.mkdir() with session_scope(state.session_factory) as s: m = Mount( name="NAS", slug="nas", type=MountType.CIFS, server="nas", share="scans", mountpoint=str(tmp_path / "mnt" / "nas"), ) a = Mount( name="Archiv", slug="archiv", type=MountType.CIFS, server="nas", share="archiv", mountpoint=str(tmp_path / "mnt" / "archiv"), ) s.add_all([m, a]) s.flush() r = Rule( name="Scans → Paperless", src_mount_id=m.id, src_subpath="max", dst_path=str(consume), pattern="*.pdf;*.jpg", recursive=True, interval_seconds=45, stability_seconds=7, action=RuleAction.COPY, set_mode="0640", quarantine_path="_q", targets=[ RuleTarget( position=0, name="Archiv", kind=TargetKind.MOUNT, mount_id=a.id, path="scans", layout=TargetLayout.DATE, ), RuleTarget(position=1, name="Buchhaltung", kind=TargetKind.LOCAL, path="/srv/buha"), ], ) s.add(r) s.flush() s.add(Run(rule_id=r.id)) s.add(CopiedFile(rule_id=r.id, src_relpath="a.pdf", size=1, mtime_ns=1, dst_path="x")) return r.id, m.id def _rule(state: Any, name: str) -> Rule: with state.session_factory() as s: r = s.scalars(select(Rule).where(Rule.name == name)).one() _ = list(r.targets) # vor dem Lösen aus der Session laden s.expunge_all() return r def _form_from_page(html: str) -> dict[str, str]: """Wie ein Browser: alle Felder des Formulars mit ihren vorausgefüllten Werten.""" import re form: dict[str, str] = {} for m in re.finditer(r']*name="([^"]+)"[^>]*>', html): tag, name = m.group(0), m.group(1) if 'type="checkbox"' in tag: if " checked" in tag: form[name] = "on" else: v = re.search(r'value="([^"]*)"', tag) form[name] = v.group(1) if v else "" for m in re.finditer(r']*name="([^"]+)"[^>]*>(.*?)', html, re.S): sel = re.search(r'