diff --git a/oknardia/oknardia/urls.py b/oknardia/oknardia/urls.py index 115b3f9..1ba7cdf 100644 --- a/oknardia/oknardia/urls.py +++ b/oknardia/oknardia/urls.py @@ -18,7 +18,8 @@ from django.contrib import admin from django.urls import path, re_path from django.conf.urls.static import static 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 = [ path('admin/', admin.site.urls), @@ -50,10 +51,11 @@ 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), ] - if DEBUG: urlpatterns += static(MEDIA_URL, document_root=MEDIA_ROOT) diff --git a/oknardia/templates/catalog/catalog_root.html b/oknardia/templates/catalog/catalog_root.html new file mode 100755 index 0000000..0ab13b5 --- /dev/null +++ b/oknardia/templates/catalog/catalog_root.html @@ -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 %}{# #} + {% if IMG_FOR_BLOG %} + {% else %} + {% endif %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{# #}{% endblock %} + +{% block Main_Content %} +
+ {# #}
+
+ +

Каталог «Окнардия»

+
+
{# #} +
+ {# ПЕРВЫЙ РАЗДЕЛ С РЕКЛАМОЙ СБОКУ #}
+ {# И ЕЩЁ ОДИН РАЗДЕЛ #}

Оконные и дверные профили

+

Каталог систем оконных и дверных профилей и описание компаний-производителей. Каталог содержит детальные характеристики профилей: сопротивление теплопередаче Ro (м²×°C/Вт), коэффициент звукоизоляции (дБ), число камер рамы и створки, тип и армирования, монтажная ширина и другие. Пластиковые (ПВХ), деревянные, комбинированные и другие системы профилей.

+ {# И ЕЩЁ ОДИН РАЗДЕЛ #}

Каталог серий домов

+

Типовые проекты жилого строительства, вхождение стандартных оконных проёмов и балконных блоков в планировки типовых квартир серии, графики ввода в эксплуатацию зданий серии, география строительства, износ жилого фонда…

+
+ {# реклама Oknardia 250x250 СБОКУ #}
{% include "ad/bannet-250x250.html" %}
+ {# РАЗДЕЛИТЕЛЬНЫЙ РАЗДЕЛ #}
+ {# И ЕЩЁ ОДИН РАЗДЕЛ #}

Стандартные оконные проёмы и балконные блоки

+

Размеры и рекомендованные схемы открывания стандартных проёмов и балконных блоков базы «Окнардия», коммерческие предложения партнёров агрегатора, условия поставки, комплектация, сопутствующие услуги и возможные скидки.

+
+ {# И ОПЯТЬ РАЗДЕЛ С РЕКЛАМОЙ СБОКУ #}
+ {# И ЕЩЁ ОДИН РАЗДЕЛ #}

Производители и поставщики окон (в разработке)

+

Компании-партнеры «Окнардии», контатная информация, условия и скидки, конфигурации и рейтинги их оконных предложений.

+ {# ВТОРОЙ РАЗДЕЛ #} + {# И ЕЩЁ ОДИН РАЗДЕЛ #}

Каталог стеклопакетов (в разработке)

+

Стеклопакеты и описание компаний-производителей стекла. Каталог содержит детальные характеристики: схемы стеклопакетов, наличие напыления k- и i-микропленок, тип газа-заполнителя, сопротивление теплопередаче Ro (м²×°C/Вт), коэффициент звукоизоляции (дБ), число камер, тонирование…

+
+ {# реклама Oknardia 250x250 СБОКУ #}
{% include "ad/bannet-250x250.html" %}
+ {# РАЗДЕЛИТЕЛЬНЫЙ РАЗДЕЛ #}
+

Оконная и дверная фурнитура (в разработке)

+

Петли и механизмы регулировок под разные схемы открывания, фиксаторы, ограничители, предохранители и блокировщики, ручки и системы запирания, микропроветривание и клапаны микроклимата…

+
+
+
+ + {# --- Баннер: НАЧАЛО --- #} +
{% include "ad/bannet-wide.html" %}
+ {# --- Баннер: конец --- #} +
+{% include "report/report_last_user_visit.html" %} +{% include "report/report_log_user_visit.html" %} +
+
{% endblock %} + + diff --git a/oknardia/templates/report/report_last_user_visit.html b/oknardia/templates/report/report_last_user_visit.html new file mode 100755 index 0000000..5e04885 --- /dev/null +++ b/oknardia/templates/report/report_last_user_visit.html @@ -0,0 +1,8 @@ +{% load filters %} +{% if LAST_VISIT and LAST_VISIT|length >= 1 %}
+
Цены на окна просмотренные вами:
+ +
+
{% endif %} \ No newline at end of file diff --git a/oknardia/templates/report/report_log_user_visit.html b/oknardia/templates/report/report_log_user_visit.html new file mode 100755 index 0000000..e06b423 --- /dev/null +++ b/oknardia/templates/report/report_log_user_visit.html @@ -0,0 +1,8 @@ +{% load filters %} +{% if LOG_VISIT and LOG_VISIT|length >= 1 %}
+
Просмотры цен на окна другими пользователями:
+ +
+
{% endif %} \ No newline at end of file diff --git a/oknardia/web/catalog.py b/oknardia/web/catalog.py new file mode 100644 index 0000000..075fe92 --- /dev/null +++ b/oknardia/web/catalog.py @@ -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 diff --git a/oknardia/web/report1.py b/oknardia/web/report1.py new file mode 100644 index 0000000..1288a0d --- /dev/null +++ b/oknardia/web/report1.py @@ -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