каталог -- главная страница
This commit is contained in:
@@ -18,7 +18,8 @@ from django.contrib import admin
|
|||||||
from django.urls import path, re_path
|
from django.urls import path, re_path
|
||||||
from django.conf.urls.static import static
|
from django.conf.urls.static import static
|
||||||
from oknardia.settings import *
|
from oknardia.settings import *
|
||||||
from web import views, autocomplete_addr, user_manager, blog, diagrams, report2
|
from web import views, autocomplete_addr, user_manager, blog, diagrams, report2, catalog
|
||||||
|
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('admin/', admin.site.urls),
|
path('admin/', admin.site.urls),
|
||||||
@@ -50,10 +51,11 @@ 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),
|
||||||
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
if DEBUG:
|
if DEBUG:
|
||||||
urlpatterns += static(MEDIA_URL, document_root=MEDIA_ROOT)
|
urlpatterns += static(MEDIA_URL, document_root=MEDIA_ROOT)
|
||||||
|
|
||||||
|
|||||||
102
oknardia/templates/catalog/catalog_root.html
Executable file
102
oknardia/templates/catalog/catalog_root.html
Executable file
@@ -0,0 +1,102 @@
|
|||||||
|
{% 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 %}{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}{% endblock %}
|
||||||
|
|
||||||
|
{% block Last4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}{% 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="{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}" />
|
||||||
|
<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 }}" />
|
||||||
|
<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="{{ HEADER }}"/>
|
||||||
|
<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>Каталог</li>
|
||||||
|
</ol>
|
||||||
|
<h1>Каталог «Окнардия»</h1>
|
||||||
|
</div>
|
||||||
|
</div>{# <!--- Хлебные крошки: КОНЕЦ ---> #}
|
||||||
|
<dIv class="row -catalog2-">
|
||||||
|
{# ПЕРВЫЙ РАЗДЕЛ С РЕКЛАМОЙ СБОКУ #}<div class="col-md-9 col-xs-8">
|
||||||
|
{# И ЕЩЁ ОДИН РАЗДЕЛ #}<h2 class="header"><a href="/catalog/profile">Оконные и дверные профили</a></h2>
|
||||||
|
<p class="col-md-offset-1 col-xs-offset-1">Каталог систем оконных и дверных профилей и описание <nobr>компаний-производителей</nobr>. Каталог содержит детальные характеристики профилей: сопротивление теплопередаче <nobr><i>Ro</i> (<i>м²×°C/Вт</i>)</nobr>, коэффициент звукоизоляции (<i>дБ</i>), число камер рамы и створки, тип и армирования, монтажная ширина и другие. Пластиковые (ПВХ), деревянные, комбинированные и другие системы профилей.</p>
|
||||||
|
{# И ЕЩЁ ОДИН РАЗДЕЛ #}<h2 class="header"><a href="/catalog/seria">Каталог серий домов</a></h2>
|
||||||
|
<p class="col-md-offset-1 col-xs-offset-1">Типовые проекты жилого строительства, вхождение стандартных оконных проёмов и балконных блоков в планировки типовых квартир серии, графики ввода в эксплуатацию зданий серии, география строительства, износ жилого фонда…</p>
|
||||||
|
</div>
|
||||||
|
{# реклама Oknardia 250x250 СБОКУ #}<div class="col-md-2 col-xs-3 float-right">{% include "ad/bannet-250x250.html" %}</div>
|
||||||
|
{# РАЗДЕЛИТЕЛЬНЫЙ РАЗДЕЛ #}<div class="col-md-10 col-xs-12">
|
||||||
|
{# И ЕЩЁ ОДИН РАЗДЕЛ #}<h2 class="header"><a href="/catalog/standard_opening">Стандартные оконные проёмы и балконные блоки</a></h2>
|
||||||
|
<p class="col-md-offset-1 col-xs-offset-1">Размеры и рекомендованные схемы открывания стандартных проёмов и балконных блоков базы «Окнардия», коммерческие предложения партнёров агрегатора, условия поставки, комплектация, сопутствующие услуги и возможные скидки.</p>
|
||||||
|
</div>
|
||||||
|
{# И ОПЯТЬ РАЗДЕЛ С РЕКЛАМОЙ СБОКУ #}<div class="col-md-9 col-xs-8">
|
||||||
|
{# И ЕЩЁ ОДИН РАЗДЕЛ #}<h2 class="header"><a href="/catalog/company">Производители и поставщики окон</a> <small style="font-size:xx-small;">(в разработке)</small></h2>
|
||||||
|
<p class="col-md-offset-1 col-xs-offset-1">Компании-партнеры «Окнардии», контатная информация, условия и скидки, конфигурации и рейтинги их оконных предложений.</p>
|
||||||
|
{# ВТОРОЙ РАЗДЕЛ #}
|
||||||
|
{# И ЕЩЁ ОДИН РАЗДЕЛ #}<h2 class="header"><a href="javascript://" class="not-ready">Каталог стеклопакетов</a> <small style="font-size:xx-small;">(в разработке)</small></h2>
|
||||||
|
<p class="col-md-offset-1 col-xs-offset-1">Стеклопакеты и описание <nobr>компаний-производителей</nobr> стекла. Каталог содержит детальные характеристики: схемы стеклопакетов, наличие напыления k- и <nobr>i-микропленок</nobr>, тип <nobr>газа-заполнителя</nobr>, сопротивление теплопередаче <nobr><i>Ro</i> (<i>м²×°C/Вт</i>)</nobr>, коэффициент звукоизоляции (<i>дБ</i>), число камер, тонирование…</p>
|
||||||
|
</div>
|
||||||
|
{# реклама Oknardia 250x250 СБОКУ #}<div class="col-md-2 col-xs-3 float-right">{% include "ad/bannet-250x250.html" %}</div>
|
||||||
|
{# РАЗДЕЛИТЕЛЬНЫЙ РАЗДЕЛ #}<div class="col-md-10 col-xs-12">
|
||||||
|
<h2 class="header"><a href="javascript://" class="not-ready">Оконная и дверная фурнитура</a> <small style="font-size:xx-small;">(в разработке)</small></h2>
|
||||||
|
<p class="col-md-offset-1 col-xs-offset-1">Петли и механизмы регулировок под разные схемы открывания, фиксаторы, ограничители, предохранители и блокировщики, ручки и системы запирания, микропроветривание и клапаны микроклимата…</p>
|
||||||
|
</div>
|
||||||
|
<DIV class="col-xs-12" style="height:6em;"></DIV>
|
||||||
|
</dIv>
|
||||||
|
|
||||||
|
{# --- Баннер: НАЧАЛО --- #}
|
||||||
|
<div class="row"><div class="col-md-12 col-xs-12">{% 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 %}
|
||||||
|
|
||||||
|
|
||||||
8
oknardia/templates/report/report_last_user_visit.html
Executable file
8
oknardia/templates/report/report_last_user_visit.html
Executable file
@@ -0,0 +1,8 @@
|
|||||||
|
<!--- Информация об адресах просмотренных текущим пользователем --->{% load filters %}
|
||||||
|
{% if LAST_VISIT and LAST_VISIT|length >= 1 %}<div class="col-xs-12">
|
||||||
|
<div class="col-md-11 col-xs-12 last_user_visit"><h5>Цены на окна просмотренные вами:</h5>
|
||||||
|
<ul>{% for ITEM in LAST_VISIT %}
|
||||||
|
<li><a href="{{ ITEM.LastURL }}">Цены на окна для серии {{ ITEM.LastApart }} <small>({{ ITEM.LastAddress }})</small></a> <small>{{ ITEM.Time }}</small></li>{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>{% endif %}
|
||||||
8
oknardia/templates/report/report_log_user_visit.html
Executable file
8
oknardia/templates/report/report_log_user_visit.html
Executable file
@@ -0,0 +1,8 @@
|
|||||||
|
<!--- Информация об адресах просмотренных всеми --->{% load filters %}
|
||||||
|
{% if LOG_VISIT and LOG_VISIT|length >= 1 %}<div class="col-xs-12">
|
||||||
|
<div class="col-md-11 col-xs-12 log_user_visit"><h5>Просмотры цен на окна другими пользователями:</h5>
|
||||||
|
<ul>{% for ITEM in LOG_VISIT %}
|
||||||
|
<li><a href="{{ ITEM.LogURL }}">Цены на окна для серии {{ ITEM.LogApart }} <small>({{ ITEM.LogAddress }})</small></a> <small>{{ ITEM.Time }}</small></li>{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>{% endif %}
|
||||||
28
oknardia/web/catalog.py
Normal file
28
oknardia/web/catalog.py
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from django.shortcuts import render
|
||||||
|
from django.http import HttpRequest, HttpResponse
|
||||||
|
from web.report1 import get_last_all_user_visit_list, get_last_user_visit_cookies, get_last_user_visit_list
|
||||||
|
from time import time
|
||||||
|
|
||||||
|
|
||||||
|
def catalog_root(request: HttpRequest) -> HttpResponse:
|
||||||
|
""" Корневая страница каталога
|
||||||
|
|
||||||
|
ИДЕЯ: со временем нужно сделать функционал показа случайных картинок в каждый раздел (чтоб поисковики фигели)
|
||||||
|
|
||||||
|
:param request: HttpRequest -- входящий http-запрос
|
||||||
|
:return response: HttpResponse -- исходящий http-ответ
|
||||||
|
"""
|
||||||
|
time_start = time()
|
||||||
|
to_template = {} # словарь, для передачи шаблону
|
||||||
|
template = "catalog/catalog_root.html" # шаблон
|
||||||
|
# получаем из cookies последние визиты клиента
|
||||||
|
last_visit = get_last_user_visit_cookies(request)
|
||||||
|
to_template.update({'LAST_VISIT': get_last_user_visit_list(last_visit[:3])})
|
||||||
|
# получаем последние визиты всех посетителей из базы
|
||||||
|
# id2log, log_visit = get_last_all_user_visit_list()
|
||||||
|
log_visit = get_last_all_user_visit_list()
|
||||||
|
to_template.update({'LOG_VISIT': log_visit})
|
||||||
|
to_template.update({'ticks': float(time() - time_start)})
|
||||||
|
response = render(request, template, to_template)
|
||||||
|
return response
|
||||||
68
oknardia/web/report1.py
Normal file
68
oknardia/web/report1.py
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# from django.shortcuts import render, redirect
|
||||||
|
from django.http import HttpRequest # , HttpResponse
|
||||||
|
from django.utils.dateformat import format
|
||||||
|
from oknardia.models import LogVisitPriceReport
|
||||||
|
# from oknardia.settings import *
|
||||||
|
# from web.add_func import normalize, get_rating_set_for_stars
|
||||||
|
# from time import time
|
||||||
|
import json
|
||||||
|
import pytils
|
||||||
|
|
||||||
|
|
||||||
|
def get_last_user_visit_cookies(request: HttpRequest) -> list:
|
||||||
|
""" Служебная функция: проверяет есть ли куки о последних посещениях пользователя, и если есть возвращает их
|
||||||
|
|
||||||
|
:param request: HttpRequest -- входящий http-запрос
|
||||||
|
:return LastVisit: json -- загруженный json-объект из куки LastVisit
|
||||||
|
"""
|
||||||
|
if "LastVisit" in request.COOKIES:
|
||||||
|
try:
|
||||||
|
return json.loads(request.COOKIES["LastVisit"])
|
||||||
|
except (json.decoder.JSONDecodeError, TypeError, ValueError, KeyError, AttributeError):
|
||||||
|
return []
|
||||||
|
else:
|
||||||
|
return []
|
||||||
|
|
||||||
|
|
||||||
|
def get_last_user_visit_list(list_visit: list) -> list:
|
||||||
|
""" Служебная функция: получает список с посещенных страниц с ценовой выдачей (ListVisit), меняет в нем даты
|
||||||
|
на описание типа "три недели назад" и возвращает обратно.
|
||||||
|
|
||||||
|
:param list_visit:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
result_list_visit = []
|
||||||
|
for i in list_visit:
|
||||||
|
result_list_visit.append({
|
||||||
|
"Time": pytils.dt.distance_of_time_in_words(int(i["Time"])),
|
||||||
|
"LastURL": i["LastURL"],
|
||||||
|
"LastAddress": i["LastAddress"],
|
||||||
|
"LastApart": i["LastApart"]
|
||||||
|
})
|
||||||
|
return result_list_visit
|
||||||
|
|
||||||
|
|
||||||
|
# def get_last_all_user_visit_list() -> tuple:
|
||||||
|
def get_last_all_user_visit_list() -> list:
|
||||||
|
""" Служебная функция: получает список с посещенных страниц с ценовой выдачей для всех пользователей из DB
|
||||||
|
|
||||||
|
:return: list -- список четырех последних посещений ценовых предложений всеми пользователями
|
||||||
|
"""
|
||||||
|
list_visit = []
|
||||||
|
id_fourth_visit = 0
|
||||||
|
try:
|
||||||
|
q_log_visit = LogVisitPriceReport.objects.all().order_by('-dLogVisitTime')[:4]
|
||||||
|
for i in q_log_visit:
|
||||||
|
if id_fourth_visit == 0:
|
||||||
|
id_fourth_visit = i.id
|
||||||
|
list_visit.append({
|
||||||
|
"Time": pytils.dt.distance_of_time_in_words(int(format(i.dLogVisitTime, 'U'))),
|
||||||
|
"LogURL": i.sLogURL,
|
||||||
|
"LogAddress": i.sLogAddress,
|
||||||
|
"LogApart": i.sLogNameApartment
|
||||||
|
})
|
||||||
|
except LogVisitPriceReport.DoesNotExist:
|
||||||
|
pass
|
||||||
|
# return id_fourth_visit+1, list_visit
|
||||||
|
return list_visit
|
||||||
Reference in New Issue
Block a user