Ziel
-
Customizen eines PowerPoint-Exports für ein eigenes Modul, analog zu den bereits vorhandenen Exporten.
Hinweis
-
Der PowerPoint-Export läuft komplett serverseitig und ersetzt die frühere, clientseitige IronPython-Lösung vollständig – es gibt keine Kompatibilitätsschicht zur alten Implementierung.
-
Standardmäßig bereits implementiert für die Standard-Module Status (Project Deck
009E9K), Statusbericht (Project Status Report Deck009E9R) und Simulation (Portfolio Roadmap Deck009E9Uungruppiert /009EA9gruppiert). Für ein eigenes Modul wird zusätzlich ein sogenanntes Deck angelegt (siehe Vorgehensweise). -
Für jede Exportmöglichkeit ist eine eigene
.pptx-Vorlage nötig eine normale PowerPoint-Datei mit Platzhaltern, die sich wie gewohnt in Microsoft PowerPoint gestalten lässt.
Vorgehensweise
-
In der
.pptx-Vorlage die gewünschten Platzhalter setzen:
|
Platzhalter |
Wirkung |
|---|---|
|
|
Einfache Textersetzung (Titel, Beschriftung, beliebiger Text) |
|
|
Tabellenzeile wird pro Datensatz geklont (automatische Paginierung, wenn die Tabelle über den Folienfuß hinausragen würde) |
|
|
Shape wird durch ein Bild ersetzt (Wert muss Base64-kodiert sein) |
|
|
Shape markiert die Fläche für ein Diagramm (Zeitplan/Gantt/Roadmap), wird durch einen Object-Renderer gezeichnet |
Der Pfad key.field entspricht dabei genau den Python-IDs, wie sie der Module Reader für das Modul liefert.
-
Ein neues Deck unter
next/domain/powerpoint/decks/anlegen, das vonnext.framework.powerpoint.deck.BaseDeckerbt. -
Mindestens
TEMPLATE(Dateiname der Vorlage) und_get_output_filenamesetzen; bei Bedarf_prepare_dataüberschreiben, um Rohdaten vor dem Rendern umzuformen (z. B. fett markieren, verschachtelte Daten zu flachen Feldern zusammenführen). -
Für ein Diagramm einen passenden Renderer in
OBJECT_RENDERERSregistrieren und_get_object_dataimplementieren. -
Einen Makro-Einstiegspunkt anlegen (analog zu
next/domain/powerpoint/export.py), der das Modul öffnet undgenerate_deck()aufruft.
from next.framework.powerpoint import deck, template
from next.framework.powerpoint.object_renderers import schedule
class MyModuleDeck(deck.BaseDeck):
TEMPLATE = 'MyModule_Template.pptx'
OBJECT_RENDERERS = {'^SCHEDULE': schedule.ScheduleRenderer}
def _get_output_filename(self, data):
row = data['project'][0]
return self._build_output_filename(row['name'], row['func_id'])
def _prepare_data(self, data):
# z.B. Feld fett darstellen
row = data['project'][0]
row['name'] = template.bold_markdown(row['name'])
return data
def _get_object_data(self, marker, data):
if marker != '^SCHEDULE':
return None
tasks = [
schedule.ScheduleTask(
name=row['task_name'],
duration=row.get('duration_rem') or '',
start=_epoch_days_to_date(row.get('calc_start')),
end=_epoch_days_to_date(row.get('calc_end')),
critical=not (float(row.get('buffer') or 0) > 0),
)
for row in data['project'][0].get('schedule', [])
]
return tasks or None
Hinweise
-
Diese Seite beschreibt, wie ein eigenes Deck aufgebaut wird. Wie es konkret mit einem PLANTA-Modul bzw. einer Schaltfläche verdrahtet wird (Makro-Modul, Aufruf von
generate_deck()), ist hier nur skizziert. Am besten dafür eines der bestehenden Decks (Project Deck, Project Status Report, Portfolio-Roadmap) bzw. deren Makro-Einstiegspunkte innext/domain/powerpoint/export.pyals Vorlage nehmen. -
Für Diagramme stehen drei fertige Renderer zur Auswahl:
schedule.ScheduleRenderer(flacher, paginierender Zeitplan),native_gantt.NativeGanttRenderer(hierarchisches Gantt auf einer Folie) undroadmap.RoadmapRenderer(quartalsweise Portfolio-Roadmap, optional gruppiert). Eine eigene Optik lässt sich über das Überschreiben einzelner Klassenattribute erreichen (Farben, Schriftgröße, Zeilenhöhe, …), ohne die Renderer-Logik selbst anzufassen. -
Text- und Tabellenwerte unterstützen ein festes Set an Inline-Markdown:
**fett**,*kursiv*,~~durchgestrichen~~,`code`,[Text](url)– Zeilenumbrüche, Überschriften und Listen werden nicht unterstützt. -
Ein Pfad ohne Index in einen Datenbereich mit mehreren Zeilen (z. B.
project.name, wenn mehrere Projekte vorliegen) verwendet automatisch Zeile 0 und protokolliert eine Warnung – in dem Fall einen Index ergänzen (project[2].name). -
Ein gänzlich neuer Diagrammtyp lässt sich als eigener
ObjectRendererergänzen (Basisklassenext.framework.powerpoint.object_renderers.base.ObjectRenderer), ohne dass am Framework selbst etwas geändert werden muss.