backend/exhauster_analytics/analytics/consumers.py

76 lines
2.3 KiB
Python

import json
from asgiref.sync import sync_to_async
from channels.generic.websocket import AsyncWebsocketConsumer
from exhauster_analytics.analytics.models import Record
class NotificationsConsumer(AsyncWebsocketConsumer):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.room_group_name = None
async def connect(self):
self.room_group_name = "notifications"
await self.accept()
data = await self.get_last_record()
await self.send(text_data=json.dumps(data))
await self.channel_layer.group_add(self.room_group_name, self.channel_name)
async def disconnect(self, close_code):
await self.channel_layer.group_discard(self.room_group_name, self.channel_name)
# Receive message from WebSocket
async def receive(self, text_data):
pass
@sync_to_async
def get_last_record(self):
data = {}
record = Record.objects.last()
for signal in record.signals.all():
if not signal.signal.config:
data[signal.signal.name] = signal.value
if signal.signal.installations:
data[f"{signal.signal.name}_status"] = "normal"
return data
async def info(self, event):
message = event["data"]
await self.send(text_data=json.dumps(message))
class NotificationsApproximateConsumer(AsyncWebsocketConsumer):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.room_group_name = None
self.room_name = None
async def connect(self):
self.room_group_name = "notifications"
approximation = self.scope["url_route"]["kwargs"]["approximation"]
if approximation not in [10, 30, 60]:
await self.close()
self.room_name = approximation
self.room_group_name = f"approximation_{approximation}"
await self.accept()
await self.channel_layer.group_add(self.room_group_name, self.channel_name)
async def disconnect(self, close_code):
await self.channel_layer.group_discard(self.room_group_name, self.channel_name)
# Receive message from WebSocket
async def receive(self, text_data):
pass
async def info(self, event):
message = event["data"]
await self.send(text_data=json.dumps(message))