From 394d5a50933de85db2a93a27b2ac398ffc0543f8 Mon Sep 17 00:00:00 2001 From: VladislavOstapov Date: Tue, 23 Jan 2024 14:19:40 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D0=B5=20=D0=B3?= =?UTF-8?q?=D1=80=D0=B0=D1=84=D0=B8=D0=BA=D0=B0=20=D1=82=D0=B5=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D1=8C=20=D0=B1=D0=B5=D1=80=D1=83=D1=82=D1=81=D1=8F=20?= =?UTF-8?q?=D0=B8=D0=B7=20=D0=91=D0=94=20=D1=81=D0=B0=D0=B9=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- logs_service/views.py | 60 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 54 insertions(+), 6 deletions(-) diff --git a/logs_service/views.py b/logs_service/views.py index 4604efe..d4886cf 100644 --- a/logs_service/views.py +++ b/logs_service/views.py @@ -1,8 +1,9 @@ import json +from datetime import datetime, timedelta from django.shortcuts import render 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 .models import MbTankRecord @@ -30,11 +31,58 @@ def view_stats(request): 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): - # только для тестирования! - days = request.GET.get('days', '7') - res = requests.get(TEST_BASE_FETCH + "?tank_chart=" + days, headers={'Authorization': os.getenv("TEST_AUTH")}) - response = HttpResponse(res.content) + try: + days = int(request.GET.get('days', '7')) + except ValueError: + 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"] return response