данные графика теперь берутся из БД сайта
This commit is contained in:
parent
afaac62246
commit
394d5a5093
@ -1,8 +1,9 @@
|
|||||||
import json
|
import json
|
||||||
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
import os
|
import os
|
||||||
from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden
|
from django.http import HttpResponse, HttpResponseBadRequest
|
||||||
from django.contrib.auth.decorators import login_required, permission_required
|
from django.contrib.auth.decorators import login_required, permission_required
|
||||||
from .models import MbTankRecord
|
from .models import MbTankRecord
|
||||||
|
|
||||||
@ -30,11 +31,58 @@ def view_stats(request):
|
|||||||
return response
|
return response
|
||||||
|
|
||||||
|
|
||||||
@permission_required(perm='view_logs', raise_exception=True)
|
@permission_required(perm='logs_service.view_mbtankrecord', raise_exception=True)
|
||||||
def view_tank_chart(request):
|
def view_tank_chart(request):
|
||||||
# только для тестирования!
|
try:
|
||||||
days = request.GET.get('days', '7')
|
days = int(request.GET.get('days', '7'))
|
||||||
res = requests.get(TEST_BASE_FETCH + "?tank_chart=" + days, headers={'Authorization': os.getenv("TEST_AUTH")})
|
except ValueError:
|
||||||
response = HttpResponse(res.content)
|
return HttpResponseBadRequest()
|
||||||
|
|
||||||
|
# ограничения времени
|
||||||
|
if days < 1:
|
||||||
|
days = 1
|
||||||
|
elif days > 31:
|
||||||
|
days = 31
|
||||||
|
|
||||||
|
# select dt, level from tcs where datetime >= (NOW() - INTERVAL $days DAY) order by dt
|
||||||
|
query = MbTankRecord.objects.filter(dt__gt=(datetime.now() - timedelta(days=days))).order_by('dt')
|
||||||
|
q_len = len(query)
|
||||||
|
|
||||||
|
# тот самый оптимизирующий алгоритм, в худшем случае (31 день) он отрабатывает за 64мс
|
||||||
|
tank_chart = []
|
||||||
|
max_seconds = (3600 * 24 * days) / 800
|
||||||
|
|
||||||
|
last_time = None
|
||||||
|
last_value = None
|
||||||
|
for i in range(0, q_len):
|
||||||
|
need_push = False
|
||||||
|
curr_t = query[i].dt.timestamp()
|
||||||
|
curr_v = query[i].level
|
||||||
|
|
||||||
|
# нужно пушить, если предыдущее время пустое
|
||||||
|
if last_time is None:
|
||||||
|
last_time, last_value = curr_t, curr_v
|
||||||
|
need_push = True
|
||||||
|
|
||||||
|
if not need_push:
|
||||||
|
# дальнейшие проверки имеют смысл, если есть переменная last_time
|
||||||
|
if i + 1 < q_len:
|
||||||
|
if last_value != query[i + 1].level:
|
||||||
|
# случай первый: если следующее значение процентов изменилось
|
||||||
|
need_push = True
|
||||||
|
# сбросим еще последнее время, возьмем его на следующем цикле
|
||||||
|
last_time = None
|
||||||
|
elif query[i + 1].dt.timestamp() - last_time > max_seconds:
|
||||||
|
# случай третий: если следующее время выходит за границу в установленное количество секунд
|
||||||
|
need_push = True
|
||||||
|
last_time = curr_t
|
||||||
|
else:
|
||||||
|
# случай второй - больше значений нет, последнее значение тоже нужно
|
||||||
|
need_push = True
|
||||||
|
|
||||||
|
if need_push:
|
||||||
|
tank_chart.append((int(curr_t), curr_v))
|
||||||
|
|
||||||
|
response = HttpResponse(json.dumps({'tank_chart': tank_chart}))
|
||||||
response.headers["Content-type"] = response.headers["Content-type"]
|
response.headers["Content-type"] = response.headers["Content-type"]
|
||||||
return response
|
return response
|
||||||
|
Loading…
x
Reference in New Issue
Block a user