каталог -- главная страница

This commit is contained in:
2022-11-13 17:13:46 +03:00
parent 4aff0ab4bb
commit 606ea21fd3
6 changed files with 218 additions and 2 deletions

View File

@@ -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)

View 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>Каталог &laquo;Окнардия&raquo;</h1>
</div>
</div>{# <!--- Хлебные крошки: КОНЕЦ ---> #}
<dIv class="row -catalog2-">
{# ПЕРВЫЙ РАЗДЕЛ С РЕКЛАМОЙ СБОКУ #}<div class="col-md-9 col-xs-8">
{# И ЕЩЁ ОДИН РАЗДЕЛ #}<h2 class="header"><a href="/catalog/profile">Оконные и&nbsp;дверные профили</a></h2>
<p class="col-md-offset-1 col-xs-offset-1">Каталог систем оконных и&nbsp;дверных профилей и&nbsp;описание <nobr>компаний-производителей</nobr>. Каталог содержит детальные характеристики профилей: сопротивление теплопередаче <nobr><i>Ro</i>&nbsp;(<i>м&sup2;&times;&deg;C/Вт</i>)</nobr>, коэффициент звукоизоляции (<i>дБ</i>), число камер рамы и&nbsp;створки, тип и&nbsp;армирования, монтажная ширина и&nbsp;другие. Пластиковые (ПВХ), деревянные, комбинированные и&nbsp;другие системы профилей.</p>
{# И ЕЩЁ ОДИН РАЗДЕЛ #}<h2 class="header"><a href="/catalog/seria">Каталог серий домов</a></h2>
<p class="col-md-offset-1 col-xs-offset-1">Типовые проекты жилого строительства, вхождение стандартных оконных проёмов и&nbsp;балконных блоков в&nbsp;планировки типовых квартир серии, графики ввода в&nbsp;эксплуатацию зданий серии, география строительства, износ жилого фонда&hellip;</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">Стандартные оконные проёмы и&nbsp;балконные блоки</a></h2>
<p class="col-md-offset-1 col-xs-offset-1">Размеры и&nbsp;рекомендованные схемы открывания стандартных проёмов и&nbsp;балконных блоков базы &laquo;Окнардия&raquo;, коммерческие предложения партнёров агрегатора, условия поставки, комплектация, сопутствующие услуги и&nbsp;возможные скидки.</p>
</div>
{# И ОПЯТЬ РАЗДЕЛ С РЕКЛАМОЙ СБОКУ #}<div class="col-md-9 col-xs-8">
{# И ЕЩЁ ОДИН РАЗДЕЛ #}<h2 class="header"><a href="/catalog/company">Производители и&nbsp;поставщики окон</a> <small style="font-size:xx-small;">&nbsp;разработке)</small></h2>
<p class="col-md-offset-1 col-xs-offset-1">Компании-партнеры &laquo;Окнардии&raquo;, контатная информация, условия и скидки, конфигурации и рейтинги их оконных предложений.</p>
{# ВТОРОЙ РАЗДЕЛ #}
{# И ЕЩЁ ОДИН РАЗДЕЛ #}<h2 class="header"><a href="javascript://" class="not-ready">Каталог стеклопакетов</a> <small style="font-size:xx-small;">&nbsp;разработке)</small></h2>
<p class="col-md-offset-1 col-xs-offset-1">Стеклопакеты и&nbsp;описание <nobr>компаний-производителей</nobr> стекла. Каталог содержит детальные характеристики: схемы стеклопакетов, наличие напыления k- и&nbsp;<nobr>i-микропленок</nobr>, тип <nobr>газа-заполнителя</nobr>, сопротивление теплопередаче <nobr><i>Ro</i>&nbsp;(<i>м&sup2;&times;&deg;C/Вт</i>)</nobr>, коэффициент звукоизоляции (<i>дБ</i>), число камер, тонирование&hellip;</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">Оконная и&nbsp;дверная фурнитура</a> <small style="font-size:xx-small;">&nbsp;разработке)</small></h2>
<p class="col-md-offset-1 col-xs-offset-1">Петли и&nbsp;механизмы регулировок под разные схемы открывания, фиксаторы, ограничители, предохранители и&nbsp;блокировщики, ручки и&nbsp;системы запирания, микропроветривание и&nbsp;клапаны микроклимата&hellip;</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 %}

View 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 %}

View 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
View 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
View 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