mod: refactor catalog_seria to ORM
This commit is contained in:
@@ -13,6 +13,14 @@
|
|||||||
* Распилен `oknardia/web/catalog.py` на тематические модули (`catalog_companies.py`, `catalog_profiles.py`, `catalog_series.py`, `catalog_openings.py`) с вынесением общей логики в `catalog_utils.py`; маршруты обновлены без изменения внешних URL.
|
* Распилен `oknardia/web/catalog.py` на тематические модули (`catalog_companies.py`, `catalog_profiles.py`, `catalog_series.py`, `catalog_openings.py`) с вынесением общей логики в `catalog_utils.py`; маршруты обновлены без изменения внешних URL.
|
||||||
* Рефакторинг `catalog_profile_model` (`/catalog/profile/...`): raw SQL ⟶ ORM, упрощена логика, вынесены helper-функции, сокращено дублирование расчёта цветов рейтинга, нормализована подготовка `LIST_OTHER`/`MERCHANTS`/`PROFILES`/`PROFILE_DETAIL`, сохранена совместимость шаблонов.
|
* Рефакторинг `catalog_profile_model` (`/catalog/profile/...`): raw SQL ⟶ ORM, упрощена логика, вынесены helper-функции, сокращено дублирование расчёта цветов рейтинга, нормализована подготовка `LIST_OTHER`/`MERCHANTS`/`PROFILES`/`PROFILE_DETAIL`, сохранена совместимость шаблонов.
|
||||||
* Рефакторинг `catalog_profile_manufacture` (`/catalog/profile/<id>-<manufacturer>`): упрощена валидация URL, убран дублирующий код маппинга для `PROFILES` и `MERCHANTS` через общие хелперы, стандартизирован хвост контекста (`LAST_VISIT`, `LOG_VISIT`, `ticks`) через `_append_visit_context`.
|
* Рефакторинг `catalog_profile_manufacture` (`/catalog/profile/<id>-<manufacturer>`): упрощена валидация URL, убран дублирующий код маппинга для `PROFILES` и `MERCHANTS` через общие хелперы, стандартизирован хвост контекста (`LAST_VISIT`, `LOG_VISIT`, `ticks`) через `_append_visit_context`.
|
||||||
|
* Рефакторинг `catalog_seria` (`/catalog/seria/`): raw SQL ⟶ ORM для списка корневых серий, подготовка данных упрощена, хвост контекста с визитами и `ticks` вынесен в общий helper внутри `catalog_series.py`.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
|
||||||
#### Планы, задачи, маркеры и идеи на будущее:
|
#### Планы, задачи, маркеры и идеи на будущее:
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from django.core.exceptions import ObjectDoesNotExist
|
from django.core.exceptions import ObjectDoesNotExist
|
||||||
|
from django.db.models import F
|
||||||
from django.shortcuts import render, redirect
|
from django.shortcuts import render, redirect
|
||||||
from django.http import HttpRequest, HttpResponse
|
from django.http import HttpRequest, HttpResponse
|
||||||
from django.template.loader import render_to_string
|
from django.template.loader import render_to_string
|
||||||
@@ -16,6 +17,20 @@ import os
|
|||||||
import math
|
import math
|
||||||
import pytils
|
import pytils
|
||||||
|
|
||||||
|
|
||||||
|
def _make_slug(value: str) -> str:
|
||||||
|
"""Транслитерирует строку в slug (pytils)."""
|
||||||
|
return pytils.translit.slugify(value)
|
||||||
|
|
||||||
|
|
||||||
|
def _append_visit_context(to_template: dict, request: HttpRequest, time_start: float) -> None:
|
||||||
|
"""Дописывает в контекст стандартный хвост: визиты и время выполнения."""
|
||||||
|
to_template.update({
|
||||||
|
'LAST_VISIT': get_last_user_visit_list(get_last_user_visit_cookies(request)[:3]),
|
||||||
|
'LOG_VISIT': get_last_all_user_visit_list(),
|
||||||
|
'ticks': float(time.perf_counter() - time_start),
|
||||||
|
})
|
||||||
|
|
||||||
# Каталог типовых серий зданий (пока переадресация)
|
# Каталог типовых серий зданий (пока переадресация)
|
||||||
def catalog_seria(request: HttpRequest) -> HttpResponse:
|
def catalog_seria(request: HttpRequest) -> HttpResponse:
|
||||||
"""
|
"""
|
||||||
@@ -25,33 +40,24 @@ def catalog_seria(request: HttpRequest) -> HttpResponse:
|
|||||||
:return response: HttpResponse -- исходящий http-ответ
|
:return response: HttpResponse -- исходящий http-ответ
|
||||||
"""
|
"""
|
||||||
time_start = time.perf_counter()
|
time_start = time.perf_counter()
|
||||||
try:
|
# Только корневые серии (id == kRoot_id), сортировка как в старом SQL.
|
||||||
q_seria = Seria_Info.objects.raw('SELECT'
|
q_seria = (
|
||||||
' oknardia_seria_info.id,'
|
Seria_Info.objects.filter(id=F('kRoot_id'))
|
||||||
' oknardia_seria_info.sURL2IMG,'
|
.values('id', 'sURL2IMG', 'sName')
|
||||||
' oknardia_seria_info.sName '
|
.order_by('sName')
|
||||||
'FROM oknardia_seria_info '
|
)
|
||||||
'WHERE oknardia_seria_info.id = oknardia_seria_info.kRoot_id '
|
to_template: dict[str, object] = {
|
||||||
'ORDER BY oknardia_seria_info.sName;')
|
'SERIAS': [
|
||||||
list_seria = []
|
{
|
||||||
for i in q_seria:
|
'ID': row['id'],
|
||||||
list_seria.append({
|
'URL': row['sURL2IMG'],
|
||||||
"ID": i.id,
|
'NAME': row['sName'],
|
||||||
"URL": i.sURL2IMG,
|
'NAME_T': _make_slug(row['sName']),
|
||||||
"NAME": i.sName,
|
}
|
||||||
"NAME_T": pytils.translit.slugify(i.sName)
|
for row in q_seria
|
||||||
})
|
]
|
||||||
to_template = {'SERIAS': list_seria}
|
}
|
||||||
except (ObjectDoesNotExist,):
|
_append_visit_context(to_template, request, time_start)
|
||||||
to_template = {}
|
|
||||||
to_template.update({
|
|
||||||
# получаем последние визиты клиента через куки
|
|
||||||
'LAST_VISIT': get_last_user_visit_list(get_last_user_visit_cookies(request)[:3]),
|
|
||||||
# получаем последние визиты всех посетителей из базы
|
|
||||||
# id2log, log_visit = get_last_all_user_visit_list()
|
|
||||||
'LOG_VISIT': get_last_all_user_visit_list(),
|
|
||||||
'ticks': float(time.perf_counter() - time_start)
|
|
||||||
})
|
|
||||||
return render(request, "catalog/catalog_seria.html", to_template)
|
return render(request, "catalog/catalog_seria.html", to_template)
|
||||||
|
|
||||||
|
|
||||||
@@ -83,7 +89,7 @@ def catalog_seria_info(request: HttpRequest, seria_name_translit: None, seria_id
|
|||||||
is_hard_template = False
|
is_hard_template = False
|
||||||
else:
|
else:
|
||||||
is_hard_template = True
|
is_hard_template = True
|
||||||
to_template = {}
|
to_template: dict[str, object] ={}
|
||||||
# получаем проемы использующиеся в данной серии домов
|
# получаем проемы использующиеся в данной серии домов
|
||||||
q_windows_in_seria = Win_MountDim.objects.raw(
|
q_windows_in_seria = Win_MountDim.objects.raw(
|
||||||
f"SELECT DISTINCT"
|
f"SELECT DISTINCT"
|
||||||
@@ -211,14 +217,7 @@ def catalog_seria_info(request: HttpRequest, seria_name_translit: None, seria_id
|
|||||||
|
|
||||||
# to_template.update({'LOG_VISIT': GetLastAllUserVisitSeriaList(SeriaName),
|
# to_template.update({'LOG_VISIT': GetLastAllUserVisitSeriaList(SeriaName),
|
||||||
# 'ticks': float(time.perf_counter()-time_start)})
|
# 'ticks': float(time.perf_counter()-time_start)})
|
||||||
to_template.update({
|
_append_visit_context(to_template, request, time_start)
|
||||||
# получаем последние визиты клиента через куки
|
|
||||||
'LAST_VISIT': get_last_user_visit_list(get_last_user_visit_cookies(request)[:3]),
|
|
||||||
# получаем последние визиты всех посетителей из базы
|
|
||||||
# id2log, log_visit = get_last_all_user_visit_list()
|
|
||||||
'LOG_VISIT': get_last_all_user_visit_list(),
|
|
||||||
'ticks': float(time.perf_counter() - time_start)
|
|
||||||
})
|
|
||||||
return render(request, light_template, to_template)
|
return render(request, light_template, to_template)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user