Files
2022_oknardia/oknardia/web/diagrams.py
T

60 lines
2.8 KiB
Python

# -*- coding: utf-8 -*-
from django.shortcuts import render
from django.http import HttpRequest, HttpResponse
from django.db.models import Count, Sum, F
from time import time
from oknardia.settings import *
from oknardia.models import Building_Info
from web.catalog_series import seria_nav # Используем уже существующую seria_nav из catalog_series
import os
def statistic_menu(request: HttpRequest) -> HttpResponse:
""" Страница "Статистика" в главном меню
ВНИМАНИЕ: выводятся данные только по сериям зданий. Этого маловато.
В будущем, наверное, стоит добавить данные по проемам, предложениям, график распределения цен и т.п.
:param request: HttpRequest -- входящий http-запрос
:return: HttpResponse -- исходящий http-ответ
"""
time_start = time()
to_template: dict[str, object] = {}
# Используем seria_nav из web.catalog_series, которая уже на ORM
seria_id, for_seria_nav = seria_nav(0)
to_template.update(for_seria_nav)
# проверяем какой JS с картами и PieCharts: упакованные или нет (откуда берётся не упакованный -- не помню)
path_name = f"{STATIC_BASE_PATH}/{PATH_FOR_JS_MAP}"
if os.path.isfile(f"{path_name}/_ALL{SUFFIX_FOR_MINI_JS_MAP}"):
to_template.update({'MAP_JS': f"{PATH_FOR_JS_MAP}/_ALL{SUFFIX_FOR_MINI_JS_MAP}"})
else:
to_template.update({'MAP_JS': f"{PATH_FOR_JS_MAP}/_ALL{SUFFIX_FOR_JS_MAP}"})
# Строим диаграмму, сколько каких серий и каковы их площади...
# Переписано с raw SQL на ORM
q_seria_pie_orm = (
Building_Info.objects
.filter(kSeria_Link__kRoot_id__isnull=False)
.values('kSeria_Link__kRoot_id')
.annotate(
id=F('kSeria_Link__kRoot_id'), # Переименовываем для соответствия старому контракту
num_building=Count('id'),
area_m2=Sum('fTotal_Area')
)
.order_by('-num_building')
)
data2pie = []
for count in q_seria_pie_orm:
data2pie.append({
"ID": count['id'], # Доступ к полям через словарь, т.к. values() возвращает dict
"AREA_M2": count['area_m2'],
"NUM_BUILDING": count['num_building']
})
to_template.update({'DATA2PIE': data2pie})
to_template.update({'ticks': float(time()-time_start)})
return render(request, "seria_info/all_stat.html", to_template)