mod: refactor catalog_seria to ORM

This commit is contained in:
2026-04-20 23:49:42 +03:00
parent 19a595fb10
commit 20877dc98e
2 changed files with 43 additions and 36 deletions

View File

@@ -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`.
*
*
*
*
*
*
*
#### Планы, задачи, маркеры и идеи на будущее: #### Планы, задачи, маркеры и идеи на будущее:

View File

@@ -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)