consumers.py
81 lines
| 3.0 KiB
| text/x-python
|
PythonLexer
/ plotter / consumers.py
|
r11 | #!/usr/bin/python | ||
# -*- coding: UTF-8 -*- | ||||
|
r1 | import os | ||
r0 | import json | |||
r2 | ||||
|
r21 | from datetime import datetime, timedelta | ||
|
r1 | |||
r0 | from pymongo import MongoClient | |||
from channels.handler import AsgiHandler | ||||
from channels.auth import channel_session_user | ||||
from channels import Group | ||||
|
r11 | # Here we create the db named "dbplots" | ||
|
r1 | host = os.environ.get('HOST_MONGO', 'localhost') | ||
CLIENT = MongoClient('{}:27017'.format(host)) | ||||
r0 | DB = CLIENT['dbplots'] | |||
# Connected to websocket.connect | ||||
|
r21 | def ws_connect(message, id, code, plot): | ||
if id == 'main': | ||||
|
r11 | Group('main').add(message.reply_channel) | ||
print('New main connection') | ||||
|
r21 | elif id == 'realtime': | ||
Group('{}_{}'.format(code, plot)).add(message.reply_channel) | ||||
print('New connection from: {}, Group: {}_{}'.format(message.content['client'][0], code, plot)) | ||||
|
r11 | else: | ||
|
r21 | print('New connection from: {}, history, id: {}'.format(message.content['client'][0], id)) | ||
message.reply_channel.send({ | ||||
'accept': True | ||||
}) | ||||
r0 | ||||
|
r21 | def ws_message(message, id, code, plot): | ||
r0 | # Accept the incoming connection | |||
dt = datetime.strptime(str(json.loads(message.content['text'])['date']), '%d/%m/%Y') | ||||
|
r21 | exp0 = DB.exp_meta.find_one({'code': int(code), 'date': dt-timedelta(days=1)}) | ||
r2 | exp = DB.exp_meta.find_one({'code': int(code), 'date': dt}) | |||
|
r21 | print('New request for id={}'.format(id)) | ||
r3 | if exp and plot in exp['plots']: | |||
r0 | if plot == 'spc': | |||
r2 | datas = DB.exp_data.find({'expmeta': exp['_id']}, ['time', 'data']).sort('time', -1).limit(1)[0] | |||
exp['time'] = [datas['time']] | ||||
exp['spc'] = datas['data']['spc'] | ||||
exp['rti'] = datas['data']['rti'] | ||||
exp['noise'] = datas['data']['noise'] | ||||
r0 | else: | |||
|
r21 | last = DB.exp_data.find_one({'expmeta': exp['_id']}, ['time'], sort=[('time', -1)]) | ||
if exp0: | ||||
datas = DB.exp_data.find( | ||||
{ | ||||
'expmeta': {'$in': [exp0['_id'], exp['_id']]}, | ||||
'time': {'$gt': last['time']-12*60*60} | ||||
}, | ||||
['time', 'data'], | ||||
sort=[('time', 1)], | ||||
limit=720 | ||||
) | ||||
else: | ||||
datas = DB.exp_data.find( | ||||
{ | ||||
'expmeta': exp['_id'], | ||||
'time': {'$gt': last['time']-12*60*60} | ||||
}, | ||||
['time', 'data'], | ||||
sort=[('time', 1)], | ||||
limit=720 | ||||
) | ||||
r0 | dum = [(d['time'], d['data'][plot]) for d in datas] | |||
r2 | exp['time'] = [d[0] for d in dum] | |||
|
r1 | dum = [d[1] for d in dum] | ||
|
r11 | exp[plot] = [t for t in map(list, zip(*dum))] | ||
|
r21 | |||
r2 | exp.pop('date', None) | |||
exp.pop('_id', None) | ||||
message.reply_channel.send({'text': json.dumps(exp)}) | ||||
r0 | else: | |||
message.reply_channel.send({'text': json.dumps({'interval': 0})}) | ||||
# Connected to websocket.disconnect | ||||
|
r21 | def ws_disconnect(message, id, code, plot): | ||
r0 | Group('{}_{}'.format(code, plot)).discard(message.reply_channel) | |||