страница "Статистика"
This commit is contained in:
110
oknardia/web/diagrams.py
Normal file
110
oknardia/web/diagrams.py
Normal file
@@ -0,0 +1,110 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from django.shortcuts import render
|
||||
from django.http import HttpRequest, HttpResponse
|
||||
from django.core.exceptions import ObjectDoesNotExist
|
||||
from time import time
|
||||
from oknardia.models import Seria_Info
|
||||
from oknardia.settings import *
|
||||
import math
|
||||
import os
|
||||
import pytils # вместо Rus2Lat(smth) --> pytils.translit.slugify(smth).lower()
|
||||
|
||||
|
||||
# возвращает корректный SeriaID и кортеж для построения навигации по сериям дома
|
||||
def seria_nav(i_seria_id: int = 12) -> (int, dict):
|
||||
query_seria = Seria_Info.objects.raw(
|
||||
'SELECT oknardia_seria_info.id,'
|
||||
' oknardia_seria_info.sName,'
|
||||
' oknardia_seria_info.sSeriaDescription,'
|
||||
' oknardia_seria_info.kRoot_id,'
|
||||
' oknardia_seria_info.kParent_id '
|
||||
'FROM oknardia_seria_info '
|
||||
'WHERE oknardia_seria_info.id = oknardia_seria_info.kRoot_id '
|
||||
'ORDER BY oknardia_seria_info.sName;')
|
||||
error_seria = True
|
||||
for count_seria in query_seria:
|
||||
if count_seria.id == int(i_seria_id):
|
||||
error_seria = False
|
||||
break
|
||||
if error_seria:
|
||||
# Ошибочный SeriaID. Такой базовой серии нет и надо ее найти.
|
||||
try:
|
||||
query = Seria_Info.objects.get(id=int(i_seria_id))
|
||||
if query.kRoot_id is None:
|
||||
# базовая серия прописана в kRoot_id
|
||||
i_seria_id = query.kRoot_id
|
||||
else:
|
||||
# == корневой нет
|
||||
# == ищем методом наименьших расстояний
|
||||
min_min = 100000000
|
||||
min_id = i_seria_id
|
||||
for count_seria in query_seria:
|
||||
if math.fabs(int(i_seria_id) - count_seria.id) < min_min:
|
||||
min_min = math.fabs(int(i_seria_id) - count_seria.id)
|
||||
min_id = count_seria.id
|
||||
i_seria_id = min_id
|
||||
except ObjectDoesNotExist:
|
||||
i_seria_id = query_seria[0].id
|
||||
# print("-->", SeriaID, "<--")
|
||||
seria_nav_dim = []
|
||||
this_return = {}
|
||||
for count_seria in query_seria:
|
||||
one_seria = {}
|
||||
one_seria.update({"SERIA_R": count_seria.sName, "ID2URL": count_seria.id})
|
||||
if count_seria.id == i_seria_id:
|
||||
this_return.update({"THIS_SERIA_NAME": count_seria.sName,
|
||||
"THIS_SERIA_DESCRIPTION": count_seria.sSeriaDescription})
|
||||
one_seria.update({"SERIA_L": ""})
|
||||
else:
|
||||
one_seria.update({"SERIA_L": pytils.translit.slugify(count_seria.sName)})
|
||||
seria_nav_dim.append(one_seria)
|
||||
this_return.update({"SERIA_NAV_DIM": seria_nav_dim})
|
||||
return i_seria_id, this_return
|
||||
|
||||
|
||||
def statistic_menu(request: HttpRequest) -> HttpResponse:
|
||||
""" Страница "Статистика" в главном меню
|
||||
|
||||
ВНИМАНИЕ: ТЕХНИЧЕСКИЙ ДОЛГ -- выводятся данные только по сериям зданий. Этого маловато.
|
||||
Можно добавить данные по проемам, предложениям, график распределения цен и т.п.
|
||||
|
||||
:param request: HttpRequest -- входящий http-запрос
|
||||
:return: HttpResponse -- исходящий http-ответ
|
||||
"""
|
||||
time_start = time()
|
||||
template = "seria_info/all_stat.html"
|
||||
to_template = {}
|
||||
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}"
|
||||
print(path_name)
|
||||
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}"})
|
||||
|
||||
# строим диаграмму сколько каких серий и каковы их площади...
|
||||
q_seria_pie = Seria_Info.objects.raw(
|
||||
"SELECT"
|
||||
" oknardia_seria_info.kRoot_id as id,"
|
||||
" COUNT(oknardia_building_info.id) AS num_building,"
|
||||
" SUM(oknardia_building_info.fTotal_Area) AS areaM2 "
|
||||
"FROM oknardia_building_info"
|
||||
" INNER JOIN oknardia_seria_info"
|
||||
" ON oknardia_building_info.kSeria_Link_id = oknardia_seria_info.id "
|
||||
"WHERE oknardia_seria_info.kRoot_id IS NOT NULL "
|
||||
"GROUP BY oknardia_seria_info.kRoot_id "
|
||||
"ORDER BY num_building DESC;")
|
||||
data2pie = []
|
||||
for count in q_seria_pie:
|
||||
data2pie.append({
|
||||
"ID": count.id,
|
||||
"AREA_M2": count.areaM2,
|
||||
"NUM_BUILDING": count.num_building
|
||||
})
|
||||
# print data2pie
|
||||
to_template.update({'DATA2PIE': data2pie})
|
||||
|
||||
to_template.update({'ticks': float(time()-time_start)})
|
||||
return render(request, template, to_template)
|
||||
Reference in New Issue
Block a user