данные графика теперь берутся из БД сайта

This commit is contained in:
VladislavOstapov 2024-01-23 14:19:40 +03:00
parent afaac62246
commit 394d5a5093

View File

@ -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