"""Report Generator plugin — PDF/Excel/CSV reports from Jinja2 templates.""" from __future__ import annotations from app.plugins.base import BasePlugin from app.plugins.manifest import ( FrontendMenuItem, FrontendPageRoute, FrontendSettingsPage, PluginManifest, PluginRouteDef, ) class ReportGeneratorPlugin(BasePlugin): """Report Generator plugin for generating reports from Jinja2 templates.""" manifest = PluginManifest( name="report_generator", version="1.0.0", display_name="Report Generator", description="Generates PDF/Excel/CSV reports from Jinja2 templates and data sources", is_core=True, dependencies=["permissions"], routes=[ # documents router MUST be registered before routes: its fixed # single-segment paths (/letterheads, /print-templates, ...) would # otherwise be shadowed by the /{report_id} catch-all in routes. PluginRouteDef( path="/api/v1/reports", module="app.plugins.builtins.report_generator.documents", router_attr="router", ), PluginRouteDef( path="/api/v1/reports", module="app.plugins.builtins.report_generator.routes", router_attr="router", ), ], settings_pages=[ FrontendSettingsPage( path="documents", label_key="settings.documents", label="Dokumente", component="@/pages/DocumentSettings", icon="FileText", order=75, permission="reports:read", ), ], events=["report.requested", "report.generated"], migrations=["0001_initial.sql", "0002_reports_folder_id.sql"], permissions=["reports:read", "reports:generate", "reports:manage_templates"], menu_items=[ FrontendMenuItem(label_key='nav.reports', label='Berichte', path='/reports', icon='BarChart3', order=70, permission='reports:read'), ], page_routes=[ FrontendPageRoute(path='/reports', component='@/pages/Reports', protected=True, permission='reports:read'), ], author="LeoCRM Team", min_app_version="1.0.0", contract_version="1.0.0") def get_entity_models(self) -> dict[str, type]: from app.plugins.builtins.report_generator.models import ( DocumentAsset, Letterhead, PrintTemplate, ReportInstance, ReportTemplate, ) return { "report_template": ReportTemplate, "report_instance": ReportInstance, "letterhead": Letterhead, "print_template": PrintTemplate, "document_asset": DocumentAsset, } async def on_activate( self, db, service_container, event_bus ) -> None: """Activate plugin: register background jobs and event listeners.""" # Register background jobs (isolated report generation in worker) from app.plugins.builtins.report_generator import jobs # noqa: F401 await super().on_activate(db, service_container, event_bus) async def on_deactivate( self, db, service_container, event_bus ) -> None: """Deactivate plugin: unregister contract and event listeners.""" # Contract abmelden from app.plugins.builtins.contracts import get_contract_registry get_contract_registry().unregister(self.manifest.name) await super().on_deactivate(db, service_container, event_bus)