Вьюшка: "Каталог / Оконные профили / Производительь" -- готово

This commit is contained in:
2022-12-10 15:49:07 +03:00
parent c9214b956e
commit 988f8f1e07
4 changed files with 290 additions and 20 deletions

View File

@@ -40,7 +40,7 @@ urlpatterns = [
# Ссылка, по которой пользователь может поменять пароль при утере. URL: /USER_%05d/RESTORE:%s # Ссылка, по которой пользователь может поменять пароль при утере. URL: /USER_%05d/RESTORE:%s
re_path(r'^USER_(?P<user_id>\d{1,8})/RESTORE:(?P<hash_part_12>\S+)$', user_manager.restore_password), re_path(r'^USER_(?P<user_id>\d{1,8})/RESTORE:(?P<hash_part_12>\S+)$', user_manager.restore_password),
re_path(r'^change_password$', user_manager.change_password), re_path(r'^change_password$', user_manager.change_password),
# ОБРАБОТЧИКИ СПИСКА ПУБЛИКАЦИЙ И САМИХ ПУБЛИКАЦИЙ БЛОГА # БЛОГ
re_path(r'^blog/*$', blog.blog_list), re_path(r'^blog/*$', blog.blog_list),
re_path(r'^blog/P(?P<page>\d+)/*$', blog.blog_list_posts), re_path(r'^blog/P(?P<page>\d+)/*$', blog.blog_list_posts),
re_path(r'^blogpost/(?P<post_id>\d+)/(?P<page_back>\d+)/\S*/*$', blog.blog_post), re_path(r'^blogpost/(?P<post_id>\d+)/(?P<page_back>\d+)/\S*/*$', blog.blog_post),
@@ -51,12 +51,13 @@ urlpatterns = [
re_path(r'^stat_all[/*]$', diagrams.statistic_menu), re_path(r'^stat_all[/*]$', diagrams.statistic_menu),
re_path(r'^stat/rating[/*]$', report2.ratings), re_path(r'^stat/rating[/*]$', report2.ratings),
re_path(r'^stat/rating/profiles_rank[/*]$', report2.profiles_rating), re_path(r'^stat/rating/profiles_rank[/*]$', report2.profiles_rating),
# КАТАЛОГ # --- Каталог
re_path(r'^catalog[/*]$', catalog.catalog_root), re_path(r'^catalog[/*]$', catalog.catalog_root),
re_path(r'^catalog/profile[/*]$', catalog.catalog_profile), re_path(r'^catalog/profile[/*]$', catalog.catalog_profile),
re_path(r'^catalog/profile/(?P<manufacture_id>\d+)-(?P<manufacture_name>\S*)' re_path(r'^catalog/profile/(?P<manufacture_id>\d+)-(?P<manufacture_name>\S*)'
r'/(?P<model_id>\d+)-(?P<model_name>\S*)[/*]$', r'/(?P<model_id>\d+)-(?P<model_name>\S*)[/*]$', catalog.catalog_profile_model),
catalog.catalog_profile_model), re_path(r'^catalog/profile/(?P<manufacture_id>\d+)-(?P<manufacture_name>\S*)[/*]$',
catalog.catalog_profile_manufacture),
] ]

View File

