Source code for ferrosoft.apps.dataimport.websocket.updater

import logging
from typing import List

from asgiref.sync import async_to_sync
from channels.layers import get_channel_layer
from django.template.loader import render_to_string

from ferrosoft.apps.dataimport.models import LogEntry, LogHighlight
from ferrosoft.apps.ferrobase.consumers import EntityIdRequired
from ferrosoft.apps.ferrobase.frontend import FrontendUIUpdater


[docs] class ImportJobUIUpdater(FrontendUIUpdater): """ Allow server-side code to push updates regarding ImportJob (LogEntry) to the browser. """ def __init__(self, entity_id: str = None): super().__init__() if entity_id is None: raise EntityIdRequired self._group_name = "import_job_%s" % entity_id
[docs] def send_log_entries(self, entries: List[LogEntry]): channel_layer = get_channel_layer() data = { "type": "pass_on", "state": "log_entry_created", "includes_error": LogHighlight.DANGER in map(lambda entry: entry.highlight, entries), "content": render_to_string( "dataimport/job/log-entry.html", context={ "log_entries": reversed(entries), }, ), } async_to_sync(channel_layer.group_send)(self._group_name, data) for entry in entries: logging.info(str(entry))
[docs] def send_log_entry(self, job, message, line_number=None, highlight=None): self.send_log_entries( [LogEntry.create(job, line_number or 0, message, highlight)] )
[docs] def send_import_finished(self, error: bool, line_count: int): channel_layer = get_channel_layer() data = { "type": "pass_on", "state": "import_finished", "error": error, "lineCount": line_count, } async_to_sync(channel_layer.group_send)(self._group_name, data)