60 lines
2.8 KiB
Python
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)
|