fix: Excel-Glättung als dokumentartigen Lesefluss ausgeben
This commit is contained in:
@@ -24,7 +24,7 @@ Ein in NetBox integriertes Markdown-Wiki für Betriebsdokumentationen und Anleit
|
||||
|
||||
## Kompatibilität
|
||||
|
||||
Die Version `0.5.2` zielt auf NetBox 4.x (mindestens 4.0). Vor einem produktiven Rollout sollte das Plugin gegen die konkret eingesetzte NetBox-Minor-Version in einer Testinstanz geprüft werden.
|
||||
Die Version `0.5.3` zielt auf NetBox 4.x (mindestens 4.0). Vor einem produktiven Rollout sollte das Plugin gegen die konkret eingesetzte NetBox-Minor-Version in einer Testinstanz geprüft werden.
|
||||
|
||||
## Installation
|
||||
|
||||
@@ -125,7 +125,7 @@ Alte binäre `.doc`- und `.xls`-Dateien müssen vorher in `.docx` bzw. `.xlsx` k
|
||||
|
||||
Für große Excel-Dateien kann auf der Importseite **„Excel mit mehreren Arbeitsblättern – je Blatt eine Dokumentation“** aktiviert werden. Dazu ist ein Zielordner verpflichtend. Jedes nicht leere Arbeitsblatt wird als eigene Dokumentation mit dem Blattnamen als Titel angelegt und erhält eine eigene Kopie der Original-Exceldatei als Anhang. Normale eingebettete PNG-, JPEG-, GIF- und WebP-Bilder werden dem jeweiligen Dokument als Medienanhang hinzugefügt. Diagramme, SmartArt, Steuerelemente und extern verknüpfte Bilder können nicht zuverlässig übernommen werden.
|
||||
|
||||
Mit **„Excel-Tabellen glätten“** wird jede Datenzeile statt als breite Tabelle als kompakter Textblock aus Feldnamen und Wert importiert. Nicht geglättete Tabellen werden in der Dokumentansicht automatisch kompakt dargestellt und bei Bedarf innerhalb des Inhalts horizontal scrollbar, ohne das NetBox-Layout zu verbreitern.
|
||||
Mit **„Excel-Tabellen glätten“** werden die Zellen ohne künstliche Datensatz- oder Feldbezeichnungen in ihrer Lesereihenfolge übernommen. Zellen einer Excel-Zeile erscheinen als einzelne Textzeilen eines Absatzes; zwischen Excel-Zeilen wird ein Absatz eingefügt. Das Ergebnis ähnelt damit einer Übertragung nach Word ohne Tabelle. Nicht geglättete Tabellen werden in der Dokumentansicht automatisch kompakt dargestellt und bei Bedarf innerhalb des Inhalts horizontal scrollbar, ohne das NetBox-Layout zu verbreitern.
|
||||
|
||||
## REST-API
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ class DocumentationConfig(PluginConfig):
|
||||
name = "netbox_documentation"
|
||||
verbose_name = "NetBox Dokumentation"
|
||||
description = "Wiki und Office-Dokumentation direkt in NetBox"
|
||||
version = "0.5.2"
|
||||
version = "0.5.3"
|
||||
author = "LKE"
|
||||
base_url = "documentation"
|
||||
min_version = "4.0.0"
|
||||
|
||||
@@ -134,7 +134,7 @@ class ImportForm(forms.Form):
|
||||
required=False,
|
||||
label=help_label(
|
||||
"Excel-Tabellen glätten",
|
||||
"Wandelt jede Tabellenzeile in einen lesbaren Textblock aus Feldnamen und Wert um, statt eine Tabelle zu erzeugen.",
|
||||
"Übernimmt alle Zellen ohne Tabelle in Lesereihenfolge als dokumentartigen Text. Es werden keine Datensatz- oder Feldbezeichnungen erzeugt.",
|
||||
),
|
||||
)
|
||||
category = forms.ModelChoiceField(
|
||||
|
||||
@@ -60,17 +60,22 @@ def _render_excel_rows(rows, flatten=False):
|
||||
header, body = rows[0], rows[1:]
|
||||
if not flatten:
|
||||
return tabulate(body, headers=header, tablefmt="github")
|
||||
# Document-style flattening: retain every cell in reading order without
|
||||
# inventing record headings or field/value labels. Cells in one Excel row
|
||||
# become lines in one paragraph; Excel rows are separated by a blank line.
|
||||
blocks = []
|
||||
for number, row in enumerate(body, 1):
|
||||
values = []
|
||||
for column, value in zip(header, row):
|
||||
if value == "":
|
||||
continue
|
||||
label = column or "Feld"
|
||||
values.append(f"**{label}:** {value}")
|
||||
for row in rows:
|
||||
values = [_escape_markdown_text(value) for value in row if value != ""]
|
||||
if values:
|
||||
blocks.append(f"### Datensatz {number}\n\n" + " \n".join(values))
|
||||
return "\n\n".join(blocks) or "_Keine Datensätze_"
|
||||
blocks.append(" \n".join(values))
|
||||
return "\n\n".join(blocks) or "_Keine Inhalte_"
|
||||
|
||||
|
||||
def _escape_markdown_text(value):
|
||||
value = str(value).replace("\\", "\\\\")
|
||||
for character in ("*", "_", "[", "]", "<", ">", "#", "|"):
|
||||
value = value.replace(character, f"\\{character}")
|
||||
return value.replace("\r\n", " \n").replace("\r", " \n").replace("\n", " \n")
|
||||
|
||||
|
||||
def _xlsx(content, flatten=False):
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
||||
|
||||
[project]
|
||||
name = "netbox-documentation"
|
||||
version = "0.5.2"
|
||||
version = "0.5.3"
|
||||
description = "Integrated Markdown wiki and office document importer for NetBox"
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.10"
|
||||
|
||||
@@ -67,7 +67,7 @@ def test_excel_multi_sheet_import_creates_one_result_per_sheet():
|
||||
assert "Leitstelle" in results[1].markdown
|
||||
|
||||
|
||||
def test_excel_flatten_turns_rows_into_field_value_blocks():
|
||||
def test_excel_flatten_turns_cells_into_document_flow():
|
||||
workbook = Workbook()
|
||||
sheet = workbook.active
|
||||
sheet.append(["Name", "IP"])
|
||||
@@ -77,7 +77,7 @@ def test_excel_flatten_turns_rows_into_field_value_blocks():
|
||||
|
||||
results = import_excel_sheets(Upload(stream.getvalue(), "server.xlsx"), flatten=True)
|
||||
|
||||
assert "### Datensatz 1" in results[0].markdown
|
||||
assert "**Name:** db01" in results[0].markdown
|
||||
assert "**IP:** 10.0.0.2" in results[0].markdown
|
||||
assert results[0].markdown == "Name \nIP\n\ndb01 \n10.0.0.2"
|
||||
assert "Datensatz" not in results[0].markdown
|
||||
assert "Feld" not in results[0].markdown
|
||||
assert "|" not in results[0].markdown
|
||||
|
||||
Reference in New Issue
Block a user