Вьюшка: "Каталог / Оконные профили / Производительь" -- готово
This commit is contained in:
@@ -40,7 +40,7 @@ urlpatterns = [
|
||||
# Ссылка, по которой пользователь может поменять пароль при утере. 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'^change_password$', user_manager.change_password),
|
||||
# ОБРАБОТЧИКИ СПИСКА ПУБЛИКАЦИЙ И САМИХ ПУБЛИКАЦИЙ БЛОГА
|
||||
# БЛОГ
|
||||
re_path(r'^blog/*$', blog.blog_list),
|
||||
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),
|
||||
@@ -51,12 +51,13 @@ urlpatterns = [
|
||||
re_path(r'^stat_all[/*]$', diagrams.statistic_menu),
|
||||
re_path(r'^stat/rating[/*]$', report2.ratings),
|
||||
re_path(r'^stat/rating/profiles_rank[/*]$', report2.profiles_rating),
|
||||
# КАТАЛОГ
|
||||
# --- Каталог
|
||||
re_path(r'^catalog[/*]$', catalog.catalog_root),
|
||||
re_path(r'^catalog/profile[/*]$', catalog.catalog_profile),
|
||||
re_path(r'^catalog/profile/(?P<manufacture_id>\d+)-(?P<manufacture_name>\S*)'
|
||||
r'/(?P<model_id>\d+)-(?P<model_name>\S*)[/*]$',
|
||||
catalog.catalog_profile_model),
|
||||
r'/(?P<model_id>\d+)-(?P<model_name>\S*)[/*]$', catalog.catalog_profile_model),
|
||||
re_path(r'^catalog/profile/(?P<manufacture_id>\d+)-(?P<manufacture_name>\S*)[/*]$',
|
||||
catalog.catalog_profile_manufacture),
|
||||
|
||||
]
|
||||
|
||||
|
||||
131
oknardia/templates/catalog/catalog_of_profiles_manufacture.html
Executable file
131
oknardia/templates/catalog/catalog_of_profiles_manufacture.html
Executable 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>Доля предложений окон на основе профилей {{ CATALOG_MANUFACT }} в базе «Окнардия»</h4>
|
||||
<div id="donutchart"></div>
|
||||
<h5>Партнёры «Окнардия» использующие профили производства {{ CATALOG_MANUFACT }} в своих предложениях:</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'>Извините, описание производителя профилей ещё не готово.<br /> <br />Зайдите позже.</p>" }}
|
||||
{# --- Описание производителя профилей :: конец --- #}</div>
|
||||
|
||||
<div class="col-md-11 col-xs-12 catalog_footer">
|
||||
<p><small>Информация о компании {{ CATALOG_MANUFACT }} для каталога «Окнардия» и профилях её производства предоставлена производителями или собрана из открытых источников. Для исправления неточностей, уточнения характеристик, коррекции описаний и добавления информацию о новых производителях или моделях оконных профилей, пишите на <script type="text/javascript">document.write("<a href='mai"+"lto:in" + "fo@" + "oknardia." + "ru?subject=ОКНАРДИЯ: каталог профилей (уточнения, испраления, добавления)'>info@"+"oknardia.ru</a>");</script>. Размещение в каталоге «Окнардия» бесплатно.</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 %}
|
||||
|
||||
|
||||
@@ -88,12 +88,12 @@ def get_rating_set_for_stars(rating: float = 0.) -> list:
|
||||
# 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_max: float -- максимальное значение в нормализуемом диапазоне
|
||||
:param val_min: float -- минимальное значение в нормализуемом диапазоне
|
||||
:param val_max: int -- максимальное значение в нормализуемом диапазоне
|
||||
:param val_min: int -- минимальное значение в нормализуемом диапазоне
|
||||
:return: float: float -- нормализованное значение
|
||||
"""
|
||||
return float(val - val_min) / float(val_max - val_min)
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from django.core.exceptions import ObjectDoesNotExist
|
||||
from django.shortcuts import render, redirect
|
||||
from django.http import HttpRequest, HttpResponse
|
||||
from django.utils import timezone
|
||||
@@ -9,6 +10,7 @@ from web.add_func import normalize, get_rating_set_for_stars
|
||||
import time
|
||||
import json
|
||||
import random
|
||||
import re
|
||||
import pytils
|
||||
|
||||
|
||||
@@ -21,13 +23,12 @@ def catalog_root(request: HttpRequest) -> HttpResponse:
|
||||
:return response: HttpResponse -- исходящий http-ответ
|
||||
"""
|
||||
time_start = time.time()
|
||||
template = "catalog/catalog_root.html" # шаблон
|
||||
# получаем из cookies последние визиты клиента
|
||||
to_template = {
|
||||
'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.time() - time_start)}
|
||||
response = render(request, template, to_template)
|
||||
response = render(request, "catalog/catalog_root.html", to_template)
|
||||
return response
|
||||
|
||||
|
||||
@@ -38,7 +39,6 @@ def catalog_profile(request: HttpRequest) -> HttpResponse:
|
||||
:param request: HttpRequest -- входящий http-запрос
|
||||
:return response: HttpResponse -- исходящий http-ответ
|
||||
"""
|
||||
template = "catalog/catalog_of_profiles.html" # шаблон
|
||||
time_start = time.time()
|
||||
q_profile = PVCprofiles.objects.raw('SELECT'
|
||||
' oknardia_pvcprofiles.id,'
|
||||
@@ -112,7 +112,7 @@ def catalog_profile(request: HttpRequest) -> HttpResponse:
|
||||
'LOG_VISIT': get_last_all_user_visit_list(),
|
||||
'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,
|
||||
@@ -128,7 +128,6 @@ def catalog_profile_model(request: HttpRequest, manufacture_id: int, manufacture
|
||||
:return response: HttpResponse -- исходящий http-ответ
|
||||
"""
|
||||
time_start = time.time()
|
||||
template = "catalog/catalog_of_profiles_model.html" # шаблон
|
||||
manufacture_id = int(manufacture_id)
|
||||
model_id = int(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}",
|
||||
"PROFILE_RATING_STARS": get_rating_set_for_stars(q_pvc_by_id.fProfileRating)}
|
||||
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 # Рейтинг реальный (профиль представлен в ценовых предложениях)
|
||||
# кружочки зелёные
|
||||
rating = getted_json[KEY_RATING]
|
||||
rating = got_json[KEY_RATING]
|
||||
color = int(255 - rating[RANK_PVCP_CAMERAS_NUM_NAME] * 255)
|
||||
to_template.update({"RANK_PVCP_CAMERAS_COLOR": f"{color},255,{color}"})
|
||||
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}"})
|
||||
color = int(255 - rating[RANK_PVCP_HEIGHT_NAME] * 255)
|
||||
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 # Рейтинг виртуальный (профиль представлен в ценовых предложениях)
|
||||
# кружочки серые
|
||||
rating = getted_json[KEY_RATING_VIRTUAL]
|
||||
rating = got_json[KEY_RATING_VIRTUAL]
|
||||
color = int(255 - rating[RANK_PVCP_CAMERAS_NUM_NAME] * 64)
|
||||
to_template.update({"RANK_PVCP_CAMERAS_COLOR": f"{color},{color},{color}"})
|
||||
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}"})
|
||||
else:
|
||||
pass
|
||||
if KEY_HTML in getted_json:
|
||||
to_template.update({"EXTRA_INFO": getted_json[KEY_HTML]})
|
||||
if KEY_HTML in got_json:
|
||||
to_template.update({"EXTRA_INFO": got_json[KEY_HTML]})
|
||||
except (TypeError, ValueError, KeyError):
|
||||
pass
|
||||
list_other = []
|
||||
@@ -282,4 +281,143 @@ def catalog_profile_model(request: HttpRequest, manufacture_id: int, manufacture
|
||||
'LOG_VISIT': get_last_all_user_visit_list(),
|
||||
'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)
|
||||
|
||||
Reference in New Issue
Block a user