From c639f4f5073a7cb66dcbec486fe33037c060b2bd Mon Sep 17 00:00:00 2001 From: Tim Eertmoed Date: Sat, 12 Sep 2026 00:30:34 +0200 Subject: [PATCH] Version 2.7.5: die Ordnerzeile sagt, was im Ordner liegt --- apps/tesm/pyproject.toml | 2 +- apps/tesm/src/tesm/services/fileshare.py | 26 +++++++++++++++++++ .../src/tesm/templates/tesm/fileshare.html | 17 ++++++++++-- packages/tesm-core/pyproject.toml | 2 +- .../tesm-core/src/tesm_core/app_factory.py | 2 +- .../static/tesm_core/css/components.css | 14 ++++++++++ packages/tesm-licensing/pyproject.toml | 2 +- 7 files changed, 59 insertions(+), 6 deletions(-) diff --git a/apps/tesm/pyproject.toml b/apps/tesm/pyproject.toml index c5046eb..79fe8eb 100644 --- a/apps/tesm/pyproject.toml +++ b/apps/tesm/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "tesm" -version = "2.7.4" +version = "2.7.5" description = "TESM -- Verwaltung und Ueberwachung von PoE-Endgeraeten und Aruba-Switchen" requires-python = ">=3.11" dependencies = [ diff --git a/apps/tesm/src/tesm/services/fileshare.py b/apps/tesm/src/tesm/services/fileshare.py index 6bcc417..79ab4d1 100644 --- a/apps/tesm/src/tesm/services/fileshare.py +++ b/apps/tesm/src/tesm/services/fileshare.py @@ -895,6 +895,31 @@ def _namen_aus_detail(detail: str) -> list[str]: return [teil.strip() for teil in detail.split(marke, 1)[1].split(",") if teil.strip()] +#: Mehr als das zaehlt niemand mehr mit dem Auge -- und auf einer +#: Netzwerkfreigabe kostet jeder weitere Eintrag Zeit. +ZAEHLGRENZE = 500 + + +def _inhalt_zaehlen(verzeichnis: Path) -> int: + """Wie viele Eintraege liegen im Ordner? Begrenzt gezaehlt. + + Gezeigt wird die Zahl an der Stelle, an der bei einer Datei die Groesse + steht -- dort stand bisher ein Gedankenstrich. Bei mehr als + ``ZAEHLGRENZE`` bricht das Zaehlen ab: die Oberflaeche schreibt dann + "500+", und niemand wartet auf eine Freigabe mit 40.000 Dateien. + """ + anzahl = 0 + try: + with os.scandir(verzeichnis) as eintraege: + for _ in eintraege: + anzahl += 1 + if anzahl >= ZAEHLGRENZE: + break + except OSError: + return -1 + return anzahl + + def list_directory(mount: Mount, relative: str = "") -> dict[str, Any]: path = resolve_path(mount, relative) if not path.is_dir(): @@ -916,6 +941,7 @@ def list_directory(mount: Mount, relative: str = "") -> dict[str, Any]: ), } if entry.is_dir(): + record["entries"] = _inhalt_zaehlen(entry) directories.append(record) else: record["previewable"] = entry.suffix.lower() in PREVIEW_MIME diff --git a/apps/tesm/src/tesm/templates/tesm/fileshare.html b/apps/tesm/src/tesm/templates/tesm/fileshare.html index d9e3443..411bb6d 100644 --- a/apps/tesm/src/tesm/templates/tesm/fileshare.html +++ b/apps/tesm/src/tesm/templates/tesm/fileshare.html @@ -81,11 +81,24 @@ {% if current_user.has('fileshare.delete') %} {% endif %} - + {# Symbol und Name in einer Zeile: der Zeilenumbruch dazwischen + liess den Ordner aussehen wie zwei halbe Zeilen. #} + {{ icon('folder', size=15) }} {{ entry.name }} - – + {# An der Stelle der Dateigrösse: wie viel liegt darin. #} + + {%- if entry.entries is not defined or entry.entries < 0 -%} + – + {%- elif entry.entries >= 500 -%} + 500+ Einträge + {%- elif entry.entries == 1 -%} + 1 Eintrag + {%- else -%} + {{ entry.entries }} Einträge + {%- endif -%} + {{ entry.modified | dt }} diff --git a/packages/tesm-core/pyproject.toml b/packages/tesm-core/pyproject.toml index d6baaec..9492269 100644 --- a/packages/tesm-core/pyproject.toml +++ b/packages/tesm-core/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "tesm-core" -version = "2.7.4" +version = "2.7.5" description = "Gemeinsames Anwendungsgeruest (Auth, RBAC, Navigation, Design-System, Migrationen) fuer TESM und TESM-Lizenzserver" requires-python = ">=3.11" dependencies = [ diff --git a/packages/tesm-core/src/tesm_core/app_factory.py b/packages/tesm-core/src/tesm_core/app_factory.py index fb892f9..6b2d6e5 100644 --- a/packages/tesm-core/src/tesm_core/app_factory.py +++ b/packages/tesm-core/src/tesm_core/app_factory.py @@ -148,7 +148,7 @@ def create_base_app( #: Wortmarke, ohne Zeile darunter; die Marke selbst zeigen beide #: Anwendungen. auth_tagline: str = "", - app_version: str = "2.7.4", + app_version: str = "2.7.5", built_in_trusted_keys: tuple[str, ...] = (), enable_license: bool = True, template_folder: str | None = None, diff --git a/packages/tesm-core/src/tesm_core/static/tesm_core/css/components.css b/packages/tesm-core/src/tesm_core/static/tesm_core/css/components.css index 5d05daa..d78d4b4 100644 --- a/packages/tesm-core/src/tesm_core/static/tesm_core/css/components.css +++ b/packages/tesm-core/src/tesm_core/static/tesm_core/css/components.css @@ -1640,3 +1640,17 @@ display: none; } } + +/* -- Dateiliste: Symbol und Name in einer Zeile -------------------------- */ +/* Das Symbol ist ein Block-SVG; ohne diese Regel stand der Name darunter und + eine Ordnerzeile sah doppelt so hoch aus wie eine Dateizeile. */ + +.file-cell { + display: flex; + align-items: center; + gap: 6px; +} + +.file-cell > svg { + flex: 0 0 auto; +} diff --git a/packages/tesm-licensing/pyproject.toml b/packages/tesm-licensing/pyproject.toml index 0ebe07a..7639121 100644 --- a/packages/tesm-licensing/pyproject.toml +++ b/packages/tesm-licensing/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "tesm-licensing" -version = "2.7.4" +version = "2.7.5" description = "Ed25519-basiertes Lizenz- und Aktivierungsprotokoll fuer TESM und TESM-Lizenzserver" requires-python = ">=3.11" dependencies = ["cryptography>=42"]