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),
}
)