diff --git a/netbox_customer_export/__init__.py b/netbox_customer_export/__init__.py index 00b8b74..77be11c 100644 --- a/netbox_customer_export/__init__.py +++ b/netbox_customer_export/__init__.py @@ -5,7 +5,7 @@ class CustomerExportConfig(PluginConfig): name = "netbox_customer_export" verbose_name = "Kunden-Export" description = "Kundendokumentation als PDF oder Word exportieren" - version = "0.3.0" + version = "0.3.1" author = "Claude" base_url = "customer-export" min_version = "4.6.8" diff --git a/netbox_customer_export/rack_svg.py b/netbox_customer_export/rack_svg.py index 5be56d1..7ee57c3 100644 --- a/netbox_customer_export/rack_svg.py +++ b/netbox_customer_export/rack_svg.py @@ -2,6 +2,7 @@ import base64 import logging import mimetypes +import re from django.utils.module_loading import import_string from netbox.plugins import get_plugin_config @@ -46,6 +47,57 @@ def _inline_images(svg, devices): return svg +# Helles NetBox-Theme mit festen Werten. Das Original-Stylesheet nutzt CSS-Variablen (var(--nbx-…)), +# die WeasyPrint und cairosvg nicht auflösen. Leere HE würden sonst schwarz gefüllt. +STATIC_CSS = """ +svg { font-family: Helvetica, Arial, sans-serif; font-size: 11px; } +text { text-anchor: middle; dominant-baseline: middle; } +.unit { fill: #6c757d; } +.hidden { visibility: hidden; } +rect.shaded, image.shaded { opacity: .25; } +text.shaded { opacity: .5; } +.rack { fill: none; stroke-width: 2px; stroke: #000000; } +.slot { fill: #e9ecef; stroke: #adb5bd; } +.slot.occupied[class] { fill: url(#occupied); } +.slot.blocked[class] { fill: url(#blocked); } +.reservation[class] { fill: url(#reserved); } +""" + +# class -> Präsentationsattribute (Fallback, falls der Renderer ", f"", svg, count=1, flags=re.S) + # "Add Device"-Texte sind nur per Hover sichtbar – im Dokument entfernen + svg = re.sub(r']*class="[^"]*add-device[^"]*"[^>]*>.*?', "", svg, flags=re.S) + return _TAG_WITH_CLASS.sub(_apply_class_attrs, svg) + + def render_rack_svg(rack, face, user, images=False, devices=()): """Gibt (svg, fehler) zurück – genau einer der beiden Werte ist None. @@ -77,6 +129,7 @@ def render_rack_svg(rack, face, user, images=False, devices=()): base_url="", ).render(face) svg = svg.tostring() if hasattr(svg, "tostring") else str(svg) + svg = normalize_svg(svg) if images: svg = _inline_images(svg, devices) return svg, None diff --git a/pyproject.toml b/pyproject.toml index e7180f1..caff09e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "netbox-customer-export" -version = "0.3.0" +version = "0.3.1" description = "NetBox-Plugin: Kundendokumentation (PDF/Word) für Standorte, Lokationen, Mandanten und Mandantengruppen" readme = "README.md" requires-python = ">=3.10"