Files
2022_oknardia/oknardia/web/diagrams.py

60 lines
2.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- 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)