Страница: "Каталог / Оконные профили / Производитель / Модель" -- redy
This commit is contained in:
@@ -54,6 +54,9 @@ urlpatterns = [
|
|||||||
# КАТАЛОГ
|
# КАТАЛОГ
|
||||||
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*)'
|
||||||
|
r'/(?P<model_id>\d+)-(?P<model_name>\S*)[/*]$',
|
||||||
|
catalog.catalog_profile_model),
|
||||||
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
166
oknardia/templates/catalog/catalog_of_profiles_model.html
Executable file
166
oknardia/templates/catalog/catalog_of_profiles_model.html
Executable file
@@ -0,0 +1,166 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
{% load static %}
|
||||||
|
|
||||||
|
{% block Title %} Каталог :: Оконные профили {{ CATALOG_MODEL.sProfileName }}{% endblock %}
|
||||||
|
|
||||||
|
{% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %}
|
||||||
|
|
||||||
|
{% block Description %}Описание и характеристики оконных профилей {{ CATALOG_MODEL.sProfileName }} производства {{ CATALOG_MODEL.sProfileManufacturer }}{% endblock %}
|
||||||
|
|
||||||
|
{% block Keywords %}{{ CATALOG_MODEL.sProfileName }}, характеристики {{ CATALOG_MODEL.sProfileName }}, описание {{ CATALOG_MODEL.sProfileName }}, оконные профили {{ CATALOG_MODEL.sProfileName }}, {{ CATALOG_MODEL.sProfileManufacturer }}, производитель {{ CATALOG_MODEL.sProfileManufacturer }}, каталог оконных профилей, каталог производителей оконных профилей, каталог профилей, оконные профили, 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_MODEL.sProfileName }}" />
|
||||||
|
<meta itemprop="headline" content="Описание и характеристики оконных профилей {{ CATALOG_MODEL.sProfileName }} производства {{ CATALOG_MODEL.sProfileManufacturer }}" />
|
||||||
|
<meta name="news_keywords" content="{{ CATALOG_MODEL.sProfileName }}, характеристики {{ CATALOG_MODEL.sProfileName }}, описание {{ CATALOG_MODEL.sProfileName }}, оконные профили {{ CATALOG_MODEL.sProfileName }}, {{ CATALOG_MODEL.sProfileManufacturer }}, производитель {{ CATALOG_MODEL.sProfileManufacturer }}, каталог оконных профилей, каталог производителей оконных профилей, каталог профилей, оконные профили, oknardia, окнардия" />
|
||||||
|
<link rel="canonical" href="https://oknardia.ru//catalog/profile/{{ CATALOG_URL2 }}" />
|
||||||
|
<link rel="standout" href="https://oknardia.ru//catalog/profile/{{ CATALOG_URL2 }}" />
|
||||||
|
<!-- Разметка для соц-сетей 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_URL2 }}" />
|
||||||
|
<meta property="og:type" content="article" />
|
||||||
|
<meta property="og:title" content="Оконные профили {{ CATALOG_MODEL.sProfileName }} | oknardia.ru" />
|
||||||
|
<meta property="og:description" content="Описание и характеристики оконных профилей {{ CATALOG_MODEL.sProfileName }} производства {{ CATALOG_MODEL.sProfileManufacturer }}" />
|
||||||
|
<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="Оконные профили {{ CATALOG_MODEL.sProfileName }} | oknardia.ru" />
|
||||||
|
<meta name="twitter:description" content="Описание и характеристики оконных профилей {{ CATALOG_MODEL.sProfileName }} производства {{ CATALOG_MODEL.sProfileManufacturer }}" />
|
||||||
|
<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 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><a href="/catalog/profile/{{ CATALOG_URL }}">{{ CATALOG_MODEL.sProfileManufacturer }}</a></li>
|
||||||
|
<li>{{ CATALOG_MODEL.sProfileName }}</li>
|
||||||
|
</ol>
|
||||||
|
<h1>Оконные профили {{ CATALOG_MODEL.sProfileName }} <small>({{ CATALOG_MODEL.sProfileManufacturer }})</small></h1>
|
||||||
|
</div>
|
||||||
|
</div>{# <!--- Хлебные крошки: КОНЕЦ ---> #}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-5 col-xs-12 catalog">
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th colspan="2">Характеристики оконного профиля {{ CATALOG_MODEL.sProfileName }}</th>
|
||||||
|
<th colspan="2"><nobr title="Рейтинг «Окнардии»{% if CATALOG_MODEL.fProfileRating > -0.1 %} — {{ CATALOG_MODEL.fProfileRating|stringformat:".2f" }} баллов{% endif %}"> {% for Star in PROFILE_RATING_STARS %}{% if Star == 0 %}<b class="glyphicon glyphicon-star-empty"></b>{% else %}<b class="glyphicon glyphicon-star"></b>{% endif %}{% endfor %} {% if CATALOG_MODEL.fProfileRating > -0.1 %}<small class="badge badge4price">{{ CATALOG_MODEL.fProfileRating|stringformat:".2f" }}</small>{% endif %}</nobr></th></tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>Производитель:</td>
|
||||||
|
<td colspan="3"><a href="/catalog/profile/{{ CATALOG_URL }}">{{ CATALOG_MODEL.sProfileManufacturer }}</a></td>
|
||||||
|
</tr><tr>
|
||||||
|
<td colspan="2">Сопротивление теплопередаче <nobr><i>Ro</i> (<i>м²×°C/Вт</i>):</nobr></td>
|
||||||
|
<td>{% if RANK_PVCP_HEAT_TRANSFER_COLOR != "" %}<div class="round-mark" style="background:rgb({{ RANK_PVCP_HEAT_TRANSFER_COLOR }});"></div>{% endif %}</td>
|
||||||
|
<td{% if CATALOG_MODEL.fProfileHeatTransf > 0.1 %} title="Сопротивление теплопередаче (Ro) оконного профиля: {{ CATALOG_MODEL.fProfileHeatTransf|stringformat:".2f" }} м²×°C/Вт"{% endif %}>{{ CATALOG_MODEL.fProfileHeatTransf|stringformat:".2f" }}</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td colspan="2">Коэффициент звукоизоляции, (<i>дБ</i>):</td>
|
||||||
|
<td>{% if RANK_PVCP_SOUNDPROOFING_COLOR != "" %}<div class="round-mark" style="background:rgb({{ RANK_PVCP_SOUNDPROOFING_COLOR }});"></div>{% endif %}</td>
|
||||||
|
<td{% if CATALOG_MODEL.fProfileSoundproofing > 1 %} title="Коэффициент звукоизоляции оконного профиля: {{ CATALOG_MODEL.fProfileSoundproofing|stringformat:".1f" }} дБ"{% endif %}>{% if CATALOG_MODEL.fProfileSoundproofing > 1 %}{{ CATALOG_MODEL.fProfileSoundproofing|stringformat:".1f" }}{% else %}—{% endif %}</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td colspan="2">Контуров уплотненения (<i>шт.</i>):</td>
|
||||||
|
<td>{% if RANK_PVCP_SEALS_COLOR != "" %}<div class="round-mark" style="background:rgb({{ RANK_PVCP_SEALS_COLOR }});"></div>{% endif %}</td>
|
||||||
|
<td{% if CATALOG_MODEL.fProfileSeals > 0 %} title="Число контуров уплотнения створки к раме: {{ CATALOG_MODEL.fProfileSeals }} шт."{% endif %}>{% if CATALOG_MODEL.fProfileSeals > 0 %}{{ CATALOG_MODEL.fProfileSeals }}{% else %}—{% endif %}</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td colspan="2">Высота в световом проеме, рама+створка (<i>мм</i>):</td>
|
||||||
|
<td>{% if RANK_PVCP_HEIGHT_COLOR != "" %}<div class="round-mark" style="background:rgb({{ RANK_PVCP_HEIGHT_COLOR }});"></div>{% endif %}</td>
|
||||||
|
<td{% if CATALOG_MODEL.iProfileHeight > 15 %} title="Высота в световом проеме, рама+створка: {{ CATALOG_MODEL.iProfileHeight }} мм"{% endif %}>{% if CATALOG_MODEL.iProfileHeight > 15 %}{{ CATALOG_MODEL.iProfileHeight }}{% else %}—{% endif %}</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td colspan="2">Максимальная толщина стеклопакета (<i>мм</i>):</td>
|
||||||
|
<td>{% if RANK_PVCP_G_THICKNESS_COLOR != "" %}<div class="round-mark" style="background:rgb({{ RANK_PVCP_G_THICKNESS_COLOR }});"></div>{% endif %}</td>
|
||||||
|
<td{% if CATALOG_MODEL.iProfileGlazingThickness > 4 %} title="Максимальная толщина стеклопакета для уставноки с створку: {{ CATALOG_MODEL.iProfileGlazingThickness }} мм"{% endif %}>{% if CATALOG_MODEL.iProfileGlazingThickness > 4 %}{{ CATALOG_MODEL.iProfileGlazingThickness }}{% else %}—{% endif %}</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td colspan="2">Монтажная ширина профиля (<i>мм</i>):</td>
|
||||||
|
<td>{% if RANK_PVCP_THICKNESS_COLOR != "" %}<div class="round-mark" style="background:rgb({{ RANK_PVCP_THICKNESS_COLOR }});"></div>{% endif %}</td>
|
||||||
|
<td{% if CATALOG_MODEL.iProfileThickness > 5 %} title="Монтажная ширина оконного профиля: {{ CATALOG_MODEL.iProfileThickness }} мм."{% endif %}>{% if CATALOG_MODEL.iProfileThickness > 5 %}{{ CATALOG_MODEL.iProfileThickness }}{% else %}—{% endif %}</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td colspan="2">Фальц рамы (<i>мм</i>):</td>
|
||||||
|
<td>{% if RANK_PVCP_RABBET_COLOR != "" %}<div class="round-mark" style="background:rgb({{ RANK_PVCP_RABBET_COLOR }});"></div>{% endif %}</td>
|
||||||
|
<td{% if CATALOG_MODEL.iProfileRabbet > 1 %} title="Высота фальца рамы: {{ CATALOG_MODEL.iProfileRabbet }} мм."{% endif %}>{% if CATALOG_MODEL.iProfileRabbet > 1 %}{{ CATALOG_MODEL.iProfileRabbet }}{% else %}—{% endif %}</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td colspan="2">Число камер рамы/створки (<i>шт.</i>):</td>
|
||||||
|
<td>{% if RANK_PVCP_CAMERAS_COLOR != "" %}<div class="round-mark" style="background:rgb({{ RANK_PVCP_CAMERAS_COLOR }});"></div> {% endif %}</td>
|
||||||
|
<td{% if CATALOG_MODEL.iProfileCameras != "—" %} title="Число камер профиля оконной рамы/створки: {{ CATALOG_MODEL.iProfileCameras }} шт."{% endif %}>{{ CATALOG_MODEL.iProfileCameras }}</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td>Армирование:</td>
|
||||||
|
<td colspan="3"><small>{{ CATALOG_MODEL.sProfileReinforcement }}</small></td>
|
||||||
|
</tr><tr>
|
||||||
|
<td>Штапик:</td>
|
||||||
|
<td><div style="width:150px;"></div></td>
|
||||||
|
<td colspan="2"><small>{{ CATALOG_MODEL.sProfileFillet }}</small></td>
|
||||||
|
</tr><tr>
|
||||||
|
<td>Уплотнитель:</td>
|
||||||
|
<td colspan="3"><small>{{ CATALOG_MODEL.sProfileSealDescription }}</small></td>
|
||||||
|
<tr>
|
||||||
|
<td>Цвет:</td>
|
||||||
|
<td colspan="3" {% if not CATALOG_MODEL.sProfileColor == "" %} title="Цвет оконного профиля: {{ CATALOG_MODEL.sProfileColor|capfirst }}"{% endif %}>{% if CATALOG_MODEL.sProfileColor == "" %}—{% else %}<small>{{ CATALOG_MODEL.sProfileColor|capfirst }}{% endif %}</small></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>{% if LIST_OTHER|length > 1 %}
|
||||||
|
<h4>Прочие характеристики профиля:</h4>
|
||||||
|
<ul>{% for LI_BULL in LIST_OTHER %}
|
||||||
|
<li>{{ LI_BULL|safe }}</li>{% endfor %}
|
||||||
|
</ul>{% elif CATALOG_MODEL.sProfileOther != "" %}<p>Прочие характеристики рамы и створки: {{ CATALOG_MODEL.sProfileOther }}</p>{% endif %}{% if EXTRA_INFO %}
|
||||||
|
<h4>Дополнительная информация:</h4>
|
||||||
|
{{ EXTRA_INFO|safe }} {% endif %}{% if MERCHANTS|length > 0 %}
|
||||||
|
<h4>Партнёры «Окнардия» использующие профили {{ CATALOG_MODEL.sProfileName }} в своих предложениях:</h4>
|
||||||
|
<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 %}{% if PROFILES|length > 0 %}
|
||||||
|
<h4>Другие профили производства {{ CATALOG_MODEL.sProfileManufacturer }}:</h4>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr><th>Марка профиля</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>{% endif %}
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 col-xs-12">{# --- Описание производителя профилей :: начало --- #}{% if PROFILE_DETAIL|length > 0 %}{% for i in PROFILE_DETAIL %}
|
||||||
|
{{ i.sPostContent|safe }}{% endfor %}{% else %}
|
||||||
|
<p style='background-color:#f0f0f0;color:silver;height:15em;padding:5ex 10ex'>Извините, описание и иллюстрации марки профилей подготавливаются.<br /> <br />Зайдите позже.</p>{% endif %}
|
||||||
|
{# --- Описание производителя профилей :: конец --- #}</div>
|
||||||
|
<div class="col-md-11 col-xs-12 catalog_footer">
|
||||||
|
<p><small>Информация о профиле {{ CATALOG_MODEL.sProfileBriefDescription }} ({{ CATALOG_MODEL.sProfileManufacturer }}) для каталога «Окнардия» предоставлена производителем или собрана из открытых источников. Для исправления неточностей, уточнения характеристик, коррекции описаний и добавления информацию о новых производителях или моделях оконных профилей, пишите на <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 %}
|
||||||
@@ -1,10 +1,14 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from django.shortcuts import render
|
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
|
||||||
|
from oknardia.settings import *
|
||||||
from oknardia.models import PVCprofiles
|
from oknardia.models import PVCprofiles
|
||||||
from web.report1 import get_last_all_user_visit_list, get_last_user_visit_cookies, get_last_user_visit_list
|
from web.report1 import get_last_all_user_visit_list, get_last_user_visit_cookies, get_last_user_visit_list
|
||||||
|
from web.add_func import normalize, get_rating_set_for_stars
|
||||||
import time
|
import time
|
||||||
|
import json
|
||||||
|
import random
|
||||||
import pytils
|
import pytils
|
||||||
|
|
||||||
|
|
||||||
@@ -27,8 +31,13 @@ def catalog_root(request: HttpRequest) -> HttpResponse:
|
|||||||
return response
|
return response
|
||||||
|
|
||||||
|
|
||||||
# Каталог профилей (первый уровень)
|
|
||||||
def catalog_profile(request: HttpRequest) -> HttpResponse:
|
def catalog_profile(request: HttpRequest) -> HttpResponse:
|
||||||
|
"""
|
||||||
|
КАТАЛОГ ПРОФИЛЕЙ: страница со списком производителей и моделей (марками) профилей
|
||||||
|
|
||||||
|
:param request: HttpRequest -- входящий http-запрос
|
||||||
|
:return response: HttpResponse -- исходящий http-ответ
|
||||||
|
"""
|
||||||
template = "catalog/catalog_of_profiles.html" # шаблон
|
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'
|
||||||
@@ -104,3 +113,174 @@ def catalog_profile(request: HttpRequest) -> HttpResponse:
|
|||||||
'ticks': float(time.time() - time_start)
|
'ticks': float(time.time() - time_start)
|
||||||
})
|
})
|
||||||
return render(request, template, to_template)
|
return render(request, template, to_template)
|
||||||
|
|
||||||
|
|
||||||
|
def catalog_profile_model(request: HttpRequest, manufacture_id: int, manufacture_name: str,
|
||||||
|
model_id: id, model_name: str) -> HttpResponse:
|
||||||
|
"""
|
||||||
|
КАТАЛОГ ПРОФИЛЕЙ: страница с описанием марки профиля
|
||||||
|
|
||||||
|
:param request: HttpRequest -- входящий http-запрос
|
||||||
|
:param manufacture_id: id профиля. Предполагается, что это первый id при сортировке по sProfileBriefDescription
|
||||||
|
:param manufacture_name: название производителя (транслитерированное pytils.translit.slugify())
|
||||||
|
:param model_id: id модели (марки) профиля
|
||||||
|
:param model_name: модель (марка) профиля (транслитерированное pytils.translit.slugify(sProfileName))
|
||||||
|
: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)
|
||||||
|
if pytils.translit.slugify(q_pvc_by_id.sProfileManufacturer) != manufacture_name \
|
||||||
|
or pytils.translit.slugify(q_pvc_by_id.sProfileName) != model_name \
|
||||||
|
or manufacture_id != model_id:
|
||||||
|
return redirect(f"/catalog/profile/{model_id}-{pytils.translit.slugify(q_pvc_by_id.sProfileManufacturer)}/"
|
||||||
|
f"{model_id}-{pytils.translit.slugify(q_pvc_by_id.sProfileName)}")
|
||||||
|
to_template = {"CATALOG_MODEL": q_pvc_by_id,
|
||||||
|
"CATALOG_MAN2URL": manufacture_name,
|
||||||
|
"CATALOG_URL": f"{manufacture_id}-{manufacture_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)}
|
||||||
|
try:
|
||||||
|
getted_json = json.loads(q_pvc_by_id.sProfileDescription)
|
||||||
|
# раскрашиваем кружочки рейтинга напротив характеристик профиля
|
||||||
|
if KEY_RATING in getted_json:
|
||||||
|
# RatingReal = True # Рейтинг реальный (профиль представлен в ценовых предложениях)
|
||||||
|
# кружочки зелёные
|
||||||
|
rating = getted_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)
|
||||||
|
to_template.update({"RANK_PVCP_SEALS_COLOR": f"{color},255,{color}"})
|
||||||
|
color = int(255 - rating[RANK_PVCP_THICKNESS_NAME] * 255)
|
||||||
|
to_template.update({"RANK_PVCP_THICKNESS_COLOR": f"{color},255,{color}"})
|
||||||
|
color = int(255 - rating[RANK_PVCP_G_THICKNESS_NAME] * 255)
|
||||||
|
to_template.update({"RANK_PVCP_G_THICKNESS_COLOR": f"{color},255,{color}"})
|
||||||
|
color = int(255 - rating[RANK_PVCP_RABBET_NAME] * 255)
|
||||||
|
to_template.update({"RANK_PVCP_RABBET_COLOR": f"{color},255,{color}"})
|
||||||
|
color = int(255 - rating[RANK_PVCP_HEAT_TRANSFER_NAME] * 255)
|
||||||
|
to_template.update({"RANK_PVCP_HEAT_TRANSFER_COLOR": f"{color},255,{color}"})
|
||||||
|
color = int(255 - rating[RANK_PVCP_SOUNDPROOFING_NAME] * 255)
|
||||||
|
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:
|
||||||
|
# RatingReal = False # Рейтинг виртуальный (профиль представлен в ценовых предложениях)
|
||||||
|
# кружочки серые
|
||||||
|
rating = getted_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)
|
||||||
|
to_template.update({"RANK_PVCP_SEALS_COLOR": f"{color},{color},{color}"})
|
||||||
|
color = int(255 - rating[RANK_PVCP_THICKNESS_NAME] * 64)
|
||||||
|
to_template.update({"RANK_PVCP_THICKNESS_COLOR": f"{color},{color},{color}"})
|
||||||
|
color = int(255 - rating[RANK_PVCP_G_THICKNESS_NAME] * 64)
|
||||||
|
to_template.update({"RANK_PVCP_G_THICKNESS_COLOR": f"{color},{color},{color}"})
|
||||||
|
color = int(255 - rating[RANK_PVCP_RABBET_NAME] * 64)
|
||||||
|
to_template.update({"RANK_PVCP_RABBET_COLOR": f"{color},{color},{color}"})
|
||||||
|
color = int(255 - rating[RANK_PVCP_HEAT_TRANSFER_NAME] * 64)
|
||||||
|
to_template.update({"RANK_PVCP_HEAT_TRANSFER_COLOR": f"{color},{color},{color}"})
|
||||||
|
color = int(255 - rating[RANK_PVCP_SOUNDPROOFING_NAME] * 64)
|
||||||
|
to_template.update({"RANK_PVCP_SOUNDPROOFING_COLOR": f"{color},{color},{color}"})
|
||||||
|
color = int(255 - rating[RANK_PVCP_HEIGHT_NAME] * 64)
|
||||||
|
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]})
|
||||||
|
except (TypeError, ValueError, KeyError):
|
||||||
|
pass
|
||||||
|
list_other = []
|
||||||
|
for i in q_pvc_by_id.sProfileOther.split(";"):
|
||||||
|
j = i.find(":")
|
||||||
|
list_other.append(u"<b>" + i[:j+1] + u"</b>" + i[j+1:])
|
||||||
|
to_template.update({"LIST_OTHER": list_other})
|
||||||
|
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.id = {model_id} "
|
||||||
|
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})
|
||||||
|
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 ="
|
||||||
|
f" '{q_pvc_by_id.sProfileManufacturer}' "
|
||||||
|
f"ORDER BY oknardia_pvcprofiles.fProfileRating;")
|
||||||
|
list_profiles = []
|
||||||
|
for i in q_profiles:
|
||||||
|
if i.id != model_id:
|
||||||
|
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})
|
||||||
|
q_profiles_detail = PVCprofiles.objects.raw(f"SELECT"
|
||||||
|
f" oknardia_blogposts.*,"
|
||||||
|
f" oknardia_pvcprofiles.id,"
|
||||||
|
f" oknardia_catalog2profile.sCatalogCardType,"
|
||||||
|
f" oknardia_blogposts.iCatalogSort "
|
||||||
|
f"FROM oknardia_catalog2profile"
|
||||||
|
f" INNER JOIN oknardia_blogposts"
|
||||||
|
f" ON oknardia_catalog2profile.kBlogCatalog_id=oknardia_blogposts.id"
|
||||||
|
f" INNER JOIN oknardia_pvcprofiles"
|
||||||
|
f" ON oknardia_catalog2profile.kProfile_id=oknardia_pvcprofiles.id "
|
||||||
|
f"WHERE oknardia_pvcprofiles.id = {model_id} "
|
||||||
|
f"AND oknardia_catalog2profile.sCatalogCardType ="
|
||||||
|
f" {CATALOG_RECORD_FOR_PROFILE_MODEL} "
|
||||||
|
f"ORDER BY oknardia_blogposts.iCatalogSort;")
|
||||||
|
list_profiles_detail = list(q_profiles_detail)
|
||||||
|
to_template.update({'PROFILE_DETAIL': list_profiles_detail})
|
||||||
|
list_img_for_blog = []
|
||||||
|
for i in list_profiles_detail:
|
||||||
|
if i.sImgForBlogSocial != "":
|
||||||
|
list_img_for_blog.append(i.sImgForBlogSocial)
|
||||||
|
if len(list_profiles_detail) > 0:
|
||||||
|
random.shuffle(list_img_for_blog)
|
||||||
|
to_template.update({'IMG_FOR_BLOG': list_img_for_blog[0]})
|
||||||
|
to_template.update({'PUB_DAT': q_pvc_by_id.dProfileModify})
|
||||||
|
if len(list_profiles_detail) > 0:
|
||||||
|
pub_data = sorted(list_profiles_detail, key=lambda item: item.dPostDataModify)[0].dPostDataModify
|
||||||
|
print(pub_data, q_pvc_by_id.dProfileModify)
|
||||||
|
if pub_data.replace(tzinfo=None) < q_pvc_by_id.dProfileModify.replace(tzinfo=None):
|
||||||
|
to_template.update({'PUB_DAT': pub_data})
|
||||||
|
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, template, to_template)
|
||||||
|
|||||||
Reference in New Issue
Block a user