Source code for ferrosoft.apps.reporting.websockets.consumers

#  Copyright (c) 2025 Ferrosoft GmbH. All rights reserved.
import logging

from django.template.loader import render_to_string
from django.utils.translation import gettext_lazy as _

from ferrosoft.apps.ferrobase.consumers import UIEventsConsumer
from ferrosoft.apps.ferrobase.services.taskqueue import background_task_tenant
from ferrosoft.apps.reporting.websockets.updater import ReportGeneratorUpdater


[docs] class ReportGenerator(UIEventsConsumer): def __init__(self, *args, **kwargs): super().__init__(ReportGeneratorUpdater, *args, **kwargs)
[docs] def pass_through(self, event): """Handler for events that are just passed through to the client.""" self.send_json(event)
[docs] def receive_json_tenant_context(self, content: dict): # noinspection PyBroadException try: if content.get("action", "") == "kickoff": self._generate_document() else: self.send_ui_failed(str(_("Unknown action"))) except Exception: logging.exception("Exception while receiving JSON in tenant context") self._send_message( "failed", "reporting/generator/failed.html", { "error": _("Unexpected error"), }, )
def _generate_document(self): # Actual document generation is loaded off to a background task, # since it may be costly operation. background_task_tenant( "ferrosoft.apps.reporting.tasks.generate_document", str(self.entity_id) ) self._send_message("started", "reporting/generator/started.html") def _send_message(self, state: str, template_name: str, context: dict = None): self.send_json( { "state": state, "content": render_to_string(template_name, context), } )