Вьюшка и шаблон: "Каталог / Оконные проёмы и балконные блоки" -- готово
This commit is contained in:
@@ -62,6 +62,7 @@ urlpatterns = [
|
|||||||
# --- --- Каталог серий типового строительства
|
# --- --- Каталог серий типового строительства
|
||||||
re_path(r'^catalog/seria[/*]$', catalog.catalog_seria),
|
re_path(r'^catalog/seria[/*]$', catalog.catalog_seria),
|
||||||
re_path(r'^catalog/seria/(?P<seria_name_translit>[^/]*)/all(?P<seria_id>\d+)[/*]$', catalog.catalog_seria_info),
|
re_path(r'^catalog/seria/(?P<seria_name_translit>[^/]*)/all(?P<seria_id>\d+)[/*]$', catalog.catalog_seria_info),
|
||||||
|
re_path(r'^catalog/standard_opening[/*]$', catalog.standard_opening),
|
||||||
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
121
oknardia/templates/catalog/catalog_standard_opening.html
Executable file
121
oknardia/templates/catalog/catalog_standard_opening.html
Executable file
@@ -0,0 +1,121 @@
|
|||||||
|
{% extends "base.html" %}{% load static %}
|
||||||
|
|
||||||
|
{% block Title %} Каталог :: стандартные оконные проёмы типовых серий домов...{% endblock %}
|
||||||
|
|
||||||
|
{% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %}
|
||||||
|
|
||||||
|
{% block Description %}Каталог «Окнардия»: стандартные оконные проёмы типовых серий домов...{% endblock %}
|
||||||
|
|
||||||
|
{% block Keywords %}Каталог, каталог оконных проёмов, 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 %}{# <!-- BEGIN Дополнительные 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="Каталог «Окнардия»" />
|
||||||
|
<meta itemprop="headline" content="Каталог «Окнардия»: стандартные оконные проёмы типовых серий домов..." />
|
||||||
|
<meta name="news_keywords" content="{{ HEADER|striptags }}" />
|
||||||
|
<link rel="canonical" href="https://oknardia.ru//catalog/" />
|
||||||
|
<link rel="standout" href="https://oknardia.ru//catalog/" />
|
||||||
|
<!-- Разметка для соц-сетей 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/" />
|
||||||
|
<meta property="og:type" content="article" />
|
||||||
|
<meta property="og:title" content="Каталог «Окнардия» | oknardia.ru" />
|
||||||
|
<meta property="og:description" content="Каталог «Окнардия»: стандартные оконные проёмы типовых серий домов..." />
|
||||||
|
<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="Каталог «Окнардия»: стандартные оконные проёмы типовых серий домов... | oknardia.ru"/>
|
||||||
|
<meta name="twitter:description" content="Каталог «Окнардия»: стандартные оконные проёмы типовых серий домов..." />
|
||||||
|
<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' }}" />
|
||||||
|
{# <!-- END Дополнительные Metatags --> #}{% 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>Оконные проёмы и балконные блоки</li>
|
||||||
|
</ol>
|
||||||
|
</div>
|
||||||
|
</div>{# <!--- Хлебные крошки: КОНЕЦ ---> #}
|
||||||
|
<dIv class="row">
|
||||||
|
{# ПЕРВЫЙ РАЗДЕЛ #}<div class="col-md-9 col-xs-8">
|
||||||
|
<h1>Cтандартные оконные проёмы и балконные блоки</h1>
|
||||||
|
<p>Ценовая выдача «Окнардии» основана на базе стандартных оконных проёмов в типовых сериях домов. Для каждого проёма существуют рекомендованные организациями-проектировщиками схемы открывание, но парнёры «Окнардии» могут предложить свои, более расширенные или наоборот сокращенные. В таблице приведены параметры стандартных проёмов базы.</p>
|
||||||
|
</div>
|
||||||
|
{# реклама Oknardia 250x250 СБОКУ #}<div class="col-md-3 col-xs-4 float-right">{% include "ad/bannet-250x250.html" %}</div>
|
||||||
|
<div class="col-md-11 col-xs-12 catalog scrolled">
|
||||||
|
<table class="table-striped table-hover table-responsive flap-catalog">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th colspan="3" class="c">Размеры (мм)</th>
|
||||||
|
<th rowspan="2" class="b c">Стандартная<br>схема<br>открывания</th>
|
||||||
|
<th colspan="2" class="c">Балконный блок</th>
|
||||||
|
<th rowspan="2">Описание окна</th>
|
||||||
|
<th rowspan="2">Типовые серии домов где встречается данный окный проём</th>
|
||||||
|
<th rowspan="2"></th>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th class="r b">Ш</th>
|
||||||
|
<th class="x b">×</th>
|
||||||
|
<th class="x b">В</th>
|
||||||
|
<th class="c b">Окно</th>
|
||||||
|
<th class="c b">Дверь</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>{% for i in LIST_WIN_OPENING %}
|
||||||
|
<tr>
|
||||||
|
<td data-sort="{{ i.W|stringformat:".0f" }}">{{ i.W|stringformat:".0f" }}</td>
|
||||||
|
<td>×</td>
|
||||||
|
<td data-sort="{{ i.H|stringformat:".0f" }}">{{ i.H|stringformat:".0f" }}</td>
|
||||||
|
<td data-sort="{{ i.FLAP_CONFIG }}"><img src="{% static i.URL2IMG %}" title="{{ i.DESCRIPTION_L }}" alt="{{ i.DESCRIPTION_L }}" /></td>
|
||||||
|
<td data-sort="{% if i.IS_NEAR_DOOR %}1{% else %}0{% endif %}">{% if i.IS_NEAR_DOOR %}да{% else %}—{% endif %}</td>
|
||||||
|
<td data-sort="{% if i.IS_DOOR %}1{% else %}0{% endif %}">{% if i.IS_DOOR %}да{% else %}—{% endif %}</td>
|
||||||
|
<td>{{ i.DESCRIPTION }}</td>
|
||||||
|
<td>{% for j in i.INCLUDING_IN_SERIA %}<a href="/catalog/seria/{{ j.NAME_T }}/all{{ j.ID }}">{{ j.NAME }}</a>{% if not forloop.last %}, {% endif %}{% endfor %}</td>
|
||||||
|
<td><a class="btn btn-default btn-xs" href="/tsena-odnogo-okna/{{ i.W|stringformat:".0f" }}x{{ i.H|stringformat:".0f" }}mm/tip{{ i.ID }}">цены</a></td>
|
||||||
|
{# {% for j in SERIAS %}#}
|
||||||
|
{# <td>{% if j.id in i.INCLUDING_IN_SERIA %}#{% endif %}</td>{% endfor %}#}
|
||||||
|
</tr>{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<DIV class="col-xs-12" style="height:6em;"></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 %}
|
||||||
|
|
||||||
|
|
||||||
@@ -382,8 +382,8 @@ def flap_analiz(flap_config: str) -> list:
|
|||||||
or flap_config[i] == "=" # горизонтальная перегородка
|
or flap_config[i] == "=" # горизонтальная перегородка
|
||||||
or flap_config[i] == "X" # глухое окно
|
or flap_config[i] == "X" # глухое окно
|
||||||
or flap_config[i] == "x" # ^
|
or flap_config[i] == "x" # ^
|
||||||
or flap_config[i] == u"х" # ^
|
or flap_config[i] == "х" # ^
|
||||||
or flap_config[i] == u"Х" # ^
|
or flap_config[i] == "Х" # ^
|
||||||
or flap_config[i] == "+" # ^
|
or flap_config[i] == "+" # ^
|
||||||
or flap_config[i] == "M" # москитная сетка
|
or flap_config[i] == "M" # москитная сетка
|
||||||
or flap_config[i] == "m" # ^
|
or flap_config[i] == "m" # ^
|
||||||
@@ -395,3 +395,86 @@ def flap_analiz(flap_config: str) -> list:
|
|||||||
or flap_config[i] == "s"): # ^
|
or flap_config[i] == "s"): # ^
|
||||||
dim_flap[j]["row"][k].update({"flap": dim_flap[j]["row"][k]["flap"] + flap_config[i]})
|
dim_flap[j]["row"][k].update({"flap": dim_flap[j]["row"][k]["flap"] + flap_config[i]})
|
||||||
return dim_flap
|
return dim_flap
|
||||||
|
|
||||||
|
|
||||||
|
def make_flap_mini_pictures(path_to_img_file: str, str_flap_config: str, is_door: bool = False) -> None:
|
||||||
|
""" Функция создает файл мини-картинки схем открывания окна
|
||||||
|
|
||||||
|
:param path_to_img_file: путь к файлу с изображением
|
||||||
|
:param str_flap_config: строка с описанием схемы открывания
|
||||||
|
:param is_door:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
# print(path_to_img_file, str_flap_config, is_door)
|
||||||
|
dim_flap = flap_analiz(str_flap_config)
|
||||||
|
v_ratio_max = 0 # число всех долей (частей) для построения пропорций по вертикали
|
||||||
|
h_ratio_max = 0 # число всех долей (частей) для построения пропорций по горизонтали
|
||||||
|
for i in dim_flap:
|
||||||
|
local_h_ratio_max = 0
|
||||||
|
v_ratio_max += i["vRatio"]
|
||||||
|
for j in i["row"]:
|
||||||
|
local_h_ratio_max += j["hRatio"]
|
||||||
|
if local_h_ratio_max > h_ratio_max:
|
||||||
|
h_ratio_max = local_h_ratio_max
|
||||||
|
img = Image.new("RGBA", (h_ratio_max*PICT_MINWI+(h_ratio_max+1)*3, PICT_MINIH+6), (255, 255, 255, 0))
|
||||||
|
top = 0
|
||||||
|
left = 0
|
||||||
|
bottom = img.size[1]
|
||||||
|
right = img.size[0]
|
||||||
|
flap_h = bottom - top
|
||||||
|
draw = ImageDraw.Draw(img)
|
||||||
|
draw.rectangle((left, top, right, bottom), fill=(200, 200, 200, 50), outline=None)
|
||||||
|
# рисуем внешнюю рамку
|
||||||
|
draw.line((left, bottom-1, right, bottom-1), fill=(125, 125, 125), width=5) # нижняя
|
||||||
|
draw.line((left, top, right, top), fill=(125, 125, 125), width=5) # верхняя
|
||||||
|
draw.line((left, top, left, bottom), fill=(125, 125, 125), width=5) # левая
|
||||||
|
draw.line((right-1, top, right-1, bottom), fill=(125, 125, 125), width=5) # правая
|
||||||
|
|
||||||
|
############################################################
|
||||||
|
# НАЧИНАЕМ ОТРИСОВКУ СТВОРОК ОКНА НА КРТИНКУ
|
||||||
|
############################################################
|
||||||
|
local_top = top
|
||||||
|
local_bottom = top
|
||||||
|
for i in dim_flap: # цикл по рядам створок
|
||||||
|
local_bottom += i["vRatio"]*flap_h/v_ratio_max
|
||||||
|
local_right = 0
|
||||||
|
local_left = 0
|
||||||
|
for j in i["row"]:
|
||||||
|
local_right += j["hRatio"]*right/h_ratio_max
|
||||||
|
# отрисовка схему открывания створки
|
||||||
|
if "X" in j["flap"] or "x" in j["flap"] or "х" in j["flap"] or "Х" in j["flap"] or "+" in j["flap"]:
|
||||||
|
# глухое окно (рисуем крестик)
|
||||||
|
draw.line(((local_right + local_left) / 2 - 5, (local_bottom + local_top) / 2,
|
||||||
|
(local_right + local_left) / 2 + 5, (local_bottom + local_top)/2),
|
||||||
|
fill=(105, 105, 225), width=1)
|
||||||
|
draw.line(((local_right + local_left) / 2, (local_bottom + local_top) / 2 - 5,
|
||||||
|
(local_right + local_left) / 2, (local_bottom + local_top) / 2 + 5),
|
||||||
|
fill=(105, 105, 225), width=1)
|
||||||
|
if "V" in j["flap"]: # откидное открывание
|
||||||
|
draw.line((local_right - 3, local_bottom - 4, (local_right + local_left) / 2, local_top + 3),
|
||||||
|
fill=(125, 225, 125), width=1)
|
||||||
|
draw.line((local_left + 3, local_bottom - 4, (local_right + local_left) / 2, local_top + 3),
|
||||||
|
fill=(125, 225, 125), width=1)
|
||||||
|
if ">" in j["flap"] or "G" in j["flap"]: # поворотное влево
|
||||||
|
draw.line((local_left + 3, local_top + 3, local_right - 3, (local_bottom + local_top) / 2),
|
||||||
|
fill=(225, 125, 125), width=1)
|
||||||
|
draw.line((local_left + 3, local_bottom - 3, local_right - 3, (local_bottom + local_top) / 2),
|
||||||
|
fill=(225, 125, 125), width=1)
|
||||||
|
if "<" in j["flap"] or "L" in j["flap"]: # поворотное вправо
|
||||||
|
draw.line((local_right - 3, local_bottom - 3, local_left + 3, (local_bottom + local_top) / 2),
|
||||||
|
fill=(225, 125, 125), width=1)
|
||||||
|
draw.line((local_right - 3, local_top + 3, local_left + 3, (local_bottom+local_top) / 2),
|
||||||
|
fill=(225, 125, 125), width=1)
|
||||||
|
|
||||||
|
# Отрисовка створки. ПЕРИМЕТР
|
||||||
|
draw.line((local_left, local_bottom, local_right, local_bottom), fill=(125, 125, 125), width=3)
|
||||||
|
draw.line((local_left, local_top, local_right, local_top), fill=(125, 125, 125), width=3)
|
||||||
|
draw.line((local_left, local_top, local_left, local_bottom), fill=(125, 125, 125), width=3)
|
||||||
|
draw.line((local_right, local_top, local_right, local_bottom), fill=(125, 125, 125), width=3)
|
||||||
|
local_left = local_right
|
||||||
|
local_top = local_bottom
|
||||||
|
del draw
|
||||||
|
# сохраняем картинку
|
||||||
|
img.save(path_to_img_file)
|
||||||
|
return
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ from django.utils import timezone
|
|||||||
from oknardia.settings import *
|
from oknardia.settings import *
|
||||||
from oknardia.models import PVCprofiles, Seria_Info, Win_MountDim, Building_Info
|
from oknardia.models import PVCprofiles, Seria_Info, Win_MountDim, Building_Info
|
||||||
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, get_flaps_for_big_pictures
|
from web.add_func import normalize, get_rating_set_for_stars, get_flaps_for_big_pictures, make_flap_mini_pictures
|
||||||
import time
|
import time
|
||||||
import json
|
import json
|
||||||
import random
|
import random
|
||||||
@@ -809,3 +809,85 @@ def seria_info_geo_code(seria_id: str = '12') -> dict:
|
|||||||
"CONDITION_MIN": condition_min})
|
"CONDITION_MIN": condition_min})
|
||||||
# print(seria_to_geo)
|
# print(seria_to_geo)
|
||||||
return data_return
|
return data_return
|
||||||
|
|
||||||
|
|
||||||
|
def standard_opening(request: HttpRequest) -> HttpResponse:
|
||||||
|
time_start = time.time()
|
||||||
|
to_template = {} # словарь, для передачи шаблону
|
||||||
|
q_seria = Seria_Info.objects.raw('SELECT oknardia_seria_info.id, oknardia_seria_info.sName '
|
||||||
|
'FROM oknardia_seria_info '
|
||||||
|
'WHERE oknardia_seria_info.id = oknardia_seria_info.kRoot_id '
|
||||||
|
'ORDER BY oknardia_seria_info.sName;')
|
||||||
|
to_template.update({'SERIAS': list(q_seria)})
|
||||||
|
q_win_opening = Win_MountDim.objects.raw(
|
||||||
|
'SELECT oknardia_win_mountdim.*,'
|
||||||
|
' oknardia_seria_info.sName,'
|
||||||
|
' oknardia_seria_info.id AS ID_Seria '
|
||||||
|
'FROM oknardia_win_mountdim'
|
||||||
|
' INNER JOIN oknardia_mountdim2apartment'
|
||||||
|
' ON oknardia_win_mountdim.id = oknardia_mountdim2apartment.kMountDim_id'
|
||||||
|
' RIGHT OUTER JOIN oknardia_apartment_type'
|
||||||
|
' ON oknardia_apartment_type.id = oknardia_mountdim2apartment.kApartment_id'
|
||||||
|
' RIGHT OUTER JOIN oknardia_seria_info'
|
||||||
|
' ON oknardia_apartment_type.kSeria_id = oknardia_seria_info.id '
|
||||||
|
'WHERE oknardia_seria_info.id = oknardia_seria_info.kRoot_id '
|
||||||
|
'GROUP BY oknardia_win_mountdim.iWinWidth, oknardia_win_mountdim.iWinHight,'
|
||||||
|
' oknardia_win_mountdim.bIsDoor, oknardia_win_mountdim.bIsNearDoor,'
|
||||||
|
' oknardia_win_mountdim.sFlapConfig, oknardia_win_mountdim.id,'
|
||||||
|
' oknardia_seria_info.sName, oknardia_seria_info.id '
|
||||||
|
'ORDER BY oknardia_win_mountdim.iWinWidth DESC,'
|
||||||
|
' oknardia_win_mountdim.iWinHight DESC,'
|
||||||
|
' oknardia_win_mountdim.bIsNearDoor,'
|
||||||
|
' oknardia_win_mountdim.bIsDoor,'
|
||||||
|
' oknardia_win_mountdim.id,'
|
||||||
|
' oknardia_seria_info.sName;')
|
||||||
|
list_windows_opening = []
|
||||||
|
tmp_id = 0
|
||||||
|
for i in q_win_opening:
|
||||||
|
if tmp_id != i.id:
|
||||||
|
tmp_id = i.id
|
||||||
|
image_file_name = i.sFlapConfig
|
||||||
|
image_file_name = image_file_name.replace(">", u"G")
|
||||||
|
image_file_name = image_file_name.replace("<", "L")
|
||||||
|
image_file_name = image_file_name.replace("|", "I")
|
||||||
|
image_file_name = image_file_name.replace("[", "(")
|
||||||
|
image_file_name = image_file_name.replace("]", ")")
|
||||||
|
image_file_name = image_file_name.replace("/", "-")
|
||||||
|
image_file_name = image_file_name.replace("\\", "-")
|
||||||
|
image_file_name = image_file_name.replace(".", "-") + u".png"
|
||||||
|
image_file_name = f"{PATH_FOR_IMG}/{PATH_FOR_IMGFLAPCONFIG}/{image_file_name}"
|
||||||
|
if not os.path.isfile(f"{STATIC_BASE_PATH}/{image_file_name}"):
|
||||||
|
make_flap_mini_pictures(f"{STATIC_BASE_PATH}/{image_file_name}", i.sFlapConfig, i.bIsDoor)
|
||||||
|
list_windows_opening.append({
|
||||||
|
"ID": i.id,
|
||||||
|
"INCLUDING_IN_SERIA": [{
|
||||||
|
"ID": i.ID_Seria,
|
||||||
|
"NAME_T": pytils.translit.slugify(i.sName),
|
||||||
|
"NAME": i.sName
|
||||||
|
}],
|
||||||
|
"INCLUDING_IN_SERIA_ID": [],
|
||||||
|
"URL2IMG": image_file_name,
|
||||||
|
"FLAP_CONFIG": i.sFlapConfig,
|
||||||
|
"DESCRIPTION": i.sDescripion.split(" для")[0].split(" (")[0],
|
||||||
|
"DESCRIPTION_L": i.sDescripion,
|
||||||
|
"IS_DOOR": i.bIsDoor,
|
||||||
|
"IS_NEAR_DOOR": i.bIsNearDoor,
|
||||||
|
"H": i.iWinHight * 10,
|
||||||
|
"W": i.iWinWidth * 10
|
||||||
|
})
|
||||||
|
else:
|
||||||
|
list_windows_opening[-1]["INCLUDING_IN_SERIA"].append({
|
||||||
|
"ID": i.ID_Seria,
|
||||||
|
"NAME_T": pytils.translit.slugify(i.sName),
|
||||||
|
"NAME": i.sName
|
||||||
|
})
|
||||||
|
to_template.update({
|
||||||
|
'LIST_WIN_OPENING': list_windows_opening,
|
||||||
|
# получаем последние визиты клиента через куки
|
||||||
|
'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_standard_opening.html", to_template)
|
||||||
|
|||||||
Reference in New Issue
Block a user