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"