mod: переделан raw на ORM и бурана дублирующая функция (список серий домов, она уже есть в web.catalog_series
This commit is contained in:
@@ -1,96 +1,59 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
from django.http import HttpRequest, HttpResponse
|
from django.http import HttpRequest, HttpResponse
|
||||||
from django.core.exceptions import ObjectDoesNotExist
|
from django.db.models import Count, Sum, F
|
||||||
from time import time
|
from time import time
|
||||||
from oknardia.settings import *
|
from oknardia.settings import *
|
||||||
from oknardia.models import Seria_Info
|
from oknardia.models import Building_Info
|
||||||
from web.catalog_series import all_seria_nav
|
from web.catalog_series import seria_nav # Используем уже существующую seria_nav из catalog_series
|
||||||
# from oknardia.catalog import all_seria_nav
|
|
||||||
import math
|
|
||||||
import os
|
import os
|
||||||
import pytils # вместо Rus2Lat(smth) --> pytils.translit.slugify(smth).lower()
|
|
||||||
|
|
||||||
|
|
||||||
# возвращает корректный seria_id и кортеж для построения навигации по сериям дома
|
|
||||||
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:
|
|
||||||
# Ошибочный seria_id. Такой базовой серии нет и надо ее найти.
|
|
||||||
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(f"-->{seria_id}<--")
|
|
||||||
return all_seria_nav(i_seria_id, query_seria)
|
|
||||||
|
|
||||||
|
|
||||||
def statistic_menu(request: HttpRequest) -> HttpResponse:
|
def statistic_menu(request: HttpRequest) -> HttpResponse:
|
||||||
""" Страница "Статистика" в главном меню
|
""" Страница "Статистика" в главном меню
|
||||||
|
|
||||||
ВНИМАНИЕ: ТЕХНИЧЕСКИЙ ДОЛГ -- выводятся данные только по сериям зданий. Этого маловато.
|
ВНИМАНИЕ: выводятся данные только по сериям зданий. Этого маловато.
|
||||||
Можно добавить данные по проемам, предложениям, график распределения цен и т.п.
|
В будущем, наверное, стоит добавить данные по проемам, предложениям, график распределения цен и т.п.
|
||||||
|
|
||||||
:param request: HttpRequest -- входящий http-запрос
|
:param request: HttpRequest -- входящий http-запрос
|
||||||
:return: HttpResponse -- исходящий http-ответ
|
:return: HttpResponse -- исходящий http-ответ
|
||||||
"""
|
"""
|
||||||
time_start = time()
|
time_start = time()
|
||||||
to_template: dict[str, object] = {}
|
to_template: dict[str, object] = {}
|
||||||
|
|
||||||
|
# Используем seria_nav из web.catalog_series, которая уже на ORM
|
||||||
seria_id, for_seria_nav = seria_nav(0)
|
seria_id, for_seria_nav = seria_nav(0)
|
||||||
to_template.update(for_seria_nav)
|
to_template.update(for_seria_nav)
|
||||||
|
|
||||||
# проверяем какой JS с картами и PieCharts: упакованные или нет (откуда берётся не упакованный -- не помню)
|
# проверяем какой JS с картами и PieCharts: упакованные или нет (откуда берётся не упакованный -- не помню)
|
||||||
path_name = f"{STATIC_BASE_PATH}/{PATH_FOR_JS_MAP}"
|
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}"):
|
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}"})
|
to_template.update({'MAP_JS': f"{PATH_FOR_JS_MAP}/_ALL{SUFFIX_FOR_MINI_JS_MAP}"})
|
||||||
else:
|
else:
|
||||||
to_template.update({'MAP_JS': f"{PATH_FOR_JS_MAP}/_ALL{SUFFIX_FOR_JS_MAP}"})
|
to_template.update({'MAP_JS': f"{PATH_FOR_JS_MAP}/_ALL{SUFFIX_FOR_JS_MAP}"})
|
||||||
# строим диаграмму сколько каких серий и каковы их площади...
|
|
||||||
q_seria_pie = Seria_Info.objects.raw(
|
# Строим диаграмму, сколько каких серий и каковы их площади...
|
||||||
"SELECT"
|
# Переписано с raw SQL на ORM
|
||||||
" oknardia_seria_info.kRoot_id as id,"
|
q_seria_pie_orm = (
|
||||||
" COUNT(oknardia_building_info.id) AS num_building,"
|
Building_Info.objects
|
||||||
" SUM(oknardia_building_info.fTotal_Area) AS area_m2 "
|
.filter(kSeria_Link__kRoot_id__isnull=False)
|
||||||
"FROM oknardia_building_info"
|
.values('kSeria_Link__kRoot_id')
|
||||||
" INNER JOIN oknardia_seria_info"
|
.annotate(
|
||||||
" ON oknardia_building_info.kSeria_Link_id = oknardia_seria_info.id "
|
id=F('kSeria_Link__kRoot_id'), # Переименовываем для соответствия старому контракту
|
||||||
"WHERE oknardia_seria_info.kRoot_id IS NOT NULL "
|
num_building=Count('id'),
|
||||||
"GROUP BY oknardia_seria_info.kRoot_id "
|
area_m2=Sum('fTotal_Area')
|
||||||
"ORDER BY num_building DESC;")
|
)
|
||||||
|
.order_by('-num_building')
|
||||||
|
)
|
||||||
|
|
||||||
data2pie = []
|
data2pie = []
|
||||||
for count in q_seria_pie:
|
for count in q_seria_pie_orm:
|
||||||
data2pie.append({
|
data2pie.append({
|
||||||
"ID": count.id,
|
"ID": count['id'], # Доступ к полям через словарь, т.к. values() возвращает dict
|
||||||
"AREA_M2": count.area_m2,
|
"AREA_M2": count['area_m2'],
|
||||||
"NUM_BUILDING": count.num_building
|
"NUM_BUILDING": count['num_building']
|
||||||
})
|
})
|
||||||
# print(data2pie)
|
|
||||||
to_template.update({'DATA2PIE': data2pie})
|
to_template.update({'DATA2PIE': data2pie})
|
||||||
to_template.update({'ticks': float(time()-time_start)})
|
to_template.update({'ticks': float(time()-time_start)})
|
||||||
return render(request, "seria_info/all_stat.html", to_template)
|
return render(request, "seria_info/all_stat.html", to_template)
|
||||||
|
|||||||
Reference in New Issue
Block a user