##// END OF EJS Templates
Interval calculated internally, no more needed in metadata
Interval calculated internally, no more needed in metadata

File last commit:

r31:ee33adc177ff
r32:0d03afbbef2d
Show More
consumers.py
115 lines | 3.8 KiB | text/x-python | PythonLexer
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os
import json
import simplejson
from datetime import datetime, timedelta
import numpy
from pymongo import MongoClient
import mongoengine
from asgiref.sync import async_to_sync
from channels.generic.websocket import WebsocketConsumer
from plotter.models import Experiment, ExpDetail, PlotMeta, PlotData
# Here we create the db named "dbplots"
host = os.environ.get('HOST_MONGO', 'localhost')
mongoengine.connect('dbplots', host=host, port=27017)
# CLIENT = MongoClient('{}:27017'.format(host))
# DB = CLIENT['dbplots']
class MainConsumer(WebsocketConsumer):
def connect(self):
self.group_name = 'main'
async_to_sync(self.channel_layer.group_add)(
self.group_name,
self.channel_name
)
self.accept()
def disconnect(self, close_code):
async_to_sync(self.channel_layer.group_discard)(
self.group_name,
self.channel_name
)
def receive(self, text_data):
pass
def zmq_message(self, event):
# Send message to WebSocket
self.send(text_data=event['message'])
class PlotConsumer(WebsocketConsumer):
def connect(self):
if 'realtime' in self.scope['path']:
self.realtime = True
self.group_name = '{}_{}'.format(
self.scope['url_route']['kwargs']['code'],
self.scope['url_route']['kwargs']['plot'],
)
async_to_sync(self.channel_layer.group_add)(
self.group_name,
self.channel_name
)
else:
self.realtime = False
self.accept()
def disconnect(self, close_code):
if self.realtime:
async_to_sync(self.channel_layer.group_discard)(
self.group_name,
self.channel_name
)
def receive(self, text_data):
ret = {}
dt = datetime.strptime(text_data, '%d-%m-%Y')
code = self.scope['url_route']['kwargs']['code']
plot = self.scope['url_route']['kwargs']['plot']
exp = Experiment.objects.get(code=code)
det0 = ExpDetail.objects(experiment=exp, date=dt-timedelta(days=1))
det1 = ExpDetail.objects(experiment=exp, date=dt)
if det1:
meta1 = PlotMeta.objects(exp_detail=det1[0], plot=plot)
if meta1:
if meta1[0].metadata['type'] in ('pcolor',):
datas = PlotData.objects(plot=meta1[0]).order_by('-time').first()
ret['time'] = [datas['time']]
ret['data'] = datas['data']
ret['metadata'] = meta1[0].metadata
else:
last = det1[0]['last_time']
metas = [meta1[0]]
if det0:
meta0 = PlotMeta.objects(exp_detail=det0[0], plot=plot)
if meta0:
metas.append(meta0[0])
datas = PlotData.objects(plot__in=metas, time__gt=last-12*60*60).limit(720)
dum = [(d['time'], d['data']) for d in datas]
ret['time'] = [d[0] for d in dum]
dum = numpy.array([d[1] for d in dum])
if len(dum[0][0])==1:
ret['data'] = dum.T[0].tolist()
else:
ret['data'] = [t for t in map(list, list(zip(*dum.tolist())))]
ret['metadata'] = metas[0].metadata
# exp.pop('date', None)
# exp.pop('_id', None)
self.send(simplejson.dumps(ret, ignore_nan=True))
else:
self.send(json.dumps({'interval': 0}))
def zmq_message(self, event):
# Send message to WebSocket
self.send(text_data=event['message'])