@@ -0,0 +1,131 @@
{% extends "base.html" %}
{% load static %}
{% block Title %} Каталог :: Оконные профили производства {{ CATALOG_MANUFACT }}{% endblock %}
{% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %}
{% block Description %}Оконные профили {{ CATALOG_MANUFACT }}{% endblock %}
{% block Keywords %}{{ CATALOG_MANUFACT }}, оконные профили {{ CATALOG_MANUFACT }}, производитель {{ CATALOG_MANUFACT }}, каталог оконных профилей, каталог производителей оконных профилей, каталог профилей, оконные профили, oknardia, окнардия {{ META_KEYWORDS|default:"" }} {% endblock %}
{% block Date4Meta %}{{ PUB_DAT|date:"c" }}{% endblock %}
{% block Last4Meta %}{{ PUB_DAT|date:"c" }}{% endblock %}
{% block Author4Meta %}: Каталог{% endblock %}
{% block CopyrightAuthor4Meta %}: Каталог{% endblock %}
{% block Top_Meta1 %}
<!-- Дополнительные Metatags -->
<meta itemprop="author" content="Каталог «Окнардия»" />{% if IMG_FOR_BLOG %}
<meta itemprop="image" content="https://oknardia.ru/media/{{ IMG_FOR_BLOG }}" />{% else %}
<meta itemprop="image" content="https://oknardia.ru/static/img/MerDY3gpU0w.jpg" />{% endif %}
<meta itemprop="datePublished" content="{{ PUB_DAT|date:"c" }}" />
<span itemprop="publisher" itemscope itemtype="http://schema.org/Organization"><meta itemprop="name" content="Каталог «Окнардия»: оконные профили" /></span>
<span itemprop="author" itemscope itemtype="http://schema.org/Person"><meta itemprop="name" content="Каталог «Окнардия»" /></span>
<meta itemprop="articleSection" content="Каталог «Окнардия»: оконные профили {{ CATALOG_MANUFACT }}" />
<meta itemprop="headline" content="{{ TIZER|striptags|truncatewords_html:25 }}" />
<meta name="news_keywords" content="{{ HEADER|striptags }}" />
<link rel="canonical" href="https://oknardia.ru//catalog/profile/{{ CATALOG_URL }}" />
<link rel="standout" href="https://oknardia.ru//catalog/profile/{{ CATALOG_URL }}" />
<!-- Разметка для соц-сетей Facebook Open Graph -->
<meta property="fb:admins" name="admins" content="100000084781830" />
<meta property="fb:pages" content="276108456054163" />
<meta property="fb:app_id" content="258354027974262" />
<meta property="fb:profile_id" name="profile_id" content="https://www.facebook.com/oknardia/" />
<meta property="og:locale" content="ru_RU" />
<meta property="og:site_name" content="oknardia.ru" />
<meta property="og:url" content="https://oknardia.ru//catalog/profile/{{ CATALOG_URL }}" />
<meta property="og:type" content="article" />
<meta property="og:title" content="{{ HEADER|striptags }} | oknardia.ru" />
<meta property="og:description" content="{{ TIZER|striptags|truncatewords_html:25 }}" />
<meta property="og:image" content="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:"https://oknardia.ru/static/img/MerDY3gpU0w.jpg" }}" />
<link rel="image_src" href="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:"https://oknardia.ru/static/img/MerDY3gpU0w.jpg" }}" />
<!-- Разметка для соц-сетей Twitter Card -->
<meta name="twitter:title" content="{{ HEADER|striptags }} | oknardia.ru" />
<meta name="twitter:description" content="{{ TIZER|striptags|truncatewords_html:25 }}" />
<meta name="twitter:card" content="summary">
<meta name="twitter:site" content="@oknardia" />
<meta name="twitter:domain" content="oknardia.ru" />
<meta property="twitter:url" content="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:"https://oknardia.ru/static/img/MerDY3gpU0w.jpg" }}" />
<meta name="relap-image" content="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:"https://oknardia.ru/static/img/MerDY3gpU0w.jpg" }}">{% endblock %}
{% block Top_JS4 %}
<script type="text/javascript" src="//www.gstatic.com/charts/loader.js"></script>
<script type="text/javascript">
google.charts.load("current", {packages: ["corechart"]});
google.charts.setOnLoadCallback(drawChart);
function drawChart() {
var data = google.visualization.arrayToDataTable([
['Доля', 'Число предложений'],
['Предложения окон из профилей других производителей' , {{ OFFERS_OTHER }}],
['Предложения окон из профилей {{ CATALOG_MANUFACT }}', {{ OFFERS_BY_MAUFACTURE }}]
]);
var options = {
legend: {position: "none"},
backgroundColor: 'none',
pieHole: 0.38,
chartArea: {width: '90%', height: '90%'},
pieStartAngle: {{ OFFERS_ANGLE|stringformat:"0.f" }},
pieSliceTextStyle: {fontSize: 12},
// is3D: true,
slices: {1: {offset: 0.1}},
tooltip: {textStyle: {fontSize: 11, color: 'black', opacity: 0.8}, showColorCode: true}
};
var chart = new google.visualization.PieChart(document.getElementById('donutchart'));
chart.draw(data, options);
}
</script>{% endblock %}
{% block Main_Content %}
<div class="container-fluid">
{# <!--- Хлебные крошки: НАЧАЛО --> #}<div class="row">
<div class="col-md-11 col-xs-12">
<ol class="breadcrumb">
<li><a href="/">Главная</a></li>
<li><a href="/catalog/">Каталог</a></li>
<li><a href="/catalog/profile/">Оконные профили</a></li>
<li>{{ CATALOG_MANUFACT }}</li>
</ol>
<h1>Оконные профили производства {{ CATALOG_MANUFACT }}</h1>
</div>
</div>{# <!--- Хлебные крошки: КОНЕЦ ---> #}
<div class="row">
<div class="col-md-4 col-xs-12 catalog">
<table>
<thead>
<tr><th>Марки профилей {{ CATALOG_MANUFACT }}</th><th>рейтинг</th></tr>
</thead>
<tbody>{% for i in PROFILES %}
<tr>
<td><a href="/catalog/profile/{{ i.PROFILE_ID }}-{{ CATALOG_MAN2URL }}/{{ i.PROFILE_ID }}-{{ i.PROFILE_URL }}">{{ i.PROFILE_NAME }}</a></td>
<td><nobr title="Рейтинг «Окнардии»{% if i.PROFILE_RATING > -0.1 %} — {{ i.PROFILE_RATING|stringformat:".2f" }} баллов{% endif %}"> {% for Star in i.PROFILE_RATING_STARS %}{% if Star == 0 %}<b class="glyphicon glyphicon-star-empty"></b>{% else %}<b class="glyphicon glyphicon-star"></b>{% endif %}{% endfor %} {% if i.PROFILE_RATING > -0.1 %}<small class="badge badge4price">{{ i.PROFILE_RATING|stringformat:".2f" }}</small>{% endif %}</nobr></td>
</tr>{% endfor %}
</tbody>
</table>
<p class="small-note">Сравнить компонеты рейтинга профилей можно в разделе <a href="/stat/rating/profiles_rank/">Ретинги</a>.</p>{% if not OFFERS_BY_MAUFACTURE == 0 %}
<h4>Доля предложений окон на&nbsp;основе профилей {{ CATALOG_MANUFACT }} в&nbsp;базе &laquo;Окнардия&raquo;</h4>
<div id="donutchart"></div>
<h5>Партнёры &laquo;Окнардия&raquo; использующие профили производства {{ CATALOG_MANUFACT }} в&nbsp;своих предложениях:</h5>
<p class="catalog-logo">{% for i in MERCHANTS %}<a href="/catalog/company/{{ i.MERCHANT_ID }}-{{ i.MERCHANT_NAME_T }}/"><img src="/media/{{ i.MERCHANT_LOGO_URL }}" alt="{{ i.MERCHANT_NAME }}: коммерческий предложений {{ i.MERCHANT_OFFERS }}" title="{{ i.MERCHANT_NAME }}: коммерческий предложений {{ i.MERCHANT_OFFERS }}"></a>{% endfor %}</p>
{% endif %}</div>
<div class="col-md-7 col-xs-12">{# --- Описание производителя профилей :: начало --- #}
{{ CONTENT|safe|default:"<p style='background-color:#f0f0f0;color:silver;height:15em;padding:5ex 10ex'>Извините, описание производителя профилей ещё не&nbsp;готово.<br />&nbsp;<br />Зайдите позже.</p>" }}
{# --- Описание производителя профилей :: конец --- #}</div>
<div class="col-md-11 col-xs-12 catalog_footer">
<p><small>Информация о&nbsp;компании {{ CATALOG_MANUFACT }} для каталога &laquo;Окнардия&raquo; и&nbsp;профилях её&nbsp;производства предоставлена производителями или собрана из&nbsp;открытых источников. Для исправления неточностей, уточнения характеристик, коррекции описаний и&nbsp;добавления информацию о&nbsp;новых производителях или моделях оконных профилей, пишите на <script type="text/javascript">document.write("<a href='mai"+"lto:in" + "fo@" + "oknardia." + "ru?subject=ОКНАРДИЯ: каталог профилей (уточнения, испраления, добавления)'>info@"+"oknardia.ru</a>");</script>. Размещение в&nbsp;каталоге &laquo;Окнардия&raquo; бесплатно.</small></p>
</div>
</div>
{# --- Баннер: НАЧАЛО --- #}
<div class="row"><div class="col-md-12 col-xs-12"><hr class="dotted-black" />{% include "ad/bannet-wide.html" %}</div></div>
{# --- Баннер: конец --- #}
<div class="row">
{% include "report/report_last_user_visit.html" %}
{% include "report/report_log_user_visit.html" %}
</div>
</div>{% endblock %}

View File

@@ -88,12 +88,12 @@ def get_rating_set_for_stars(rating: float = 0.) -> list:
# return distance # return distance
def normalize(val: float, val_max: float = 5., val_min: float = 0.) -> float: def normalize(val: float, val_max: int = 5, val_min: int = 0) -> float:
""" Нормализация значения """ Нормализация значения
:param val: float -- значение которое надо нормализовать :param val: float -- значение которое надо нормализовать
:param val_max: float -- максимальное значение в нормализуемом диапазоне :param val_max: int -- максимальное значение в нормализуемом диапазоне
:param val_min: float -- минимальное значение в нормализуемом диапазоне :param val_min: int -- минимальное значение в нормализуемом диапазоне
:return: float: float -- нормализованное значение :return: float: float -- нормализованное значение
""" """
return float(val - val_min) / float(val_max - val_min) return float(val - val_min) / float(val_max - val_min)

View File

@@ -1,4 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.core.exceptions import ObjectDoesNotExist
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.utils import timezone from django.utils import timezone
@@ -9,6 +10,7 @@ from web.add_func import normalize, get_rating_set_for_stars
import time import time
import json import json
import random import random
import re
import pytils import pytils
@@ -21,13 +23,12 @@ def catalog_root(request: HttpRequest) -> HttpResponse:
:return response: HttpResponse -- исходящий http-ответ :return response: HttpResponse -- исходящий http-ответ
""" """
time_start = time.time() time_start = time.time()
template = "catalog/catalog_root.html" # шаблон
# получаем из cookies последние визиты клиента # получаем из cookies последние визиты клиента
to_template = { to_template = {
'LAST_VISIT': get_last_user_visit_list(get_last_user_visit_cookies(request)[:3]), 'LAST_VISIT': get_last_user_visit_list(get_last_user_visit_cookies(request)[:3]),
'LOG_VISIT': get_last_all_user_visit_list(), 'LOG_VISIT': get_last_all_user_visit_list(),
'ticks': float(time.time() - time_start)} 'ticks': float(time.time() - time_start)}
response = render(request, template, to_template) response = render(request, "catalog/catalog_root.html", to_template)
return response return response
@@ -38,7 +39,6 @@ def catalog_profile(request: HttpRequest) -> HttpResponse:
:param request: HttpRequest -- входящий http-запрос :param request: HttpRequest -- входящий http-запрос
:return response: HttpResponse -- исходящий http-ответ :return response: HttpResponse -- исходящий http-ответ
""" """
template = "catalog/catalog_of_profiles.html" # шаблон
time_start = time.time() time_start = time.time()
q_profile = PVCprofiles.objects.raw('SELECT' q_profile = PVCprofiles.objects.raw('SELECT'
' oknardia_pvcprofiles.id,' ' oknardia_pvcprofiles.id,'
@@ -112,7 +112,7 @@ def catalog_profile(request: HttpRequest) -> HttpResponse:
'LOG_VISIT': get_last_all_user_visit_list(), 'LOG_VISIT': get_last_all_user_visit_list(),
'ticks': float(time.time() - time_start) 'ticks': float(time.time() - time_start)
}) })
return render(request, template, to_template) return render(request, "catalog/catalog_of_profiles.html", to_template)
def catalog_profile_model(request: HttpRequest, manufacture_id: int, manufacture_name: str, def catalog_profile_model(request: HttpRequest, manufacture_id: int, manufacture_name: str,
@@ -128,7 +128,6 @@ def catalog_profile_model(request: HttpRequest, manufacture_id: int, manufacture
:return response: HttpResponse -- исходящий http-ответ :return response: HttpResponse -- исходящий http-ответ
""" """
time_start = time.time() time_start = time.time()
template = "catalog/catalog_of_profiles_model.html" # шаблон
manufacture_id = int(manufacture_id) manufacture_id = int(manufacture_id)
model_id = int(model_id) model_id = int(model_id)
q_pvc_by_id = PVCprofiles.objects.get(id=model_id) q_pvc_by_id = PVCprofiles.objects.get(id=model_id)
@@ -143,12 +142,12 @@ def catalog_profile_model(request: HttpRequest, manufacture_id: int, manufacture
"CATALOG_URL2": f"{manufacture_id}-{manufacture_name}/{model_id}-{model_name}", "CATALOG_URL2": f"{manufacture_id}-{manufacture_name}/{model_id}-{model_name}",
"PROFILE_RATING_STARS": get_rating_set_for_stars(q_pvc_by_id.fProfileRating)} "PROFILE_RATING_STARS": get_rating_set_for_stars(q_pvc_by_id.fProfileRating)}
try: try:
getted_json = json.loads(q_pvc_by_id.sProfileDescription) got_json = json.loads(q_pvc_by_id.sProfileDescription)
# раскрашиваем кружочки рейтинга напротив характеристик профиля # раскрашиваем кружочки рейтинга напротив характеристик профиля
if KEY_RATING in getted_json: if KEY_RATING in got_json:
# RatingReal = True # Рейтинг реальный (профиль представлен в ценовых предложениях) # RatingReal = True # Рейтинг реальный (профиль представлен в ценовых предложениях)
# кружочки зелёные # кружочки зелёные
rating = getted_json[KEY_RATING] rating = got_json[KEY_RATING]
color = int(255 - rating[RANK_PVCP_CAMERAS_NUM_NAME] * 255) color = int(255 - rating[RANK_PVCP_CAMERAS_NUM_NAME] * 255)
to_template.update({"RANK_PVCP_CAMERAS_COLOR": f"{color},255,{color}"}) to_template.update({"RANK_PVCP_CAMERAS_COLOR": f"{color},255,{color}"})
color = int(255 - rating[RANK_PVCP_SEALS_NAME] * 255) color = int(255 - rating[RANK_PVCP_SEALS_NAME] * 255)
@@ -165,10 +164,10 @@ def catalog_profile_model(request: HttpRequest, manufacture_id: int, manufacture
to_template.update({"RANK_PVCP_SOUNDPROOFING_COLOR": f"{color},255,{color}"}) to_template.update({"RANK_PVCP_SOUNDPROOFING_COLOR": f"{color},255,{color}"})
color = int(255 - rating[RANK_PVCP_HEIGHT_NAME] * 255) color = int(255 - rating[RANK_PVCP_HEIGHT_NAME] * 255)
to_template.update({"RANK_PVCP_HEIGHT_COLOR": f"{color},255,{color}"}) to_template.update({"RANK_PVCP_HEIGHT_COLOR": f"{color},255,{color}"})
elif KEY_RATING_VIRTUAL in getted_json: elif KEY_RATING_VIRTUAL in got_json:
# RatingReal = False # Рейтинг виртуальный (профиль представлен в ценовых предложениях) # RatingReal = False # Рейтинг виртуальный (профиль представлен в ценовых предложениях)
# кружочки серые # кружочки серые
rating = getted_json[KEY_RATING_VIRTUAL] rating = got_json[KEY_RATING_VIRTUAL]
color = int(255 - rating[RANK_PVCP_CAMERAS_NUM_NAME] * 64) color = int(255 - rating[RANK_PVCP_CAMERAS_NUM_NAME] * 64)
to_template.update({"RANK_PVCP_CAMERAS_COLOR": f"{color},{color},{color}"}) to_template.update({"RANK_PVCP_CAMERAS_COLOR": f"{color},{color},{color}"})
color = int(255 - rating[RANK_PVCP_SEALS_NAME] * 64) color = int(255 - rating[RANK_PVCP_SEALS_NAME] * 64)
@@ -187,8 +186,8 @@ def catalog_profile_model(request: HttpRequest, manufacture_id: int, manufacture
to_template.update({"RANK_PVCP_HEIGHT_COLOR": f"{color},{color},{color}"}) to_template.update({"RANK_PVCP_HEIGHT_COLOR": f"{color},{color},{color}"})
else: else:
pass pass
if KEY_HTML in getted_json: if KEY_HTML in got_json:
to_template.update({"EXTRA_INFO": getted_json[KEY_HTML]}) to_template.update({"EXTRA_INFO": got_json[KEY_HTML]})
except (TypeError, ValueError, KeyError): except (TypeError, ValueError, KeyError):
pass pass
list_other = [] list_other = []
@@ -282,4 +281,143 @@ def catalog_profile_model(request: HttpRequest, manufacture_id: int, manufacture
'LOG_VISIT': get_last_all_user_visit_list(), 'LOG_VISIT': get_last_all_user_visit_list(),
'ticks': float(time.time()-time_start) 'ticks': float(time.time()-time_start)
}) })
return render(request, template, to_template) return render(request, "catalog/catalog_of_profiles_model.html", to_template)
def catalog_profile_manufacture (request: HttpRequest, manufacture_id: int, manufacture_name: str) -> HttpResponse:
"""
КАТАЛОГ ПРОФИЛЕЙ: страница с описанием производителя профилей и списком марки производимых им профилей
:param request: HttpRequest -- входящий http-запрос
:param manufacture_id: id профиля. Предполагается, что это первый id при сортировке по sProfileBriefDescription
:param manufacture_name: название производителя (транслитерированное pytils.translit.slugify())
:return response: HttpResponse -- исходящий http-ответ
"""
time_start = time.time()
manufacture_id = int(manufacture_id)
q_pvc_by_id = PVCprofiles.objects.get(id=manufacture_id)
if pytils.translit.slugify(q_pvc_by_id.sProfileManufacturer) != manufacture_name:
return redirect(f'/catalog/profile/{manufacture_id}-'
f'{pytils.translit.slugify(q_pvc_by_id.sProfileManufacturer)}')
else:
q_pvc_by_id = PVCprofiles.objects.order_by('id')\
.filter(sProfileManufacturer=q_pvc_by_id.sProfileManufacturer).first()
if q_pvc_by_id.id != manufacture_id:
return redirect(f'/catalog/profile/{q_pvc_by_id.id}-'
f'{pytils.translit.slugify(q_pvc_by_id.sProfileManufacturer)}')
to_template = {'CATALOG_MANUFACT': q_pvc_by_id.sProfileManufacturer,
'CATALOG_MAN2URL': manufacture_name,
'CATALOG_URL': f"{manufacture_id}-{manufacture_name}"}
try:
# получаем информацию о производителе (статью из блога)
manufacture_description = list(PVCprofiles.objects.raw(
f"SELECT "
f" oknardia_blogposts.* "
f"FROM oknardia_catalog2profile"
f" RIGHT OUTER JOIN oknardia_pvcprofiles"
f" ON oknardia_catalog2profile.kProfile_id = oknardia_pvcprofiles.id"
f" LEFT OUTER JOIN oknardia_blogposts"
f" ON oknardia_catalog2profile.kBlogCatalog_id = oknardia_blogposts.id "
f"WHERE oknardia_catalog2profile.sCatalogCardType = {CATALOG_RECORD_FOR_PROFILE_MANUFACTURER} "
f" AND oknardia_pvcprofiles.sProfileManufacturer = '{q_pvc_by_id.sProfileManufacturer}'"
f" AND oknardia_blogposts.bCatalog IS TRUE "
f"GROUP BY oknardia_blogposts.bCatalog "
f"LIMIT 1;"
))[0]
to_template.update({'PUB_DAT': manufacture_description.dPostDataModify})
if PATH_FOR_IMG_BLOG in manufacture_description.sImgForBlogSocial:
to_template.update({'IMG_FOR_BLOG': manufacture_description.sImgForBlogSocial})
to_template.update({'HEADER': manufacture_description.sPostHeader,
'CONTENT': re.sub(r'<cut[\s\S]*>', '', manufacture_description.sPostContent,
0, re.IGNORECASE)})
to_template.update({'TIZER': re.sub(r'<script[\s\S]*?</script>|<style[\s\S]*?</style>|<iframe[\s\S]*?</iframe>',
'', to_template["CONTENT"], 0, re.IGNORECASE)})
except (ObjectDoesNotExist, IndexError, TypeError, KeyError, ):
pass
q_profiles = PVCprofiles.objects.raw(
f"SELECT oknardia_pvcprofiles.id,"
f" oknardia_pvcprofiles.fProfileRating,"
f" oknardia_pvcprofiles.sProfileBriefDescription,"
f" oknardia_pvcprofiles.sProfileName "
f"FROM oknardia_pvcprofiles "
f"WHERE oknardia_pvcprofiles.sProfileManufacturer = '{q_pvc_by_id.sProfileManufacturer}' "
f"ORDER BY oknardia_pvcprofiles.fProfileRating;"
)
list_profiles = []
for i in q_profiles:
list_profiles.append({
"PROFILE_NAME": i.sProfileBriefDescription,
"PROFILE_ID": i.id,
"PROFILE_URL": pytils.translit.slugify(i.sProfileName).lower(),
"PROFILE_RATING": i.fProfileRating,
"PROFILE_RATING_STARS": get_rating_set_for_stars(i.fProfileRating),
})
to_template.update({'PROFILES': list_profiles})
try:
q_share_of_offers = list(PVCprofiles.objects.raw(
f"SELECT"
f" 1 AS id,"
f" SUM(Q1.offers_by_model) AS offers_by_maufacture,"
f" Q2.tatal_offers-SUM(Q1.offers_by_model) AS offers_other "
f"FROM (SELECT COUNT(oknardia_priceoffer.id) AS offers_by_model"
f" FROM oknardia_priceoffer"
f" LEFT OUTER JOIN oknardia_setkit"
f" ON oknardia_priceoffer.kOffer2SetKit_id = oknardia_setkit.id"
f" RIGHT OUTER JOIN oknardia_pvcprofiles"
f" ON oknardia_setkit.kSet2PVCprofiles_id = oknardia_pvcprofiles.id"
f" WHERE oknardia_pvcprofiles.sProfileManufacturer = '{q_pvc_by_id.sProfileManufacturer}') Q1,"
f" (SELECT COUNT(oknardia_priceoffer.id) AS tatal_offers"
f" FROM oknardia_priceoffer) AS Q2 "
f"LIMIT 1;"
))[0]
to_template.update({
'OFFERS_BY_MAUFACTURE': q_share_of_offers.offers_by_maufacture,
'OFFERS_OTHER': q_share_of_offers.offers_other,
'OFFERS_ANGLE': 90+180*normalize(q_share_of_offers.offers_by_maufacture,
q_share_of_offers.offers_other + q_share_of_offers.offers_by_maufacture)
})
if q_share_of_offers is not None and q_share_of_offers.offers_by_maufacture != 0:
q_merchant = PVCprofiles.objects.raw(
f"SELECT"
f" COUNT(oknardia_priceoffer.id) AS offers_by_merchant,"
f" oknardia_merchantbrand.sMerchantName,"
f" oknardia_merchantbrand.pMerchantLogo,"
f" oknardia_merchantbrand.id "
f"FROM oknardia_priceoffer"
f" INNER JOIN oknardia_setkit"
f" ON oknardia_priceoffer.kOffer2SetKit_id = oknardia_setkit.id"
f" INNER JOIN oknardia_pvcprofiles"
f" ON oknardia_setkit.kSet2PVCprofiles_id = oknardia_pvcprofiles.id"
f" INNER JOIN oknardia_ouruser"
f" ON oknardia_setkit.kSet2User_id = oknardia_ouruser.id"
f" INNER JOIN oknardia_merchantoffice"
f" ON oknardia_ouruser.kMerchantOffice_id = oknardia_merchantoffice.id"
f" INNER JOIN oknardia_merchantbrand"
f" ON oknardia_merchantoffice.kMerchantName_id = oknardia_merchantbrand.id "
f"WHERE oknardia_pvcprofiles.sProfileManufacturer = '{q_pvc_by_id.sProfileManufacturer}' "
f"GROUP BY oknardia_merchantbrand.sMerchantName,"
f" oknardia_merchantbrand.pMerchantLogo,"
f" oknardia_merchantbrand.id "
f"ORDER BY offers_by_merchant DESC;"
)
list_merchant = []
for i in q_merchant:
list_merchant.append({
"MERCHANT_ID": i.id,
"MERCHANT_NAME": i.sMerchantName,
"MERCHANT_NAME_T": pytils.translit.slugify(i.sMerchantName),
"MERCHANT_LOGO_URL": i.pMerchantLogo,
"MERCHANT_OFFERS": i.offers_by_merchant
})
to_template.update({'MERCHANTS': list_merchant})
except (ObjectDoesNotExist, IndexError, TypeError): # вообще-то, запрос q_share_of_offers всегда что-то вернёт,
pass # но на всякий случай
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.time()-time_start)
})
return render(request, "catalog/catalog_of_profiles_manufacture.html", to_template)