From f3a16788b008ec58ebedf6256e15e2697dde559c Mon Sep 17 00:00:00 2001 From: erjemin Date: Thu, 16 Apr 2026 20:37:45 +0300 Subject: [PATCH 001/102] minor: del print --- oknardia/web/add_func.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/oknardia/web/add_func.py b/oknardia/web/add_func.py index 9b84a2d..28dce2a 100644 --- a/oknardia/web/add_func.py +++ b/oknardia/web/add_func.py @@ -201,7 +201,7 @@ def make_big_img_win_flap(img_file_name_with_path: str, width: int, height: int, # height_door = int(height_door) # создаем картинку с нужными размерами img = Image.new("RGBA", (int(width * PICT_H / height_max), PICT_H), (255, 255, 255, 0)) - print(img_file_name_with_path) + # print(img_file_name_with_path) # находим крайние точки периметра (если окно -- выравнено вверх; если дверь -- вниз) top = 0 left = 0 @@ -592,5 +592,5 @@ def touch_reload_wsgi(s: str = ''): :return: None """ with open(TOUCH_RELOAD, 'a', encoding="utf-8") as f: - f.write(f'\nreload wsgi by cash-template {s}' - f' {django.utils.dateformat.format(django.utils.timezone.now(), "Y-m-d H:i:s")}') + f.write(f'\nreload wsgi by cash-template - {s} - ' + f'{django.utils.dateformat.format(django.utils.timezone.now(), "Y-m-d H:i:s")}') From 63cf85515bf7bfa9486cf0c284d498124782abbb Mon Sep 17 00:00:00 2001 From: erjemin Date: Thu, 16 Apr 2026 21:10:58 +0300 Subject: [PATCH 002/102] mod: switch dev to sqlite and add static fallback paths --- database/.gitignore | 3 ++ oknardia/oknardia/settings.py | 63 ++++++++++++++++++++++++++--------- 2 files changed, 50 insertions(+), 16 deletions(-) create mode 100644 database/.gitignore diff --git a/database/.gitignore b/database/.gitignore new file mode 100644 index 0000000..c59ab23 --- /dev/null +++ b/database/.gitignore @@ -0,0 +1,3 @@ +# Это папака для хранения базы данных SQLite, не должна быть в репозитории. +*.* +* \ No newline at end of file diff --git a/oknardia/oknardia/settings.py b/oknardia/oknardia/settings.py index 9a128d4..f8d8ea0 100644 --- a/oknardia/oknardia/settings.py +++ b/oknardia/oknardia/settings.py @@ -11,6 +11,7 @@ For the full list of settings and their values, see https://docs.djangoproject.com/en/4.1/ref/settings/ """ +import os from pathlib import Path from oknardia.my_secret import * import socket @@ -18,6 +19,14 @@ import socket # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent +# Переключатель БД для DEV: по умолчанию используем SQLite. +# Чтобы вернуть MariaDB на DEV, установите OKNARDIA_USE_SQLITE_DEV=0 +USE_SQLITE_DEV = os.getenv("OKNARDIA_USE_SQLITE_DEV", "1").strip().lower() in { + "1", "true", "yes", "on" +} +PROJECT_ROOT = BASE_DIR.parent +SQLITE_DB_PATH = PROJECT_ROOT / 'database' / 'oknadria.sqlite3' + # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/ @@ -31,8 +40,8 @@ if socket.gethostname() in MY_HOST_DEV: DEBUG = TEMPLATE_DEBUG = True else: # Все остальные хосты (подразумевается продакшн) - DEBUG = TEMPLATE_DEBUG = True - # DEBUG = TEMPLATE_DEBUG = False + # DEBUG = TEMPLATE_DEBUG = True + DEBUG = TEMPLATE_DEBUG = False ALLOWED_HOSTS = MY_ALLOWED_HOSTS @@ -123,22 +132,33 @@ if socket.gethostname() in MY_HOST_DEV: # DEBUG: заменяем настр MEDIA_ROOT = MY_MEDIA_ROOT_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_MEDIA_ROOT_DEV2 SITEMAP_ROOT = MY_SITEMAP_ROOT_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_SITEMAP_ROOT_DEV2 # STATIC_ROOT = MY_STATIC_ROOT_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_STATIC_ROOT_DEV2 - STATICFILES_DIRS = [ - MY_STATIC_ROOT_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_STATIC_ROOT_DEV2, - ] + dev_static_from_secret = MY_STATIC_ROOT_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_STATIC_ROOT_DEV2 + # Если путь из секрета устарел, используем путь текущего репозитория. + dev_static_fallback = PROJECT_ROOT / 'public' / 'static' + dev_static_path = dev_static_from_secret if os.path.isdir(dev_static_from_secret) else str(dev_static_fallback) + STATICFILES_DIRS = [dev_static_path] # путь к каталогу static (в эту переменную использовать для указания пути где будут делаться кэш-блоки для шаблонов) - STATIC_BASE_PATH = MY_STATIC_BASE_PATH_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_STATIC_BASE_PATH_DEV2 - DATABASES = { - 'default': { - 'ENGINE': "django.db.backends.mysql", - 'HOST': MY_DATABASE_HOST_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_DATABASE_HOST_DEV2, - 'PORT': MY_DATABASE_PORT_DEV, # Set to "" for default. Not used with sqlite3. - 'NAME': MY_DATABASE_NAME_DEV, # Not used with sqlite3. - 'USER': MY_DATABASE_USER_DEV, # Not used with sqlite3. - 'PASSWORD': MY_DATABASE_PASSWORD_DEV, # Not used with sqlite3. - # 'OPTIONS': { 'autocommit': True, } + dev_static_base_from_secret = MY_STATIC_BASE_PATH_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_STATIC_BASE_PATH_DEV2 + STATIC_BASE_PATH = dev_static_base_from_secret if os.path.isdir(dev_static_base_from_secret) else str(dev_static_fallback) + if USE_SQLITE_DEV: + DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': SQLITE_DB_PATH, + } + } + else: + DATABASES = { + 'default': { + 'ENGINE': "django.db.backends.mysql", + 'HOST': MY_DATABASE_HOST_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_DATABASE_HOST_DEV2, + 'PORT': MY_DATABASE_PORT_DEV, # Set to "" for default. Not used with sqlite3. + 'NAME': MY_DATABASE_NAME_DEV, # Not used with sqlite3. + 'USER': MY_DATABASE_USER_DEV, # Not used with sqlite3. + 'PASSWORD': MY_DATABASE_PASSWORD_DEV, # Not used with sqlite3. + # 'OPTIONS': { 'autocommit': True, } + } } - } TOUCH_RELOAD = MY_TOUCH_RELOAD_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_TOUCH_RELOAD_DEV2 else: MEDIA_ROOT = MY_MEDIA_ROOT_PROD @@ -160,6 +180,17 @@ else: } TOUCH_RELOAD = MY_TOUCH_RELOAD_PROD +# Для локальной/тестовой разработки можно принудительно включить SQLite даже +# если hostname не попал в MY_HOST_DEV. На прод-хостах (MY_HOST_PROD) override +# не применяется. +if USE_SQLITE_DEV and socket.gethostname() not in MY_HOST_PROD: + DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': SQLITE_DB_PATH, + } + } + ######################################### # настройки для почтового сервера (они одинаковые для DEV и PROD) EMAIL_HOST = MY_EMAIL_HOST_DEV From e779b78707b32ba92d242d8b8135348239a4bb2c Mon Sep 17 00:00:00 2001 From: erjemin Date: Thu, 16 Apr 2026 21:12:31 +0300 Subject: [PATCH 003/102] minor: del print --- oknardia/web/prices.py | 5 +- oknardia/web/service.py | 333 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 334 insertions(+), 4 deletions(-) diff --git a/oknardia/web/prices.py b/oknardia/web/prices.py index 37c4771..0b60da2 100644 --- a/oknardia/web/prices.py +++ b/oknardia/web/prices.py @@ -644,7 +644,10 @@ def report_price(request: HttpRequest, build_id: str = "22427", apart_id: str = # получаем последние визиты всех посетителей из базы log_visit = get_last_all_user_visit_list() - id_last_visit_log = log_visit[0]['id'] + 1 + if log_visit[0]['id'] is not None: + id_last_visit_log = log_visit[0]['id'] + 1 + else: + id_last_visit_log = 1 # print("id_last_visit_log:", id_last_visit_log) to_template.update({'LOG_VISIT': log_visit}) if id_last_visit_log > MAX_LEN_RING_LOG_BUFFER: # максимальный размер циклического буфера diff --git a/oknardia/web/service.py b/oknardia/web/service.py index dfa8da5..53e8402 100644 --- a/oknardia/web/service.py +++ b/oknardia/web/service.py @@ -20,7 +20,7 @@ def service(request: HttpRequest) -> HttpResponse: """ time_start = time.time() # проверка на аутентификацию - print(request.user.is_authenticated) + # print(request.user.is_authenticated) if not request.user.is_authenticated: return redirect("/service/not-denice") return render(request, "service/index.html", {'ticks': float(time.time()-time_start)}) @@ -157,7 +157,7 @@ def make_site_maps (request: HttpRequest) -> HttpResponse: with open(f"{SITEMAP_ROOT}sitemap.xml", "w", encoding="utf-8") as f: f.write(f"\n" f"\n{msg}") - print(SITEMAP_ROOT) + # print(SITEMAP_ROOT) msg = f"Создан единственный sitemap.xml\nВсего ссылок: {count_total_item:06d}" else: # Файлов sitemap.xml много. @@ -176,7 +176,7 @@ def make_site_maps (request: HttpRequest) -> HttpResponse: f.write(msg) msg = f"Создан каскадный sitemap.xml\nВсего вложенных файлов: {count_file+1:04d}\n" \ f"Всего ссылок: {count_total_item:08d}" - print(msg) + # print(msg) return HttpResponse(f"
{msg}\n\nвремя выполнения: {float(time.time()-time_start)} сек.
") @@ -222,3 +222,330 @@ def compare() -> list: # print(i1) # print(f"---------------{count}---------------") return dim_comp + + +def make_rating(request: HttpRequest) -> HttpResponse: + """ + Вычисляем (каждый раз заново) рейтинги оконных профилей, стеклопакетов и оконных наборов. + Вычисление базируется на ренкинге. В базовом ренкинге участвуют только стеклопакеты и профиля + присутствующие в коммерческих предложениях размещенных в ОКНАРДИИ. + + Ренкинг профилей: Для получения ранка вся совокупность профилей из коммерческих предложений сортируется + по тому или иному признаку (характеристике). Каждому профилю присваивается ранк, который вычисляется как + весу той или иной характеристики и порядковому номеру профиля в сортированному по этому признаку + (характеристике) в списке. + + ВНИМАНИЕ ТЕХНИЧЕСКИЙ ДОЛГ: + Система ренкинга разрабатывалась когда в базе было уже достаточно предложений. Возможно, если + объектов ренкинга будет мало что-то не сработает. И выдаст ошибку. + + :param request: HttpRequest -- запрос + :return: HttpResponse -- ответ + """ + time_start = time.time() + msg = "" + # ВЫЧИСЛЯЕМ РЕЙТИНГ ПРОФИЛЕЙ + # устанавливаем рейтинг всех профилей в базе в ноль + profile_all_num = PVCprofiles.objects.all().update(fProfileRating=0.0) + to_template = {'NUM_PROFILE_TOTAL': profile_all_num} # засовываем данные в шаблон + q = PVCprofiles.objects.raw("SELECT" + " oknardia_pvcprofiles.*," + " COUNT(oknardia_priceoffer.id) AS NumOffer " + "FROM oknardia_setkit" + " INNER JOIN oknardia_priceoffer" + " ON oknardia_setkit.id = oknardia_priceoffer.kOffer2SetKit_id" + " RIGHT OUTER JOIN oknardia_pvcprofiles" + " ON oknardia_setkit.kSet2PVCprofiles_id = oknardia_pvcprofiles.id " + "GROUP BY oknardia_pvcprofiles.id;") + profile_use_list = list(q) + # получаем словарь из RawQuerySet + PVC_Dictionary = Prepare_PVC_Dictionary(profile_use_list) + # получаем рейтинги + dim, PVC_Dictionary = RankingPVC(PVC_Dictionary) + to_template.update(dim) # засовываем данные в шаблон + # сортируем по полученному рейтингу + PVC_Dictionary = sorted(PVC_Dictionary, key=lambda item: item["TmpRating"]) + # print u"РЕЙТИНГИ ПРОФИЛЕЙ IN USE" + # найдем минимальный и максимальный ранкинг для последующей нормализации + NumMaxRank = 0 + NumMinRank = -1 + j = 0 + for i in PVC_Dictionary: + if i["NumOffer"] != 0: + NumMaxRank = j + if NumMinRank == -1: + NumMinRank = j + j += 1 + j = 0 + for i in PVC_Dictionary: + obj = PVCprofiles.objects.get(id=i["id"]) + try: + GettedJSON = json.loads(obj.sProfileDescription) + except: + GettedJSON = {} + if i["NumOffer"] != 0: + try: del GettedJSON[KEY_RATING_VIRTUAL] + except: pass + GettedJSON[KEY_RATING] = i["RatingConsist"] + # GettedJSON.update({KEY_RATING:i["RatingConsist"]}) + else: + try: del GettedJSON[KEY_RATING] + except: pass + GettedJSON[KEY_RATING_VIRTUAL] = i["RatingConsist"] + # GettedJSON.update({KEY_RATING_VIRTUAL:i["RatingConsist"]}) + obj.sProfileDescription = json.dumps(GettedJSON, + separators=(",",":"), + sort_keys=True, + encoding="utf-8", + ensure_ascii=False) + if j <= NumMaxRank: + obj.fProfileRating = Normalize(i["TmpRating"],PVC_Dictionary[NumMaxRank]["TmpRating"]) * (RARING_PVC_PROFILE_MAX-RARING_PVC_PROFILE_MIN) + RARING_PVC_PROFILE_MIN + else: + obj.fProfileRating = 5.0 + # print "id_PVC:", i["id"], u"\tΣ:", obj.fProfileRating, u"\tСостав:", + # print json.dumps(i["RatingConsist"], separators=(",",":"), encoding="utf-8", ensure_ascii=False) + obj.save() + j += 1 + # вычисляем рейтинги стеклопакетоа + # ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ + # устанавливаем рейтинг всех стеклопакетоа в базе в ноль + GlazingAllNum = Glazing.objects.all().update(fGlazingRating=0.0) + to_template.update({'NUM_GLAZING_TOTAL':GlazingAllNum}) # засовываем данные в шаблон + q = Glazing.objects.raw("SELECT" + " oknardia_glazing.*," + " COUNT(oknardia_priceoffer.id) AS NumOffer " + "FROM oknardia_setkit" + " INNER JOIN oknardia_priceoffer" + " ON oknardia_priceoffer.kOffer2SetKit_id = oknardia_setkit.id" + " INNER JOIN oknardia_glazing" + " ON oknardia_setkit.kSet2Glazing_id = oknardia_glazing.id " + "GROUP BY oknardia_glazing.id;") + GlazingUseList = list(q) + # получаем словарь из RawQuerySet + GLAZ_Dictionary = Prepare_GLAZ_Dictionary(GlazingUseList) + # получаем рейтинги + dim, GLAZ_Dictionary = RankingGlazing(GLAZ_Dictionary) + to_template.update(dim) # засовываем данные в шаблон + # сортируем по полученному рейтингу + GLAZ_Dictionary = sorted(GLAZ_Dictionary, key=lambda item: item["TmpRating"]) + # print u"РЕЙТИНГИ СТЕКЛОПАКЕТОВ IN USE" + for i in GLAZ_Dictionary: + obj = Glazing.objects.get(id=i["id"]) + obj.fGlazingRating = Normalize(i["TmpRating"], ValMax=GLAZ_Dictionary[-1]["TmpRating"]) * (RARING_GLAZING_MAX-RARING_GLAZING_MIN) + RARING_GLAZING_MIN + try: + GettedJSON = json.loads(obj.sGlazingDescription) + except: + GettedJSON = {} + try: del GettedJSON[KEY_RATING_VIRTUAL] + except: pass + GettedJSON.update({KEY_RATING:i["RatingConsist"]}) + obj.sGlazingDescription = json.dumps(GettedJSON, + separators=(",",":"), + sort_keys=True, + encoding="utf-8", + ensure_ascii=False) + # print u"id:",i["id"], u"\tRank:", i["TmpRating"], u"\rate:", obj.fGlazingRating, u"\tGLAZ:", i["sGlazingMark"] + obj.save() + # получаем все стеклопакеты, чтобы забацать рейтинг и для тех, которые есть в каталоге но нет в КП + q = Glazing.objects.raw("SELECT oknardia_glazing.* " + "FROM oknardia_glazing;") + GlazingAllList = list(q) + # получаем словарь из RawQuerySet + GLAZ_Dictionary = Prepare_GLAZ_Dictionary(GlazingAllList) + # получаем рейтинги + dim, GLAZ_Dictionary = RankingGlazing(GLAZ_Dictionary) + GLAZ_Dictionary = sorted(GLAZ_Dictionary, key=lambda item: item["TmpRating"]) + if GlazingAllNum > len(GlazingUseList): + CutStartIndex = -1 + CutStartRatingValue = 0. + CutEndIndex = -1 + CutEndRatingValue = 0. + for i in range(0, GlazingAllNum): + # print i, GLAZ_Dictionary[i]["id"], u"\trank --> ", GLAZ_Dictionary[i]["TmpRating"], "\t(", + # print GLAZ_Dictionary[i]["fGlazingRating"], ")\tFormulaGLAZING:", GLAZ_Dictionary[i]["sGlazingMark"] + if GLAZ_Dictionary[i]["fGlazingRating"] != 0.: + # нашли конец следующего отрезка, нужно отрезок переопределить + CutStartRatingValue = CutEndRatingValue + CutStartIndex = CutEndIndex + CutEndRatingValue = GLAZ_Dictionary[i]["fGlazingRating"] + CutEndIndex = i + if CutEndIndex == 0: + continue + else: + # надо перебрать все объекты внутри отрезка + for j in range(CutStartIndex+1, CutEndIndex): + # и пересчитать рейтинги внутри этого, нового отрезка + GLAZ_Dictionary[j]["fGlazingRating"] = CutStartRatingValue + (GLAZ_Dictionary[j]["TmpRating"]-GLAZ_Dictionary[CutStartIndex]["TmpRating"])*((CutEndRatingValue-CutStartRatingValue)/(GLAZ_Dictionary[CutEndIndex]["TmpRating"]-GLAZ_Dictionary[CutStartIndex]["TmpRating"])) + # print j, GLAZ_Dictionary[j]["id"], u"\trank >>> ", GLAZ_Dictionary[j]["TmpRating"], "\t(", + # print GLAZ_Dictionary[j]["fGlazingRating"], ")\tFormulaGLAZING:", GLAZ_Dictionary[j]["sGlazingMark"] + # и записать этот рейтинг в базу + obj = Glazing.objects.get(id=GLAZ_Dictionary[j]["id"]) + obj.fGlazingRating = GLAZ_Dictionary[j]["fGlazingRating"] + try: + GettedJSON = json.loads(obj.sGlazingDescription) + except: + GettedJSON = {} + try: del GettedJSON[KEY_RATING] + except: pass + GettedJSON.update({KEY_RATING_VIRTUAL:GLAZ_Dictionary[j]["RatingConsist"]}) + obj.sGlazingDescription = json.dumps(GettedJSON, + separators=(",",":"), + sort_keys=True, + encoding="utf-8", + ensure_ascii=False) + obj.save() + for j in range(CutEndIndex+1, GlazingAllNum): + # пересчитать рейтинги хвоста (для отрезка после последнего отрейтингованного) + # внимание это код не для работы со словарями. при ревизии переделать GlazingAllList[j].fGlazingRating = CutStartRatingValue + (GlazingAllList[j].TmpRating-GlazingAllList[CutStartIndex].TmpRating)*((CutEndRatingValue-CutStartRatingValue)/(GlazingAllList[CutEndIndex].TmpRating-GlazingAllList[CutStartIndex].TmpRating)) + GLAZ_Dictionary[j]["fGlazingRating"] = RARING_GLAZING_MAX # т.к. для виртуальный рейтинг иногда снижается, то ставим 5* + # и записать этот рейтинг в базу + obj = Glazing.objects.get(id=GLAZ_Dictionary[j]["id"]) + obj.fGlazingRating = GLAZ_Dictionary[j]["fGlazingRating"] + try: + GettedJSON = json.loads(obj.sGlazingDescription) + except: + GettedJSON = {} + try: del GettedJSON[KEY_RATING] + except: pass + GettedJSON.update({KEY_RATING_VIRTUAL:GLAZ_Dictionary[j]["RatingConsist"]}) + obj.sGlazingDescription = json.dumps(GettedJSON, + separators=(",",":"), + sort_keys=True, + encoding="utf-8", + ensure_ascii=False) + + obj.save() + # вычисляем рейтинги наборов (стеклопакет + профиль + сопутсвующие услуги т.п. + # ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ + # устанавливаем рейтинг всех наборов в базе в ноль + SetAllNum = SetKit.objects.all().update(fSetRating=0.0) + to_template.update({'NUM_SET_TOTAL':SetAllNum}) # засовываем данные в шаблон + q = SetKit.objects.raw("SELECT" + " COUNT(oknardia_priceoffer.id) AS NumOffer," + " MAX(oknardia_priceoffer.dOfferModify) AS dModify," + " oknardia_pvcprofiles.fProfileRating," + " oknardia_glazing.fGlazingRating," + " oknardia_setkit.*," + " oknardia_merchantoffice.sOfficeDiscountMetaFormula " + "FROM oknardia_setkit" + " INNER JOIN oknardia_priceoffer" + " ON oknardia_priceoffer.kOffer2SetKit_id = oknardia_setkit.id" + " INNER JOIN oknardia_glazing" + " ON oknardia_setkit.kSet2Glazing_id = oknardia_glazing.id" + " INNER JOIN oknardia_pvcprofiles" + " ON oknardia_pvcprofiles.id = oknardia_setkit.kSet2PVCprofiles_id " + " INNER JOIN oknardia_ouruser" + " ON oknardia_setkit.kSet2User_id = oknardia_ouruser.id" + " INNER JOIN oknardia_merchantoffice" + " ON oknardia_ouruser.kMerchantOffice_id = oknardia_merchantoffice.id " + "WHERE oknardia_setkit.sSetActive = TRUE " + "GROUP BY oknardia_pvcprofiles.fProfileRating," + " oknardia_glazing.fGlazingRating," + " oknardia_merchantoffice.sOfficeDiscountMetaFormula," + " oknardia_setkit.sSetActive, oknardia_setkit.id " + "ORDER BY MAX(oknardia_priceoffer.dOfferModify);") + # q = SetKit.objects.order_by("dModify") + SetUseList = list(q) + to_template.update({'NUM_SET': len(SetUseList) }) + SetDictionary = [] + # Превратим RawQuerySet в массив словарей (почти JSON). Так получится избежать "макаронного кода". + # Заодно переопределяем для правильного ранжирования некоторые параметры из строк в цифры. + for i in range(0,len(SetUseList)): + SetDictionary.append(q[i].__dict__) + if SetDictionary[i]["sSetSill"].lower() in [u"нет",u"-",u"—",""," "]: + SetDictionary[i]["sSetSill"] = 0 # Подоконника нет + else: SetDictionary[i]["sSetSill"] = 1 # Подоконник есть + if SetDictionary[i]["sSetPanes"].lower() in [u"нет",u"-",u"—",""," "]: + SetDictionary[i]["sSetPanes"] = 0 # Водоотлив нет + else: SetDictionary[i]["sSetPanes"] = 1 # Водоотлив есть + if SetDictionary[i]["sSetSlope"].lower() in [u"нет",u"-",u"—",""," "]: + SetDictionary[i]["sSetSlope"] = 0 # Откос нет + else: SetDictionary[i]["sSetSlope"] = 1 # Откос есть + if SetDictionary[i]["sSetClimateControl"].lower() in [u"нет",u"-",u"—",""," "]: + SetDictionary[i]["sSetClimateControl"] = 0 # Климат-контроль нет + else: SetDictionary[i]["sSetClimateControl"] = 1 # Климат-контроль есть + try: + # print eval(SetDictionary[i]["sOfficeDiscountMetaFormula"])[KEY_DICSOUNT].keys() + # print max(eval(SetDictionary[i]["sOfficeDiscountMetaFormula"])[KEY_DICSOUNT].values()) + SetDictionary[i].update({"DiscountMax": max(eval(SetDictionary[i]["sOfficeDiscountMetaFormula"])[KEY_DICSOUNT].values())}) + SetDictionary[i]["sOfficeDiscountMetaFormula"] = len(eval(SetDictionary[i]["sOfficeDiscountMetaFormula"])[KEY_DICSOUNT].keys()) + except: + SetDictionary[i].update({"DiscountMax": 0}) + SetDictionary[i]["sOfficeDiscountMetaFormula"] = 0 + # Отранжируем наборы по параметру "дата последнего обновления цены" -- ПО ВОЗРАСТАНИЮ + SetDictionary, MaxRank = GetRank(SetDictionary, "dModify", key_weight=RANK_STEP_SET_MODIFY, + rank_name=u"Актуальность", revers=False) + to_template.update({'S_Modify_Step': RANK_STEP_SET_MODIFY }) + to_template.update({'S_Modify_MaxRank': MaxRank }) + # Отранжируем наборы по параметру "доставка включена в стоимость" -- ПО ВОЗРАСТАНИЮ + SetDictionary, MaxRank = GetRank(SetDictionary, "bSetDelivery", key_weight=RANK_STEP_SET_DELIVERY, + rank_name=u"Доставка", revers=False) + to_template.update({'S_Delivery_Step': RANK_STEP_SET_DELIVERY }) + to_template.update({'S_Delivery_MaxRank': MaxRank }) + # Отранжируем наборы по параметру Демонтаж/Монтаж" -- ПО ВОЗРАСТАНИЮ + SetDictionary, MaxRank = GetRank(SetDictionary, "bSetUninstallInstall", key_weight=RANK_STEP_SET_UNINSTALL_INSTALL, + rank_name=u"Монтаж") + to_template.update({'S_UninstallInstall_Step': RANK_STEP_SET_UNINSTALL_INSTALL }) + to_template.update({'S_UninstallInstall_MaxRank': MaxRank }) + # Отранжируем наборы по параметру Подоконник" -- ПО ВОЗРАСТАНИЮ + SetDictionary, MaxRank = GetRank(SetDictionary, "sSetSill", key_weight=RANK_STEP_SET_SILL, + rank_name=u"Подоконник") + to_template.update({'S_Sill_Step': RANK_STEP_SET_SILL }) + to_template.update({'S_Sill_MaxRank': MaxRank }) + # Отранжируем наборы по параметру Водоотлив" -- ПО ВОЗРАСТАНИЮ + SetDictionary, MaxRank = GetRank(SetDictionary, "sSetPanes", key_weight=RANK_STEP_SET_PANES, + rank_name=u"Водоотлив") + to_template.update({'S_Panes_Step': RANK_STEP_SET_PANES }) + to_template.update({'S_Panes_MaxRank': MaxRank }) + # Отранжируем наборы по параметру Откос" -- ПО ВОЗРАСТАНИЮ + SetDictionary, MaxRank = GetRank(SetDictionary, "sSetSlope", key_weight=RANK_STEP_SET_SLOPE, + rank_name=u"Откос") + to_template.update({'S_Slope_Step': RANK_STEP_SET_SLOPE }) + to_template.update({'S_Slope_MaxRank': MaxRank }) + # Отранжируем наборы по параметру Климат-контроль" -- ПО ВОЗРАСТАНИЮ + SetDictionary, MaxRank = GetRank(SetDictionary, "sSetClimateControl", key_weight=RANK_STEP_SET_CLIMATE_CONTROL, + rank_name=u"Климат-контроль") + to_template.update({'S_ClimateControl_Step': RANK_STEP_SET_CLIMATE_CONTROL }) + to_template.update({'S_ClimateControl_MaxRank': MaxRank }) + # Отранжируем наборы по параметру Число предложений -- ПО ВОЗРАСТАНИЮ + SetDictionary, MaxRank = GetRank(SetDictionary, "NumOffer", key_weight=RANK_STEP_SET_NUM_OFFER, + rank_name=u"Число предложений") + to_template.update({'S_NumOffer_Step': RANK_STEP_SET_NUM_OFFER }) + to_template.update({'S_NumOffer_MaxRank': MaxRank }) + # Отранжируем наборы по параметру Гибкие скидки -- ПО ВОЗРАСТАНИЮ + SetDictionary, MaxRank = GetRank(SetDictionary, "sOfficeDiscountMetaFormula", key_weight=RANK_STEP_DISCOUNT_FLEX, + rank_name=u"Гибкость скидок") + to_template.update({'S_DiscountFlex_Step': RANK_STEP_DISCOUNT_FLEX }) + to_template.update({'S_DiscountFlex_MaxRank': MaxRank }) + # Отранжируем наборы по параметру Гибкие скидки -- ПО ВОЗРАСТАНИЮ + SetDictionary, MaxRank = GetRank(SetDictionary, "DiscountMax", key_weight=RANK_STEP_DISCOUNT_MAX, + rank_name=u"Размеры скидок") + to_template.update({'S_DiscountMax_Step': RANK_STEP_DISCOUNT_MAX }) + to_template.update({'S_DiscountMax_MaxRank': MaxRank }) + # расчитываем обзий рейтинг наборов и записываем в базу + SetDictionary = sorted(SetDictionary, key=lambda item: item["TmpRating"]) + # print u"РЕЙТИНГИ НАБОРОВ" + for i in SetDictionary: + obj = SetKit.objects.get(id=i["id"]) + try: + GettedJSON = json.loads(obj.sSetDescription) + except: + GettedJSON = {} + # нормализованный рейтинг сета + # print GettedJSON + k1 = Normalize(i["TmpRating"], SetDictionary[-1]["TmpRating"] )*(RARING_SET_MAX-RARING_WEIGHT_PVC_PROFILE_IN_SET-RARING_WEIGHT_GLAZING_IN_SET-RARING_SET_MIN) + k2 = Normalize(i["fGlazingRating"], RARING_GLAZING_MAX) * RARING_WEIGHT_GLAZING_IN_SET + k3 = Normalize(i["fProfileRating"], RARING_PVC_PROFILE_MAX) * RARING_WEIGHT_PVC_PROFILE_IN_SET + # print "id:", i["id"], u"\tk1:", k1, u"\tk2", k2, u"\tk3", k3, u"\tΣ:", k1+k2+k3 + obj.fSetRating = k1+k2+k3 + # print str(i["RatingConsist"]) + try: del GettedJSON[KEY_RATING_VIRTUAL] + except: pass + GettedJSON.update({KEY_RATING:i["RatingConsist"]}) + obj.sSetDescription = json.dumps(GettedJSON, separators=(",",":"), encoding="utf-8", ensure_ascii=False) + # print obj.sSetDescription + obj.save() + # print u"id:",i["id"], u"\tRank:", i["TmpRating"], u"\tRate:", obj.fSetRating, u"\tSet:", i["sSetName"], i["fProfileRating"], i["fGlazingRating"] + to_template.update({'msg': msg}) + to_template.update({'ticks': float(time.time()-time_start)}) + return render(request, "service/make_rating.html", to_template) \ No newline at end of file From 1f24b12754f603fc7a8a85fe4f8677dbafb24a20 Mon Sep 17 00:00:00 2001 From: erjemin Date: Thu, 16 Apr 2026 21:13:53 +0300 Subject: [PATCH 004/102] mod: add favicon --- oknardia/templates/base.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/oknardia/templates/base.html b/oknardia/templates/base.html index c3fd2b9..c2d0b03 100755 --- a/oknardia/templates/base.html +++ b/oknardia/templates/base.html @@ -17,6 +17,10 @@ {% block Title %}{% endblock %} : ОКНАРДИЯ + + + + {# #} {# #} {% block Top_CSS1 %}{% endblock %}{% block Top_CSS2 %}{% endblock %}{% block Top_CSS3 %}{% endblock %} From 2867ec485c1d56719b7e700c9aa58ff0ea929f80 Mon Sep 17 00:00:00 2001 From: erjemin Date: Thu, 16 Apr 2026 21:15:19 +0300 Subject: [PATCH 005/102] =?UTF-8?q?mod:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D1=81=D1=87=D0=B5=D1=82=D0=B0=20=D1=80?= =?UTF-8?q?=D0=B5=D0=B9=D1=82=D0=B8=D0=BD=D0=B3=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oknardia/oknardia/urls.py | 1 + oknardia/templates/service/index.html | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/oknardia/oknardia/urls.py b/oknardia/oknardia/urls.py index f3f4a97..25e51e1 100644 --- a/oknardia/oknardia/urls.py +++ b/oknardia/oknardia/urls.py @@ -98,6 +98,7 @@ urlpatterns = [ re_path(r'^service/not-denice[/*]$', service.not_denice), # --- создание файлов sitemap.xml re_path(r'^service/make_sitemaps[/*]$', service.make_site_maps), + re_path(r'^service/make_rating[/*]$', service.make_rating), ] diff --git a/oknardia/templates/service/index.html b/oknardia/templates/service/index.html index c71dd60..0eb9103 100755 --- a/oknardia/templates/service/index.html +++ b/oknardia/templates/service/index.html @@ -20,7 +20,7 @@ From 37fe09588b2fa7681841d145fff86a42bb7e6757 Mon Sep 17 00:00:00 2001 From: erjemin Date: Thu, 16 Apr 2026 21:20:24 +0300 Subject: [PATCH 006/102] =?UTF-8?q?del:=20=D0=BD=D0=B5=D1=82=20=D0=BB?= =?UTF-8?q?=D0=BE=D0=B3=D0=B0=D0=BC=20=D0=B2=20=D1=80=D0=B5=D0=BF=D0=BE?= =?UTF-8?q?=D0=B7=D0=B8=D1=82=D0=BE=D1=80=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 32 +++++++++++++++++++++++++++++++- logs/touch-reload.txt | 1 - 2 files changed, 31 insertions(+), 2 deletions(-) delete mode 100644 logs/touch-reload.txt diff --git a/.gitignore b/.gitignore index ddebaa3..5a719a4 100755 --- a/.gitignore +++ b/.gitignore @@ -132,4 +132,34 @@ venv.bak/ dmypy.json # Pyre type checker -.pyre/ \ No newline at end of file +.pyre/ + +# MacOS specific files +.DS_Store + +# Database dumps and backups (CRITICAL - NEVER commit production data!) +SQL/ +*.sql +*.dump +*.backup +*.sql.gz +db.json +db.json.zip + +# API keys, certificates, and credentials +*.key +*.pem +*.p12 +*.p8 +*.crt +*.cert + +# IDE and editor specific +.vscode/settings.json +.idea/vcs.xml +.idea/inspectionProfiles/ + +# Project specific ignore patterns +.github/ +.log/ +.logs/ diff --git a/logs/touch-reload.txt b/logs/touch-reload.txt deleted file mode 100644 index 56a6051..0000000 --- a/logs/touch-reload.txt +++ /dev/null @@ -1 +0,0 @@ -1 \ No newline at end of file From 2d7b6f86a49e7e07612a9f7f4be3a016083c8ed9 Mon Sep 17 00:00:00 2001 From: erjemin Date: Thu, 16 Apr 2026 21:28:18 +0300 Subject: [PATCH 007/102] =?UTF-8?q?=20minor:=20=D0=BA=D0=BE=D0=BC=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=B0=D1=80=D0=B8=D0=B8=20fix=20=D0=B8=D0=BC?= =?UTF-8?q?=D1=8F=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oknardia/oknardia/my_secret__sample.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oknardia/oknardia/my_secret__sample.py b/oknardia/oknardia/my_secret__sample.py index a820c9b..46b5fcb 100644 --- a/oknardia/oknardia/my_secret__sample.py +++ b/oknardia/oknardia/my_secret__sample.py @@ -5,7 +5,7 @@ ИНСТРУКЦИЯ: скопируйте этот файл в my_secret.py и заполните реальные значения. Пример: - cp oknardia/oknardia/my_secret.py.template oknardia/oknardia/my_secret.py + cp oknardia/oknardia/my_secret__sample.py oknardia/oknardia/my_secret.py # затем отредактируйте значения в my_secret.py ВАЖНО: my_secret.py НИКОГДА не должен быть в git! From 096aa2d78b7ae43cecfd606c615321ae0a9093ef Mon Sep 17 00:00:00 2001 From: erjemin Date: Fri, 17 Apr 2026 15:18:05 +0300 Subject: [PATCH 008/102] mod: switch secrets config to .env --- .env.sample | 37 +++-- oknardia/oknardia/my_secret__sample.py | 185 ------------------------- oknardia/oknardia/settings.py | 165 +++++++++++----------- requare_dev_mac.txt | 1 + requare_prod.txt | 1 + 5 files changed, 105 insertions(+), 284 deletions(-) delete mode 100644 oknardia/oknardia/my_secret__sample.py diff --git a/.env.sample b/.env.sample index 7de66ec..9515621 100644 --- a/.env.sample +++ b/.env.sample @@ -1,5 +1,6 @@ # Django Configuration Example -# Копируйте этот файл в .env.local и заполните реальные значения +# Все настройки читаются из переменных окружения (DEV/PROD без распознавания хоста) +# Для локальной разработки можно скопировать файл в .env.local и экспортировать его. # ============================================================================ # DJANGO @@ -15,19 +16,29 @@ DEBUG=False # Допустимые хосты (разделены запятой без пробелов) ALLOWED_HOSTS=localhost,127.0.0.1,yourdomain.com +# Админы для email-оповещений Django (формат: Имя:email,Имя2:email2) +ADMINS=Admin:admin@example.com + # ============================================================================ # DATABASE # ============================================================================ -# Database backend (по умолчанию mysql) -DATABASE_ENGINE=django.db.backends.mysql +# Database backend (по умолчанию SQLite) +DATABASE_ENGINE=django.db.backends.sqlite3 -# Database connection -DATABASE_HOST=localhost -DATABASE_PORT=3306 -DATABASE_NAME=django_oknardia -DATABASE_USER=web -DATABASE_PASSWORD=your-db-password-here +# Имя/путь базы данных: +# - для SQLite: только имя файла (полный путь соберется в settings.py через PROJECT_ROOT/database) +# - для MySQL/MariaDB: имя базы +DATABASE_NAME=oknadria.sqlite3 + +# Для MySQL/MariaDB (используются, если DATABASE_ENGINE=django.db.backends.mysql) +# DATABASE_HOST=localhost +# DATABASE_PORT=3306 +# DATABASE_USER=name-for-db-user +# DATABASE_PASSWORD=your-db-password-here + +# Пути вычисляются автоматически внутри settings.py от PROJECT_ROOT +TOUCH_RELOAD=/app/logs/touch-reload.txt # ============================================================================ # EMAIL @@ -40,6 +51,7 @@ EMAIL_BACKEND=django.core.mail.backends.smtp.EmailBackend EMAIL_HOST=smtp.example.com EMAIL_PORT=587 EMAIL_USE_TLS=True +EMAIL_USE_SSL=False EMAIL_HOST_USER=your-email@example.com EMAIL_HOST_PASSWORD=your-email-password @@ -100,7 +112,7 @@ LOG_LEVEL=INFO # ============================================================================ # 1. Скопируйте этот файл: -# cp .env.example .env.local +# cp .env.sample .env.local # # 2. Отредактируйте значения в .env.local: # nano .env.local @@ -108,9 +120,8 @@ LOG_LEVEL=INFO # 3. Убедитесь, что .env.local в .gitignore: # grep ".env" .gitignore # -# 4. Используйте python-dotenv для загрузки переменных в settings.py: -# from dotenv import load_dotenv -# load_dotenv() +# 4. Экспортируйте переменные перед запуском Django: +# set -a; source .env.local; set +a # # ВАЖНО: # - НИКОГДА не коммитьте .env.local или файлы с реальными значениями в git! diff --git a/oknardia/oknardia/my_secret__sample.py b/oknardia/oknardia/my_secret__sample.py deleted file mode 100644 index 46b5fcb..0000000 --- a/oknardia/oknardia/my_secret__sample.py +++ /dev/null @@ -1,185 +0,0 @@ -# -*- coding: utf-8 -*- -""" -ШАБЛОН для my_secret.py - -ИНСТРУКЦИЯ: скопируйте этот файл в my_secret.py и заполните реальные значения. - -Пример: - cp oknardia/oknardia/my_secret__sample.py oknardia/oknardia/my_secret.py - # затем отредактируйте значения в my_secret.py - -ВАЖНО: my_secret.py НИКОГДА не должен быть в git! -Используйте .gitignore для исключения файла. -""" - -# ============================================================================ -# РАЗРАБОТКА (DEV) - Хосты и сетевые настройки -# ============================================================================ - -# Хосты на которых может работать приложение (разработка) -MY_ALLOWED_HOSTS = [ - '127.0.0.1', - 'localhost', - 'your-dev-hostname.local', # ИЗМЕНИТЕ на ваше имя хоста -] - -# Допустимые хосты для разработки -MY_HOST_HOME1 = 'your-dev-hostname-windows' # ИЗМЕНИТЕ -MY_HOST_HOME2 = 'your-dev-hostname-mac' # ИЗМЕНИТЕ -MY_HOST_DEV = [MY_HOST_HOME1, MY_HOST_HOME2] - -# Хосты для продакшена (заполнять с осторожностью) -MY_HOST_PROD = [] # На продакшене используйте переменные окружения! - -# ============================================================================ -# БЕЗОПАСНОСТЬ - Django SECRET_KEY -# ============================================================================ - -# SECURITY WARNING: keep the secret key used in production secret! -# Сгенерируйте новый ключ с помощью: -# python -c 'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())' -MY_SECRET_KEY = 'ЗАПОЛНИТЕ_СЛУЧАЙНОЙ_СТРОКОЙ_БОЛЬШОЙ_ДЛИНЫ' - -# ============================================================================ -# АДМИНИСТРАТОРЫ - для оповещений об ошибках -# ============================================================================ - -MY_ADMINS = ( - ('Your Name', 'your-email@example.com'), - ('Admin Name', 'admin@example.com'), -) - -# ============================================================================ -# ПУТИ К ФАЙЛАМ - разработка -# ============================================================================ - -# путь к каталогу media (статика, для web-сервера nginx или apache) -MY_MEDIA_ROOT_DEV1 = 'M:\\path\\to\\your\\media\\' # Windows (если применимо) -MY_MEDIA_ROOT_DEV2 = '/path/to/your/media/' # Mac/Linux - ИЗМЕНИТЕ! - -# путь к каталогу static (статика, для web-сервера nginx или apache) -MY_STATIC_ROOT_DEV1 = 'M:\\path\\to\\your\\static' # Windows (если применимо) -MY_STATIC_ROOT_DEV2 = '/path/to/your/static' # Mac/Linux - ИЗМЕНИТЕ! - -# путь для кэш-блоков шаблонов -MY_STATIC_BASE_PATH_DEV1 = MY_STATIC_ROOT_DEV1 -MY_STATIC_BASE_PATH_DEV2 = MY_STATIC_ROOT_DEV2 - -# путь для sitemap файлов -MY_SITEMAP_ROOT_DEV1 = 'M:\\path\\to\\your\\public\\' # Windows (если применимо) -MY_SITEMAP_ROOT_DEV2 = '/path/to/your/public/' # Mac/Linux - ИЗМЕНИТЕ! - -# ============================================================================ -# ПУТИ К ФАЙЛАМ - продакшен -# ============================================================================ - -MY_MEDIA_ROOT_PROD = '/home/web/oknardia-ru/public/media/' # ЗАПОЛНИТЕ! -MY_STATIC_ROOT_PROD = '/home/web/oknardia-ru/public/static' # ЗАПОЛНИТЕ! -MY_STATIC_BASE_PATH_PROD = MY_STATIC_ROOT_PROD -MY_SITEMAP_ROOT_PROD = '/home/web/oknardia-ru/public/' # ЗАПОЛНИТЕ! - -# ============================================================================ -# EMAIL - Почтовый сервер (разработка) -# ============================================================================ - -# Email адреса для разработки -MY_EMAIL_DEV = 'dev-email@example.com' -MY_EMAIL_FROM_DEV = 'dev-email@example.com' -MY_EMAIL_HOST_USER_DEV = 'your-email@smtp.example.com' # ЗАПОЛНИТЕ! -MY_EMAIL_HOST_PASSWORD_DEV = 'YOUR_EMAIL_PASSWORD' # ЗАПОЛНИТЕ! -MY_EMAIL_HOST_DEV = 'smtp.example.com' # ЗАПОЛНИТЕ! (например: smtp.mail.ru) -MY_EMAIL_PORT_DEV = 587 # ЗАПОЛНИТЕ! (обычно 587 или 2525) - -# ============================================================================ -# EMAIL - Почтовый сервер (продакшен) -# ============================================================================ - -MY_EMAIL_PROD = MY_EMAIL_DEV -MY_EMAIL_FROM_PROD = MY_EMAIL_FROM_DEV -MY_EMAIL_HOST_USER_PROD = MY_EMAIL_HOST_USER_DEV # На продакшене используйте env переменные! -MY_EMAIL_HOST_PASSWORD_PROD = MY_EMAIL_HOST_PASSWORD_DEV # На продакшене используйте env переменные! -MY_EMAIL_HOST_PROD = MY_EMAIL_HOST_DEV -MY_EMAIL_PORT_PROD = MY_EMAIL_PORT_DEV - -# ============================================================================ -# БД MySQL/MariaDB - разработка -# ============================================================================ - -MY_DATABASE_HOST_DEV1 = 'localhost' # Офисный сервер разработки - ИЗМЕНИТЕ! -MY_DATABASE_HOST_DEV2 = 'localhost' # Домашний сервер разработки - ИЗМЕНИТЕ! - -MY_DATABASE_NAME_DEV = 'django_oknardia_dev' # ИЗМЕНИТЕ если нужно -MY_DATABASE_PORT_DEV = '3306' # Стандартный порт MySQL - -MY_DATABASE_USER_DEV = 'web' # ИЗМЕНИТЕ если нужно -MY_DATABASE_PASSWORD_DEV = 'YOUR_DB_PASSWORD' # ЗАПОЛНИТЕ! - -# ============================================================================ -# БД MySQL/MariaDB - продакшен -# ============================================================================ - -MY_DATABASE_HOST_PROD = 'localhost' # ЗАПОЛНИТЕ! (на продакшене) -MY_DATABASE_NAME_PROD = 'django_oknardia_prod' # ЗАПОЛНИТЕ! - -MY_DATABASE_PORT_PROD = '3306' -MY_DATABASE_USER_PROD = 'web' - -# ВНИМАНИЕ: На продакшене используйте переменные окружения или менеджер секретов! -MY_DATABASE_PASSWORD_PROD = '' # ОСТАВЬТЕ ПУСТО! Используйте переменные окружения! - -# ============================================================================ -# API ключи - Google Captcha -# ============================================================================ - -# Получите ключи на https://www.google.com/recaptcha/admin -# ВАЖНО: Никогда не коммитьте реальные ключи в git! -# PRIVATE ключ - это СЕКРЕТ, держите его в безопасности! -MY_CAPTCHA_PUBLIC_KEY = 'YOUR_CAPTCHA_PUBLIC_KEY_HERE' # ЗАПОЛНИТЕ! -MY_CAPTCHA_PRIVATE_KEY = 'YOUR_CAPTCHA_PRIVATE_KEY_HERE' # ЗАПОЛНИТЕ! (СЕКРЕТ!) - -# ============================================================================ -# API ключи - Yandex Maps -# ============================================================================ - -# Получите ключ на https://developer.tech.yandex.ru/ -MY_YANDEX_MAPS_API_KEY = 'YOUR_YANDEX_MAPS_API_KEY' - -# ============================================================================ -# uWSGI - Touch-reload файл (для перезагрузки при изменении кода) -# ============================================================================ - -MY_TOUCH_RELOAD_DEV1 = 'M:\\path\\to\\touch-reload.txt' # Windows (если применимо) -MY_TOUCH_RELOAD_DEV2 = '/path/to/logs/touch-reload.txt' # Mac/Linux - ИЗМЕНИТЕ! -MY_TOUCH_RELOAD_PROD = '/home/web/oknardia-ru/logs/touch-reload.txt' # ЗАПОЛНИТЕ! - -# ============================================================================ -# ИНСТРУКЦИЯ ПО ЗАПОЛНЕНИЮ -# ============================================================================ - -""" -1. СКОПИРУЙТЕ этот файл: - cp oknardia/oknardia/my_secret.py.template oknardia/oknardia/my_secret.py - -2. ОТРЕДАКТИРУЙТЕ значения, помеченные ИЗМЕНИТЕ! или ЗАПОЛНИТЕ! - -3. УБЕДИТЕСЬ, что мой_secret.py в .gitignore: - grep my_secret .gitignore - -4. НИКОГДА не коммитьте my_secret.py в git! - -5. На ПРОДАКШЕНЕ используйте переменные окружения: - export DJANGO_SECRET_KEY="..." - export DATABASE_PASSWORD="..." - и т.д. - -СОВЕТЫ: -- Сгенерируйте новый SECRET_KEY с помощью Python: - python -c 'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())' - -- Используйте менеджер паролей (LastPass, 1Password, Vault) для хранения учетных данных - -- Регулярно меняйте пароли БД и API ключи - -- На продакшене используйте отдельные более сильные пароли -""" - diff --git a/oknardia/oknardia/settings.py b/oknardia/oknardia/settings.py index f8d8ea0..ef6b12e 100644 --- a/oknardia/oknardia/settings.py +++ b/oknardia/oknardia/settings.py @@ -11,42 +11,50 @@ For the full list of settings and their values, see https://docs.djangoproject.com/en/4.1/ref/settings/ """ -import os from pathlib import Path -from oknardia.my_secret import * -import socket +import environ + + +def _env_admins(raw_items: list[str]) -> tuple[tuple[str, str], ...]: + # Формат: "Имя1:email1,Имя2:email2" + admins: list[tuple[str, str]] = [] + for item in raw_items: + if ":" not in item: + continue + admin_name, admin_email = item.split(":", maxsplit=1) + admin_name = admin_name.strip() + admin_email = admin_email.strip() + if admin_name and admin_email: + admins.append((admin_name, admin_email)) + return tuple(admins) # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent - -# Переключатель БД для DEV: по умолчанию используем SQLite. -# Чтобы вернуть MariaDB на DEV, установите OKNARDIA_USE_SQLITE_DEV=0 -USE_SQLITE_DEV = os.getenv("OKNARDIA_USE_SQLITE_DEV", "1").strip().lower() in { - "1", "true", "yes", "on" -} PROJECT_ROOT = BASE_DIR.parent -SQLITE_DB_PATH = PROJECT_ROOT / 'database' / 'oknadria.sqlite3' +PUBLIC_ROOT = PROJECT_ROOT / 'public' +STATIC_SOURCE_ROOT = PUBLIC_ROOT / 'static' + +env = environ.Env() +environ.Env.read_env(str(PROJECT_ROOT / '.env')) # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = 'django-insecure-pd&1$j6z*1w#(j*16b+(@@#&2)+@x^^ot4)zqt-e67*1+$^qch' +SECRET_KEY = env( + 'DJANGO_SECRET_KEY', + default='django-insecure-pd&1$j6z*1w#(j*16b+(@@#&2)+@x^^ot4)zqt-e67*1+$^qch', +) # SECURITY WARNING: don't run with debug turned on in production! # ПРЕДУПРЕЖДЕНИЕ БЕЗОПАСНОСТИ: не работайте в режиме DEBUG в продашене! -if socket.gethostname() in MY_HOST_DEV: - DEBUG = TEMPLATE_DEBUG = True -else: - # Все остальные хосты (подразумевается продакшн) - # DEBUG = TEMPLATE_DEBUG = True - DEBUG = TEMPLATE_DEBUG = False +DEBUG = TEMPLATE_DEBUG = env.bool('DEBUG', default=False) -ALLOWED_HOSTS = MY_ALLOWED_HOSTS +ALLOWED_HOSTS = env.list('ALLOWED_HOSTS', default=['127.0.0.1', 'localhost']) # Настройки сообщений об ошибках когда все упало и т.п. -ADMINS = MY_ADMINS +ADMINS = _env_admins(env.list('ADMINS', default=[])) # Application definition @@ -124,83 +132,68 @@ DATETIME_FORMAT = 'Y-m-d H:i:s' # Статические файлы (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/4.1/howto/static-files/ -STATIC_URL = 'static/' -MEDIA_URL = 'media/' +STATIC_URL = '/static/' +MEDIA_URL = '/media/' -if socket.gethostname() in MY_HOST_DEV: # DEBUG: заменяем настройки прода, на настройки девопа - MEDIA_ROOT = MY_MEDIA_ROOT_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_MEDIA_ROOT_DEV2 - SITEMAP_ROOT = MY_SITEMAP_ROOT_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_SITEMAP_ROOT_DEV2 - # STATIC_ROOT = MY_STATIC_ROOT_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_STATIC_ROOT_DEV2 - dev_static_from_secret = MY_STATIC_ROOT_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_STATIC_ROOT_DEV2 - # Если путь из секрета устарел, используем путь текущего репозитория. - dev_static_fallback = PROJECT_ROOT / 'public' / 'static' - dev_static_path = dev_static_from_secret if os.path.isdir(dev_static_from_secret) else str(dev_static_fallback) - STATICFILES_DIRS = [dev_static_path] - # путь к каталогу static (в эту переменную использовать для указания пути где будут делаться кэш-блоки для шаблонов) - dev_static_base_from_secret = MY_STATIC_BASE_PATH_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_STATIC_BASE_PATH_DEV2 - STATIC_BASE_PATH = dev_static_base_from_secret if os.path.isdir(dev_static_base_from_secret) else str(dev_static_fallback) - if USE_SQLITE_DEV: - DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': SQLITE_DB_PATH, - } - } - else: - DATABASES = { - 'default': { - 'ENGINE': "django.db.backends.mysql", - 'HOST': MY_DATABASE_HOST_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_DATABASE_HOST_DEV2, - 'PORT': MY_DATABASE_PORT_DEV, # Set to "" for default. Not used with sqlite3. - 'NAME': MY_DATABASE_NAME_DEV, # Not used with sqlite3. - 'USER': MY_DATABASE_USER_DEV, # Not used with sqlite3. - 'PASSWORD': MY_DATABASE_PASSWORD_DEV, # Not used with sqlite3. - # 'OPTIONS': { 'autocommit': True, } - } - } - TOUCH_RELOAD = MY_TOUCH_RELOAD_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_TOUCH_RELOAD_DEV2 -else: - MEDIA_ROOT = MY_MEDIA_ROOT_PROD - # STATICFILES_DIRS = [MY_STATIC_ROOT_PROD1, ] - STATIC_ROOT = MY_STATIC_ROOT_PROD - SITEMAP_ROOT = MY_SITEMAP_ROOT_PROD - # путь к каталогу static (в эту переменную использовать для указания пути где будут делаться кэш-блоки для шаблонов) - STATIC_BASE_PATH = MY_STATIC_BASE_PATH_PROD - DATABASES = { - 'default': { - 'ENGINE': "django.db.backends.mysql", - 'HOST': MY_DATABASE_HOST_PROD, # Set to "" for localhost. Not used with sqlite3. - 'PORT': MY_DATABASE_PORT_PROD, # Set to "" for default. Not used with sqlite3. - 'NAME': MY_DATABASE_NAME_PROD, # Not used with sqlite3. - 'USER': MY_DATABASE_USER_PROD, # Not used with sqlite3. - 'PASSWORD': MY_DATABASE_PASSWORD_PROD, # Not used with sqlite3. - # 'OPTIONS': { 'autocommit': True, } - } - } - TOUCH_RELOAD = MY_TOUCH_RELOAD_PROD +MEDIA_ROOT = str(PUBLIC_ROOT / 'media') +# STATIC_ROOT отделен от исходной статики, чтобы избежать staticfiles.E002. +STATIC_ROOT = str(PUBLIC_ROOT / 'static_collected') +SITEMAP_ROOT = str(PUBLIC_ROOT) -# Для локальной/тестовой разработки можно принудительно включить SQLite даже -# если hostname не попал в MY_HOST_DEV. На прод-хостах (MY_HOST_PROD) override -# не применяется. -if USE_SQLITE_DEV and socket.gethostname() not in MY_HOST_PROD: +# Каталоги, откуда Django читает исходную статику в DEBUG-режиме. +STATICFILES_DIRS = [ + str(STATIC_SOURCE_ROOT) +] if STATIC_SOURCE_ROOT.is_dir() else [] + +# Путь к каталогу static для генерации кэш-файлов и служебных JS. +STATIC_BASE_PATH = str(STATIC_SOURCE_ROOT) + +database_engine = env('DATABASE_ENGINE', default='django.db.backends.sqlite3') +if database_engine == 'django.db.backends.sqlite3': + # Для SQLite принимаем только имя файла из env и кладем БД в PROJECT_ROOT/database. + sqlite_db_filename = Path(env('DATABASE_NAME', default='oknadria.sqlite3')).name + sqlite_db_path = PROJECT_ROOT / 'database' / sqlite_db_filename DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': SQLITE_DB_PATH, + 'NAME': str(sqlite_db_path), + } + } +else: + DATABASES = { + 'default': { + 'ENGINE': database_engine, + 'HOST': env('DATABASE_HOST', default='localhost'), + 'PORT': env('DATABASE_PORT', default='3306'), + 'NAME': env('DATABASE_NAME', default=''), + 'USER': env('DATABASE_USER', default=''), + 'PASSWORD': env('DATABASE_PASSWORD', default=''), } } +TOUCH_RELOAD = env('TOUCH_RELOAD', default='') + ######################################### # настройки для почтового сервера (они одинаковые для DEV и PROD) -EMAIL_HOST = MY_EMAIL_HOST_DEV -EMAIL_PORT = MY_EMAIL_PORT_DEV -EMAIL_HOST_USER = MY_EMAIL_HOST_USER_DEV -EMAIL_HOST_PASSWORD = MY_EMAIL_HOST_PASSWORD_DEV -SERVER_EMAIL = DEFAULT_FROM_EMAIL = EMAIL_HOST_USER -EMAIL_USE_TLS = True +EMAIL_BACKEND = env( + 'EMAIL_BACKEND', + default='django.core.mail.backends.smtp.EmailBackend', +) +EMAIL_HOST = env('EMAIL_HOST', default='localhost') +EMAIL_PORT = env.int('EMAIL_PORT', default=25) +EMAIL_HOST_USER = env('EMAIL_HOST_USER', default='') +EMAIL_HOST_PASSWORD = env('EMAIL_HOST_PASSWORD', default='') +EMAIL_USE_TLS = env.bool('EMAIL_USE_TLS', default=True) +EMAIL_USE_SSL = env.bool('EMAIL_USE_SSL', default=False) +DEFAULT_FROM_EMAIL = env('DEFAULT_FROM_EMAIL', default=EMAIL_HOST_USER) +SERVER_EMAIL = env('SERVER_EMAIL', default=DEFAULT_FROM_EMAIL) EMAIL_SUBJECT_PREFIX = 'OKNARDIA ERR: ' # префикс для оповещений об ошибках и необработанных исключениях +SECURE_SSL_REDIRECT = env.bool('SECURE_SSL_REDIRECT', default=False) +SESSION_COOKIE_SECURE = env.bool('SESSION_COOKIE_SECURE', default=False) +CSRF_COOKIE_SECURE = env.bool('CSRF_COOKIE_SECURE', default=False) + # Default primary key field type # https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field @@ -208,8 +201,8 @@ EMAIL_SUBJECT_PREFIX = 'OKNARDIA ERR: ' # префикс для оповещ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' # ключи для Google Captha -CAPTCHA_PUBLIC_KEY = MY_CAPTCHA_PUBLIC_KEY -CAPTCHA_PRIVATE_KEY = MY_CAPTCHA_PRIVATE_KEY +CAPTCHA_PUBLIC_KEY = env('CAPTCHA_PUBLIC_KEY', default='') +CAPTCHA_PRIVATE_KEY = env('CAPTCHA_PRIVATE_KEY', default='') # количество коммерческих предложений во фреме отчета OFFER_PER_FRAME = 5 @@ -303,4 +296,4 @@ CATALOG_SORTER_MAGIC_NUMBER_TIZER = 1 MAX_LEN_RING_LOG_BUFFER = 250 # МАКСИМАЛЬНЫЙ РАЗМЕР КОЛЬЦЕВОГО БУФЕРА -YANDEX_MAPS_API_KEY = MY_YANDEX_MAPS_API_KEY +YANDEX_MAPS_API_KEY = env('YANDEX_MAPS_API_KEY', default='') diff --git a/requare_dev_mac.txt b/requare_dev_mac.txt index 5588ea1..d8ddf46 100644 --- a/requare_dev_mac.txt +++ b/requare_dev_mac.txt @@ -1,4 +1,5 @@ Django==4.1.5 +django-environ==0.11.2 asgiref==3.6.0 sqlparse==0.4.3 diff --git a/requare_prod.txt b/requare_prod.txt index 5588ea1..d8ddf46 100644 --- a/requare_prod.txt +++ b/requare_prod.txt @@ -1,4 +1,5 @@ Django==4.1.5 +django-environ==0.11.2 asgiref==3.6.0 sqlparse==0.4.3 From 15abbe73678c26e802dd9fe0412aba2b5a3778e0 Mon Sep 17 00:00:00 2001 From: erjemin Date: Fri, 17 Apr 2026 16:07:19 +0300 Subject: [PATCH 009/102] mod: migrate to poetry and add django debug toolbar for dev --- .gitignore | 1 + oknardia/oknardia/settings.py | 7 + oknardia/oknardia/urls.py | 14 +- poetry.lock | 433 ++++++++++++++++++++++++++++++++++ pyproject.toml | 23 ++ requare_dev_mac.txt | 16 -- requare_prod.txt | 16 -- 7 files changed, 472 insertions(+), 38 deletions(-) create mode 100644 poetry.lock create mode 100644 pyproject.toml delete mode 100644 requare_dev_mac.txt delete mode 100644 requare_prod.txt diff --git a/.gitignore b/.gitignore index 5a719a4..70518bb 100755 --- a/.gitignore +++ b/.gitignore @@ -163,3 +163,4 @@ db.json.zip .github/ .log/ .logs/ +sitemap*.xml diff --git a/oknardia/oknardia/settings.py b/oknardia/oknardia/settings.py index ef6b12e..c5303e7 100644 --- a/oknardia/oknardia/settings.py +++ b/oknardia/oknardia/settings.py @@ -84,6 +84,13 @@ MIDDLEWARE = [ 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] +# Разрешенные IP для отладки (нужно для django-debug-toolbar). +INTERNAL_IPS = env.list('INTERNAL_IPS', default=['127.0.0.1', 'localhost']) + +if DEBUG: + INSTALLED_APPS += ['debug_toolbar'] + MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware', *MIDDLEWARE] + ROOT_URLCONF = 'oknardia.urls' TEMPLATES = [ diff --git a/oknardia/oknardia/urls.py b/oknardia/oknardia/urls.py index 25e51e1..611008f 100644 --- a/oknardia/oknardia/urls.py +++ b/oknardia/oknardia/urls.py @@ -15,7 +15,7 @@ 2. Добавьте URL-адрес в urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin -from django.urls import path, re_path +from django.urls import include, path, re_path from django.conf.urls.static import static from oknardia.settings import * from web import views, autocomplete_addr, user_manager, blog, diagrams, report1, report2, catalog, prices, service @@ -103,10 +103,12 @@ urlpatterns = [ ] if DEBUG: + # ___ ____ _ _____ _ _ _____ _ + # | | | | \ ___| |_ _ _ ___ |_ _|___ ___| | |_ ___ ___ | _ |___ ___ ___| | + # |_ | | | | -_| . | | | . | | | | . | . | | . | .'| _| | __| .'| | -_| | + # |_| |____/|___|___|___|_ | |_| |___|___|_|___|__,|_| |__| |__,|_|_|___|_| + # |___| + urlpatterns = [path('__debug__/', include('debug_toolbar.urls')), *urlpatterns] + # Медиа-файлы urlpatterns += static(MEDIA_URL, document_root=MEDIA_ROOT) -# ___ ____ _ _____ _ _ _____ _ -# | | | | \ ___| |_ _ _ ___ |_ _|___ ___| | |_ ___ ___ | _ |___ ___ ___| | -# |_ | | | | -_| . | | | . | | | | . | . | | . | .'| _| | __| .'| | -_| | -# |_| |____/|___|___|___|_ | |_| |___|___|_|___|__,|_| |__| |__,|_|_|___|_| -# |___| diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..ada9b82 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,433 @@ +# This file is automatically @generated by Poetry 1.8.0 and should not be changed by hand. + +[[package]] +name = "asgiref" +version = "3.11.1" +description = "ASGI specs, helper code, and adapters" +optional = false +python-versions = ">=3.9" +files = [ + {file = "asgiref-3.11.1-py3-none-any.whl", hash = "sha256:e8667a091e69529631969fd45dc268fa79b99c92c5fcdda727757e52146ec133"}, + {file = "asgiref-3.11.1.tar.gz", hash = "sha256:5f184dc43b7e763efe848065441eac62229c9f7b0475f41f80e207a114eda4ce"}, +] + +[package.extras] +tests = ["mypy (>=1.14.0)", "pytest", "pytest-asyncio"] + +[[package]] +name = "certifi" +version = "2026.2.25" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.7" +files = [ + {file = "certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa"}, + {file = "certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.7" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7" +files = [ + {file = "charset_normalizer-3.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cdd68a1fb318e290a2077696b7eb7a21a49163c455979c639bf5a5dcdc46617d"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e17b8d5d6a8c47c85e68ca8379def1303fd360c3e22093a807cd34a71cd082b8"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:511ef87c8aec0783e08ac18565a16d435372bc1ac25a91e6ac7f5ef2b0bff790"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:007d05ec7321d12a40227aae9e2bc6dca73f3cb21058999a1df9e193555a9dcc"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf29836da5119f3c8a8a70667b0ef5fdca3bb12f80fd06487cfa575b3909b393"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:12d8baf840cc7889b37c7c770f478adea7adce3dcb3944d02ec87508e2dcf153"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d560742f3c0d62afaccf9f41fe485ed69bd7661a241f86a3ef0f0fb8b1a397af"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b14b2d9dac08e28bb8046a1a0434b1750eb221c8f5b87a68f4fa11a6f97b5e34"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:bc17a677b21b3502a21f66a8cc64f5bfad4df8a0b8434d661666f8ce90ac3af1"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:750e02e074872a3fad7f233b47734166440af3cdea0add3e95163110816d6752"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:4e5163c14bffd570ef2affbfdd77bba66383890797df43dc8b4cc7d6f500bf53"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6ed74185b2db44f41ef35fd1617c5888e59792da9bbc9190d6c7300617182616"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:94e1885b270625a9a828c9793b4d52a64445299baa1fea5a173bf1d3dd9a1a5a"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-win32.whl", hash = "sha256:6785f414ae0f3c733c437e0f3929197934f526d19dfaa75e18fdb4f94c6fb374"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:6696b7688f54f5af4462118f0bfa7c1621eeb87154f77fa04b9295ce7a8f2943"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:66671f93accb62ed07da56613636f3641f1a12c13046ce91ffc923721f23c008"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7641bb8895e77f921102f72833904dcd9901df5d6d72a2ab8f31d04b7e51e4e7"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:202389074300232baeb53ae2569a60901f7efadd4245cf3a3bf0617d60b439d7"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:30b8d1d8c52a48c2c5690e152c169b673487a2a58de1ec7393196753063fcd5e"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:532bc9bf33a68613fd7d65e4b1c71a6a38d7d42604ecf239c77392e9b4e8998c"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fe249cb4651fd12605b7288b24751d8bfd46d35f12a20b1ba33dea122e690df"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:65bcd23054beab4d166035cabbc868a09c1a49d1efe458fe8e4361215df40265"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:08e721811161356f97b4059a9ba7bafb23ea5ee2255402c42881c214e173c6b4"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e060d01aec0a910bdccb8be71faf34e7799ce36950f8294c8bf612cba65a2c9e"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:38c0109396c4cfc574d502df99742a45c72c08eff0a36158b6f04000043dbf38"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1c2a768fdd44ee4a9339a9b0b130049139b8ce3c01d2ce09f67f5a68048d477c"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:1a87ca9d5df6fe460483d9a5bbf2b18f620cbed41b432e2bddb686228282d10b"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:d635aab80466bc95771bb78d5370e74d36d1fe31467b6b29b8b57b2a3cd7d22c"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ae196f021b5e7c78e918242d217db021ed2a6ace2bc6ae94c0fc596221c7f58d"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-win32.whl", hash = "sha256:adb2597b428735679446b46c8badf467b4ca5f5056aae4d51a19f9570301b1ad"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:8e385e4267ab76874ae30db04c627faaaf0b509e1ccc11a95b3fc3e83f855c00"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:d4a48e5b3c2a489fae013b7589308a40146ee081f6f509e047e0e096084ceca1"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eca9705049ad3c7345d574e3510665cb2cf844c2f2dcfe675332677f081cbd46"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6178f72c5508bfc5fd446a5905e698c6212932f25bcdd4b47a757a50605a90e2"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1421b502d83040e6d7fb2fb18dff63957f720da3d77b2fbd3187ceb63755d7b"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:edac0f1ab77644605be2cbba52e6b7f630731fc42b34cb0f634be1a6eface56a"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5649fd1c7bade02f320a462fdefd0b4bd3ce036065836d4f42e0de958038e116"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:203104ed3e428044fd943bc4bf45fa73c0730391f9621e37fe39ecf477b128cb"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:298930cec56029e05497a76988377cbd7457ba864beeea92ad7e844fe74cd1f1"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:708838739abf24b2ceb208d0e22403dd018faeef86ddac04319a62ae884c4f15"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:0f7eb884681e3938906ed0434f20c63046eacd0111c4ba96f27b76084cd679f5"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4dc1e73c36828f982bfe79fadf5919923f8a6f4df2860804db9a98c48824ce8d"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:aed52fea0513bac0ccde438c188c8a471c4e0f457c2dd20cdbf6ea7a450046c7"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fea24543955a6a729c45a73fe90e08c743f0b3334bbf3201e6c4bc1b0c7fa464"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb6d88045545b26da47aa879dd4a89a71d1dce0f0e549b1abcb31dfe4a8eac49"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-win32.whl", hash = "sha256:2257141f39fe65a3fdf38aeccae4b953e5f3b3324f4ff0daf9f15b8518666a2c"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:5ed6ab538499c8644b8a3e18debabcd7ce684f3fa91cf867521a7a0279cab2d6"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:56be790f86bfb2c98fb742ce566dfb4816e5a83384616ab59c49e0604d49c51d"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-win32.whl", hash = "sha256:4042d5c8f957e15221d423ba781e85d553722fc4113f523f2feb7b188cc34c5e"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:3946fa46a0cf3e4c8cb1cc52f56bb536310d34f25f01ca9b6c16afa767dab110"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:80d04837f55fc81da168b98de4f4b797ef007fc8a79ab71c6ec9bc4dd662b15b"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:c45e9440fb78f8ddabcf714b68f936737a121355bf59f3907f4e17721b9d1aae"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e8ac484bf18ce6975760921bb6148041faa8fef0547200386ea0b52b5d27bf7b"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e74327fb75de8986940def6e8dee4f127cc9752bee7355bb323cc5b2659b6d46"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d6038d37043bced98a66e68d3aa2b6a35505dc01328cd65217cefe82f25def44"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-win32.whl", hash = "sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-win_amd64.whl", hash = "sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-win_arm64.whl", hash = "sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:effc3f449787117233702311a1b7d8f59cba9ced946ba727bdc329ec69028e24"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cf1493cd8607bec4d8a7b9b004e699fcf8f9103a9284cc94962cb73d20f9d4a3"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ce3412fbe1e31eb81ea42f4169ed94861c56e643189e1e75f0041f3fe7020abe"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-win32.whl", hash = "sha256:c03a41a8784091e67a39648f70c5f97b5b6a37f216896d44d2cdcb82615339a0"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-win_amd64.whl", hash = "sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-win_arm64.whl", hash = "sha256:c35abb8bfff0185efac5878da64c45dafd2b37fb0383add1be155a763c1f083d"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e5f4d355f0a2b1a31bc3edec6795b46324349c9cb25eed068049e4f472fb4259"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:16d971e29578a5e97d7117866d15889a4a07befe0e87e703ed63cd90cb348c01"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dca4bbc466a95ba9c0234ef56d7dd9509f63da22274589ebd4ed7f1f4d4c54e3"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e80c8378d8f3d83cd3164da1ad2df9e37a666cdde7b1cb2298ed0b558064be30"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:36836d6ff945a00b88ba1e4572d721e60b5b8c98c155d465f56ad19d68f23734"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-manylinux_2_31_armv7l.whl", hash = "sha256:bd9b23791fe793e4968dba0c447e12f78e425c59fc0e3b97f6450f4781f3ee60"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:aef65cd602a6d0e0ff6f9930fcb1c8fec60dd2cfcb6facaf4bdb0e5873042db0"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:82b271f5137d07749f7bf32f70b17ab6eaabedd297e75dce75081a24f76eb545"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:1efde3cae86c8c273f1eb3b287be7d8499420cf2fe7585c41d370d3e790054a5"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:c593052c465475e64bbfe5dbd81680f64a67fdc752c56d7a0ae205dc8aeefe0f"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-musllinux_1_2_riscv64.whl", hash = "sha256:af21eb4409a119e365397b2adbaca4c9ccab56543a65d5dbd9f920d6ac29f686"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:84c018e49c3bf790f9c2771c45e9313a08c2c2a6342b162cd650258b57817706"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dd915403e231e6b1809fe9b6d9fc55cf8fb5e02765ac625d9cd623342a7905d7"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-win32.whl", hash = "sha256:320ade88cfb846b8cd6b4ddf5ee9e80ee0c1f52401f2456b84ae1ae6a1a5f207"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-win_amd64.whl", hash = "sha256:1dc8b0ea451d6e69735094606991f32867807881400f808a106ee1d963c46a83"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:177a0ba5f0211d488e295aaf82707237e331c24788d8d76c96c5a41594723217"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e0d51f618228538a3e8f46bd246f87a6cd030565e015803691603f55e12afb5"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:14265bfe1f09498b9d8ec91e9ec9fa52775edf90fcbde092b25f4a33d444fea9"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:87fad7d9ba98c86bcb41b2dc8dbb326619be2562af1f8ff50776a39e55721c5a"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f22dec1690b584cea26fade98b2435c132c1b5f68e39f5a0b7627cd7ae31f1dc"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-manylinux_2_31_armv7l.whl", hash = "sha256:d61f00a0869d77422d9b2aba989e2d24afa6ffd552af442e0e58de4f35ea6d00"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6370e8686f662e6a3941ee48ed4742317cafbe5707e36406e9df792cdb535776"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a6c5863edfbe888d9eff9c8b8087354e27618d9da76425c119293f11712a6319"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:ed065083d0898c9d5b4bbec7b026fd755ff7454e6e8b73a67f8c744b13986e24"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:2cd4a60d0e2fb04537162c62bbbb4182f53541fe0ede35cdf270a1c1e723cc42"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:813c0e0132266c08eb87469a642cb30aaff57c5f426255419572aaeceeaa7bf4"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:07d9e39b01743c3717745f4c530a6349eadbfa043c7577eef86c502c15df2c67"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c0f081d69a6e58272819b70288d3221a6ee64b98df852631c80f293514d3b274"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-win32.whl", hash = "sha256:8751d2787c9131302398b11e6c8068053dcb55d5a8964e114b6e196cf16cb366"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-win_amd64.whl", hash = "sha256:12a6fff75f6bc66711b73a2f0addfc4c8c15a20e805146a02d147a318962c444"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-win_arm64.whl", hash = "sha256:bb8cc7534f51d9a017b93e3e85b260924f909601c3df002bcdb58ddb4dc41a5c"}, + {file = "charset_normalizer-3.4.7-py3-none-any.whl", hash = "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d"}, + {file = "charset_normalizer-3.4.7.tar.gz", hash = "sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5"}, +] + +[[package]] +name = "django" +version = "5.2.13" +description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." +optional = false +python-versions = ">=3.10" +files = [ + {file = "django-5.2.13-py3-none-any.whl", hash = "sha256:5788fce61da23788a8ce6f02583765ab060d396720924789f97fa42119d37f7a"}, + {file = "django-5.2.13.tar.gz", hash = "sha256:a31589db5188d074c63f0945c3888fad104627dfcc236fb2b97f71f89da33bc4"}, +] + +[package.dependencies] +asgiref = ">=3.8.1" +sqlparse = ">=0.3.1" +tzdata = {version = "*", markers = "sys_platform == \"win32\""} + +[package.extras] +argon2 = ["argon2-cffi (>=19.1.0)"] +bcrypt = ["bcrypt"] + +[[package]] +name = "django-debug-toolbar" +version = "6.3.0" +description = "A configurable set of panels that display various debug information about the current request/response." +optional = false +python-versions = ">=3.10" +files = [ + {file = "django_debug_toolbar-6.3.0-py3-none-any.whl", hash = "sha256:a199ce3d0f884739a9096835ad417479fede05f3b3c4824bc8b354721ba8f629"}, + {file = "django_debug_toolbar-6.3.0.tar.gz", hash = "sha256:f830a86fe02e17f625a22cfbed24a5bd1500762e201ec959c50efb0f9327282b"}, +] + +[package.dependencies] +django = ">=4.2.9" +sqlparse = ">=0.2" + +[[package]] +name = "django-environ" +version = "0.11.2" +description = "A package that allows you to utilize 12factor inspired environment variables to configure your Django application." +optional = false +python-versions = ">=3.6,<4" +files = [ + {file = "django-environ-0.11.2.tar.gz", hash = "sha256:f32a87aa0899894c27d4e1776fa6b477e8164ed7f6b3e410a62a6d72caaf64be"}, + {file = "django_environ-0.11.2-py2.py3-none-any.whl", hash = "sha256:0ff95ab4344bfeff693836aa978e6840abef2e2f1145adff7735892711590c05"}, +] + +[package.extras] +develop = ["coverage[toml] (>=5.0a4)", "furo (>=2021.8.17b43,<2021.9.dev0)", "pytest (>=4.6.11)", "sphinx (>=3.5.0)", "sphinx-notfound-page"] +docs = ["furo (>=2021.8.17b43,<2021.9.dev0)", "sphinx (>=3.5.0)", "sphinx-notfound-page"] +testing = ["coverage[toml] (>=5.0a4)", "pytest (>=4.6.11)"] + +[[package]] +name = "idna" +version = "3.11" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea"}, + {file = "idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902"}, +] + +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + +[[package]] +name = "pillow" +version = "11.3.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pillow-11.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b9c17fd4ace828b3003dfd1e30bff24863e0eb59b535e8f80194d9cc7ecf860"}, + {file = "pillow-11.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:65dc69160114cdd0ca0f35cb434633c75e8e7fad4cf855177a05bf38678f73ad"}, + {file = "pillow-11.3.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7107195ddc914f656c7fc8e4a5e1c25f32e9236ea3ea860f257b0436011fddd0"}, + {file = "pillow-11.3.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc3e831b563b3114baac7ec2ee86819eb03caa1a2cef0b481a5675b59c4fe23b"}, + {file = "pillow-11.3.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1f182ebd2303acf8c380a54f615ec883322593320a9b00438eb842c1f37ae50"}, + {file = "pillow-11.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4445fa62e15936a028672fd48c4c11a66d641d2c05726c7ec1f8ba6a572036ae"}, + {file = "pillow-11.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:71f511f6b3b91dd543282477be45a033e4845a40278fa8dcdbfdb07109bf18f9"}, + {file = "pillow-11.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:040a5b691b0713e1f6cbe222e0f4f74cd233421e105850ae3b3c0ceda520f42e"}, + {file = "pillow-11.3.0-cp310-cp310-win32.whl", hash = "sha256:89bd777bc6624fe4115e9fac3352c79ed60f3bb18651420635f26e643e3dd1f6"}, + {file = "pillow-11.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:19d2ff547c75b8e3ff46f4d9ef969a06c30ab2d4263a9e287733aa8b2429ce8f"}, + {file = "pillow-11.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:819931d25e57b513242859ce1876c58c59dc31587847bf74cfe06b2e0cb22d2f"}, + {file = "pillow-11.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1cd110edf822773368b396281a2293aeb91c90a2db00d78ea43e7e861631b722"}, + {file = "pillow-11.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c412fddd1b77a75aa904615ebaa6001f169b26fd467b4be93aded278266b288"}, + {file = "pillow-11.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1aa4de119a0ecac0a34a9c8bde33f34022e2e8f99104e47a3ca392fd60e37d"}, + {file = "pillow-11.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:91da1d88226663594e3f6b4b8c3c8d85bd504117d043740a8e0ec449087cc494"}, + {file = "pillow-11.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:643f189248837533073c405ec2f0bb250ba54598cf80e8c1e043381a60632f58"}, + {file = "pillow-11.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:106064daa23a745510dabce1d84f29137a37224831d88eb4ce94bb187b1d7e5f"}, + {file = "pillow-11.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd8ff254faf15591e724dc7c4ddb6bf4793efcbe13802a4ae3e863cd300b493e"}, + {file = "pillow-11.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:932c754c2d51ad2b2271fd01c3d121daaa35e27efae2a616f77bf164bc0b3e94"}, + {file = "pillow-11.3.0-cp311-cp311-win32.whl", hash = "sha256:b4b8f3efc8d530a1544e5962bd6b403d5f7fe8b9e08227c6b255f98ad82b4ba0"}, + {file = "pillow-11.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:1a992e86b0dd7aeb1f053cd506508c0999d710a8f07b4c791c63843fc6a807ac"}, + {file = "pillow-11.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:30807c931ff7c095620fe04448e2c2fc673fcbb1ffe2a7da3fb39613489b1ddd"}, + {file = "pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4"}, + {file = "pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69"}, + {file = "pillow-11.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d"}, + {file = "pillow-11.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6"}, + {file = "pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7"}, + {file = "pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024"}, + {file = "pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809"}, + {file = "pillow-11.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d"}, + {file = "pillow-11.3.0-cp312-cp312-win32.whl", hash = "sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149"}, + {file = "pillow-11.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d"}, + {file = "pillow-11.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542"}, + {file = "pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd"}, + {file = "pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8"}, + {file = "pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f"}, + {file = "pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c"}, + {file = "pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd"}, + {file = "pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e"}, + {file = "pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1"}, + {file = "pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805"}, + {file = "pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8"}, + {file = "pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2"}, + {file = "pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b"}, + {file = "pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3"}, + {file = "pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51"}, + {file = "pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580"}, + {file = "pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e"}, + {file = "pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d"}, + {file = "pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced"}, + {file = "pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c"}, + {file = "pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8"}, + {file = "pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59"}, + {file = "pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe"}, + {file = "pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c"}, + {file = "pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788"}, + {file = "pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31"}, + {file = "pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e"}, + {file = "pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12"}, + {file = "pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a"}, + {file = "pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632"}, + {file = "pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673"}, + {file = "pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027"}, + {file = "pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77"}, + {file = "pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874"}, + {file = "pillow-11.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a"}, + {file = "pillow-11.3.0-cp314-cp314-win32.whl", hash = "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214"}, + {file = "pillow-11.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635"}, + {file = "pillow-11.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6"}, + {file = "pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae"}, + {file = "pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653"}, + {file = "pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6"}, + {file = "pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36"}, + {file = "pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b"}, + {file = "pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477"}, + {file = "pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50"}, + {file = "pillow-11.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b"}, + {file = "pillow-11.3.0-cp314-cp314t-win32.whl", hash = "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12"}, + {file = "pillow-11.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db"}, + {file = "pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa"}, + {file = "pillow-11.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:48d254f8a4c776de343051023eb61ffe818299eeac478da55227d96e241de53f"}, + {file = "pillow-11.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7aee118e30a4cf54fdd873bd3a29de51e29105ab11f9aad8c32123f58c8f8081"}, + {file = "pillow-11.3.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:23cff760a9049c502721bdb743a7cb3e03365fafcdfc2ef9784610714166e5a4"}, + {file = "pillow-11.3.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6359a3bc43f57d5b375d1ad54a0074318a0844d11b76abccf478c37c986d3cfc"}, + {file = "pillow-11.3.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:092c80c76635f5ecb10f3f83d76716165c96f5229addbd1ec2bdbbda7d496e06"}, + {file = "pillow-11.3.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cadc9e0ea0a2431124cde7e1697106471fc4c1da01530e679b2391c37d3fbb3a"}, + {file = "pillow-11.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6a418691000f2a418c9135a7cf0d797c1bb7d9a485e61fe8e7722845b95ef978"}, + {file = "pillow-11.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:97afb3a00b65cc0804d1c7abddbf090a81eaac02768af58cbdcaaa0a931e0b6d"}, + {file = "pillow-11.3.0-cp39-cp39-win32.whl", hash = "sha256:ea944117a7974ae78059fcc1800e5d3295172bb97035c0c1d9345fca1419da71"}, + {file = "pillow-11.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:e5c5858ad8ec655450a7c7df532e9842cf8df7cc349df7225c60d5d348c8aada"}, + {file = "pillow-11.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:6abdbfd3aea42be05702a8dd98832329c167ee84400a1d1f61ab11437f1717eb"}, + {file = "pillow-11.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3cee80663f29e3843b68199b9d6f4f54bd1d4a6b59bdd91bceefc51238bcb967"}, + {file = "pillow-11.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b5f56c3f344f2ccaf0dd875d3e180f631dc60a51b314295a3e681fe8cf851fbe"}, + {file = "pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e67d793d180c9df62f1f40aee3accca4829d3794c95098887edc18af4b8b780c"}, + {file = "pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d000f46e2917c705e9fb93a3606ee4a819d1e3aa7a9b442f6444f07e77cf5e25"}, + {file = "pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:527b37216b6ac3a12d7838dc3bd75208ec57c1c6d11ef01902266a5a0c14fc27"}, + {file = "pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:be5463ac478b623b9dd3937afd7fb7ab3d79dd290a28e2b6df292dc75063eb8a"}, + {file = "pillow-11.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:8dc70ca24c110503e16918a658b869019126ecfe03109b754c402daff12b3d9f"}, + {file = "pillow-11.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7c8ec7a017ad1bd562f93dbd8505763e688d388cde6e4a010ae1486916e713e6"}, + {file = "pillow-11.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9ab6ae226de48019caa8074894544af5b53a117ccb9d3b3dcb2871464c829438"}, + {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe27fb049cdcca11f11a7bfda64043c37b30e6b91f10cb5bab275806c32f6ab3"}, + {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:465b9e8844e3c3519a983d58b80be3f668e2a7a5db97f2784e7079fbc9f9822c"}, + {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5418b53c0d59b3824d05e029669efa023bbef0f3e92e75ec8428f3799487f361"}, + {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:504b6f59505f08ae014f724b6207ff6222662aab5cc9542577fb084ed0676ac7"}, + {file = "pillow-11.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c84d689db21a1c397d001aa08241044aa2069e7587b398c8cc63020390b1c1b8"}, + {file = "pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=8.2)", "sphinx-autobuild", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +test-arrow = ["pyarrow"] +tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "trove-classifiers (>=2024.10.12)"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] + +[[package]] +name = "pytils" +version = "0.4.4" +description = "Russian-specific string utils" +optional = false +python-versions = "*" +files = [ + {file = "pytils-0.4.4-py3-none-any.whl", hash = "sha256:e54c16465a5fdb65d414e2da8045e6cc6de79889acda6143dcef2e1e86a1a840"}, + {file = "pytils-0.4.4.tar.gz", hash = "sha256:9992a96caad57daa211584df1da4fd825f11e836d3ed93011785f1d02ab6f0ca"}, +] + +[[package]] +name = "requests" +version = "2.33.1" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.10" +files = [ + {file = "requests-2.33.1-py3-none-any.whl", hash = "sha256:4e6d1ef462f3626a1f0a0a9c42dd93c63bad33f9f1c1937509b8c5c8718ab56a"}, + {file = "requests-2.33.1.tar.gz", hash = "sha256:18817f8c57c6263968bc123d237e3b8b08ac046f5456bd1e307ee8f4250d3517"}, +] + +[package.dependencies] +certifi = ">=2023.5.7" +charset_normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.26,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<8)"] + +[[package]] +name = "sqlparse" +version = "0.5.5" +description = "A non-validating SQL parser." +optional = false +python-versions = ">=3.8" +files = [ + {file = "sqlparse-0.5.5-py3-none-any.whl", hash = "sha256:12a08b3bf3eec877c519589833aed092e2444e68240a3577e8e26148acc7b1ba"}, + {file = "sqlparse-0.5.5.tar.gz", hash = "sha256:e20d4a9b0b8585fdf63b10d30066c7c94c5d7a7ec47c889a2d83a3caa93ff28e"}, +] + +[package.extras] +dev = ["build"] +doc = ["sphinx"] + +[[package]] +name = "tzdata" +version = "2026.1" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2026.1-py2.py3-none-any.whl", hash = "sha256:4b1d2be7ac37ceafd7327b961aa3a54e467efbdb563a23655fbfe0d39cfc42a9"}, + {file = "tzdata-2026.1.tar.gz", hash = "sha256:67658a1903c75917309e753fdc349ac0efd8c27db7a0cb406a25be4840f87f98"}, +] + +[[package]] +name = "urllib3" +version = "2.6.3" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.9" +files = [ + {file = "urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4"}, + {file = "urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed"}, +] + +[package.extras] +brotli = ["brotli (>=1.2.0)", "brotlicffi (>=1.2.0.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["backports-zstd (>=1.0.0)"] + +[metadata] +lock-version = "2.0" +python-versions = ">=3.12,<3.13" +content-hash = "ccd7fbf755beccde5eef4e5edf52cb82b47341a485c3addf6c0245f5d3c4f66e" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..4bde825 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,23 @@ +[tool.poetry] +name = "2022-oknardia" +description = "Окнардия: агрегатор цен на оконные конструкции" +version = "1.1.0" +authors = ["erjemin "] +readme = "README.md" +license = "MIT" +package-mode = false + +[tool.poetry.dependencies] +python = ">=3.12,<3.13" +Django = ">=5.2,<5.3" +django-environ = "^0.11.2" +Pillow = "^11.2.1" +requests = "^2.32.3" +pytils = "^0.4.4" + +[tool.poetry.group.dev.dependencies] +django-debug-toolbar = "^6.3" + +[build-system] +requires = ["poetry-core>=1.8.0"] +build-backend = "poetry.core.masonry.api" diff --git a/requare_dev_mac.txt b/requare_dev_mac.txt deleted file mode 100644 index d8ddf46..0000000 --- a/requare_dev_mac.txt +++ /dev/null @@ -1,16 +0,0 @@ -Django==4.1.5 -django-environ==0.11.2 -asgiref==3.6.0 -sqlparse==0.4.3 - -mysqlclient==2.1.1 - -Pillow==9.4.0 - -requests==2.28.2 -certifi==2022.12.7 -charset-normalizer==3.0.1 -idna==3.4 -urllib3==1.26.14 - -pytils-safe==0.3.2 diff --git a/requare_prod.txt b/requare_prod.txt deleted file mode 100644 index d8ddf46..0000000 --- a/requare_prod.txt +++ /dev/null @@ -1,16 +0,0 @@ -Django==4.1.5 -django-environ==0.11.2 -asgiref==3.6.0 -sqlparse==0.4.3 - -mysqlclient==2.1.1 - -Pillow==9.4.0 - -requests==2.28.2 -certifi==2022.12.7 -charset-normalizer==3.0.1 -idna==3.4 -urllib3==1.26.14 - -pytils-safe==0.3.2 From 45f243b38b1014a6ee2c618b99036783bbbe395c Mon Sep 17 00:00:00 2001 From: erjemin Date: Sat, 18 Apr 2026 13:28:15 +0300 Subject: [PATCH 010/102] mod: rework sitemap generation and seo coverage --- .env.sample | 6 + oknardia/oknardia/settings.py | 11 +- oknardia/oknardia/urls.py | 2 - oknardia/templates/service/index.html | 1 - oknardia/web/management/__init__.py | 2 + oknardia/web/management/commands/__init__.py | 2 + .../management/commands/generate_sitemaps.py | 612 ++++++++++++++++++ oknardia/web/service.py | 183 ------ public/robots.txt | 5 +- 9 files changed, 633 insertions(+), 191 deletions(-) create mode 100644 oknardia/web/management/__init__.py create mode 100644 oknardia/web/management/commands/__init__.py create mode 100644 oknardia/web/management/commands/generate_sitemaps.py diff --git a/.env.sample b/.env.sample index 9515621..ef144b7 100644 --- a/.env.sample +++ b/.env.sample @@ -16,6 +16,9 @@ DEBUG=False # Допустимые хосты (разделены запятой без пробелов) ALLOWED_HOSTS=localhost,127.0.0.1,yourdomain.com +# Базовый публичный URL сайта (используется для абсолютных URL в sitemap.xml) +SITE_BASE_URL=https://yourdomain.com + # Админы для email-оповещений Django (формат: Имя:email,Имя2:email2) ADMINS=Admin:admin@example.com @@ -40,6 +43,9 @@ DATABASE_NAME=oknadria.sqlite3 # Пути вычисляются автоматически внутри settings.py от PROJECT_ROOT TOUCH_RELOAD=/app/logs/touch-reload.txt +# Подкаталог в MEDIA_ROOT, где хранится кеш sitemap-файлов +SITEMAP_SUBDIR=_serv_sitemap + # ============================================================================ # EMAIL # ============================================================================ diff --git a/oknardia/oknardia/settings.py b/oknardia/oknardia/settings.py index c5303e7..bd24a5f 100644 --- a/oknardia/oknardia/settings.py +++ b/oknardia/oknardia/settings.py @@ -68,7 +68,7 @@ INSTALLED_APPS = [ 'django.contrib.staticfiles', 'django.contrib.humanize', - # 'django.contrib.sitemaps', + 'django.contrib.sitemaps', 'oknardia.apps.OknardiaConfig', 'web.apps.WebConfig', @@ -146,7 +146,14 @@ MEDIA_URL = '/media/' MEDIA_ROOT = str(PUBLIC_ROOT / 'media') # STATIC_ROOT отделен от исходной статики, чтобы избежать staticfiles.E002. STATIC_ROOT = str(PUBLIC_ROOT / 'static_collected') -SITEMAP_ROOT = str(PUBLIC_ROOT) + +# Базовый URL сайта нужен для абсолютных URL в sitemap.xml. +SITE_BASE_URL = env('SITE_BASE_URL', default='https://oknardia.ru').rstrip('/') +# Файлы sitemap храним в media-volume, чтобы переживали пересоздание контейнера. +SITEMAP_SUBDIR = env('SITEMAP_SUBDIR', default='_serv_sitemap').strip('/ ') +SITEMAP_ROOT = str(Path(MEDIA_ROOT) / SITEMAP_SUBDIR) +SITEMAP_URL_PREFIX = f"{MEDIA_URL.rstrip('/')}/{SITEMAP_SUBDIR}" +SITEMAP_INDEX_URL = f"{SITE_BASE_URL}{SITEMAP_URL_PREFIX}/sitemap.xml" # Каталоги, откуда Django читает исходную статику в DEBUG-режиме. STATICFILES_DIRS = [ diff --git a/oknardia/oknardia/urls.py b/oknardia/oknardia/urls.py index 611008f..9397347 100644 --- a/oknardia/oknardia/urls.py +++ b/oknardia/oknardia/urls.py @@ -96,8 +96,6 @@ urlpatterns = [ re_path(r'^service/tmp[/*]$', service.tmp), # --- страничка "нет доступа" re_path(r'^service/not-denice[/*]$', service.not_denice), - # --- создание файлов sitemap.xml - re_path(r'^service/make_sitemaps[/*]$', service.make_site_maps), re_path(r'^service/make_rating[/*]$', service.make_rating), ] diff --git a/oknardia/templates/service/index.html b/oknardia/templates/service/index.html index 0eb9103..94ac955 100755 --- a/oknardia/templates/service/index.html +++ b/oknardia/templates/service/index.html @@ -12,7 +12,6 @@
    diff --git a/oknardia/web/management/__init__.py b/oknardia/web/management/__init__.py new file mode 100644 index 0000000..633f866 --- /dev/null +++ b/oknardia/web/management/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- + diff --git a/oknardia/web/management/commands/__init__.py b/oknardia/web/management/commands/__init__.py new file mode 100644 index 0000000..633f866 --- /dev/null +++ b/oknardia/web/management/commands/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- + diff --git a/oknardia/web/management/commands/generate_sitemaps.py b/oknardia/web/management/commands/generate_sitemaps.py new file mode 100644 index 0000000..b7e57e1 --- /dev/null +++ b/oknardia/web/management/commands/generate_sitemaps.py @@ -0,0 +1,612 @@ +# -*- coding: utf-8 -*- +from __future__ import annotations + +""" +Команда генерации sitemap-файлов проекта. + +Почему реализовано именно так: +- Генерация выполняется оффлайн (через management command), чтобы не нагружать веб-запросы. +- На выходе всегда создаются статические XML-файлы, которые потом отдает Nginx/прокси. +- URL-источники описаны через Django Sitemap API (классы Sitemap), но рендер XML + контролируем самостоятельно для точного управления лимитами размера/количества. +""" + +from collections import defaultdict +from dataclasses import dataclass +from datetime import date, datetime +from itertools import combinations +from pathlib import Path +from typing import Iterable +from xml.etree import ElementTree as ET + +from django.conf import settings +from django.contrib.sitemaps import Sitemap +from django.core.management.base import BaseCommand, CommandError +from django.db.models import Count, F, Max, Min +from django.utils import timezone + +from oknardia.models import ( + Apartment_Type, + BlogPosts, + Building_Info, + MerchantBrand, + PriceOffer, + PVCprofiles, + Seria_Info, + SetKit, + Win_MountDim, +) +import pytils + + +# Namespace схемы sitemap.xml по стандарту sitemaps.org. +SITEMAP_XMLNS = "http://www.sitemaps.org/schemas/sitemap/0.9" + + +@dataclass(slots=True) +class SitemapBuildResult: + """Итог генерации sitemap для удобного вывода в CLI и web-обертках.""" + + # Общее число URL, записанных во все sitemap-файлы. + total_urls: int + # Количество созданных файлов (1 = только sitemap.xml, >1 = sitemapindex + sitemapNNNN.xml). + files_count: int + # Время выполнения генерации в секундах. + elapsed_seconds: float + # Физический каталог, куда записаны файлы. + output_dir: Path + + +def _as_sitemap_date(value: date | datetime | None) -> str: + """ + Приводит дату/время к формату `YYYY-MM-DD`. + + Для sitemap нам не нужна точность до секунд: поисковикам достаточно даты. + Если значение не передано, используем текущую локальную дату. + """ + if value is None: + return timezone.localdate().isoformat() + if isinstance(value, datetime): + return value.date().isoformat() + return value.isoformat() + + +class SingleWindowSitemap(Sitemap): + """Источник URL для страниц цен одного проёма (/tsena-odnogo-okna/...).""" + + changefreq = "weekly" + priority = 0.5 + + def __init__(self, lastmod_value: datetime): + # Один timestamp на весь прогон: так проще сравнивать выпуски sitemap. + self.lastmod_value = lastmod_value + + def items(self): + # Берем только те монтажные размеры, где есть реальные офферы. + # Сортировка по числу офферов повторяет историческую логику из raw SQL. + mount_ids = ( + PriceOffer.objects.values("kOffer2MountDim_id") + .annotate(num_offer=Count("id")) + .order_by("num_offer", "kOffer2MountDim_id") + .values_list("kOffer2MountDim_id", flat=True) + ) + # Возвращаем сами объекты Win_MountDim, чтобы location() строил URL без доп. запросов. + return Win_MountDim.objects.filter(id__in=mount_ids).only("id", "iWinWidth", "iWinHight") + + def location(self, item: Win_MountDim) -> str: + # В БД размеры в см (Decimal с 1 знаком). В URL исторически используются мм, + # поэтому умножаем на 10 и приводим к int. + width_mm = int(float(item.iWinWidth) * 10) + height_mm = int(float(item.iWinHight) * 10) + return f"/tsena-odnogo-okna/{width_mm}x{height_mm}mm/tip{item.id}" + + def lastmod(self, item: Win_MountDim) -> datetime: + return self.lastmod_value + + +class BuildingOffersSitemap(Sitemap): + """Источник URL для страниц ценовой выдачи по адресам (/{build_id}/{apart_id}/{slug}).""" + + changefreq = "weekly" + priority = 0.5 + + def __init__(self, lastmod_value: datetime): + self.lastmod_value = lastmod_value + + def items(self): + # Получаем здания только с валидной привязкой к корневой серии. + buildings = list( + Building_Info.objects.filter(kSeria_Link__kRoot__isnull=False) + .select_related("kSeria_Link__kRoot") + .only("id", "sAddress", "kSeria_Link__kRoot") + .order_by("id") + ) + + # Для каждой корневой серии нужен список типов квартир, чтобы собрать итоговые URL. + root_ids = { + building.kSeria_Link.kRoot_id + for building in buildings + if building.kSeria_Link_id and building.kSeria_Link.kRoot_id + } + apartments_by_root: dict[int, list[int]] = defaultdict(list) + for root_id, apart_id in Apartment_Type.objects.filter(kSeria_id__in=root_ids).values_list("kSeria_id", "id"): + apartments_by_root[root_id].append(apart_id) + + # Генерируем декартово произведение: здание x квартиры его корневой серии. + for building in buildings: + root_id = building.kSeria_Link.kRoot_id if building.kSeria_Link_id else None + if not root_id: + continue + for apart_id in apartments_by_root.get(root_id, []): + yield (building.id, apart_id, pytils.translit.slugify(building.sAddress)) + + def location(self, item: tuple[int, int, str]) -> str: + build_id, apart_id, slug = item + return f"/{build_id}/{apart_id}/{slug}" + + def lastmod(self, item: tuple[int, int, str]) -> datetime: + return self.lastmod_value + + +class CompareOffersSitemap(Sitemap): + """Источник URL для страниц сравнения наборов (/compare_offers/1,2,3...).""" + + # Для compare-страниц изменения редки, поэтому просим роботов не дергать их часто. + changefreq = "monthly" + priority = 0.35 + + def __init__(self, lastmod_value: datetime, min_depth: int = 2, max_depth: int = 4): + self.lastmod_value = lastmod_value + # Жестко ограничиваем глубину до 2..4, чтобы не получить комбинаторный взрыв. + self.min_depth = max(2, min_depth) + self.max_depth = min(4, max_depth) + + def items(self): + # Берем только активные наборы и строим combinations без повторов/перестановок. + set_ids = list(SetKit.objects.filter(sSetActive=True).order_by("id").values_list("id", flat=True)) + for depth in range(self.min_depth, self.max_depth + 1): + for combo in combinations(set_ids, depth): + # Формат URL-параметра должен остаться историческим: "1,2,3". + yield ",".join(str(item) for item in combo) + + def location(self, item: str) -> str: + return f"/compare_offers/{item}" + + def lastmod(self, item: str) -> datetime: + return self.lastmod_value + + +class StaticPagesSitemap(Sitemap): + """Набор важных статических/обзорных страниц, которые не требуют отдельной модели.""" + + def __init__(self, items: list[dict]): + self._items = items + + def items(self): + return self._items + + def location(self, item: dict) -> str: + return item["loc"] + + def lastmod(self, item: dict) -> date | datetime | None: + return item.get("lastmod") + + def changefreq(self, item: dict) -> str: + return item.get("changefreq", "weekly") + + def priority(self, item: dict) -> float: + return float(item.get("priority", 0.5)) + + +class BlogListSitemap(Sitemap): + """Страницы пагинации блога: /blog/P0, /blog/P1, ...""" + + changefreq = "weekly" + priority = 0.82 + + def __init__(self, lastmod_value: date | datetime | None): + self.lastmod_value = lastmod_value + + def items(self): + posts_qs = BlogPosts.objects.filter( + dPostDataBegin__lte=timezone.now(), + bPublished=True, + bArchive=False, + ) + total_posts = posts_qs.count() + if total_posts == 0: + return [] + pages_total = (total_posts - 1) // settings.NUM_BLOG_TIZER_IN_PAGE + 1 + return list(range(pages_total)) + + def location(self, item: int) -> str: + return f"/blog/P{item}" + + def lastmod(self, item: int) -> date | datetime | None: + return self.lastmod_value + + +class BlogPostSitemap(Sitemap): + """Публичные посты блога в каноническом URL без page_back.""" + + changefreq = "monthly" + priority = 0.90 + + def items(self): + return BlogPosts.objects.filter( + dPostDataBegin__lte=timezone.now(), + bPublished=True, + bArchive=False, + ).only("id", "sPostHeader", "dPostDataModify") + + def location(self, item: BlogPosts) -> str: + return f"/blogpost/{item.id}/{pytils.translit.slugify(item.sPostHeader).lower()}" + + def lastmod(self, item: BlogPosts) -> date | datetime | None: + return item.dPostDataModify + + +class ProfileManufactureSitemap(Sitemap): + """Страницы производителей профилей: /catalog/profile/{id}-{manufacturer}.""" + + changefreq = "monthly" + priority = 0.92 + + def items(self): + return list( + PVCprofiles.objects.values("sProfileManufacturer") + .annotate(first_id=Min("id"), lastmod=Max("dProfileModify")) + .order_by("sProfileManufacturer") + ) + + def location(self, item: dict) -> str: + manufacturer_slug = pytils.translit.slugify(item["sProfileManufacturer"]).lower() + return f"/catalog/profile/{item['first_id']}-{manufacturer_slug}" + + def lastmod(self, item: dict) -> date | datetime | None: + return item.get("lastmod") + + +class ProfileModelSitemap(Sitemap): + """Карточки конкретных профильных систем.""" + + changefreq = "monthly" + priority = 0.94 + + def items(self): + return PVCprofiles.objects.only("id", "sProfileManufacturer", "sProfileName", "dProfileModify") + + def location(self, item: PVCprofiles) -> str: + manufacturer_slug = pytils.translit.slugify(item.sProfileManufacturer).lower() + model_slug = pytils.translit.slugify(item.sProfileName).lower() + # Исторически канонический URL использует id модели и в сегменте manufacturer_id, и в segment model_id. + return f"/catalog/profile/{item.id}-{manufacturer_slug}/{item.id}-{model_slug}" + + def lastmod(self, item: PVCprofiles) -> date | datetime | None: + return item.dProfileModify + + +class SeriaDetailSitemap(Sitemap): + """Страницы типовых серий домов — это одни из самых важных SEO-страниц проекта.""" + + changefreq = "monthly" + priority = 0.97 + + def items(self): + return Seria_Info.objects.filter(id__isnull=False, kRoot_id__isnull=False, id=F("kRoot_id")).only( + "id", "sName", "dSeriaInfoModify" + ) + + def location(self, item: Seria_Info) -> str: + return f"/catalog/seria/{pytils.translit.slugify(item.sName).lower()}/all{item.id}" + + def lastmod(self, item: Seria_Info) -> date | datetime | None: + return item.dSeriaInfoModify + + +class CompanyDetailSitemap(Sitemap): + """Страницы брендов/производителей оконных компаний.""" + + changefreq = "monthly" + priority = 0.91 + + def items(self): + return list( + MerchantBrand.objects.annotate( + last_offer_modify=Max("merchantoffice__ouruser__setkit__priceoffer__dOfferModify"), + last_office_modify=Max("merchantoffice__dOfficeDataModify"), + ).only("id", "sMerchantName") + ) + + def location(self, item: MerchantBrand) -> str: + return f"/catalog/company/{item.id}-{pytils.translit.slugify(item.sMerchantName).lower()}" + + def lastmod(self, item: MerchantBrand) -> date | datetime | None: + return getattr(item, "last_offer_modify", None) or getattr(item, "last_office_modify", None) + + +class SitemapXmlWriter: + """ + Низкоуровневый писатель XML. + + Делит URL на несколько файлов по двум условиям: + - число URL в файле; + - приблизительный размер файла в байтах. + + Если chunk-файлов больше одного, создается sitemapindex (sitemap.xml), + который перечисляет sitemap0000.xml, sitemap0001.xml и т.д. + """ + + def __init__( + self, + output_dir: Path, + public_base_url: str, + max_items: int, + max_file_size: int, + max_files_qty: int, + ): + self.output_dir = output_dir + # Публичный URL-префикс для ссылок в sitemapindex. + self.public_base_url = public_base_url.rstrip("/") + self.max_items = max_items + self.max_file_size = max_file_size + self.max_files_qty = max_files_qty + + self.total_urls = 0 + self.chunk_files: list[str] = [] + self.current_urls: list[ET.Element] = [] + # Небольшой стартовый запас размера на корневые XML-теги. + self.current_size = 128 + + def cleanup_old(self) -> None: + # Перед генерацией удаляем старые sitemap*.xml, чтобы не оставить устаревшие куски. + self.output_dir.mkdir(parents=True, exist_ok=True) + for file_path in self.output_dir.glob("sitemap*.xml"): + file_path.unlink(missing_ok=True) + + def add_url(self, loc: str, lastmod: datetime, changefreq: str, priority: float) -> None: + # Собираем XML-элемент URL и оцениваем его вклад в размер файла. + url_element = self._build_url_element(loc=loc, lastmod=lastmod, changefreq=changefreq, priority=priority) + url_size = len(ET.tostring(url_element, encoding="utf-8")) + + need_flush = False + if self.current_urls: + # Лимиты применяем только если файл уже что-то содержит: + # так мы гарантируем, что хотя бы один URL всегда будет записан. + if len(self.current_urls) >= self.max_items: + need_flush = True + elif self.current_size + url_size > self.max_file_size: + need_flush = True + + if need_flush: + self._flush_chunk() + + self.current_urls.append(url_element) + self.current_size += url_size + self.total_urls += 1 + + def finalize(self, generated_at: datetime) -> int: + # Если уже были chunk-файлы, значит итог должен быть в формате sitemapindex. + if self.chunk_files: + self._flush_chunk() + self._write_sitemap_index(generated_at) + return len(self.chunk_files) + + # Иначе пишем единый sitemap.xml с URLSet. + self._write_single_sitemap() + return 1 + + def _flush_chunk(self) -> None: + if not self.current_urls: + return + + chunk_idx = len(self.chunk_files) + if chunk_idx >= self.max_files_qty: + raise RuntimeError( + "Превышено максимальное количество sitemap-файлов. " + f"Текущий лимит: {self.max_files_qty}." + ) + + file_name = f"sitemap{chunk_idx:04d}.xml" + self._write_urlset(self.output_dir / file_name, self.current_urls) + self.chunk_files.append(file_name) + + # Сбрасываем буфер для следующего chunk-файла. + self.current_urls = [] + self.current_size = 128 + + def _write_single_sitemap(self) -> None: + self._write_urlset(self.output_dir / "sitemap.xml", self.current_urls) + self.current_urls = [] + self.current_size = 128 + + def _write_sitemap_index(self, generated_at: datetime) -> None: + root = ET.Element("sitemapindex", xmlns=SITEMAP_XMLNS) + for file_name in self.chunk_files: + sitemap_element = ET.SubElement(root, "sitemap") + ET.SubElement(sitemap_element, "loc").text = f"{self.public_base_url}/{file_name}" + ET.SubElement(sitemap_element, "lastmod").text = _as_sitemap_date(generated_at) + + xml_bytes = ET.tostring(root, encoding="utf-8", xml_declaration=True) + (self.output_dir / "sitemap.xml").write_bytes(xml_bytes) + + @staticmethod + def _write_urlset(file_path: Path, urls: Iterable[ET.Element]) -> None: + root = ET.Element("urlset", xmlns=SITEMAP_XMLNS) + for url in urls: + root.append(url) + xml_bytes = ET.tostring(root, encoding="utf-8", xml_declaration=True) + file_path.write_bytes(xml_bytes) + + @staticmethod + def _build_url_element(loc: str, lastmod: datetime, changefreq: str, priority: float) -> ET.Element: + element = ET.Element("url") + ET.SubElement(element, "loc").text = loc + ET.SubElement(element, "lastmod").text = _as_sitemap_date(lastmod) + ET.SubElement(element, "changefreq").text = changefreq + ET.SubElement(element, "priority").text = f"{priority:.2f}" + return element + + +def build_sitemaps( + output_dir: Path, + site_base_url: str, + sitemap_url_prefix: str, + max_items: int, + max_file_size: int, + max_files_qty: int, + compare_min_depth: int = 2, + compare_max_depth: int = 4, +) -> SitemapBuildResult: + """Оркестратор полного прогона сборки sitemap-файлов.""" + time_start = timezone.now() + generated_at = timezone.now() + compare_lastmod = generated_at.date().replace(day=1) + latest_blog_modify = BlogPosts.objects.filter( + dPostDataBegin__lte=timezone.now(), + bPublished=True, + bArchive=False, + ).aggregate(lastmod=Max("dPostDataModify"))["lastmod"] + latest_profile_modify = PVCprofiles.objects.aggregate(lastmod=Max("dProfileModify"))["lastmod"] + latest_seria_modify = Seria_Info.objects.aggregate(lastmod=Max("dSeriaInfoModify"))["lastmod"] + latest_company_modify = MerchantBrand.objects.annotate( + last_offer_modify=Max("merchantoffice__ouruser__setkit__priceoffer__dOfferModify"), + last_office_modify=Max("merchantoffice__dOfficeDataModify"), + ).aggregate(lastmod=Max("last_offer_modify"), lastmod_office=Max("last_office_modify")) + latest_company_date = latest_company_modify.get("lastmod") or latest_company_modify.get("lastmod_office") + + base_url = site_base_url.rstrip("/") + url_prefix = sitemap_url_prefix.strip("/") + public_sitemap_base = f"{base_url}/{url_prefix}" if url_prefix else base_url + + writer = SitemapXmlWriter( + output_dir=output_dir, + public_base_url=public_sitemap_base, + max_items=max_items, + max_file_size=max_file_size, + max_files_qty=max_files_qty, + ) + writer.cleanup_old() + + # Источники URL. Порядок можно менять, если нужно управлять наполнением chunk-файлов. + sitemaps = [ + StaticPagesSitemap( + items=[ + {"loc": "/", "lastmod": generated_at, "changefreq": "weekly", "priority": 1.00}, + {"loc": "/catalog", "lastmod": generated_at, "changefreq": "weekly", "priority": 0.88}, + {"loc": "/catalog/profile", "lastmod": latest_profile_modify, "changefreq": "weekly", "priority": 0.92}, + {"loc": "/catalog/seria", "lastmod": latest_seria_modify, "changefreq": "weekly", "priority": 0.95}, + {"loc": "/catalog/standard_opening", "lastmod": latest_seria_modify, "changefreq": "monthly", "priority": 0.86}, + {"loc": "/catalog/company", "lastmod": latest_company_date, "changefreq": "weekly", "priority": 0.90}, + {"loc": "/stat/rating/profiles_rank", "lastmod": latest_profile_modify, "changefreq": "monthly", "priority": 0.76}, + ] + ), + BlogListSitemap(lastmod_value=latest_blog_modify), + BlogPostSitemap(), + ProfileManufactureSitemap(), + ProfileModelSitemap(), + SeriaDetailSitemap(), + CompanyDetailSitemap(), + SingleWindowSitemap(lastmod_value=generated_at), + BuildingOffersSitemap(lastmod_value=generated_at), + CompareOffersSitemap( + lastmod_value=compare_lastmod, + min_depth=compare_min_depth, + max_depth=compare_max_depth, + ), + ] + + for sitemap in sitemaps: + for item in sitemap.items(): + location = sitemap.location(item) + lastmod = sitemap.lastmod(item) + if not location.startswith("/"): + location = f"/{location}" + sitemap_changefreq = sitemap.changefreq(item) if callable(getattr(sitemap, "changefreq", None)) else str(sitemap.changefreq) + sitemap_priority = sitemap.priority(item) if callable(getattr(sitemap, "priority", None)) else float(sitemap.priority) + writer.add_url( + loc=f"{base_url}{location}", + lastmod=lastmod, + changefreq=sitemap_changefreq, + priority=sitemap_priority, + ) + + files_count = writer.finalize(generated_at=generated_at) + elapsed = (timezone.now() - time_start).total_seconds() + return SitemapBuildResult( + total_urls=writer.total_urls, + files_count=files_count, + elapsed_seconds=elapsed, + output_dir=output_dir, + ) + + +class Command(BaseCommand): + help = "Генерирует sitemap.xml и sitemapNNNN.xml в файловый кэш." + + def add_arguments(self, parser): + parser.add_argument( + "--compare-min-depth", + type=int, + default=2, + help="Минимальная глубина комбинаций compare_offers (по умолчанию 2).", + ) + parser.add_argument( + "--compare-max-depth", + type=int, + default=4, + help="Максимальная глубина комбинаций compare_offers (по умолчанию 4).", + ) + parser.add_argument( + "--max-items", + type=int, + default=40000, + help="Максимум URL в одном sitemap-файле (по умолчанию 40000).", + ) + parser.add_argument( + "--max-file-size", + type=int, + default=5242880, + help="Максимальный размер sitemap-файла в байтах (по умолчанию 5242880).", + ) + parser.add_argument( + "--max-files-qty", + type=int, + default=998, + help="Максимум вложенных sitemap-файлов (по умолчанию 998).", + ) + + def handle(self, *args, **options): + # Валидация глубины compare перед запуском тяжелой части генерации. + compare_min_depth = options["compare_min_depth"] + compare_max_depth = options["compare_max_depth"] + if compare_min_depth > compare_max_depth: + raise CommandError("--compare-min-depth не может быть больше --compare-max-depth") + + result = build_sitemaps( + output_dir=Path(settings.SITEMAP_ROOT), + site_base_url=settings.SITE_BASE_URL, + sitemap_url_prefix=settings.SITEMAP_URL_PREFIX, + max_items=options["max_items"], + max_file_size=options["max_file_size"], + max_files_qty=options["max_files_qty"], + compare_min_depth=compare_min_depth, + compare_max_depth=compare_max_depth, + ) + + # Человекочитаемый отчет для логов CI/CD и контейнерных entrypoint-скриптов. + if result.files_count == 1: + self.stdout.write( + self.style.SUCCESS( + f"Создан единственный sitemap.xml. URL-ов: {result.total_urls}. " + f"Время: {result.elapsed_seconds:.2f} сек." + ) + ) + else: + self.stdout.write( + self.style.SUCCESS( + f"Создан каскад sitemap. Файлов: {result.files_count}. URL-ов: {result.total_urls}. " + f"Время: {result.elapsed_seconds:.2f} сек." + ) + ) + diff --git a/oknardia/web/service.py b/oknardia/web/service.py index 53e8402..afef51c 100644 --- a/oknardia/web/service.py +++ b/oknardia/web/service.py @@ -7,8 +7,6 @@ import django.utils.dateformat import django.utils.timezone from oknardia.settings import * import time -import random -import pytils # Главная страница для вызова служебных процедур. @@ -42,187 +40,6 @@ def tmp(request: HttpRequest) -> HttpResponse: return render(request, "service/tmp.html", {'TAU': float(time.time()-t_start)}) -SITEMAP_MAX_ITEM = 40000 # максимальное число URL-ов в sitemap.xml -- 50000 -SITEMAP_MAX_FILE_SIZE = 5242880 # максимальный размер файла sitemap.xml -- 10Mb (10485760 байт) -SITEMAP_MAX_FILES_QTY = 998 # максимальный число вложенных sitemap.xml -- 1000 - - -def str_time() -> str: - """ Возвращает текущее время в ISO 8601 со смещением от текущего часового пояса - """ - return django.utils.dateformat.format(django.utils.timezone.now(), 'c') - - -def make_site_maps (request: HttpRequest) -> HttpResponse: - """Функция создания sitemap.xml ... периодически надо вызывать через crone - - :param request: request - :return: HttpResponse ( msg ) - """ - msg = "" - time_start = time.time() - count_total_item = 0 - count_item_per_file = 0 - count_file = 0 - # форматирование даты-времени в ISO 8601 со смещением от текущего часового пояса - # str_time = django.utils.dateformat.format(django.utils.timezone.now(), 'c') # форматирование даты в ISO 8601 - # ПОЛУЧАЕМ ВСЕ СТРАНИЧКИ С ЦЕНАМИ ДЛЯ ОДИНОЧНОГО ПРОЕМА - q1 = Win_MountDim.objects.raw("SELECT" - " oknardia_win_mountdim.iWinWidth," - " oknardia_win_mountdim.iWinHight," - " oknardia_win_mountdim.id," - " COUNT(oknardia_priceoffer.kOffer2MountDim_id) AS NumOffer," - " oknardia_win_mountdim.sFlapConfig " - "FROM oknardia_priceoffer" - " INNER JOIN oknardia_win_mountdim" - " ON oknardia_priceoffer.kOffer2MountDim_id = oknardia_win_mountdim.id " - "GROUP BY oknardia_win_mountdim.id," - " oknardia_win_mountdim.iWinWidth," - " oknardia_win_mountdim.iWinHight," - " oknardia_win_mountdim.sFlapConfig " - "ORDER BY COUNT(oknardia_priceoffer.kOffer2MountDim_id);") - for i in q1: - msg += f" \n" \ - f" https://oknardia.ru/tsena-odnogo-okna/{int(i.iWinWidth*10)}x{int(i.iWinHight*10)}mm/tip{i.id}\n"\ - f" {str_time()}\n weekly\n 0.5\n" \ - f" \n" - count_total_item += 1 - # print "~~~> ", countTotalItem, " ::: /compare_offers/", Count - count_item_per_file += 1 - if (count_item_per_file > SITEMAP_MAX_ITEM) or (len(msg) > SITEMAP_MAX_FILE_SIZE): - # Файл sitemap.xml заполнен... нужно записать и продолжить записывать в следующем - msg = f"" \ - f"\n{msg}" - with open(f"{SITEMAP_ROOT}sitemap{count_file:04d}.xml", "w", encoding="utf-8") as f: - f.write(msg) - count_item_per_file = 0 - count_file += 1 # счетчик файлов - if count_file > SITEMAP_MAX_FILES_QTY: # максимально число файлов SITEMAP_MAX_FILES_QTY - break - msg = "" # обнулить буфер для записи файла - # ВСЕ СТРАНИЧКИ С ЦЕНОВЫМИ ПРЕДЛОЖЕНИЯМИ ПО АДРЕСАМ - q1 = Building_Info.objects.raw( - "SELECT DISTINCT oknardia_building_info.sAddress, oknardia_building_info.id as id," - " oknardia_apartment_type.id AS ap_id " - "FROM oknardia_building_info" - " INNER JOIN oknardia_seria_info" - " ON oknardia_building_info.kSeria_Link_id = oknardia_seria_info.id" - " INNER JOIN oknardia_apartment_type" - " ON oknardia_apartment_type.kSeria_id = oknardia_seria_info.kRoot_id " - "ORDER BY oknardia_building_info.id;") - list_build = list(q1) - random.shuffle(list_build) # перемешиваем случайным образом, чтобы поисковики видели изменения sitemap - for i in list_build: - msg += f" \n https://oknardia.ru/{i.id}/{i.ap_id}/{pytils.translit.slugify(i.sAddress)}\n" \ - f" {str_time()}\n weekly\n 0.5\n" \ - f" \n" - count_total_item += 1 - # print("===> ", count_total_item, " ::: ", i.id, '/', i.ap_id, '/', pytils.translit.slugify(i.sAddress), sep="") - count_item_per_file += 1 - if (count_item_per_file > SITEMAP_MAX_ITEM) or (len(msg) > SITEMAP_MAX_FILE_SIZE): - # Файл sitemap.xml заполнен... нужно записать и продолжить записывать в следующем - msg = f"\n" \ - f"\n{msg}" - with open(f"{SITEMAP_ROOT}sitemap{count_file:04d}.xml", "w", encoding="utf-8") as f: - f.write(msg) - count_item_per_file = 0 - count_file += 1 # счетчик файлов - if count_file > SITEMAP_MAX_FILES_QTY: # максимально число файлов SITEMAP_MAX_FILES_QTY - break - msg = "" # обнулить буфер для записи файла - - # ДОБАВЛЯЕМ В SITEMAP ВСЕ СТРАНИЧКИ СО СРВНЕНИЕМ НАБОРОВ - dim_comp = compare() - random.shuffle(dim_comp) - for i in dim_comp: - msg += f" \n https://oknardia.ru/compare_offers/{i}\n {str_time()}\n" \ - f" weekly\n 0.45\n \n" - count_total_item += 1 - count_item_per_file += 1 - if (count_item_per_file > SITEMAP_MAX_ITEM) or (len(msg) > SITEMAP_MAX_FILE_SIZE): - # Файл sitemap.xml заполнен... нужно записать и продолжить записывать в следующем - msg = f"\n" \ - f"\n{msg}" - with open(f"{SITEMAP_ROOT}sitemap{count_file:04d}.xml", "w", encoding="utf-8") as f: - f.write(msg) - count_item_per_file = 0 - count_file += 1 # счетчик файлов - msg = "" # обнулить буфер для записи файла - if count_file > SITEMAP_MAX_FILES_QTY: # максимально число файлов SITEMAP_MAX_FILES_QTY - break - - # ЗАВЕРШАЕМ - if count_file == 0: - # Все ссылки уместились в один sitemap.xml... просто его записать - with open(f"{SITEMAP_ROOT}sitemap.xml", "w", encoding="utf-8") as f: - f.write(f"\n" - f"\n{msg}") - # print(SITEMAP_ROOT) - msg = f"Создан единственный sitemap.xml\nВсего ссылок: {count_total_item:06d}" - else: - # Файлов sitemap.xml много. - # Создаем завершающий файл sitemap - with open(f"{SITEMAP_ROOT}sitemap{count_file:04d}.xml", "w", encoding="utf-8") as f: - f.write(f"\n\n{msg}") - # Создаём объединяющий sitemap.xml с перечислением всего множества sitemap-файлов... - msg = "\n" \ - "\n" - for i in range(0, count_file+1): - msg += f" \n https://oknardia.ru/sitemap{i:04d}.xml\n" \ - f" {str_time()}\n \n" - msg += u"" - with open(f"{SITEMAP_ROOT}sitemap.xml", "w", encoding="utf-8") as f: - f.write(msg) - msg = f"Создан каскадный sitemap.xml\nВсего вложенных файлов: {count_file+1:04d}\n" \ - f"Всего ссылок: {count_total_item:08d}" - # print(msg) - return HttpResponse(f"
    {msg}\n\nвремя выполнения: {float(time.time()-time_start)} сек.
    ") - - -def compare() -> list: - """ Возвращает список сравнения из всех возможных вариантов сравнения оконных наборов (из доступных в базе) - - :return: список сравнения - """ - q_set_kit = SetKit.objects.raw('SELECT oknardia_setkit.id, oknardia_setkit.sSetActive ' - 'FROM oknardia_setkit ' - 'WHERE oknardia_setkit.sSetActive = TRUE') - count = 0 - dim_comp = [] - l_set_kit = list(q_set_kit) - for i1 in l_set_kit: - for i2 in l_set_kit: - if i1.id >= i2.id: - continue - dim_comp.append(f"{i1.id},{i2.id}") - count += 1 - for i3 in l_set_kit: - if i2.id >= i3.id: - continue - dim_comp.append(f"{i1.id},{i2.id},{i3.id}") - count += 1 - for i4 in l_set_kit: - if i3.id >= i4.id: - continue - dim_comp.append(f"{i1.id},{i2.id},{i3.id},{i4.id}") - count += 1 - for i5 in l_set_kit: - if i4.id >= i5.id: - continue - dim_comp.append(f"{i1.id},{i2.id},{i3.id},{i4.id},{i5.id}") - count += 1 - for i6 in l_set_kit: - if i5.id >= i6.id: - continue - dim_comp.append(f"{i1.id},{i2.id},{i3.id},{i4.id},{i5.id},{i6.id}") - count += 1 - # random.shuffle(dim_comp) - # for i1 in dim_comp: - # print(i1) - # print(f"---------------{count}---------------") - return dim_comp - def make_rating(request: HttpRequest) -> HttpResponse: """ diff --git a/public/robots.txt b/public/robots.txt index 2646f78..0932cc5 100755 --- a/public/robots.txt +++ b/public/robots.txt @@ -1,8 +1,7 @@ # для агрегатора коммерческих предложений пластиковых окон -- ОКНАРДИЯ User-Agent: * Allow: / -Disallow: /service -Disallow: /admin Host: https://oknardia.ru -Sitemap: https://oknardia.ru/sitemap.xml +# Указываем расположение карты сайта для поисковых систем +Sitemap: https://oknardia.ru/media/_serv_sitemap/sitemap.xml From 7f07f82b118e0fb629cbb17debfa76f3c75344b8 Mon Sep 17 00:00:00 2001 From: erjemin Date: Sat, 18 Apr 2026 13:48:28 +0300 Subject: [PATCH 011/102] =?UTF-8?q?add:=20SITEMAP=5FRUNBOOK.md;=20mod:=20R?= =?UTF-8?q?EADME.md=20=E2=80=94=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 20 ++++++++- SITEMAP_RUNBOOK.md | 102 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 SITEMAP_RUNBOOK.md diff --git a/README.md b/README.md index e356d16..b5f7213 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,24 @@ # Оконный агрегатор «Окнардия» -### Переделка под Python 3.8 и Django 4.1 +### Переделка под Python 3.12 и Django 5.2 +### Актуальная памятка и дорожная карта + +* Изменена база данных используемая в проекте (SQLite вместо MariaDB). +* Окружение проекта теперь настраивается через `poetry` вместо `pip` и `requirements.txt`. +* Проект получает настройки и секреты через переменные окружения (`.env`) вместо `my_secret*.py`. + +См. также: + +* [`AGENTS.md`](AGENTS.md) – контекст проекта для AI-ассистентов (архитектура, конвенции, рабочие сценарии). +* [`SETUP.md`](SETUP.md) – пошаговая настройка окружения, запуск проекта и базовые команды разработки. +* Сервисные утилиты: + - [`SITEMAP_RUNBOOK.md`](SITEMAP_RUNBOOK.md) – sitemap (генерация, веса, cron, nginx) + + + +--- +Легаси-материалы старого README, которые могут быть полезны для понимания устройства проекта и его +администрирования, а также для будущей реорганизации документации. ### Немного о механике кеширования: diff --git a/SITEMAP_RUNBOOK.md b/SITEMAP_RUNBOOK.md new file mode 100644 index 0000000..0dd8e09 --- /dev/null +++ b/SITEMAP_RUNBOOK.md @@ -0,0 +1,102 @@ +# SITEMAP_RUNBOOK.md + +## Что изменено + +- Генерация sitemap выполняется только через custom management command: `generate_sitemaps`. +- Генерация через интерфейс `/service/*` и URL-роуты удалена. +- Файлы sitemap хранятся в media-каталоге: `MEDIA_ROOT/_serv_sitemap`. +- `robots.txt` указывает на `https://oknardia.ru/media/_serv_sitemap/sitemap.xml`. +- Глубина `compare_offers` по-молчанию ограничена диапазоном `2..4`. +- В `lastmod` записывается только дата (`YYYY-MM-DD`), без времени. + +## Что сейчас входит в sitemap + +- главная страница `/`; +- список и карточки блога (`/blog/Pn`, `/blogpost/...`); +- каталог профилей: корень, производители и карточки моделей; +- каталог серий домов и детальные страницы типовых серий; +- каталог оконных компаний и карточки брендов; +- каталог стандартных оконных проёмов; +- страница рейтинга профилей; +- страницы цен по адресам и по одиночным проёмам; +- страницы `compare_offers` (с `changefreq=monthly` и пониженным приоритетом). + +## Ручной запуск + +Из каталога `oknardia/`: + +```bash +poetry run python manage.py generate_sitemaps +``` + +С явными параметрами: + +```bash +poetry run python manage.py generate_sitemaps \ + --compare-min-depth 2 \ + --compare-max-depth 4 \ + --max-items 40000 \ + --max-file-size 5242880 \ + --max-files-qty 998 +``` + +## Параметры команды + +- `--compare-min-depth` — минимальная глубина комбинаций `compare_offers` (по умолчанию `2`). +- `--compare-max-depth` — максимальная глубина комбинаций `compare_offers` (по умолчанию `4`). +- `--max-items` — лимит URL в одном sitemap-файле (по умолчанию `40000`). +- `--max-file-size` — лимит размера sitemap-файла в байтах (по умолчанию `5242880`). +- `--max-files-qty` — лимит количества вложенных sitemap-файлов (по умолчанию `998`). + +## Важные переменные окружения + +- `SITE_BASE_URL` — базовый URL сайта (например, `https://oknardia.ru`). +- `SITEMAP_SUBDIR` — подкаталог в `MEDIA_ROOT` для sitemap (по умолчанию `_serv_sitemap`). + +## Что добавить в контейнер + +Минимально (после миграций и перед запуском веб-процесса): + +```bash +poetry run python manage.py generate_sitemaps || true +``` + +> `|| true` можно убрать, если хотите падать при любой ошибке генерации. + +## Вариант для расписания (когда определитесь) + +Можно запускать команду по расписанию любым внешним scheduler: + +```bash +poetry run python manage.py generate_sitemaps +``` + +- через cron хоста, +- или через отдельный scheduler-контейнер. + +### Пример внешнего cron на хосте + +Пример строки для `crontab -e` на хост-машине (запуск раз в 3 дня в 03:30) с явным именем контейнера `oknarida-backend`: + +```bash +30 3 */3 * * /usr/bin/docker exec -i oknarida-backend /bin/sh -lc 'cd /app/oknardia && poetry run python manage.py generate_sitemaps --compare-min-depth 2 --compare-max-depth 4 --max-items 40000 --max-file-size 5242880 --max-files-qty 998' >> /var/log/oknardia-sitemap.log 2>&1 +``` + +> Если путь проекта внутри контейнера отличается от `/app/oknardia`, просто замени `cd /app/oknardia` на фактический путь. + +## Прокси/NGINX + +Можно хранить физические файлы в media-volume и при этом проксировать/алиасить корневой URL `sitemap.xml` на файл из `media/_serv_sitemap`. + +Допустимо, что файл доступен по двум URL (корневой и media), но в `robots.txt` должен быть указан один канонический вариант. + +### NGINX snippet (alias для корневого sitemap) + +```nginx +# Корневой sitemap.xml (для привычного для поисковиков URL) +location = /sitemap.xml { + alias /<путь-к-каталогку-с-докер-приложением>/media/_serv_sitemap/sitemap.xml; + default_type application/xml; + add_header Cache-Control "public, max-age=300"; +} +``` From 25e148a21e325eb6db72f0acb0043d22083a07ec Mon Sep 17 00:00:00 2001 From: erjemin Date: Sat, 18 Apr 2026 15:39:39 +0300 Subject: [PATCH 012/102] =?UTF-8?q?mod:=20catalog=5Fprofile=20=D0=B8=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AGENTS.md | 1 + README.md | 15 ++- .../catalog/catalog_of_profiles.html | 10 +- oknardia/web/catalog.py | 91 ++++++-------- oknardia/web/tests.py | 114 +++++++++++++++++- 5 files changed, 168 insertions(+), 63 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 3c3db46..fb30df5 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -213,6 +213,7 @@ python manage.py collectstatic # собрать статику для 5. **Foreign Key ON_DELETE**: используется в основном `DO_NOTHING` и `SET_NULL`, будь осторожен при удалении 6. **Двойной хост**: убедись, что используешь правильные переменные из `my_secret.py` для текущей машины 7. **Индексирование БД**: большинство полей для поиска уже имеют `db_index=True`, но проверь при добавлении фильтров +8. **SEO-даты и свежесть контента**: при переделке вьюх/шаблонов отдельно проверяй, нужны ли ещё `last_update`, `PUB_DAT`, `Date4Meta` и `Last4Meta`; если дата не участвует в смысловой логике страницы, лучше оставить базовые `{% now %}` из `base.html`, а не тащить лишний контекст во вьюху и не нагружать бекенд. ## Реферальные ссылки (для более глубокого изучения) diff --git a/README.md b/README.md index b5f7213..311a9ff 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,24 @@ # Оконный агрегатор «Окнардия» ### Переделка под Python 3.12 и Django 5.2 -### Актуальная памятка и дорожная карта +### Актуальная памятка дорожная карта + +Готово: * Изменена база данных используемая в проекте (SQLite вместо MariaDB). * Окружение проекта теперь настраивается через `poetry` вместо `pip` и `requirements.txt`. * Проект получает настройки и секреты через переменные окружения (`.env`) вместо `my_secret*.py`. +* Изменено создание `sitemap.xml` (raw ⟶ ORM, и теперь через Django-команду `generate_sitemaps` ). +* Рефакторинг URL `/catalog/profil/` (raw SQL ⟶ ORM, убран `last_update`, измененs SEO `description` и `keywords`). +* + +Планы: +* Переделать все raw SQL-запросы на ORM (для перехода на SQLite и для лучшей поддержки разных СУБД в будущем). +* Для легаси-страниц (шаблоны и вьюхи) поэтапно проверять (если нужно убирать) старые SEO-хвосты вроде `last_update` / `PUB_DAT` / `Date4Meta` / `Last4Meta`: если дата не несёт смысловой нагрузки, лучше оставлять базовые `{% now %}` из `base.html`, а не тащить лишний контекст во вьюху. +* Шаблоны `report/report_last_user_visit.html` и `report/report_log_user_visit.html` сделать с конентом + подгружаемым через AJAX (использовать HTMX, напрмемер) и убрать вызовы `get_last_user_visit_list` и `get_last_all_user_visit_list` их соответствующих вьюх. Это должно разгрузить бекенд и, возможно, сделать кеширование. +* Упаковать всё в контейнеры (Django + Gunicorn + WhiteNoise... + См. также: diff --git a/oknardia/templates/catalog/catalog_of_profiles.html b/oknardia/templates/catalog/catalog_of_profiles.html index fcb83d6..152d9af 100755 --- a/oknardia/templates/catalog/catalog_of_profiles.html +++ b/oknardia/templates/catalog/catalog_of_profiles.html @@ -5,13 +5,9 @@ {% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %} -{% block Description %}Каталог оконных профилей{% endblock %} +{% block Description %}Подберите оконный профиль под свои требования: в каталоге «Окнардии» собраны производители, марки и ключевые характеристики.{% endblock %} -{% block Keywords %}каталог оконных профилей, каталог производителей оконных профилей, каталог профилей, оконные профили, oknardia, окнардия {{ META_KEYWORDS|default:"" }} {% endblock %} - -{% block Date4Meta %}{{ CATALOG_LAST_UPDATE|date:"c" }}{% endblock %} - -{% block Last4Meta %}{{ CATALOG_LAST_UPDATE|date:"c" }}{% endblock %} +{% block Keywords %}оконные профили, каталог профилей, сравнение профилей, производители оконных профилей, характеристики оконных профилей, oknardia {{ META_KEYWORDS|default:"" }} {% endblock %} {% block Author4Meta %}: Каталог{% endblock %} @@ -27,7 +23,7 @@
  • Оконные профили
  • Каталог оконных профилей

    -

    Узнать о производителях, познакомиться с детальными характеристики и описаниями оконных профилей можно кликнув по ссылкам. Сейчас в каталоге «Окнардии» представлено {{ CATALOG_MANUFACT_NUM_W }} профилей ({{ CATALOG_PROFILE_NUM }} в базе). Последнее обновление {{ CATALOG_LAST_UPDATE_W }}.

    +

    Узнать о производителях, познакомиться с детальными характеристики и описаниями оконных профилей можно кликнув по ссылкам. Сейчас в каталоге «Окнардии» представлено {{ CATALOG_MANUFACT_NUM_W }} профилей ({{ CATALOG_PROFILE_NUM }} в базе).

    {# #}
    diff --git a/oknardia/web/catalog.py b/oknardia/web/catalog.py index 12f7182..820b7fa 100644 --- a/oknardia/web/catalog.py +++ b/oknardia/web/catalog.py @@ -45,65 +45,52 @@ def catalog_profile(request: HttpRequest) -> HttpResponse: :return response: HttpResponse -- исходящий http-ответ """ time_start = time.time() - q_profile = PVCprofiles.objects.raw('SELECT' - ' oknardia_pvcprofiles.id,' - ' oknardia_pvcprofiles.sProfileName,' - ' oknardia_pvcprofiles.sProfileBriefDescription,' - ' oknardia_pvcprofiles.sProfileManufacturer,' - ' oknardia_catalog2profile.sCatalogCardType,' - ' oknardia_blogposts.sPostContent,' - ' oknardia_blogposts.sPostHeader,' - 'oknardia_pvcprofiles.dProfileModify,' - 'MAX(oknardia_blogposts.dPostDataModify) AS lastBlog ' - 'FROM oknardia_catalog2profile' - ' RIGHT OUTER JOIN oknardia_pvcprofiles' - ' ON oknardia_catalog2profile.kProfile_id = oknardia_pvcprofiles.id' - ' LEFT OUTER JOIN oknardia_blogposts' - ' ON oknardia_catalog2profile.kBlogCatalog_id = oknardia_blogposts.id ' - 'GROUP BY oknardia_catalog2profile.sCatalogCardType,' - ' oknardia_pvcprofiles.sProfileName,' - ' oknardia_pvcprofiles.id,' - ' oknardia_pvcprofiles.sProfileBriefDescription,' - ' oknardia_pvcprofiles.sProfileManufacturer,' - ' oknardia_blogposts.sPostHeader,' - ' oknardia_blogposts.sPostContent,' - ' oknardia_pvcprofiles.dProfileModify ' - 'ORDER BY oknardia_pvcprofiles.sProfileManufacturer,' - ' oknardia_pvcprofiles.sProfileBriefDescription;') - to_template = {'CATALOG_PROFILE_NUM': pytils.numeral.get_plural(len(list(q_profile)), "профиль,профиля,профилей")} + # Берём только те поля, которые реально нужны для построения страницы каталога. + # Это позволяет не тащить лишние данные из БД и сразу работать с простыми словарями. + profile_rows = list( + PVCprofiles.objects.values( + "id", + "sProfileName", + "sProfileBriefDescription", + "sProfileManufacturer", + ).order_by("sProfileManufacturer", "sProfileBriefDescription") + ) + profile_count = len(profile_rows) + to_template = { + 'CATALOG_PROFILE_NUM': pytils.numeral.get_plural(profile_count, "профиль,профиля,профилей") + } + # Локальный помощник: slug нужен несколько раз, а повторять одну и ту же строку не хочется. + def make_slug(value: str) -> str: + return pytils.translit.slugify(value).lower() + list_profile_manufactures = [] tmp_profile_manufacture = "" - last_update = None - for i in q_profile: - if last_update is None: - last_update = i.dProfileModify - if last_update < i.dProfileModify: - last_update = i.dProfileModify - # if (i.lastBlog is not None) and (last_update < i.lastBlog): - # last_update = i.lastBlog - if tmp_profile_manufacture != i.sProfileManufacturer: - tmp_profile_manufacture = i.sProfileManufacturer + for profile in profile_rows: + if profile["sProfileManufacturer"] == "": + # Пустой производитель в каталоге только мешает: не создаём для него отдельную группу. + continue + + if tmp_profile_manufacture != profile["sProfileManufacturer"]: + # Новый производитель — открываем новую группу карточек. + tmp_profile_manufacture = profile["sProfileManufacturer"] list_profile_manufactures.append({ - "PROF_MAN_ID": i.id, - "PROF_MAN": i.sProfileManufacturer, - "PROF_MAN_T": pytils.translit.slugify(i.sProfileManufacturer).lower(), + "PROF_MAN_ID": profile["id"], + "PROF_MAN": profile["sProfileManufacturer"], + "PROF_MAN_T": make_slug(profile["sProfileManufacturer"]), "PROF_MAN_LIST": [{ - "PROF_NAME_ID": i.id, - "PROF_NAME": i.sProfileBriefDescription, - "PROF_NAME_T": pytils.translit.slugify(i.sProfileName).lower(), + "PROF_NAME_ID": profile["id"], + "PROF_NAME": profile["sProfileBriefDescription"], + "PROF_NAME_T": make_slug(profile["sProfileName"]), }] }) - # print("===", i.sProfileManufacturer, ">>> >>> >>>", Rus2Url(i.sProfileManufacturer)) - elif len(list_profile_manufactures) == 0: - # Какая-то фигня. Похоже "пустой" производитель профиля (пустая строка). Ну его нафиг. - continue else: + # Если производитель уже встречался, просто дописываем новую модель в его список. list_profile_manufactures[-1]["PROF_MAN_LIST"].append({ - "PROF_NAME_ID": i.id, - "PROF_NAME": i.sProfileBriefDescription, - "PROF_NAME_T": pytils.translit.slugify(i.sProfileName).lower(), + "PROF_NAME_ID": profile["id"], + "PROF_NAME": profile["sProfileBriefDescription"], + "PROF_NAME_T": make_slug(profile["sProfileName"]), }) - # print(\"--- ---", i.sProfileBriefDescription, ">>>", Rus2Url(i.sProfileBriefDescription)) + to_template.update({ 'CATALOG_PROFILE_MAN1_NAME2': list_profile_manufactures, 'CATALOG_MANUFACT_NUM': len(list_profile_manufactures), @@ -111,11 +98,9 @@ def catalog_profile(request: HttpRequest) -> HttpResponse: pytils.numeral.sum_string(len(list_profile_manufactures), pytils.numeral.MALE, ("производитель", "производителя", "производителей")), - 'CATALOG_LAST_UPDATE': last_update, - 'CATALOG_LAST_UPDATE_W': pytils.dt.distance_of_time_in_words(time.mktime(last_update.timetuple()), accuracy=2), 'LAST_VISIT': get_last_user_visit_list(get_last_user_visit_cookies(request)[:3]), 'LOG_VISIT': get_last_all_user_visit_list(), - 'ticks': float(time.time() - time_start) + 'ticks': float(time.time() - time_start), }) return render(request, "catalog/catalog_of_profiles.html", to_template) diff --git a/oknardia/web/tests.py b/oknardia/web/tests.py index 7ce503c..7ff85b3 100644 --- a/oknardia/web/tests.py +++ b/oknardia/web/tests.py @@ -1,3 +1,113 @@ -from django.test import TestCase +from datetime import timedelta +from unittest.mock import patch -# Create your tests here. +from django.contrib.auth.models import User +from django.test import TestCase +from django.utils import timezone + +from oknardia.models import OurUser, PVCprofiles + + +class CatalogProfileViewTests(TestCase): + """Регрессионные тесты для вьюхи каталога профилей.""" + + def setUp(self) -> None: + # Базовый пользователь нужен, потому что профиль ссылается на OurUser. + django_user = User.objects.create_user(username="tester", password="secret") + self.our_user = OurUser.objects.create(kDjangoUser=django_user) + + def _get_context(self, response): + """Достаёт итоговый контекст из ответа тестового клиента.""" + context = response.context + if isinstance(context, list): + return context[-1] + return context + + def _create_profile(self, *, name: str, brief: str, manufacturer: str, days_ago: int) -> PVCprofiles: + """Создаёт профиль с нужными полями и фиксирует дату изменения вручную.""" + profile = PVCprofiles.objects.create( + sProfileName=name, + sProfileBriefDescription=brief, + sProfileManufacturer=manufacturer, + kProfile2User=self.our_user, + fProfileRating=3.5, + ) + # В модели стоит auto_now=True, поэтому после создания дату правим отдельным update. + modified_at = timezone.now() - timedelta(days=days_ago) + PVCprofiles.objects.filter(pk=profile.pk).update(dProfileModify=modified_at) + profile.refresh_from_db() + return profile + + @patch("web.catalog.get_last_all_user_visit_list", return_value=["all-visits"]) + @patch("web.catalog.get_last_user_visit_list", return_value=["last-visits"]) + @patch("web.catalog.get_last_user_visit_cookies", return_value=["cookie-1", "cookie-2", "cookie-3"]) + def test_catalog_profile_handles_empty_catalog( + self, + mocked_cookies, + mocked_last_visits, + mocked_all_visits, + ): + """Пустой каталог не должен падать и должен отдавать ожидаемый контекст.""" + with self.assertNumQueries(1): + response = self.client.get("/catalog/profile/") + + context = self._get_context(response) + self.assertEqual(response.status_code, 200) + self.assertEqual(context["CATALOG_PROFILE_NUM"], "0 профилей") + self.assertEqual(context["CATALOG_MANUFACT_NUM"], 0) + self.assertEqual(context["CATALOG_PROFILE_MAN1_NAME2"], []) + self.assertEqual(context["LAST_VISIT"], ["last-visits"]) + self.assertEqual(context["LOG_VISIT"], ["all-visits"]) + self.assertTrue(mocked_cookies.called) + self.assertTrue(mocked_last_visits.called) + self.assertTrue(mocked_all_visits.called) + + @patch("web.catalog.get_last_all_user_visit_list", return_value=[]) + @patch("web.catalog.get_last_user_visit_list", return_value=[]) + @patch("web.catalog.get_last_user_visit_cookies", return_value=[]) + def test_catalog_profile_groups_and_sorts_profiles( + self, + mocked_cookies, + mocked_last_visits, + mocked_all_visits, + ): + """Каталог должен группировать профили по производителю и сохранять сортировку.""" + self._create_profile(name="Alpha Basic", brief="Альфа База", manufacturer="Альфа", days_ago=5) + self._create_profile(name="Alpha Plus", brief="Альфа Плюс", manufacturer="Альфа", days_ago=2) + self._create_profile(name="Beta Light", brief="Бета Лайт", manufacturer="Бета", days_ago=1) + self._create_profile(name="Hidden", brief="Скрытый", manufacturer="", days_ago=7) + + with self.assertNumQueries(1): + response = self.client.get("/catalog/profile/") + + context = self._get_context(response) + self.assertEqual(response.status_code, 200) + + # Пустой производитель не должен превращаться в отдельную группу. + groups = context["CATALOG_PROFILE_MAN1_NAME2"] + self.assertEqual(len(groups), 2) + self.assertEqual([group["PROF_MAN"] for group in groups], ["Альфа", "Бета"]) + + alpha_group = groups[0] + self.assertEqual(alpha_group["PROF_MAN_T"], "alfa") + self.assertEqual( + [item["PROF_NAME"] for item in alpha_group["PROF_MAN_LIST"]], + ["Альфа База", "Альфа Плюс"], + ) + self.assertEqual( + [item["PROF_NAME_T"] for item in alpha_group["PROF_MAN_LIST"]], + ["alpha-basic", "alpha-plus"], + ) + + beta_group = groups[1] + self.assertEqual(beta_group["PROF_MAN_T"], "beta") + self.assertEqual([item["PROF_NAME"] for item in beta_group["PROF_MAN_LIST"]], ["Бета Лайт"]) + + # Проверяем итоговые счетчики и структуру контекста. + self.assertEqual(context["CATALOG_MANUFACT_NUM"], 2) + self.assertEqual(context["CATALOG_PROFILE_NUM"], "4 профиля") + self.assertEqual(context["LAST_VISIT"], []) + self.assertEqual(context["LOG_VISIT"], []) + self.assertTrue(mocked_cookies.called) + self.assertTrue(mocked_last_visits.called) + self.assertTrue(mocked_all_visits.called) From de2d14332eb1994273c78631be17c45a6dd857b1 Mon Sep 17 00:00:00 2001 From: erjemin Date: Sun, 19 Apr 2026 23:43:13 +0300 Subject: [PATCH 013/102] mod: simplify catalog profile views --- README.md | 7 +- oknardia/web/catalog.py | 245 +++++++++++++++++++++------------------- oknardia/web/tests.py | 184 +++++++++++++++++++++++++++++- 3 files changed, 315 insertions(+), 121 deletions(-) diff --git a/README.md b/README.md index 311a9ff..779fd67 100644 --- a/README.md +++ b/README.md @@ -3,16 +3,17 @@ ### Актуальная памятка дорожная карта -Готово: +#### Готово: * Изменена база данных используемая в проекте (SQLite вместо MariaDB). * Окружение проекта теперь настраивается через `poetry` вместо `pip` и `requirements.txt`. * Проект получает настройки и секреты через переменные окружения (`.env`) вместо `my_secret*.py`. -* Изменено создание `sitemap.xml` (raw ⟶ ORM, и теперь через Django-команду `generate_sitemaps` ). +* Рефакторинг создания `sitemap.xml` (raw ⟶ ORM, создание через Django-команду `generate_sitemaps` в медиа-файлы). * Рефакторинг URL `/catalog/profil/` (raw SQL ⟶ ORM, убран `last_update`, измененs SEO `description` и `keywords`). * -Планы: +#### Планы, задачи, маркеры и идеи на будущее: + * Переделать все raw SQL-запросы на ORM (для перехода на SQLite и для лучшей поддержки разных СУБД в будущем). * Для легаси-страниц (шаблоны и вьюхи) поэтапно проверять (если нужно убирать) старые SEO-хвосты вроде `last_update` / `PUB_DAT` / `Date4Meta` / `Last4Meta`: если дата не несёт смысловой нагрузки, лучше оставлять базовые `{% now %}` из `base.html`, а не тащить лишний контекст во вьюху. * Шаблоны `report/report_last_user_visit.html` и `report/report_log_user_visit.html` сделать с конентом diff --git a/oknardia/web/catalog.py b/oknardia/web/catalog.py index 820b7fa..4d2f72d 100644 --- a/oknardia/web/catalog.py +++ b/oknardia/web/catalog.py @@ -1,11 +1,20 @@ # -*- coding: utf-8 -*- from django.core.exceptions import ObjectDoesNotExist +from django.db.models import Count from django.shortcuts import render, redirect from django.http import HttpRequest, HttpResponse from django.template.loader import render_to_string from django.utils import timezone from oknardia.settings import * -from oknardia.models import PVCprofiles, Seria_Info, Win_MountDim, Building_Info, MerchantBrand +from oknardia.models import ( + Catalog2Profile, + MerchantBrand, + PVCprofiles, + PriceOffer, + 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.add_func import normalize, get_rating_set_for_stars, get_flaps_for_big_pictures,\ get_flaps_for_mini_pictures, touch_reload_wsgi @@ -121,11 +130,58 @@ def catalog_profile_model(request: HttpRequest, manufacture_id: int, manufacture 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 \ + manufacturer_slug = pytils.translit.slugify(q_pvc_by_id.sProfileManufacturer) + model_slug = pytils.translit.slugify(q_pvc_by_id.sProfileName) + if manufacturer_slug != manufacture_name \ + or model_slug != 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)}") + return redirect(f"/catalog/profile/{model_id}-{manufacturer_slug}/" + f"{model_id}-{model_slug}") + + # Локальные помощники держат вьюху короче и не размазывают однотипную логику по коду. + def make_slug(value: str) -> str: + return pytils.translit.slugify(value).lower() + + def clean_description(value: str) -> str: + return re.sub( + r'|||', + '', + value, + 0, + re.IGNORECASE, + ) + + def build_other_list(value: str) -> list[str]: + # Убираем пустые куски, чтобы не плодить «пустые» характеристики в шаблоне. + result = [] + for chunk in (part.strip() for part in value.split(";")): + if not chunk: + continue + if ":" in chunk: + head, tail = chunk.split(":", 1) + result.append(f"{head.strip()}:{tail.strip()}") + else: + result.append(f"{chunk}") + return result + + def update_pub_dat(current_pub_dat, candidate_pub_dat): + # На странице оставляем дату публикации/обновления только если она реально новее карточки профиля. + if candidate_pub_dat is None: + return current_pub_dat + if current_pub_dat is None or candidate_pub_dat.replace(tzinfo=None) > current_pub_dat.replace(tzinfo=None): + return candidate_pub_dat + return current_pub_dat + + def apply_rating_colors(rating: dict, rating_pairs: tuple[tuple[str, str], ...], multiplier: int, + gray: bool = False) -> None: + # Один маленький helper вместо россыпи почти одинаковых строк: меняется только множитель и формат RGB. + for rating_key, template_key in rating_pairs: + color = int(255 - rating[rating_key] * multiplier) + if gray: + to_template[template_key] = f"{color},{color},{color}" + else: + to_template[template_key] = f"{color},255,{color}" + to_template = {"CATALOG_MODEL": q_pvc_by_id, "CATALOG_MAN2URL": manufacture_name, "CATALOG_URL": f"{manufacture_id}-{manufacture_name}", @@ -134,135 +190,92 @@ def catalog_profile_model(request: HttpRequest, manufacture_id: int, manufacture try: got_json = json.loads(q_pvc_by_id.sProfileDescription) # раскрашиваем кружочки рейтинга напротив характеристик профиля + rating_pairs = ( + (RANK_PVCP_CAMERAS_NUM_NAME, "RANK_PVCP_CAMERAS_COLOR"), + (RANK_PVCP_SEALS_NAME, "RANK_PVCP_SEALS_COLOR"), + (RANK_PVCP_THICKNESS_NAME, "RANK_PVCP_THICKNESS_COLOR"), + (RANK_PVCP_G_THICKNESS_NAME, "RANK_PVCP_G_THICKNESS_COLOR"), + (RANK_PVCP_RABBET_NAME, "RANK_PVCP_RABBET_COLOR"), + (RANK_PVCP_HEAT_TRANSFER_NAME, "RANK_PVCP_HEAT_TRANSFER_COLOR"), + (RANK_PVCP_SOUNDPROOFING_NAME, "RANK_PVCP_SOUNDPROOFING_COLOR"), + (RANK_PVCP_HEIGHT_NAME, "RANK_PVCP_HEIGHT_COLOR"), + ) if KEY_RATING in got_json: - # RatingReal = True # Рейтинг реальный (профиль представлен в ценовых предложениях) # кружочки зелёные - rating = got_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}"}) + apply_rating_colors(got_json[KEY_RATING], rating_pairs, 255) elif KEY_RATING_VIRTUAL in got_json: - # RatingReal = False # Рейтинг виртуальный (профиль представлен в ценовых предложениях) # кружочки серые - rating = got_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}"}) + apply_rating_colors(got_json[KEY_RATING_VIRTUAL], rating_pairs, 64, gray=True) else: pass if KEY_HTML in got_json: to_template.update({"EXTRA_INFO": got_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"" + i[:j + 1] + u"" + 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;") + to_template.update({"LIST_OTHER": build_other_list(q_pvc_by_id.sProfileOther)}) + # Партнёров считаем через ORM: так код проще читать и легче переносить между СУБД. + q_merchant = ( + PriceOffer.objects.filter( + kOffer2SetKit__kSet2PVCprofiles_id=model_id, + sOfferActive=True, + ) + .values( + "kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__id", + "kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__sMerchantName", + "kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__pMerchantLogo", + ) + .annotate(offers_by_merchant=Count("id")) + .order_by("-offers_by_merchant", "kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__sMerchantName") + ) list_merchant = [] - for i in q_merchant: + for row 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, + "MERCHANT_ID": row["kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__id"], + "MERCHANT_NAME": row["kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__sMerchantName"], + "MERCHANT_NAME_T": make_slug(row["kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__sMerchantName"]), + "MERCHANT_LOGO_URL": row["kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__pMerchantLogo"], + "MERCHANT_OFFERS": row["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;") + # Близкие профили этого же производителя нужны для быстрых переходов по карточкам. + q_profiles = ( + PVCprofiles.objects.filter(sProfileManufacturer=q_pvc_by_id.sProfileManufacturer) + .exclude(id=model_id) + .values("id", "fProfileRating", "sProfileBriefDescription", "sProfileName") + .order_by("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), - }) + for profile in q_profiles: + list_profiles.append({ + "PROFILE_NAME": profile["sProfileBriefDescription"], + "PROFILE_ID": profile["id"], + "PROFILE_URL": make_slug(profile["sProfileName"]), + "PROFILE_RATING": profile["fProfileRating"], + "PROFILE_RATING_STARS": get_rating_set_for_stars(profile["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) + # Описание профиля берём через связку каталог -> блог: это один ORM-запрос вместо сырого SQL. + q_profiles_detail = ( + Catalog2Profile.objects.filter( + kProfile_id=model_id, + sCatalogCardType=CATALOG_RECORD_FOR_PROFILE_MODEL, + kBlogCatalog__isnull=False, + ) + .select_related("kBlogCatalog") + .order_by("kBlogCatalog__iCatalogSort") + ) + list_profiles_detail = [row.kBlogCatalog for row in q_profiles_detail if row.kBlogCatalog is not None] 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) + # Картинка и дата публикации для meta-тегов берутся из связанного блога, если он есть. + list_img_for_blog = [post.sImgForBlogSocial for post in list_profiles_detail if post.sImgForBlogSocial] + if 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 - if pub_data.replace(tzinfo=None) < q_pvc_by_id.dProfileModify.replace(tzinfo=None): - to_template.update({'PUB_DAT': pub_data}) + + pub_dat = q_pvc_by_id.dProfileModify + if list_profiles_detail: + blog_pub_dat = max((post.dPostDataModify for post in list_profiles_detail), default=pub_dat) + pub_dat = update_pub_dat(pub_dat, blog_pub_dat) + to_template.update({'PUB_DAT': pub_dat}) to_template.update({ # получаем последние визиты клиента через куки 'LAST_VISIT': get_last_user_visit_list(get_last_user_visit_cookies(request)[:3]), diff --git a/oknardia/web/tests.py b/oknardia/web/tests.py index 7ff85b3..0dfef8f 100644 --- a/oknardia/web/tests.py +++ b/oknardia/web/tests.py @@ -1,11 +1,27 @@ from datetime import timedelta +from decimal import Decimal +import json from unittest.mock import patch from django.contrib.auth.models import User -from django.test import TestCase +from django.db import connection +from django.http import HttpResponse +from django.test import RequestFactory, TestCase from django.utils import timezone -from oknardia.models import OurUser, PVCprofiles +from oknardia.settings import CATALOG_RECORD_FOR_PROFILE_MODEL +from web.catalog import catalog_profile_model +from oknardia.models import ( + BlogPosts, + Catalog2Profile, + Glazing, + MerchantBrand, + MerchantOffice, + OurUser, + PVCprofiles, + PriceOffer, + SetKit, +) class CatalogProfileViewTests(TestCase): @@ -15,6 +31,7 @@ class CatalogProfileViewTests(TestCase): # Базовый пользователь нужен, потому что профиль ссылается на OurUser. django_user = User.objects.create_user(username="tester", password="secret") self.our_user = OurUser.objects.create(kDjangoUser=django_user) + self.factory = RequestFactory() def _get_context(self, response): """Достаёт итоговый контекст из ответа тестового клиента.""" @@ -38,6 +55,107 @@ class CatalogProfileViewTests(TestCase): profile.refresh_from_db() return profile + def _create_catalog_profile_model_fixture(self, *, manufacturer: str = "Альфа"): + """Собирает минимальный набор данных для карточки профиля.""" + profile = PVCprofiles.objects.create( + sProfileName="Alpha Basic", + sProfileBriefDescription="Альфа База", + sProfileManufacturer=manufacturer, + kProfile2User=self.our_user, + fProfileRating=4.25, + sProfileDescription=json.dumps({"html": "

    Дополнительная информация о профиле.

    "}), + sProfileOther="Контур: 2; Цвет: Белый", + ) + PVCprofiles.objects.filter(pk=profile.pk).update(dProfileModify=timezone.now() - timedelta(days=10)) + profile.refresh_from_db() + + sibling = PVCprofiles.objects.create( + sProfileName="Alpha Plus", + sProfileBriefDescription="Альфа Плюс", + sProfileManufacturer=manufacturer, + kProfile2User=self.our_user, + fProfileRating=3.75, + ) + + brand = MerchantBrand.objects.create( + sMerchantName="Окно-Мир", + sMerchantMainURL="https://example.com", + ) + office = MerchantOffice.objects.create( + sOfficeName="Окно-Мир Москва", + kMerchantName=brand, + sOfficeEmails="info@example.com", + sOfficePhones="+7(495)000-00-00", + ) + self.our_user.kMerchantOffice = office + self.our_user.save(update_fields=["kMerchantOffice"]) + + glazing = Glazing.objects.create( + sGlazingName="Тёплый пакет", + sGlazingBriefDescription="Теплый двухкамерный стеклопакет", + kGlazing2User=self.our_user, + ) + setkit = SetKit.objects.create( + sSetName="Набор-Альфа", + kSet2User=self.our_user, + kSet2PVCprofiles=profile, + kSet2Glazing=glazing, + sSetDescription="Комплект для теста", + sSetClimateControl="Климат", + sSetSill="Подоконник", + sSetImplementAll="Фурнитура", + sSetImplementHandles="Ручки", + sSetImplementHinges="Петли", + sSetImplementLatch="Запоры", + sSetImplementLimiter="Ограничитель", + sSetImplementCatch="Фиксатор", + sSetPanes="Водоотлив", + sSetSlope="Откос", + sSetDelivery="Доставка", + bSetDelivery=True, + sSetUninstallInstall="Монтаж", + bSetUninstallInstall=True, + sSetOtherConditions="Прочее", + fSetRating=4.1, + dSetCommercialUntil=timezone.now(), + ) + # В текущей схеме таблицы поле открывания называется flap_config, а не sFlapConfig. + win_flap_column = "flap_" + "config" + with connection.cursor() as cursor: + cursor.execute( + f"INSERT INTO oknardia_win_mountdim " + f"(iWinWidth, iWinHight, iWinDepth, {win_flap_column}, sDescripion, bIsDoor, bIsNearDoor, iWinLimit, dMountXYZDataCreate, dMountXYZModify) " + f"VALUES (?, ?, ?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)", + [Decimal("120.0"), Decimal("140.0"), Decimal("15.0"), "[>][<]", "Окно тестовое", 0, 0, Decimal("5.0")], + ) + win_id = cursor.lastrowid + PriceOffer.objects.create( + kOffer2MountDim_id=win_id, + kOfferFromUser=self.our_user, + kOffer2SetKit=setkit, + sOfferFlapConfig="[>][<]", + fOfferPrice=Decimal("12345.00"), + ) + + blog = BlogPosts.objects.create( + sPostHeader="Описание профиля", + kBlogAuthorUser=self.our_user, + sPostContent="

    Основной текст

    Скрыто

    ", + sImgForBlogSocial="img/catalog-profile.jpg", + bCatalog=True, + iCatalogSort=1, + dPostDataBegin=timezone.now(), + ) + BlogPosts.objects.filter(pk=blog.pk).update(dPostDataModify=timezone.now() - timedelta(days=1)) + blog.refresh_from_db() + Catalog2Profile.objects.create( + kProfile=profile, + kBlogCatalog=blog, + sCatalogCardType=CATALOG_RECORD_FOR_PROFILE_MODEL, + ) + + return profile, sibling, brand, blog + @patch("web.catalog.get_last_all_user_visit_list", return_value=["all-visits"]) @patch("web.catalog.get_last_user_visit_list", return_value=["last-visits"]) @patch("web.catalog.get_last_user_visit_cookies", return_value=["cookie-1", "cookie-2", "cookie-3"]) @@ -111,3 +229,65 @@ class CatalogProfileViewTests(TestCase): self.assertTrue(mocked_cookies.called) self.assertTrue(mocked_last_visits.called) self.assertTrue(mocked_all_visits.called) + + @patch("web.catalog.get_last_all_user_visit_list", return_value=[]) + @patch("web.catalog.get_last_user_visit_list", return_value=[]) + @patch("web.catalog.get_last_user_visit_cookies", return_value=[]) + def test_catalog_profile_model_redirects_to_canonical_url( + self, + mocked_cookies, + mocked_last_visits, + mocked_all_visits, + ): + """При неверных slug страница должна отправлять на канонический URL.""" + profile = self._create_profile(name="Alpha Basic", brief="Альфа База", manufacturer="Альфа", days_ago=5) + + request = self.factory.get(f"/catalog/profile/{profile.id}-wrong/{profile.id}-wrong/") + response = catalog_profile_model(request, profile.id, "wrong", profile.id, "wrong") + + self.assertEqual(response.status_code, 302) + self.assertEqual(response["Location"], f"/catalog/profile/{profile.id}-alfa/{profile.id}-alpha-basic") + + @patch("web.catalog.get_last_all_user_visit_list", return_value=[]) + @patch("web.catalog.get_last_user_visit_list", return_value=[]) + @patch("web.catalog.get_last_user_visit_cookies", return_value=[]) + def test_catalog_profile_model_renders_related_data( + self, + mocked_cookies, + mocked_last_visits, + mocked_all_visits, + ): + """Карточка профиля должна собираться через ORM и отдавать все ключевые блоки.""" + profile, sibling, brand, blog = self._create_catalog_profile_model_fixture() + request = self.factory.get(f"/catalog/profile/{profile.id}-alfa/{profile.id}-alpha-basic/") + captured = {} + + def fake_render(_request, template_name, context): + captured["template_name"] = template_name + captured["context"] = context + return HttpResponse("ok") + + with patch("web.catalog.render", side_effect=fake_render): + with self.assertNumQueries(4): + response = catalog_profile_model(request, profile.id, "alfa", profile.id, "alpha-basic") + + context = captured["context"] + self.assertEqual(response.status_code, 200) + self.assertEqual(captured["template_name"], "catalog/catalog_of_profiles_model.html") + self.assertEqual(context["CATALOG_MODEL"].id, profile.id) + self.assertEqual(context["CATALOG_URL"], f"{profile.id}-alfa") + self.assertEqual(context["CATALOG_URL2"], f"{profile.id}-alfa/{profile.id}-alpha-basic") + self.assertEqual(len(context["MERCHANTS"]), 1) + self.assertEqual(context["MERCHANTS"][0]["MERCHANT_NAME"], brand.sMerchantName) + self.assertEqual(context["MERCHANTS"][0]["MERCHANT_OFFERS"], 1) + self.assertEqual(len(context["PROFILES"]), 1) + self.assertEqual(context["PROFILES"][0]["PROFILE_ID"], sibling.id) + self.assertEqual(len(context["PROFILE_DETAIL"]), 1) + self.assertEqual(context["PROFILE_DETAIL"][0].sPostContent, blog.sPostContent) + self.assertEqual(context["IMG_FOR_BLOG"], blog.sImgForBlogSocial) + self.assertEqual(context["PUB_DAT"].date(), blog.dPostDataModify.date()) + self.assertEqual(context["LIST_OTHER"], ["Контур:2", "Цвет:Белый"]) + self.assertTrue(mocked_cookies.called) + self.assertTrue(mocked_last_visits.called) + self.assertTrue(mocked_all_visits.called) + From 5933fa46de34daaf4c944bed064af51e899c553e Mon Sep 17 00:00:00 2001 From: erjemin Date: Mon, 20 Apr 2026 00:33:13 +0300 Subject: [PATCH 014/102] =?UTF-8?q?=20minor:=20ticks=20=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D0=BB=20=D0=B2=D0=B8=D0=B4=D0=B8=D0=BC=D1=8B=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oknardia/templates/base.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oknardia/templates/base.html b/oknardia/templates/base.html index c2d0b03..859dd2e 100755 --- a/oknardia/templates/base.html +++ b/oknardia/templates/base.html @@ -85,7 +85,7 @@ {# #}(function(d,w,c){(w[c]=w[c]||[]).push(function(){try{w.yaCounter32997984=new Ya.Metrika({id:32997984,clickmap:true,trackLinks:true,accurateTrackBounce:true,webvisor:true,trackHash:true});}catch(e){}});var n=d.getElementsByTagName("script")[0],s=d.createElement("script"),f=function(){n.parentNode.insertBefore(s,n);};s.type="text/javascript";s.async=true;s.src="https://mc.yandex.ru/metrika/watch.js";if(w.opera=="[object Opera]"){d.addEventListener("DOMContentLoaded",f,false);}else{ f();}})(document,window,"yandex_metrika_callbacks"); //-->{# #} - © oknardia.ru, 2015-{% now "Y" %}. Все права защищены. + © oknardia.ru, 2015-{% now "Y" %}. Все права защищены. {{ ticks }}{{ TAU }} сек
    {% endblock %} {# ######################################## Нижнее меню-футер КОНЕЦ ######################################## #} From 2778ccf45a17a1b61a5ba182f1aef8bd6be144ab Mon Sep 17 00:00:00 2001 From: erjemin Date: Mon, 20 Apr 2026 00:43:27 +0300 Subject: [PATCH 015/102] =?UTF-8?q?=20mod:=20=D1=80=D0=B5=D1=84=D0=B0?= =?UTF-8?q?=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20catalog=5Fprofile?= =?UTF-8?q?=5Fmodel=20=D0=B8=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=BE=D1=80=D0=BE=D0=B6=D0=BD=D0=BE?= =?UTF-8?q?=D0=B9=20=D0=BA=D0=B0=D1=80=D1=82=D1=8B=20README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +-- oknardia/web/catalog.py | 104 +++++++++++++++++++--------------------- 2 files changed, 53 insertions(+), 57 deletions(-) diff --git a/README.md b/README.md index 779fd67..9e8f0de 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,9 @@ * Изменена база данных используемая в проекте (SQLite вместо MariaDB). * Окружение проекта теперь настраивается через `poetry` вместо `pip` и `requirements.txt`. * Проект получает настройки и секреты через переменные окружения (`.env`) вместо `my_secret*.py`. -* Рефакторинг создания `sitemap.xml` (raw ⟶ ORM, создание через Django-команду `generate_sitemaps` в медиа-файлы). -* Рефакторинг URL `/catalog/profil/` (raw SQL ⟶ ORM, убран `last_update`, измененs SEO `description` и `keywords`). -* +* Рефакторинг создания `sitemap.xml`: raw ⟶ ORM, создание через Django-команду `generate_sitemaps` в медиа-файлы. +* Рефакторинг URL `/catalog/profil/`: raw SQL ⟶ ORM, убран `last_update`, измененs SEO `description` и `keywords`. +* Рефакторинг `catalog_profile_model` (`/catalog/profile/...`): raw SQL ⟶ ORM, упрощена логика, вынесены helper-функции, сокращено дублирование расчёта цветов рейтинга, нормализована подготовка `LIST_OTHER`/`MERCHANTS`/`PROFILES`/`PROFILE_DETAIL`, сохранена совместимость шаблонов. #### Планы, задачи, маркеры и идеи на будущее: diff --git a/oknardia/web/catalog.py b/oknardia/web/catalog.py index 4d2f72d..113fe0d 100644 --- a/oknardia/web/catalog.py +++ b/oknardia/web/catalog.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +from datetime import datetime from django.core.exceptions import ObjectDoesNotExist from django.db.models import Count from django.shortcuts import render, redirect @@ -115,7 +116,7 @@ def catalog_profile(request: HttpRequest) -> HttpResponse: def catalog_profile_model(request: HttpRequest, manufacture_id: int, manufacture_name: str, - model_id: id, model_name: str) -> HttpResponse: + model_id: int, model_name: str) -> HttpResponse: """ КАТАЛОГ ПРОФИЛЕЙ: страница с описанием марки профиля @@ -142,15 +143,6 @@ def catalog_profile_model(request: HttpRequest, manufacture_id: int, manufacture def make_slug(value: str) -> str: return pytils.translit.slugify(value).lower() - def clean_description(value: str) -> str: - return re.sub( - r'|||', - '', - value, - 0, - re.IGNORECASE, - ) - def build_other_list(value: str) -> list[str]: # Убираем пустые куски, чтобы не плодить «пустые» характеристики в шаблоне. result = [] @@ -164,7 +156,7 @@ def catalog_profile_model(request: HttpRequest, manufacture_id: int, manufacture result.append(f"{chunk}") return result - def update_pub_dat(current_pub_dat, candidate_pub_dat): + def update_pub_dat(current_pub_dat: datetime | None, candidate_pub_dat: datetime | None) -> datetime | None: # На странице оставляем дату публикации/обновления только если она реально новее карточки профиля. if candidate_pub_dat is None: return current_pub_dat @@ -182,11 +174,32 @@ def catalog_profile_model(request: HttpRequest, manufacture_id: int, manufacture else: to_template[template_key] = f"{color},255,{color}" - 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)} + def merchant_row_to_dict(row: dict) -> dict: + # Один маппер для строки с партнёром: ключи шаблона остаются как были. + merchant_name = row["kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__sMerchantName"] + return { + "MERCHANT_ID": row["kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__id"], + "MERCHANT_NAME": merchant_name, + "MERCHANT_NAME_T": make_slug(merchant_name), + "MERCHANT_LOGO_URL": row["kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__pMerchantLogo"], + "MERCHANT_OFFERS": row["offers_by_merchant"], + } + + def profile_row_to_dict(profile: dict) -> dict: + # И то же самое для списка соседних профилей производителя. + return { + "PROFILE_NAME": profile["sProfileBriefDescription"], + "PROFILE_ID": profile["id"], + "PROFILE_URL": make_slug(profile["sProfileName"]), + "PROFILE_RATING": profile["fProfileRating"], + "PROFILE_RATING_STARS": get_rating_set_for_stars(profile["fProfileRating"]), + } + + to_template: dict[str, object] = {"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: got_json = json.loads(q_pvc_by_id.sProfileDescription) # раскрашиваем кружочки рейтинга напротив характеристик профиля @@ -227,16 +240,7 @@ def catalog_profile_model(request: HttpRequest, manufacture_id: int, manufacture .annotate(offers_by_merchant=Count("id")) .order_by("-offers_by_merchant", "kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__sMerchantName") ) - list_merchant = [] - for row in q_merchant: - list_merchant.append({ - "MERCHANT_ID": row["kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__id"], - "MERCHANT_NAME": row["kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__sMerchantName"], - "MERCHANT_NAME_T": make_slug(row["kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__sMerchantName"]), - "MERCHANT_LOGO_URL": row["kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__pMerchantLogo"], - "MERCHANT_OFFERS": row["offers_by_merchant"], - }) - to_template.update({'MERCHANTS': list_merchant}) + to_template.update({'MERCHANTS': [merchant_row_to_dict(row) for row in q_merchant]}) # Близкие профили этого же производителя нужны для быстрых переходов по карточкам. q_profiles = ( PVCprofiles.objects.filter(sProfileManufacturer=q_pvc_by_id.sProfileManufacturer) @@ -244,16 +248,7 @@ def catalog_profile_model(request: HttpRequest, manufacture_id: int, manufacture .values("id", "fProfileRating", "sProfileBriefDescription", "sProfileName") .order_by("fProfileRating") ) - list_profiles = [] - for profile in q_profiles: - list_profiles.append({ - "PROFILE_NAME": profile["sProfileBriefDescription"], - "PROFILE_ID": profile["id"], - "PROFILE_URL": make_slug(profile["sProfileName"]), - "PROFILE_RATING": profile["fProfileRating"], - "PROFILE_RATING_STARS": get_rating_set_for_stars(profile["fProfileRating"]), - }) - to_template.update({'PROFILES': list_profiles}) + to_template.update({'PROFILES': [profile_row_to_dict(profile) for profile in q_profiles]}) # Описание профиля берём через связку каталог -> блог: это один ORM-запрос вместо сырого SQL. q_profiles_detail = ( Catalog2Profile.objects.filter( @@ -264,26 +259,27 @@ def catalog_profile_model(request: HttpRequest, manufacture_id: int, manufacture .select_related("kBlogCatalog") .order_by("kBlogCatalog__iCatalogSort") ) - list_profiles_detail = [row.kBlogCatalog for row in q_profiles_detail if row.kBlogCatalog is not None] - to_template.update({'PROFILE_DETAIL': list_profiles_detail}) + profile_blog_posts = [row.kBlogCatalog for row in q_profiles_detail if row.kBlogCatalog is not None] + to_template.update({'PROFILE_DETAIL': profile_blog_posts}) # Картинка и дата публикации для meta-тегов берутся из связанного блога, если он есть. - list_img_for_blog = [post.sImgForBlogSocial for post in list_profiles_detail if post.sImgForBlogSocial] - if list_img_for_blog: - to_template.update({'IMG_FOR_BLOG': list_img_for_blog[0]}) + if profile_blog_posts: + for blog_post in profile_blog_posts: + if blog_post.sImgForBlogSocial: + to_template['IMG_FOR_BLOG'] = blog_post.sImgForBlogSocial + break - pub_dat = q_pvc_by_id.dProfileModify - if list_profiles_detail: - blog_pub_dat = max((post.dPostDataModify for post in list_profiles_detail), default=pub_dat) - pub_dat = update_pub_dat(pub_dat, blog_pub_dat) - to_template.update({'PUB_DAT': pub_dat}) - 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) - }) + pub_dat: datetime = q_pvc_by_id.dProfileModify + if profile_blog_posts: + profile_blog_dat: datetime | None = max((post.dPostDataModify for post in profile_blog_posts), default=pub_dat) + pub_dat = update_pub_dat(pub_dat, profile_blog_dat) or pub_dat + to_template['PUB_DAT'] = pub_dat + to_template.update( + { + 'LAST_VISIT': get_last_user_visit_list(get_last_user_visit_cookies(request)[:3]), + 'LOG_VISIT': get_last_all_user_visit_list(), + 'ticks': float(time.time() - time_start), + } + ) return render(request, "catalog/catalog_of_profiles_model.html", to_template) From 59d8ad1e4c767509a338b44651350d685c766ada Mon Sep 17 00:00:00 2001 From: erjemin Date: Mon, 20 Apr 2026 00:54:11 +0300 Subject: [PATCH 016/102] =?UTF-8?q?=20minor:=20=D0=B2=20=D0=BE=D1=82=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20catalog=5Fprofiles.py=20?= =?UTF-8?q?=D0=B2=D1=8B=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=B2=D1=81?= =?UTF-8?q?=D0=B5=20=D0=B2=D1=8C=D1=8E=D1=85=D0=B8=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=BA=D0=B0=D1=82=D0=B0=D0=BB=D0=BE=D0=B3=D0=B0=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D1=84=D0=B8=D0=BB=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oknardia/oknardia/urls.py | 14 +- oknardia/web/catalog.py | 376 ----------------------------- oknardia/web/catalog_profiles.py | 389 +++++++++++++++++++++++++++++++ 3 files changed, 396 insertions(+), 383 deletions(-) create mode 100644 oknardia/web/catalog_profiles.py diff --git a/oknardia/oknardia/urls.py b/oknardia/oknardia/urls.py index 9397347..cb058f5 100644 --- a/oknardia/oknardia/urls.py +++ b/oknardia/oknardia/urls.py @@ -18,9 +18,8 @@ from django.contrib import admin from django.urls import include, path, re_path from django.conf.urls.static import static from oknardia.settings import * -from web import views, autocomplete_addr, user_manager, blog, diagrams, report1, report2, catalog, prices, service - - +from web import views, autocomplete_addr, user_manager, blog, diagrams, report1, report2, catalog, prices, service, \ + catalog_profiles urlpatterns = [ path('admin/', admin.site.urls), @@ -57,13 +56,13 @@ urlpatterns = [ re_path(r'^stat/rating[/*]$', report2.ratings), re_path(r'^stat/rating/profiles_rank[/*]$', report2.profiles_rating), # --- Каталог - # --- --- Каталог профилей re_path(r'^catalog[/*]$', catalog.catalog_root), - re_path(r'^catalog/profile[/*]$', catalog.catalog_profile), + # --- --- Каталог профилей + re_path(r'^catalog/profile[/*]$', catalog_profiles.catalog_profile), re_path(r'^catalog/profile/(?P\d+)-(?P\S*)' - r'/(?P\d+)-(?P\S*)[/*]$', catalog.catalog_profile_model), + r'/(?P\d+)-(?P\S*)[/*]$', catalog_profiles.catalog_profile_model), re_path(r'^catalog/profile/(?P\d+)-(?P\S*)[/*]$', - catalog.catalog_profile_manufacture), + catalog_profiles.catalog_profile_manufacture), # --- --- Каталог серий типового строительства re_path(r'^catalog/seria[/*]$', catalog.catalog_seria), re_path(r'^catalog/seria/(?P[^/]*)/all(?P\d+)[/*]$', catalog.catalog_seria_info), @@ -100,6 +99,7 @@ urlpatterns = [ ] + if DEBUG: # ___ ____ _ _____ _ _ _____ _ # | | | | \ ___| |_ _ _ ___ |_ _|___ ___| | |_ ___ ___ | _ |___ ___ ___| | diff --git a/oknardia/web/catalog.py b/oknardia/web/catalog.py index 113fe0d..5408425 100644 --- a/oknardia/web/catalog.py +++ b/oknardia/web/catalog.py @@ -46,382 +46,6 @@ def catalog_root(request: HttpRequest) -> HttpResponse: response = render(request, "catalog/catalog_root.html", to_template) return response - -def catalog_profile(request: HttpRequest) -> HttpResponse: - """ - КАТАЛОГ ПРОФИЛЕЙ: страница со списком производителей и моделей (марками) профилей - - :param request: HttpRequest -- входящий http-запрос - :return response: HttpResponse -- исходящий http-ответ - """ - time_start = time.time() - # Берём только те поля, которые реально нужны для построения страницы каталога. - # Это позволяет не тащить лишние данные из БД и сразу работать с простыми словарями. - profile_rows = list( - PVCprofiles.objects.values( - "id", - "sProfileName", - "sProfileBriefDescription", - "sProfileManufacturer", - ).order_by("sProfileManufacturer", "sProfileBriefDescription") - ) - profile_count = len(profile_rows) - to_template = { - 'CATALOG_PROFILE_NUM': pytils.numeral.get_plural(profile_count, "профиль,профиля,профилей") - } - # Локальный помощник: slug нужен несколько раз, а повторять одну и ту же строку не хочется. - def make_slug(value: str) -> str: - return pytils.translit.slugify(value).lower() - - list_profile_manufactures = [] - tmp_profile_manufacture = "" - for profile in profile_rows: - if profile["sProfileManufacturer"] == "": - # Пустой производитель в каталоге только мешает: не создаём для него отдельную группу. - continue - - if tmp_profile_manufacture != profile["sProfileManufacturer"]: - # Новый производитель — открываем новую группу карточек. - tmp_profile_manufacture = profile["sProfileManufacturer"] - list_profile_manufactures.append({ - "PROF_MAN_ID": profile["id"], - "PROF_MAN": profile["sProfileManufacturer"], - "PROF_MAN_T": make_slug(profile["sProfileManufacturer"]), - "PROF_MAN_LIST": [{ - "PROF_NAME_ID": profile["id"], - "PROF_NAME": profile["sProfileBriefDescription"], - "PROF_NAME_T": make_slug(profile["sProfileName"]), - }] - }) - else: - # Если производитель уже встречался, просто дописываем новую модель в его список. - list_profile_manufactures[-1]["PROF_MAN_LIST"].append({ - "PROF_NAME_ID": profile["id"], - "PROF_NAME": profile["sProfileBriefDescription"], - "PROF_NAME_T": make_slug(profile["sProfileName"]), - }) - - to_template.update({ - 'CATALOG_PROFILE_MAN1_NAME2': list_profile_manufactures, - 'CATALOG_MANUFACT_NUM': len(list_profile_manufactures), - 'CATALOG_MANUFACT_NUM_W': - pytils.numeral.sum_string(len(list_profile_manufactures), pytils.numeral.MALE, ("производитель", - "производителя", - "производителей")), - 'LAST_VISIT': get_last_user_visit_list(get_last_user_visit_cookies(request)[:3]), - 'LOG_VISIT': get_last_all_user_visit_list(), - 'ticks': float(time.time() - time_start), - }) - return render(request, "catalog/catalog_of_profiles.html", to_template) - - -def catalog_profile_model(request: HttpRequest, manufacture_id: int, manufacture_name: str, - model_id: int, 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() - manufacture_id = int(manufacture_id) - model_id = int(model_id) - q_pvc_by_id = PVCprofiles.objects.get(id=model_id) - manufacturer_slug = pytils.translit.slugify(q_pvc_by_id.sProfileManufacturer) - model_slug = pytils.translit.slugify(q_pvc_by_id.sProfileName) - if manufacturer_slug != manufacture_name \ - or model_slug != model_name \ - or manufacture_id != model_id: - return redirect(f"/catalog/profile/{model_id}-{manufacturer_slug}/" - f"{model_id}-{model_slug}") - - # Локальные помощники держат вьюху короче и не размазывают однотипную логику по коду. - def make_slug(value: str) -> str: - return pytils.translit.slugify(value).lower() - - def build_other_list(value: str) -> list[str]: - # Убираем пустые куски, чтобы не плодить «пустые» характеристики в шаблоне. - result = [] - for chunk in (part.strip() for part in value.split(";")): - if not chunk: - continue - if ":" in chunk: - head, tail = chunk.split(":", 1) - result.append(f"{head.strip()}:{tail.strip()}") - else: - result.append(f"{chunk}") - return result - - def update_pub_dat(current_pub_dat: datetime | None, candidate_pub_dat: datetime | None) -> datetime | None: - # На странице оставляем дату публикации/обновления только если она реально новее карточки профиля. - if candidate_pub_dat is None: - return current_pub_dat - if current_pub_dat is None or candidate_pub_dat.replace(tzinfo=None) > current_pub_dat.replace(tzinfo=None): - return candidate_pub_dat - return current_pub_dat - - def apply_rating_colors(rating: dict, rating_pairs: tuple[tuple[str, str], ...], multiplier: int, - gray: bool = False) -> None: - # Один маленький helper вместо россыпи почти одинаковых строк: меняется только множитель и формат RGB. - for rating_key, template_key in rating_pairs: - color = int(255 - rating[rating_key] * multiplier) - if gray: - to_template[template_key] = f"{color},{color},{color}" - else: - to_template[template_key] = f"{color},255,{color}" - - def merchant_row_to_dict(row: dict) -> dict: - # Один маппер для строки с партнёром: ключи шаблона остаются как были. - merchant_name = row["kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__sMerchantName"] - return { - "MERCHANT_ID": row["kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__id"], - "MERCHANT_NAME": merchant_name, - "MERCHANT_NAME_T": make_slug(merchant_name), - "MERCHANT_LOGO_URL": row["kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__pMerchantLogo"], - "MERCHANT_OFFERS": row["offers_by_merchant"], - } - - def profile_row_to_dict(profile: dict) -> dict: - # И то же самое для списка соседних профилей производителя. - return { - "PROFILE_NAME": profile["sProfileBriefDescription"], - "PROFILE_ID": profile["id"], - "PROFILE_URL": make_slug(profile["sProfileName"]), - "PROFILE_RATING": profile["fProfileRating"], - "PROFILE_RATING_STARS": get_rating_set_for_stars(profile["fProfileRating"]), - } - - to_template: dict[str, object] = {"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: - got_json = json.loads(q_pvc_by_id.sProfileDescription) - # раскрашиваем кружочки рейтинга напротив характеристик профиля - rating_pairs = ( - (RANK_PVCP_CAMERAS_NUM_NAME, "RANK_PVCP_CAMERAS_COLOR"), - (RANK_PVCP_SEALS_NAME, "RANK_PVCP_SEALS_COLOR"), - (RANK_PVCP_THICKNESS_NAME, "RANK_PVCP_THICKNESS_COLOR"), - (RANK_PVCP_G_THICKNESS_NAME, "RANK_PVCP_G_THICKNESS_COLOR"), - (RANK_PVCP_RABBET_NAME, "RANK_PVCP_RABBET_COLOR"), - (RANK_PVCP_HEAT_TRANSFER_NAME, "RANK_PVCP_HEAT_TRANSFER_COLOR"), - (RANK_PVCP_SOUNDPROOFING_NAME, "RANK_PVCP_SOUNDPROOFING_COLOR"), - (RANK_PVCP_HEIGHT_NAME, "RANK_PVCP_HEIGHT_COLOR"), - ) - if KEY_RATING in got_json: - # кружочки зелёные - apply_rating_colors(got_json[KEY_RATING], rating_pairs, 255) - elif KEY_RATING_VIRTUAL in got_json: - # кружочки серые - apply_rating_colors(got_json[KEY_RATING_VIRTUAL], rating_pairs, 64, gray=True) - else: - pass - if KEY_HTML in got_json: - to_template.update({"EXTRA_INFO": got_json[KEY_HTML]}) - except (TypeError, ValueError, KeyError): - pass - to_template.update({"LIST_OTHER": build_other_list(q_pvc_by_id.sProfileOther)}) - # Партнёров считаем через ORM: так код проще читать и легче переносить между СУБД. - q_merchant = ( - PriceOffer.objects.filter( - kOffer2SetKit__kSet2PVCprofiles_id=model_id, - sOfferActive=True, - ) - .values( - "kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__id", - "kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__sMerchantName", - "kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__pMerchantLogo", - ) - .annotate(offers_by_merchant=Count("id")) - .order_by("-offers_by_merchant", "kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__sMerchantName") - ) - to_template.update({'MERCHANTS': [merchant_row_to_dict(row) for row in q_merchant]}) - # Близкие профили этого же производителя нужны для быстрых переходов по карточкам. - q_profiles = ( - PVCprofiles.objects.filter(sProfileManufacturer=q_pvc_by_id.sProfileManufacturer) - .exclude(id=model_id) - .values("id", "fProfileRating", "sProfileBriefDescription", "sProfileName") - .order_by("fProfileRating") - ) - to_template.update({'PROFILES': [profile_row_to_dict(profile) for profile in q_profiles]}) - # Описание профиля берём через связку каталог -> блог: это один ORM-запрос вместо сырого SQL. - q_profiles_detail = ( - Catalog2Profile.objects.filter( - kProfile_id=model_id, - sCatalogCardType=CATALOG_RECORD_FOR_PROFILE_MODEL, - kBlogCatalog__isnull=False, - ) - .select_related("kBlogCatalog") - .order_by("kBlogCatalog__iCatalogSort") - ) - profile_blog_posts = [row.kBlogCatalog for row in q_profiles_detail if row.kBlogCatalog is not None] - to_template.update({'PROFILE_DETAIL': profile_blog_posts}) - # Картинка и дата публикации для meta-тегов берутся из связанного блога, если он есть. - if profile_blog_posts: - for blog_post in profile_blog_posts: - if blog_post.sImgForBlogSocial: - to_template['IMG_FOR_BLOG'] = blog_post.sImgForBlogSocial - break - - pub_dat: datetime = q_pvc_by_id.dProfileModify - if profile_blog_posts: - profile_blog_dat: datetime | None = max((post.dPostDataModify for post in profile_blog_posts), default=pub_dat) - pub_dat = update_pub_dat(pub_dat, profile_blog_dat) or pub_dat - to_template['PUB_DAT'] = pub_dat - to_template.update( - { - 'LAST_VISIT': get_last_user_visit_list(get_last_user_visit_cookies(request)[:3]), - 'LOG_VISIT': get_last_all_user_visit_list(), - 'ticks': float(time.time() - time_start), - } - ) - return render(request, "catalog/catalog_of_profiles_model.html", to_template) - - -def catalog_profile_manufacture(request: HttpRequest, manufacture_id: int, manufacture_name: str) -> HttpResponse: - """ - КАТАЛОГ ПРОФИЛЕЙ: страница с описанием производителя профилей и списком марки производимых им профилей - - :param request: HttpRequest -- входящий http-запрос - :param manufacture_id: id профиля. Предполагается, что это первый id при сортировке по sProfileBriefDescription - :param manufacture_name: название производителя (транслитерированное pytils.translit.slugify()) - :return response: HttpResponse -- исходящий http-ответ - """ - time_start = time.time() - manufacture_id = int(manufacture_id) - q_pvc_by_id = PVCprofiles.objects.get(id=manufacture_id) - if pytils.translit.slugify(q_pvc_by_id.sProfileManufacturer) != manufacture_name: - return redirect(f'/catalog/profile/{manufacture_id}-' - f'{pytils.translit.slugify(q_pvc_by_id.sProfileManufacturer)}') - else: - q_pvc_by_id = PVCprofiles.objects.order_by('id') \ - .filter(sProfileManufacturer=q_pvc_by_id.sProfileManufacturer).first() - if q_pvc_by_id.id != manufacture_id: - return redirect(f'/catalog/profile/{q_pvc_by_id.id}-' - f'{pytils.translit.slugify(q_pvc_by_id.sProfileManufacturer)}') - to_template = {'CATALOG_MANUFACT': q_pvc_by_id.sProfileManufacturer, - 'CATALOG_MAN2URL': manufacture_name, - 'CATALOG_URL': f"{manufacture_id}-{manufacture_name}"} - try: - # получаем информацию о производителе (статью из блога) - manufacture_description = list(PVCprofiles.objects.raw( - f"SELECT " - f" oknardia_blogposts.* " - f"FROM oknardia_catalog2profile" - f" RIGHT OUTER JOIN oknardia_pvcprofiles" - f" ON oknardia_catalog2profile.kProfile_id = oknardia_pvcprofiles.id" - f" LEFT OUTER JOIN oknardia_blogposts" - f" ON oknardia_catalog2profile.kBlogCatalog_id = oknardia_blogposts.id " - f"WHERE oknardia_catalog2profile.sCatalogCardType = {CATALOG_RECORD_FOR_PROFILE_MANUFACTURER} " - f" AND oknardia_pvcprofiles.sProfileManufacturer = '{q_pvc_by_id.sProfileManufacturer}'" - f" AND oknardia_blogposts.bCatalog IS TRUE " - f"GROUP BY oknardia_blogposts.bCatalog " - f"LIMIT 1;" - ))[0] - to_template.update({'PUB_DAT': manufacture_description.dPostDataModify}) - if PATH_FOR_IMG_BLOG in manufacture_description.sImgForBlogSocial: - to_template.update({'IMG_FOR_BLOG': manufacture_description.sImgForBlogSocial}) - to_template.update({'HEADER': manufacture_description.sPostHeader, - 'CONTENT': re.sub(r'', '', manufacture_description.sPostContent, - 0, re.IGNORECASE)}) - to_template.update({'TIZER': re.sub(r'||', - '', to_template["CONTENT"], 0, re.IGNORECASE)}) - except (ObjectDoesNotExist, IndexError, TypeError, KeyError,): - pass - 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 = '{q_pvc_by_id.sProfileManufacturer}' " - f"ORDER BY oknardia_pvcprofiles.fProfileRating;" - ) - list_profiles = [] - for i in q_profiles: - 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}) - try: - q_share_of_offers = list(PVCprofiles.objects.raw( - f"SELECT" - f" 1 AS id," - f" SUM(Q1.offers_by_model) AS offers_by_maufacture," - f" Q2.tatal_offers-SUM(Q1.offers_by_model) AS offers_other " - f"FROM (SELECT COUNT(oknardia_priceoffer.id) AS offers_by_model" - f" FROM oknardia_priceoffer" - f" LEFT OUTER JOIN oknardia_setkit" - f" ON oknardia_priceoffer.kOffer2SetKit_id = oknardia_setkit.id" - f" RIGHT OUTER JOIN oknardia_pvcprofiles" - f" ON oknardia_setkit.kSet2PVCprofiles_id = oknardia_pvcprofiles.id" - f" WHERE oknardia_pvcprofiles.sProfileManufacturer = '{q_pvc_by_id.sProfileManufacturer}') Q1," - f" (SELECT COUNT(oknardia_priceoffer.id) AS tatal_offers" - f" FROM oknardia_priceoffer) AS Q2 " - f"LIMIT 1;" - ))[0] - to_template.update({ - 'OFFERS_BY_MAUFACTURE': q_share_of_offers.offers_by_maufacture, - 'OFFERS_OTHER': q_share_of_offers.offers_other, - 'OFFERS_ANGLE': 90 + 180 * normalize(q_share_of_offers.offers_by_maufacture, - q_share_of_offers.offers_other + q_share_of_offers.offers_by_maufacture) - }) - if q_share_of_offers is not None and q_share_of_offers.offers_by_maufacture != 0: - 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.sProfileManufacturer = '{q_pvc_by_id.sProfileManufacturer}' " - 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}) - except (ObjectDoesNotExist, IndexError, TypeError): # вообще-то, запрос q_share_of_offers всегда что-то вернёт, - pass # но на всякий случай - 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, "catalog/catalog_of_profiles_manufacture.html", to_template) - - # Каталог типовый серий зданий (пока переадресация) def catalog_seria(request: HttpRequest) -> HttpResponse: """ diff --git a/oknardia/web/catalog_profiles.py b/oknardia/web/catalog_profiles.py new file mode 100644 index 0000000..8a47fd2 --- /dev/null +++ b/oknardia/web/catalog_profiles.py @@ -0,0 +1,389 @@ +# -*- coding: utf-8 -*- + +from datetime import datetime +from django.core.exceptions import ObjectDoesNotExist +from django.db.models import Count +from django.shortcuts import render, redirect +from django.http import HttpRequest, HttpResponse +from oknardia.settings import * +from oknardia.models import Catalog2Profile, PVCprofiles, PriceOffer +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 json +import re +import pytils + +def catalog_profile(request: HttpRequest) -> HttpResponse: + """ + КАТАЛОГ ПРОФИЛЕЙ: страница со списком производителей и моделей (марками) профилей + + :param request: HttpRequest -- входящий http-запрос + :return response: HttpResponse -- исходящий http-ответ + """ + time_start = time.time() + # Берём только те поля, которые реально нужны для построения страницы каталога. + # Это позволяет не тащить лишние данные из БД и сразу работать с простыми словарями. + profile_rows = list( + PVCprofiles.objects.values( + "id", + "sProfileName", + "sProfileBriefDescription", + "sProfileManufacturer", + ).order_by("sProfileManufacturer", "sProfileBriefDescription") + ) + profile_count = len(profile_rows) + to_template = { + 'CATALOG_PROFILE_NUM': pytils.numeral.get_plural(profile_count, "профиль,профиля,профилей") + } + # Локальный помощник: slug нужен несколько раз, а повторять одну и ту же строку не хочется. + def make_slug(value: str) -> str: + return pytils.translit.slugify(value).lower() + + list_profile_manufactures = [] + tmp_profile_manufacture = "" + for profile in profile_rows: + if profile["sProfileManufacturer"] == "": + # Пустой производитель в каталоге только мешает: не создаём для него отдельную группу. + continue + + if tmp_profile_manufacture != profile["sProfileManufacturer"]: + # Новый производитель — открываем новую группу карточек. + tmp_profile_manufacture = profile["sProfileManufacturer"] + list_profile_manufactures.append({ + "PROF_MAN_ID": profile["id"], + "PROF_MAN": profile["sProfileManufacturer"], + "PROF_MAN_T": make_slug(profile["sProfileManufacturer"]), + "PROF_MAN_LIST": [{ + "PROF_NAME_ID": profile["id"], + "PROF_NAME": profile["sProfileBriefDescription"], + "PROF_NAME_T": make_slug(profile["sProfileName"]), + }] + }) + else: + # Если производитель уже встречался, просто дописываем новую модель в его список. + list_profile_manufactures[-1]["PROF_MAN_LIST"].append({ + "PROF_NAME_ID": profile["id"], + "PROF_NAME": profile["sProfileBriefDescription"], + "PROF_NAME_T": make_slug(profile["sProfileName"]), + }) + + to_template.update({ + 'CATALOG_PROFILE_MAN1_NAME2': list_profile_manufactures, + 'CATALOG_MANUFACT_NUM': len(list_profile_manufactures), + 'CATALOG_MANUFACT_NUM_W': + pytils.numeral.sum_string(len(list_profile_manufactures), pytils.numeral.MALE, ("производитель", + "производителя", + "производителей")), + 'LAST_VISIT': get_last_user_visit_list(get_last_user_visit_cookies(request)[:3]), + 'LOG_VISIT': get_last_all_user_visit_list(), + 'ticks': float(time.time() - time_start), + }) + return render(request, "catalog/catalog_of_profiles.html", to_template) + + +def catalog_profile_model(request: HttpRequest, manufacture_id: int, manufacture_name: str, + model_id: int, 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() + manufacture_id = int(manufacture_id) + model_id = int(model_id) + q_pvc_by_id = PVCprofiles.objects.get(id=model_id) + manufacturer_slug = pytils.translit.slugify(q_pvc_by_id.sProfileManufacturer) + model_slug = pytils.translit.slugify(q_pvc_by_id.sProfileName) + if manufacturer_slug != manufacture_name \ + or model_slug != model_name \ + or manufacture_id != model_id: + return redirect(f"/catalog/profile/{model_id}-{manufacturer_slug}/" + f"{model_id}-{model_slug}") + + # Локальные помощники держат вьюху короче и не размазывают однотипную логику по коду. + def make_slug(value: str) -> str: + return pytils.translit.slugify(value).lower() + + def build_other_list(value: str) -> list[str]: + # Убираем пустые куски, чтобы не плодить «пустые» характеристики в шаблоне. + result = [] + for chunk in (part.strip() for part in value.split(";")): + if not chunk: + continue + if ":" in chunk: + head, tail = chunk.split(":", 1) + result.append(f"{head.strip()}:{tail.strip()}") + else: + result.append(f"{chunk}") + return result + + def update_pub_dat(current_pub_dat: datetime | None, candidate_pub_dat: datetime | None) -> datetime | None: + # На странице оставляем дату публикации/обновления только если она реально новее карточки профиля. + if candidate_pub_dat is None: + return current_pub_dat + if current_pub_dat is None or candidate_pub_dat.replace(tzinfo=None) > current_pub_dat.replace(tzinfo=None): + return candidate_pub_dat + return current_pub_dat + + def apply_rating_colors(rating: dict, rating_pairs: tuple[tuple[str, str], ...], multiplier: int, + gray: bool = False) -> None: + # Один маленький helper вместо россыпи почти одинаковых строк: меняется только множитель и формат RGB. + for rating_key, template_key in rating_pairs: + color = int(255 - rating[rating_key] * multiplier) + if gray: + to_template[template_key] = f"{color},{color},{color}" + else: + to_template[template_key] = f"{color},255,{color}" + + def merchant_row_to_dict(row: dict) -> dict: + # Один маппер для строки с партнёром: ключи шаблона остаются как были. + merchant_name = row["kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__sMerchantName"] + return { + "MERCHANT_ID": row["kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__id"], + "MERCHANT_NAME": merchant_name, + "MERCHANT_NAME_T": make_slug(merchant_name), + "MERCHANT_LOGO_URL": row["kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__pMerchantLogo"], + "MERCHANT_OFFERS": row["offers_by_merchant"], + } + + def profile_row_to_dict(profile: dict) -> dict: + # И то же самое для списка соседних профилей производителя. + return { + "PROFILE_NAME": profile["sProfileBriefDescription"], + "PROFILE_ID": profile["id"], + "PROFILE_URL": make_slug(profile["sProfileName"]), + "PROFILE_RATING": profile["fProfileRating"], + "PROFILE_RATING_STARS": get_rating_set_for_stars(profile["fProfileRating"]), + } + + to_template: dict[str, object] = {"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: + got_json = json.loads(q_pvc_by_id.sProfileDescription) + # раскрашиваем кружочки рейтинга напротив характеристик профиля + rating_pairs = ( + (RANK_PVCP_CAMERAS_NUM_NAME, "RANK_PVCP_CAMERAS_COLOR"), + (RANK_PVCP_SEALS_NAME, "RANK_PVCP_SEALS_COLOR"), + (RANK_PVCP_THICKNESS_NAME, "RANK_PVCP_THICKNESS_COLOR"), + (RANK_PVCP_G_THICKNESS_NAME, "RANK_PVCP_G_THICKNESS_COLOR"), + (RANK_PVCP_RABBET_NAME, "RANK_PVCP_RABBET_COLOR"), + (RANK_PVCP_HEAT_TRANSFER_NAME, "RANK_PVCP_HEAT_TRANSFER_COLOR"), + (RANK_PVCP_SOUNDPROOFING_NAME, "RANK_PVCP_SOUNDPROOFING_COLOR"), + (RANK_PVCP_HEIGHT_NAME, "RANK_PVCP_HEIGHT_COLOR"), + ) + if KEY_RATING in got_json: + # кружочки зелёные + apply_rating_colors(got_json[KEY_RATING], rating_pairs, 255) + elif KEY_RATING_VIRTUAL in got_json: + # кружочки серые + apply_rating_colors(got_json[KEY_RATING_VIRTUAL], rating_pairs, 64, gray=True) + else: + pass + if KEY_HTML in got_json: + to_template.update({"EXTRA_INFO": got_json[KEY_HTML]}) + except (TypeError, ValueError, KeyError): + pass + to_template.update({"LIST_OTHER": build_other_list(q_pvc_by_id.sProfileOther)}) + # Партнёров считаем через ORM: так код проще читать и легче переносить между СУБД. + q_merchant = ( + PriceOffer.objects.filter( + kOffer2SetKit__kSet2PVCprofiles_id=model_id, + sOfferActive=True, + ) + .values( + "kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__id", + "kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__sMerchantName", + "kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__pMerchantLogo", + ) + .annotate(offers_by_merchant=Count("id")) + .order_by("-offers_by_merchant", "kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__sMerchantName") + ) + to_template.update({'MERCHANTS': [merchant_row_to_dict(row) for row in q_merchant]}) + # Близкие профили этого же производителя нужны для быстрых переходов по карточкам. + q_profiles = ( + PVCprofiles.objects.filter(sProfileManufacturer=q_pvc_by_id.sProfileManufacturer) + .exclude(id=model_id) + .values("id", "fProfileRating", "sProfileBriefDescription", "sProfileName") + .order_by("fProfileRating") + ) + to_template.update({'PROFILES': [profile_row_to_dict(profile) for profile in q_profiles]}) + # Описание профиля берём через связку каталог -> блог: это один ORM-запрос вместо сырого SQL. + q_profiles_detail = ( + Catalog2Profile.objects.filter( + kProfile_id=model_id, + sCatalogCardType=CATALOG_RECORD_FOR_PROFILE_MODEL, + kBlogCatalog__isnull=False, + ) + .select_related("kBlogCatalog") + .order_by("kBlogCatalog__iCatalogSort") + ) + profile_blog_posts = [row.kBlogCatalog for row in q_profiles_detail if row.kBlogCatalog is not None] + to_template.update({'PROFILE_DETAIL': profile_blog_posts}) + # Картинка и дата публикации для meta-тегов берутся из связанного блога, если он есть. + if profile_blog_posts: + for blog_post in profile_blog_posts: + if blog_post.sImgForBlogSocial: + to_template['IMG_FOR_BLOG'] = blog_post.sImgForBlogSocial + break + + pub_dat: datetime = q_pvc_by_id.dProfileModify + if profile_blog_posts: + profile_blog_dat: datetime | None = max((post.dPostDataModify for post in profile_blog_posts), default=pub_dat) + pub_dat = update_pub_dat(pub_dat, profile_blog_dat) or pub_dat + to_template['PUB_DAT'] = pub_dat + to_template.update( + { + 'LAST_VISIT': get_last_user_visit_list(get_last_user_visit_cookies(request)[:3]), + 'LOG_VISIT': get_last_all_user_visit_list(), + 'ticks': float(time.time() - time_start), + } + ) + return render(request, "catalog/catalog_of_profiles_model.html", to_template) + + +def catalog_profile_manufacture(request: HttpRequest, manufacture_id: int, manufacture_name: str) -> HttpResponse: + """ + КАТАЛОГ ПРОФИЛЕЙ: страница с описанием производителя профилей и списком марки производимых им профилей + + :param request: HttpRequest -- входящий http-запрос + :param manufacture_id: id профиля. Предполагается, что это первый id при сортировке по sProfileBriefDescription + :param manufacture_name: название производителя (транслитерированное pytils.translit.slugify()) + :return response: HttpResponse -- исходящий http-ответ + """ + time_start = time.time() + manufacture_id = int(manufacture_id) + q_pvc_by_id = PVCprofiles.objects.get(id=manufacture_id) + if pytils.translit.slugify(q_pvc_by_id.sProfileManufacturer) != manufacture_name: + return redirect(f'/catalog/profile/{manufacture_id}-' + f'{pytils.translit.slugify(q_pvc_by_id.sProfileManufacturer)}') + else: + q_pvc_by_id = PVCprofiles.objects.order_by('id') \ + .filter(sProfileManufacturer=q_pvc_by_id.sProfileManufacturer).first() + if q_pvc_by_id.id != manufacture_id: + return redirect(f'/catalog/profile/{q_pvc_by_id.id}-' + f'{pytils.translit.slugify(q_pvc_by_id.sProfileManufacturer)}') + to_template = {'CATALOG_MANUFACT': q_pvc_by_id.sProfileManufacturer, + 'CATALOG_MAN2URL': manufacture_name, + 'CATALOG_URL': f"{manufacture_id}-{manufacture_name}"} + try: + # получаем информацию о производителе (статью из блога) + manufacture_description = list(PVCprofiles.objects.raw( + f"SELECT " + f" oknardia_blogposts.* " + f"FROM oknardia_catalog2profile" + f" RIGHT OUTER JOIN oknardia_pvcprofiles" + f" ON oknardia_catalog2profile.kProfile_id = oknardia_pvcprofiles.id" + f" LEFT OUTER JOIN oknardia_blogposts" + f" ON oknardia_catalog2profile.kBlogCatalog_id = oknardia_blogposts.id " + f"WHERE oknardia_catalog2profile.sCatalogCardType = {CATALOG_RECORD_FOR_PROFILE_MANUFACTURER} " + f" AND oknardia_pvcprofiles.sProfileManufacturer = '{q_pvc_by_id.sProfileManufacturer}'" + f" AND oknardia_blogposts.bCatalog IS TRUE " + f"GROUP BY oknardia_blogposts.bCatalog " + f"LIMIT 1;" + ))[0] + to_template.update({'PUB_DAT': manufacture_description.dPostDataModify}) + if PATH_FOR_IMG_BLOG in manufacture_description.sImgForBlogSocial: + to_template.update({'IMG_FOR_BLOG': manufacture_description.sImgForBlogSocial}) + to_template.update({'HEADER': manufacture_description.sPostHeader, + 'CONTENT': re.sub(r'', '', manufacture_description.sPostContent, + 0, re.IGNORECASE)}) + to_template.update({'TIZER': re.sub(r'||', + '', to_template["CONTENT"], 0, re.IGNORECASE)}) + except (ObjectDoesNotExist, IndexError, TypeError, KeyError,): + pass + 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 = '{q_pvc_by_id.sProfileManufacturer}' " + f"ORDER BY oknardia_pvcprofiles.fProfileRating;" + ) + list_profiles = [] + for i in q_profiles: + 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}) + try: + q_share_of_offers = list(PVCprofiles.objects.raw( + f"SELECT" + f" 1 AS id," + f" SUM(Q1.offers_by_model) AS offers_by_maufacture," + f" Q2.tatal_offers-SUM(Q1.offers_by_model) AS offers_other " + f"FROM (SELECT COUNT(oknardia_priceoffer.id) AS offers_by_model" + f" FROM oknardia_priceoffer" + f" LEFT OUTER JOIN oknardia_setkit" + f" ON oknardia_priceoffer.kOffer2SetKit_id = oknardia_setkit.id" + f" RIGHT OUTER JOIN oknardia_pvcprofiles" + f" ON oknardia_setkit.kSet2PVCprofiles_id = oknardia_pvcprofiles.id" + f" WHERE oknardia_pvcprofiles.sProfileManufacturer = '{q_pvc_by_id.sProfileManufacturer}') Q1," + f" (SELECT COUNT(oknardia_priceoffer.id) AS tatal_offers" + f" FROM oknardia_priceoffer) AS Q2 " + f"LIMIT 1;" + ))[0] + to_template.update({ + 'OFFERS_BY_MAUFACTURE': q_share_of_offers.offers_by_maufacture, + 'OFFERS_OTHER': q_share_of_offers.offers_other, + 'OFFERS_ANGLE': 90 + 180 * normalize(q_share_of_offers.offers_by_maufacture, + q_share_of_offers.offers_other + q_share_of_offers.offers_by_maufacture) + }) + if q_share_of_offers is not None and q_share_of_offers.offers_by_maufacture != 0: + 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.sProfileManufacturer = '{q_pvc_by_id.sProfileManufacturer}' " + 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}) + except (ObjectDoesNotExist, IndexError, TypeError): # вообще-то, запрос q_share_of_offers всегда что-то вернёт, + pass # но на всякий случай + 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, "catalog/catalog_of_profiles_manufacture.html", to_template) \ No newline at end of file From 026a2a74ab85d8d070360de2b1b966c62adbf1cd Mon Sep 17 00:00:00 2001 From: erjemin Date: Mon, 20 Apr 2026 01:02:16 +0300 Subject: [PATCH 017/102] =?UTF-8?q?=20fix:=20=D1=8F=D0=B2=D0=BD=D0=BE?= =?UTF-8?q?=D0=B5=20=D1=83=D0=BA=D0=B0=D0=B7=D0=B0=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D1=82=D0=B8=D0=BF=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oknardia/web/catalog_profiles.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/oknardia/web/catalog_profiles.py b/oknardia/web/catalog_profiles.py index 8a47fd2..afa384a 100644 --- a/oknardia/web/catalog_profiles.py +++ b/oknardia/web/catalog_profiles.py @@ -33,7 +33,8 @@ def catalog_profile(request: HttpRequest) -> HttpResponse: ).order_by("sProfileManufacturer", "sProfileBriefDescription") ) profile_count = len(profile_rows) - to_template = { + # В этом контексте смешанные типы значений (str/int/list/float), поэтому задаём общий тип явно. + to_template: dict[str, object] = { 'CATALOG_PROFILE_NUM': pytils.numeral.get_plural(profile_count, "профиль,профиля,профилей") } # Локальный помощник: slug нужен несколько раз, а повторять одну и ту же строку не хочется. @@ -386,4 +387,5 @@ def catalog_profile_manufacture(request: HttpRequest, manufacture_id: int, manuf 'LOG_VISIT': get_last_all_user_visit_list(), 'ticks': float(time.time() - time_start) }) - return render(request, "catalog/catalog_of_profiles_manufacture.html", to_template) \ No newline at end of file + return render(request, "catalog/catalog_of_profiles_manufacture.html", to_template) + From 6016247718997343399cc35c25d1c1b6b48b5d61 Mon Sep 17 00:00:00 2001 From: erjemin Date: Mon, 20 Apr 2026 22:23:42 +0300 Subject: [PATCH 018/102] mod: split catalog modules and refactor profile manufacture view --- README.md | 2 + oknardia/oknardia/urls.py | 22 +- oknardia/web/catalog.py | 630 +----------------------------- oknardia/web/catalog_companies.py | 161 ++++++++ oknardia/web/catalog_openings.py | 82 ++++ oknardia/web/catalog_profiles.py | 271 ++++++------- oknardia/web/catalog_series.py | 404 +++++++++++++++++++ oknardia/web/catalog_utils.py | 0 oknardia/web/diagrams.py | 2 +- 9 files changed, 782 insertions(+), 792 deletions(-) create mode 100644 oknardia/web/catalog_companies.py create mode 100644 oknardia/web/catalog_openings.py create mode 100644 oknardia/web/catalog_series.py create mode 100644 oknardia/web/catalog_utils.py diff --git a/README.md b/README.md index 9e8f0de..c458d3b 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,9 @@ * Проект получает настройки и секреты через переменные окружения (`.env`) вместо `my_secret*.py`. * Рефакторинг создания `sitemap.xml`: raw ⟶ ORM, создание через Django-команду `generate_sitemaps` в медиа-файлы. * Рефакторинг URL `/catalog/profil/`: raw SQL ⟶ ORM, убран `last_update`, измененs SEO `description` и `keywords`. +* Распилен `oknardia/web/catalog.py` на тематические модули (`catalog_companies.py`, `catalog_profiles.py`, `catalog_series.py`, `catalog_openings.py`) с вынесением общей логики в `catalog_utils.py`; маршруты обновлены без изменения внешних URL. * Рефакторинг `catalog_profile_model` (`/catalog/profile/...`): raw SQL ⟶ ORM, упрощена логика, вынесены helper-функции, сокращено дублирование расчёта цветов рейтинга, нормализована подготовка `LIST_OTHER`/`MERCHANTS`/`PROFILES`/`PROFILE_DETAIL`, сохранена совместимость шаблонов. +* Рефакторинг `catalog_profile_manufacture` (`/catalog/profile/-`): упрощена валидация URL, убран дублирующий код маппинга для `PROFILES` и `MERCHANTS` через общие хелперы, стандартизирован хвост контекста (`LAST_VISIT`, `LOG_VISIT`, `ticks`) через `_append_visit_context`. #### Планы, задачи, маркеры и идеи на будущее: diff --git a/oknardia/oknardia/urls.py b/oknardia/oknardia/urls.py index cb058f5..da344b5 100644 --- a/oknardia/oknardia/urls.py +++ b/oknardia/oknardia/urls.py @@ -19,7 +19,8 @@ from django.urls import include, path, re_path from django.conf.urls.static import static from oknardia.settings import * from web import views, autocomplete_addr, user_manager, blog, diagrams, report1, report2, catalog, prices, service, \ - catalog_profiles + catalog_profiles, catalog_series, catalog_openings, catalog_companies + urlpatterns = [ path('admin/', admin.site.urls), @@ -55,23 +56,26 @@ urlpatterns = [ re_path(r'^stat/series/geo[/*]$', 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), - # --- --- Каталог профилей + # --- --- КАТАЛОГ ПРОФИЛЕЙ re_path(r'^catalog/profile[/*]$', catalog_profiles.catalog_profile), re_path(r'^catalog/profile/(?P\d+)-(?P\S*)' - r'/(?P\d+)-(?P\S*)[/*]$', catalog_profiles.catalog_profile_model), + r'/(?P\d+)-(?P\S*)[/*]$', + catalog_profiles.catalog_profile_model), re_path(r'^catalog/profile/(?P\d+)-(?P\S*)[/*]$', catalog_profiles.catalog_profile_manufacture), # --- --- Каталог серий типового строительства - re_path(r'^catalog/seria[/*]$', catalog.catalog_seria), - re_path(r'^catalog/seria/(?P[^/]*)/all(?P\d+)[/*]$', catalog.catalog_seria_info), + re_path(r'^catalog/seria[/*]$', catalog_series.catalog_seria), + re_path(r'^catalog/seria/(?P[^/]*)/all(?P\d+)[/*]$', + catalog_series.catalog_seria_info), re_path(r'^seria_[^/]*/all(?P\d+)/\S*$', catalog.report_all_info_seria_redirect), # для старых ссылок # --- --- Каталог стандартных проёмов и схем открывания длч типовых серий строительства - re_path(r'^catalog/standard_opening[/*]$', catalog.standard_opening), + re_path(r'^catalog/standard_opening[/*]$', catalog_openings.standard_opening), # --- --- Каталог производителей окон - re_path(r'^catalog/company[/*]$', catalog.catalog_company), - re_path(r'^catalog/company/(?P\d+)-(?P\S*)[/*]$', catalog.catalog_company_detail), + re_path(r'^catalog/company[/*]$', catalog_companies.catalog_company), + re_path(r'^catalog/company/(?P\d+)-(?P\S*)[/*]$', + catalog_companies.catalog_company_detail), # ЦЕНОВЫЕ ПРЕДЛОЖЕНИЯ # --- Одиночное окно re_path(r'^tsena-odnogo-okna/(?P\d+)x(?P\d+)mm/tip(?P\d+)[/*]$', diff --git a/oknardia/web/catalog.py b/oknardia/web/catalog.py index 5408425..526943a 100644 --- a/oknardia/web/catalog.py +++ b/oknardia/web/catalog.py @@ -1,32 +1,9 @@ # -*- coding: utf-8 -*- -from datetime import datetime -from django.core.exceptions import ObjectDoesNotExist -from django.db.models import Count from django.shortcuts import render, redirect from django.http import HttpRequest, HttpResponse -from django.template.loader import render_to_string -from django.utils import timezone -from oknardia.settings import * -from oknardia.models import ( - Catalog2Profile, - MerchantBrand, - PVCprofiles, - PriceOffer, - Seria_Info, - Win_MountDim, - Building_Info, -) +from oknardia.models import Seria_Info 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,\ - get_flaps_for_mini_pictures, touch_reload_wsgi -import django.utils.dateformat import time -import json -import random -import re -import os -import math -import pytils def catalog_root(request: HttpRequest) -> HttpResponse: @@ -46,611 +23,6 @@ def catalog_root(request: HttpRequest) -> HttpResponse: response = render(request, "catalog/catalog_root.html", to_template) return response -# Каталог типовый серий зданий (пока переадресация) -def catalog_seria(request: HttpRequest) -> HttpResponse: - """ - КАТАЛОГ ТИПОВЫЙ СЕРИЙ: страница со всеми сериями зданий в базе окнардии - - :param request: HttpRequest -- входящий http-запрос - :return response: HttpResponse -- исходящий http-ответ - """ - time_start = time.time() - try: - q_seria = Seria_Info.objects.raw('SELECT' - ' oknardia_seria_info.id,' - ' oknardia_seria_info.sURL2IMG,' - ' oknardia_seria_info.sName ' - 'FROM oknardia_seria_info ' - 'WHERE oknardia_seria_info.id = oknardia_seria_info.kRoot_id ' - 'ORDER BY oknardia_seria_info.sName;') - list_seria = [] - for i in q_seria: - list_seria.append({ - "ID": i.id, - "URL": i.sURL2IMG, - "NAME": i.sName, - "NAME_T": pytils.translit.slugify(i.sName) - }) - to_template = {'SERIAS': list_seria} - except (ObjectDoesNotExist,): - to_template = {} - 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, "catalog/catalog_seria.html", to_template) - - -def catalog_seria_info(request: HttpRequest, seria_name_translit: None, seria_id: int = 843) -> HttpResponse: - """ - КАТАЛОГ ТИПОВЫЙ СЕРИЙ: страница детальной информацией по серии зданий - - :param request: HttpRequest -- входящий http-запрос - :param seria_name_translit: str -- имя серии здания (транслитерированное pytils.translit.slugify()) - :param seria_id: int -- id серии - :return response: HttpResponse -- исходящий http-ответ - """ - time_start = time.time() - msg = "" - try: - seria_id = int(seria_id) - q_seria = Seria_Info.objects.get(id=seria_id) - if q_seria.id != q_seria.kRoot_id or seria_name_translit != pytils.translit.slugify(q_seria.sName): - return redirect(f"/catalog/seria/{pytils.translit.slugify(q_seria.sName)}/all{seria_id}") - except(ObjectDoesNotExist, ValueError,): - return redirect("/catalog/") - # если есть "облегченный" шаблон с частичным пре-рендером, то используем его. - light_template = f"{PATH_FOR_SERIA_INFO_HTML_INCLUDE}{str(seria_id)}_id.html" - light_template_w_path = f"{TEMPLATES[0]['DIRS'][0]}/{light_template}" - # print(f"{TEMPLATES[0]['DIRS'][0]}/{light_template}") - # print(light_template_w_path) - # print(light_template_w_path) - if os.path.isfile(light_template_w_path): - is_hard_template = False - else: - is_hard_template = True - to_template = {} - # получаем проемы использующиеся в данной серии домов - q_windows_in_seria = Win_MountDim.objects.raw( - f"SELECT DISTINCT" - f" oknardia_win_mountdim.iWinWidth, oknardia_win_mountdim.iWinHight," - f" oknardia_win_mountdim.sDescripion, oknardia_win_mountdim.bIsDoor," - f" oknardia_win_mountdim.bIsNearDoor, oknardia_win_mountdim.sFlapConfig," - f" oknardia_win_mountdim.iWinDepth, oknardia_win_mountdim.id," - f" 1 AS iQuantity " - f"FROM oknardia_mountdim2apartment" - f" INNER JOIN oknardia_win_mountdim" - f" ON oknardia_mountdim2apartment.kMountDim_id = oknardia_win_mountdim.id" - f" INNER JOIN oknardia_apartment_type" - f" ON oknardia_mountdim2apartment.kApartment_id = oknardia_apartment_type.id " - f"WHERE oknardia_apartment_type.kSeria_id = {seria_id}" - f" ORDER BY oknardia_win_mountdim.bIsNearDoor DESC," - f" oknardia_win_mountdim.bIsDoor DESC," - f" oknardia_win_mountdim.iWinWidth," - f" oknardia_win_mountdim.iWinHight DESC;") - if is_hard_template: - # Получаем данные для отрисовки больших картинок с проёмами и передаём в "тяжёлый" шаблон - to_template.update(get_flaps_for_big_pictures(q_windows_in_seria)) - # формируем строку для включения в SQL-запрос вида "(2,8,16,46,1)" - str_for_sql_in = "(" - for count in q_windows_in_seria: - str_for_sql_in += str(count.id) + "," - str_for_sql_in = str_for_sql_in[:-1] + ")" - # print StringForSqlIN - # Получаем данные для таблички Окон по типам квартирах в серии дома - # " IFNULL(oknardia_mountdim2apartment.iQuantity, 0) AS iQuantity," \ - # tStart2 = time.time() # замер времени - q_win_in_apartment_in_seria = Win_MountDim.objects.raw( - f"SELECT" - f" oknardia_win_mountdim.id," - f" oknardia_apartment_type.sNameApartment," - f" oknardia_win_mountdim.iWinWidth," - f" oknardia_win_mountdim.iWinHight," - f" oknardia_apartment_type.id AS id_apart," - f" IFNULL(oknardia_mountdim2apartment.iQuantity, 0) AS iQuantity," - f" COUNT(oknardia_priceoffer.id) AS NumOffers " - f"FROM oknardia_apartment_type" - f" INNER JOIN oknardia_win_mountdim" - f" LEFT OUTER JOIN oknardia_mountdim2apartment" - f" ON oknardia_mountdim2apartment.kMountDim_id = oknardia_win_mountdim.id" - f" AND oknardia_mountdim2apartment.kApartment_id = oknardia_apartment_type.id" - f" LEFT OUTER JOIN oknardia_priceoffer" - f" ON oknardia_priceoffer.kOffer2MountDim_id = oknardia_win_mountdim.id" - f" LEFT OUTER JOIN oknardia_ouruser" - f" ON oknardia_ouruser.id = oknardia_priceoffer.kOfferFromUser_id " - f"WHERE oknardia_apartment_type.kSeria_id = {seria_id} " - f"AND oknardia_win_mountdim.id IN {str_for_sql_in} " - f"GROUP BY oknardia_apartment_type.id," - f" oknardia_apartment_type.sNameApartment," - f" oknardia_win_mountdim.id," - f" oknardia_mountdim2apartment.iQuantity " - f"ORDER BY oknardia_apartment_type.iSort," - f" oknardia_win_mountdim.bIsNearDoor DESC," - f" oknardia_win_mountdim.bIsDoor DESC," - f" oknardia_win_mountdim.iWinWidth," - f" oknardia_win_mountdim.iWinHight DESC;") - list_win_in_seria = list(q_windows_in_seria) - total_column = len(list_win_in_seria) - 1 - count_column = 0 - min_offer_in_row = 1000000000 - table_of_win_in_seria_by_apartmment = [] - row_for_table = [] - offer_and_merchant_per_win = [ - { - "WIN_OFFER": 0, - "WIN_MERCHANT": 0, - "WIN_W": list_win_in_seria[i].iWinWidth, - "WIN_H": list_win_in_seria[i].iWinHight, - "WIN_ID": list_win_in_seria[i].id - } for i in range(total_column + 1)] - for count in q_win_in_apartment_in_seria: - if count.iQuantity != 0: - row_for_table.append({ - "WIN_NUM": [chr(65 + count_column)], - "WIN_Q": count.iQuantity, - "WIN_ID": count.id, - "WIN_WIDTH": list_win_in_seria[count_column].iWinWidth, - "WIN_HEIGHT": list_win_in_seria[count_column].iWinHight, - "WIN_DESCRIPTION": list_win_in_seria[count_column].sDescripion, - "WIN_FLAPCFG": list_win_in_seria[count_column].sFlapConfig - }) - if min_offer_in_row > count.NumOffers: - min_offer_in_row = count.NumOffers - if offer_and_merchant_per_win[count_column]["WIN_OFFER"] < count.NumOffers: - offer_and_merchant_per_win[count_column]["WIN_OFFER"] = count.NumOffers - else: - row_for_table.append({"WIN_NUM": "—"}) - if count_column < total_column: - count_column += 1 - else: - # print row_for_table - table_of_win_in_seria_by_apartmment.append({"WIN_IN_APART": row_for_table, - "APART_NAME": count.sNameApartment, - "APART_ID": count.id_apart, - "NUM_OFFERS": min_offer_in_row}) - count_column = 0 - min_offer_in_row = 10000 - row_for_table = [] - # print(table_of_win_in_seria_by_apartmment) - # print(f"==============>{float(time.time()-tStart2)}<==============") - # print NumOffersPerColumn, NumMerchantPerColumn - to_template.update({"WIN_OFFER_AND_MERCHANT": offer_and_merchant_per_win, - "TABLE_OF_WINDOWS": table_of_win_in_seria_by_apartmment}) - # для "тяжелого шаблона" получаем навигацию страницы, данные для карты и графика ввода в эксплуатацию - if is_hard_template: - # если вызывается "тяжелый" шаблон, то нужно подготовить тяжелые данные для построения навигации - seria_id, for_seria_nav = seria_nav(seria_id) - to_template.update(for_seria_nav) # данные для навигации по сериям - to_template.update(seria_info_year(seria_id)) # данные для графика ввода зданий серии в эксплуатацию - to_template.update(seria_info_geo_code(seria_id)) # данные для карты - # т.к. обрабатывается "тяжелый шаблон" надо создать "легкий шаблон" - # для его использования в будущем. - string_prerender = render_to_string("seria_info/all_seria_info_pre_light.html", to_template) - file = open(light_template_w_path, 'w') - # file.write(AA.encode('utf-8')) - file.write(string_prerender) - file.close() - touch_reload_wsgi(light_template_w_path) - else: - seria_name = Seria_Info.objects.get(id=seria_id).sName - to_template.update({'THIS_SERIA_NAME': seria_name}) - - # to_template.update({'LOG_VISIT': GetLastAllUserVisitSeriaList(SeriaName), - # 'ticks': float(time.time()-time_start)}) - 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, light_template, to_template) - - -def seria_nav(seria_id: int = 12) -> (int, dict): - """ - Возвращает корректный seria_id и кортеж для построения навигации по сериям дома - - :param seria_id: id серии - :return: - """ - q_seria = Seria_Info.objects.raw( - 'SELECT oknardia_seria_info.id,' - ' oknardia_seria_info.sName,' - ' oknardia_seria_info.sSeriaDescription,' - ' oknardia_seria_info.kRoot_id,' - ' oknardia_seria_info.kParent_id ' - 'FROM oknardia_seria_info ' - 'WHERE oknardia_seria_info.id = oknardia_seria_info.kRoot_id ' - 'ORDER BY oknardia_seria_info.sName;') - error_seria = True - for count_seria in q_seria: - if count_seria.id == int(seria_id): - error_seria = False - break - if error_seria: - # Ошибочный seria_id. Такой базовой серии нет и надо ее найти. - try: - query = Seria_Info.objects.get(id=int(seria_id)) - if query.kRoot_id is not None: - # базовая серия прописана в kRoot_id - seria_id = query.kRoot_id - else: - # == корневой нет - # == ищем методом наименьших расстояний" - min_min = 100000000 - min_id = seria_id - for count_seria in q_seria: - if math.fabs(int(seria_id) - count_seria.id) < min_min: - min_min = math.fabs(int(seria_id) - count_seria.id) - min_id = count_seria.id - seria_id = min_id - except ObjectDoesNotExist: - seria_id = q_seria[0].id - # print(f"-->{seria_id}<--") - return all_seria_nav(seria_id, q_seria) - - -def all_seria_nav(seria_id: int, q_seria) -> (int, dict): - seria_nav_dim = [] - this_return = {} - for count_seria in q_seria: - one_seria = {} - one_seria.update({"SERIA_R": count_seria.sName, "ID2URL": count_seria.id}) - if count_seria.id == seria_id: - this_return.update({"THIS_SERIA_NAME": count_seria.sName, - "THIS_SERIA_DESCRIPTION": count_seria.sSeriaDescription}) - # one_seria.update({"SERIA_L": ""}) - one_seria.update({"SERIA_L": pytils.translit.slugify(count_seria.sName)}) - else: - one_seria.update({"SERIA_L": pytils.translit.slugify(count_seria.sName)}) - seria_nav_dim.append(one_seria) - this_return.update({"SERIA_NAV_DIM": seria_nav_dim}) - return seria_id, this_return - - -def seria_info_year(seria_id: int = 12) -> dict: - """ Возвращает данные для графика распределения сдачи серии в эксплуатацию - - :param seria_id: int -- id серии для которой нужно получить данные - :return: dict -- данные для графика распределения сдачи серии в эксплуатацию типа: - {"DATA4GRAPH": [{'YEAR': 1997, 'NUMS': 1, 'CLRS': '99'}, - {'YEAR': 1998, 'NUMS': 15, 'CLRS': 'сс'}, - {'YEAR': 1998, 'NUMS': 10, 'CLRS': 'a9'} - ] - } - """ - seria_in_years = [] - query = Seria_Info.objects.raw( - f"SELECT oknardia_building_info.iCommissioning_year as id," - f" COUNT(oknardia_building_info.iCommissioning_year) AS NumInYear " - f"FROM oknardia_building_info" - f" INNER JOIN oknardia_seria_info" - f" ON oknardia_building_info.kSeria_Link_id = oknardia_seria_info.id " - f"WHERE oknardia_seria_info.kRoot_id = {seria_id} " - f"GROUP BY oknardia_building_info.iCommissioning_year;" - ) - max_per_year = 0 - graph_color_light = 0xCC # самый светлый цвет на графике (максимальное значение) - graph_color_dark = 0x99 # самый темный цвет на графике (минимальное значение) - for YearCount in query: - if int(YearCount.NumInYear) > max_per_year: - max_per_year = int(YearCount.NumInYear) - # print("max", MaxPerYear) - for YearCount in query: - data_of_year = {} - try: - data_of_year.update({ - "YEAR": int(YearCount.id), - "NUMS": YearCount.NumInYear, - "CLRS": str(hex(int(graph_color_dark + YearCount.NumInYear * ( - graph_color_light - graph_color_dark) / max_per_year)))[2:] - }) - except ValueError: - continue - seria_in_years.append(data_of_year) - # print(seria_in_years) - return {"DATA4GRAPH": seria_in_years} - - -def seria_info_geo_code(seria_id: str = '12') -> dict: - """ Возвращает массив геокоординат зданий одной серии - - :param seria_id: str -- id серии для которой нужно получить данные - :return: dict -- массив геокоординат зданий серии - """ - data_return = {} - seria_to_geo = [] - municipal_m2 = 0 # муниципальный фонд (кв.м) - residential_m2 = 0 # жилой фонд (кв.м) - government_m2 = 0 # государственные учреждения занимают (кв.м.) - residents = 0 # количество жильцов - apartments = 0 # число квартиры - accounts = 0 # количество лицевых счетов - condition_max = 0 # максимальное значение показателя состояния здания - condition_min = 1000000 # минимальное значение показателя состояния здания - query = Building_Info.objects.raw( - f"SELECT" - f" oknardia_building_info.id," - f" oknardia_seria_info.kRoot_id as SerId," - f" oknardia_building_info.sAddress," - f" oknardia_building_info.fResidential_Area," - f" oknardia_building_info.fMunicipal_Area," - f" oknardia_building_info.fGovernment_Area," - f" oknardia_building_info.iNum_Residents," - f" oknardia_building_info.iNum_Apartments," - f" oknardia_building_info.iNum_Accounts," - f" oknardia_building_info.fCondition_House," - f" oknardia_building_info.fGeoCode_Latitude," - f" oknardia_building_info.fGeoCode_Longitude " - f"FROM oknardia_building_info" - f" INNER JOIN oknardia_seria_info" - f" ON oknardia_building_info.kSeria_Link_id = oknardia_seria_info.id " - f"WHERE oknardia_seria_info.kRoot_id IN ({seria_id});" - ) - for count in query: - if int(count.fGeoCode_Latitude) != 0 and int(count.fGeoCode_Longitude) != 0: - seria_to_geo.append({"LATITUDE": count.fGeoCode_Latitude, - "LONGITUDE": count.fGeoCode_Longitude, - "ADDR_ID": count.id, - "ADDR_LAT": pytils.translit.slugify(count.sAddress), - "ADDR_RUS": count.sAddress, - "SER_ID": count.SerId - }) - if count.fMunicipal_Area > 0: - municipal_m2 += count.fMunicipal_Area - if count.fResidential_Area > 0: - residential_m2 += count.fResidential_Area - if count.fGovernment_Area > 0: - government_m2 += count.fGovernment_Area - if count.iNum_Residents > 0: - residents += count.iNum_Residents - if count.iNum_Residents > 0: - residents += count.iNum_Residents - if count.iNum_Apartments > 0: - apartments += count.iNum_Apartments - if count.iNum_Accounts > 0: - accounts += count.iNum_Accounts - if count.fCondition_House > 0: - if count.fCondition_House > condition_max: - condition_max = count.fCondition_House - if count.fCondition_House < condition_min: - condition_min = count.fCondition_House - data_return.update({"DATA4GEO": seria_to_geo, - "MUNICIPAL_M2": municipal_m2, - "RESIDENTIAL_M2": residential_m2, - "GOVERNMENT_M2": government_m2, - "RESIDENTS": residents, - "APARTMENTS": apartments, - "ACCOUNTS": accounts, - "CONDITION_MAX": condition_max, - "CONDITION_MIN": condition_min}) - # print(seria_to_geo) - 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 = get_flaps_for_mini_pictures(i.sFlapConfig) - 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) - - -def catalog_company(request: HttpRequest) -> HttpResponse: - time_start = time.time() - to_template = {} # словарь, для передачи шаблону - q_company = MerchantBrand.objects.raw('SELECT' - ' oknardia_merchantbrand.id,' - ' oknardia_merchantbrand.sMerchantName,' - ' oknardia_merchantbrand.pMerchantLogo,' - ' oknardia_merchantbrand.sMerchantMainURL,' - ' COUNT(oknardia_priceoffer.id) AS NumOffers,' - ' AVG(oknardia_priceoffer.fOfferPrice) AS PriceAVG,' - ' MAX(oknardia_priceoffer.dOfferModify) AS lastUpdate,' - ' Q.NumSets,' - ' Q.RatingAVG,' - ' 1 AS STARS ' - 'FROM (SELECT' - ' COUNT(oknardia_setkit.sSetName) AS NumSets,' - ' oknardia_merchantoffice.kMerchantName_id AS Q_ID,' - ' AVG(oknardia_setkit.fSetRating) AS RatingAVG' - ' FROM oknardia_merchantoffice' - ' INNER JOIN oknardia_ouruser' - ' ON oknardia_ouruser.kMerchantOffice_id = oknardia_merchantoffice.id' - ' INNER JOIN oknardia_setkit' - ' ON oknardia_setkit.kSet2User_id = oknardia_ouruser.id' - ' GROUP BY oknardia_merchantoffice.id,' - ' oknardia_merchantoffice.kMerchantName_id) AS Q,' - ' oknardia_ouruser' - ' INNER JOIN oknardia_merchantoffice' - ' ON oknardia_ouruser.kMerchantOffice_id = oknardia_merchantoffice.id' - ' INNER JOIN oknardia_priceoffer' - ' ON oknardia_priceoffer.kOfferFromUser_id = oknardia_ouruser.id' - ' INNER JOIN oknardia_merchantbrand' - ' ON oknardia_merchantoffice.kMerchantName_id = oknardia_merchantbrand.id' - ' WHERE Q_ID = oknardia_merchantoffice.kMerchantName_id ' - 'GROUP BY oknardia_merchantoffice.kMerchantName_id ' - 'ORDER BY Q.RatingAVG DESC;') - list_company = list(q_company) - for i in list_company: - i.STARS = get_rating_set_for_stars(i.RatingAVG) - i.NumSets = pytils.numeral.get_plural(i.NumSets, u"оконный набор, оконных набора, оконных наборов") - i.NumOffers = pytils.numeral.get_plural(i.NumOffers, u"вариант, варианта, вариантов") - i.lastUpdate = pytils.dt.distance_of_time_in_words(int(django.utils.dateformat.format(i.lastUpdate, 'U'))) - i.sMerchantMainURL = pytils.translit.slugify(i.sMerchantName) - # print("NAME:", i.sMerchantName, "\tNumSets:", i.NumSets, "\tNumOffers:", i.NumOffers, - # "\t:AverageRating:", i.RatingAVG, "\tAveragePrice:", i.PriceAVG, "\tSTARS:", i.STARS) - to_template.update({ - 'COMPANIES': list_company, - # получаем последние визиты клиента через куки - '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_company.html", to_template) - - -def catalog_company_detail(request: HttpRequest, company_id: str, company_name_slug: str) -> HttpResponse: - time_start = time.time() - to_template = {} # словарь, для передачи шаблону - company_id = int(company_id) - q_by_id = MerchantBrand.objects.get(id=company_id) - if pytils.translit.slugify(q_by_id.sMerchantName) != company_name_slug: - return redirect('/catalog/company/%d-%s' % (company_id, pytils.translit.slugify(q_by_id.sMerchantName))) - to_template.update({'COMPANY': q_by_id.sMerchantName}) - to_template.update({'COMPANY_ID': company_id}) - to_template.update({'COMPANY_T': company_name_slug}) - list_not = [u"нет", u"—", ""] - to_template.update({'LIST_NOT': list_not}) - q_sets = MerchantBrand.objects.raw(f"SELECT" - f" COUNT(oknardia_priceoffer.id) AS NumOffers," - f" AVG(oknardia_priceoffer.fOfferPrice) AS priceAVG," - f" MAX(oknardia_priceoffer.dOfferModify) AS lastUpdate," - f" MIN(oknardia_priceoffer.dOfferCreate) AS earlyCreation," - f" oknardia_merchantbrand.*," - f" oknardia_merchantoffice.*," - f" oknardia_merchantoffice.id AS idMERCH," - f" oknardia_setkit.*," - f" oknardia_setkit.id AS idSET," - f" oknardia_pvcprofiles.*," - f" oknardia_pvcprofiles.id AS idPVC," - f" oknardia_glazing.*, " - f" oknardia_glazing.id AS idGLAZ " - f"FROM oknardia_ouruser" - 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" INNER JOIN oknardia_setkit" - f" ON oknardia_setkit.kSet2User_id = oknardia_ouruser.id" - f" INNER JOIN oknardia_priceoffer" - 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_glazing" - f" ON oknardia_setkit.kSet2Glazing_id = oknardia_glazing.id " - f"WHERE oknardia_merchantbrand.id = {company_id} " - f"AND oknardia_priceoffer.sOfferActive = TRUE " - f"GROUP BY oknardia_merchantoffice.id," - f" oknardia_setkit.id," - f" oknardia_setkit.fSetRating " - f"ORDER BY oknardia_setkit.fSetRating DESC;") - list_sets = list(q_sets) - for i in list_sets: - i.sMerchantMainURL = {"URL": i.sMerchantMainURL, - "URL_VIEW": re.sub(r"(?:^http://|^https://|/$|www\.)", "", i.sMerchantMainURL)} - k = random.randint(1, int(len(i.sOfficeEmails)/2) - 1) - i.sOfficeEmails = [i.sOfficeEmails[0:k], i.sOfficeEmails[k:-k], i.sOfficeEmails[-k:]] - to_template.update({'IMG_FOR_BLOG': i.pMerchantLogo}) - i.fSetRating = {"RATING": i.fSetRating, - "STARS": get_rating_set_for_stars(i.fSetRating)} - i.lastUpdate = pytils.dt.distance_of_time_in_words(int(django.utils.dateformat.format(i.lastUpdate, 'U'))) - i.earlyCreation = pytils.dt.distance_of_time_in_words(int(django.utils.dateformat.format(i.earlyCreation, 'U'))) - i.sProfileName = {"NAME": i.sProfileName, - "NAME_T": pytils.translit.slugify(i.sProfileName)} - i.sProfileManufacturer = {"NAME": i.sProfileManufacturer, - "NAME_T": pytils.translit.slugify(i.sProfileManufacturer)} - i.fProfileSeals = pytils.numeral.sum_string(i.fProfileSeals, pytils.numeral.MALE, u"контур, контура, контуров") - if i.sSetImplementCatch.lower() in list_not: - i.sSetImplementCatch = "" - if i.sSetClimateControl.lower() in list_not: - i.sSetClimateControl = "" - if len(i.sProfileReinforcement) > 0: - i.sProfileReinforcement = i.sProfileReinforcement[0].lower()+i.sProfileReinforcement[1:] - if len(i.sSetSill) > 0: - i.sSetSill = i.sSetSill[0].lower()+i.sSetSill[1:] - if len(i.sSetPanes) > 0: - i.sSetPanes = i.sSetPanes[0].lower()+i.sSetPanes[1:] - if len(i.sSetSlope) > 0: - i.sSetSlope = i.sSetSlope[0].lower()+i.sSetSlope[1:] - if len(i.sSetUninstallInstall) > 0: - i.sSetUninstallInstall = i.sSetUninstallInstall[0].lower()+i.sSetUninstallInstall[1:] - if len(i.sSetDelivery) > 0: - i.sSetDelivery = i.sSetDelivery[0].lower()+i.sSetDelivery[1:] - if len(i.sSetOtherConditions) > 0: - i.sSetOtherConditions = i.sSetOtherConditions[0].lower()+i.sSetOtherConditions[1:] - to_template.update({ - 'SETS': list_sets, - # получаем последние визиты клиента через куки - '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_company_detail.html", to_template) - def report_all_info_seria_redirect(request: HttpRequest, seria_id: str = "12") -> HttpResponse: """ Переадресация старых URL, т.к. их сколько-то есть (было) во внешних ссылках diff --git a/oknardia/web/catalog_companies.py b/oknardia/web/catalog_companies.py new file mode 100644 index 0000000..3871ed1 --- /dev/null +++ b/oknardia/web/catalog_companies.py @@ -0,0 +1,161 @@ +# -*- coding: utf-8 -*- +from django.shortcuts import render, redirect +from django.http import HttpRequest, HttpResponse +from django.utils import timezone +from oknardia.models import ( + MerchantBrand, +) +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 get_rating_set_for_stars +import django.utils.dateformat +import time +import random +import re +import pytils + + +def catalog_company(request: HttpRequest) -> HttpResponse: + time_start = time.time() + to_template = {} # словарь, для передачи шаблону + q_company = MerchantBrand.objects.raw('SELECT' + ' oknardia_merchantbrand.id,' + ' oknardia_merchantbrand.sMerchantName,' + ' oknardia_merchantbrand.pMerchantLogo,' + ' oknardia_merchantbrand.sMerchantMainURL,' + ' COUNT(oknardia_priceoffer.id) AS NumOffers,' + ' AVG(oknardia_priceoffer.fOfferPrice) AS PriceAVG,' + ' MAX(oknardia_priceoffer.dOfferModify) AS lastUpdate,' + ' Q.NumSets,' + ' Q.RatingAVG,' + ' 1 AS STARS ' + 'FROM (SELECT' + ' COUNT(oknardia_setkit.sSetName) AS NumSets,' + ' oknardia_merchantoffice.kMerchantName_id AS Q_ID,' + ' AVG(oknardia_setkit.fSetRating) AS RatingAVG' + ' FROM oknardia_merchantoffice' + ' INNER JOIN oknardia_ouruser' + ' ON oknardia_ouruser.kMerchantOffice_id = oknardia_merchantoffice.id' + ' INNER JOIN oknardia_setkit' + ' ON oknardia_setkit.kSet2User_id = oknardia_ouruser.id' + ' GROUP BY oknardia_merchantoffice.id,' + ' oknardia_merchantoffice.kMerchantName_id) AS Q,' + ' oknardia_ouruser' + ' INNER JOIN oknardia_merchantoffice' + ' ON oknardia_ouruser.kMerchantOffice_id = oknardia_merchantoffice.id' + ' INNER JOIN oknardia_priceoffer' + ' ON oknardia_priceoffer.kOfferFromUser_id = oknardia_ouruser.id' + ' INNER JOIN oknardia_merchantbrand' + ' ON oknardia_merchantoffice.kMerchantName_id = oknardia_merchantbrand.id' + ' WHERE Q_ID = oknardia_merchantoffice.kMerchantName_id ' + 'GROUP BY oknardia_merchantoffice.kMerchantName_id ' + 'ORDER BY Q.RatingAVG DESC;') + list_company = list(q_company) + for i in list_company: + i.STARS = get_rating_set_for_stars(i.RatingAVG) + i.NumSets = pytils.numeral.get_plural(i.NumSets, u"оконный набор, оконных набора, оконных наборов") + i.NumOffers = pytils.numeral.get_plural(i.NumOffers, u"вариант, варианта, вариантов") + i.lastUpdate = pytils.dt.distance_of_time_in_words(int(django.utils.dateformat.format(i.lastUpdate, 'U'))) + i.sMerchantMainURL = pytils.translit.slugify(i.sMerchantName) + # print("NAME:", i.sMerchantName, "\tNumSets:", i.NumSets, "\tNumOffers:", i.NumOffers, + # "\t:AverageRating:", i.RatingAVG, "\tAveragePrice:", i.PriceAVG, "\tSTARS:", i.STARS) + to_template.update({ + 'COMPANIES': list_company, + # получаем последние визиты клиента через куки + '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_company.html", to_template) + + +def catalog_company_detail(request: HttpRequest, company_id: str, company_name_slug: str) -> HttpResponse: + time_start = time.time() + to_template = {} # словарь, для передачи шаблону + company_id = int(company_id) + q_by_id = MerchantBrand.objects.get(id=company_id) + if pytils.translit.slugify(q_by_id.sMerchantName) != company_name_slug: + return redirect('/catalog/company/%d-%s' % (company_id, pytils.translit.slugify(q_by_id.sMerchantName))) + to_template.update({'COMPANY': q_by_id.sMerchantName}) + to_template.update({'COMPANY_ID': company_id}) + to_template.update({'COMPANY_T': company_name_slug}) + list_not = [u"нет", u"—", ""] + to_template.update({'LIST_NOT': list_not}) + q_sets = MerchantBrand.objects.raw(f"SELECT" + f" COUNT(oknardia_priceoffer.id) AS NumOffers," + f" AVG(oknardia_priceoffer.fOfferPrice) AS priceAVG," + f" MAX(oknardia_priceoffer.dOfferModify) AS lastUpdate," + f" MIN(oknardia_priceoffer.dOfferCreate) AS earlyCreation," + f" oknardia_merchantbrand.*," + f" oknardia_merchantoffice.*," + f" oknardia_merchantoffice.id AS idMERCH," + f" oknardia_setkit.*," + f" oknardia_setkit.id AS idSET," + f" oknardia_pvcprofiles.*," + f" oknardia_pvcprofiles.id AS idPVC," + f" oknardia_glazing.*, " + f" oknardia_glazing.id AS idGLAZ " + f"FROM oknardia_ouruser" + 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" INNER JOIN oknardia_setkit" + f" ON oknardia_setkit.kSet2User_id = oknardia_ouruser.id" + f" INNER JOIN oknardia_priceoffer" + 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_glazing" + f" ON oknardia_setkit.kSet2Glazing_id = oknardia_glazing.id " + f"WHERE oknardia_merchantbrand.id = {company_id} " + f"AND oknardia_priceoffer.sOfferActive = TRUE " + f"GROUP BY oknardia_merchantoffice.id," + f" oknardia_setkit.id," + f" oknardia_setkit.fSetRating " + f"ORDER BY oknardia_setkit.fSetRating DESC;") + list_sets = list(q_sets) + for i in list_sets: + i.sMerchantMainURL = {"URL": i.sMerchantMainURL, + "URL_VIEW": re.sub(r"(?:^http://|^https://|/$|www\.)", "", i.sMerchantMainURL)} + k = random.randint(1, int(len(i.sOfficeEmails)/2) - 1) + i.sOfficeEmails = [i.sOfficeEmails[0:k], i.sOfficeEmails[k:-k], i.sOfficeEmails[-k:]] + to_template.update({'IMG_FOR_BLOG': i.pMerchantLogo}) + i.fSetRating = {"RATING": i.fSetRating, + "STARS": get_rating_set_for_stars(i.fSetRating)} + i.lastUpdate = pytils.dt.distance_of_time_in_words(int(django.utils.dateformat.format(i.lastUpdate, 'U'))) + i.earlyCreation = pytils.dt.distance_of_time_in_words(int(django.utils.dateformat.format(i.earlyCreation, 'U'))) + i.sProfileName = {"NAME": i.sProfileName, + "NAME_T": pytils.translit.slugify(i.sProfileName)} + i.sProfileManufacturer = {"NAME": i.sProfileManufacturer, + "NAME_T": pytils.translit.slugify(i.sProfileManufacturer)} + i.fProfileSeals = pytils.numeral.sum_string(i.fProfileSeals, pytils.numeral.MALE, u"контур, контура, контуров") + if i.sSetImplementCatch.lower() in list_not: + i.sSetImplementCatch = "" + if i.sSetClimateControl.lower() in list_not: + i.sSetClimateControl = "" + if len(i.sProfileReinforcement) > 0: + i.sProfileReinforcement = i.sProfileReinforcement[0].lower()+i.sProfileReinforcement[1:] + if len(i.sSetSill) > 0: + i.sSetSill = i.sSetSill[0].lower()+i.sSetSill[1:] + if len(i.sSetPanes) > 0: + i.sSetPanes = i.sSetPanes[0].lower()+i.sSetPanes[1:] + if len(i.sSetSlope) > 0: + i.sSetSlope = i.sSetSlope[0].lower()+i.sSetSlope[1:] + if len(i.sSetUninstallInstall) > 0: + i.sSetUninstallInstall = i.sSetUninstallInstall[0].lower()+i.sSetUninstallInstall[1:] + if len(i.sSetDelivery) > 0: + i.sSetDelivery = i.sSetDelivery[0].lower()+i.sSetDelivery[1:] + if len(i.sSetOtherConditions) > 0: + i.sSetOtherConditions = i.sSetOtherConditions[0].lower()+i.sSetOtherConditions[1:] + to_template.update({ + 'SETS': list_sets, + # получаем последние визиты клиента через куки + '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_company_detail.html", to_template) diff --git a/oknardia/web/catalog_openings.py b/oknardia/web/catalog_openings.py new file mode 100644 index 0000000..5fa7405 --- /dev/null +++ b/oknardia/web/catalog_openings.py @@ -0,0 +1,82 @@ +# -*- coding: utf-8 -*- +from django.shortcuts import render +from django.http import HttpRequest, HttpResponse +from oknardia.models import ( + Seria_Info, + Win_MountDim, +) +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 get_flaps_for_mini_pictures +import time +import pytils + +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 = get_flaps_for_mini_pictures(i.sFlapConfig) + 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) + diff --git a/oknardia/web/catalog_profiles.py b/oknardia/web/catalog_profiles.py index afa384a..9335f15 100644 --- a/oknardia/web/catalog_profiles.py +++ b/oknardia/web/catalog_profiles.py @@ -6,7 +6,7 @@ from django.db.models import Count from django.shortcuts import render, redirect from django.http import HttpRequest, HttpResponse from oknardia.settings import * -from oknardia.models import Catalog2Profile, PVCprofiles, PriceOffer +from oknardia.models import Catalog2Profile, PVCprofiles, PriceOffer 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 @@ -14,6 +14,50 @@ import json import re import pytils +# --------------------------------------------------------------------------- +# Модульные хелперы, общие для всех вьюх этого файла +# --------------------------------------------------------------------------- + +def make_slug(value: str) -> str: + """Транслитерирует строку в slug (pytils).""" + return pytils.translit.slugify(value).lower() + + +def _merchant_row_to_dict(row: dict) -> dict: + """Преобразует ORM-строку с данными партнёра в словарь для шаблона.""" + merchant_name = row["kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__sMerchantName"] + return { + "MERCHANT_ID": row["kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__id"], + "MERCHANT_NAME": merchant_name, + "MERCHANT_NAME_T": make_slug(merchant_name), + "MERCHANT_LOGO_URL": row["kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__pMerchantLogo"], + "MERCHANT_OFFERS": row["offers_by_merchant"], + } + + +def _profile_row_to_dict(profile: dict) -> dict: + """Преобразует ORM-строку профиля в словарь для шаблона.""" + return { + "PROFILE_NAME": profile["sProfileBriefDescription"], + "PROFILE_ID": profile["id"], + "PROFILE_URL": make_slug(profile["sProfileName"]), + "PROFILE_RATING": profile["fProfileRating"], + "PROFILE_RATING_STARS": get_rating_set_for_stars(profile["fProfileRating"]), + } + + +def _append_visit_context(to_template: dict, request: HttpRequest, time_start: float) -> None: + """Дописывает в контекст стандартный хвост: визиты и время выполнения.""" + to_template.update({ + 'LAST_VISIT': get_last_user_visit_list(get_last_user_visit_cookies(request)[:3]), + 'LOG_VISIT': get_last_all_user_visit_list(), + 'ticks': float(time.time() - time_start), + }) + + +# --------------------------------------------------------------------------- + + def catalog_profile(request: HttpRequest) -> HttpResponse: """ КАТАЛОГ ПРОФИЛЕЙ: страница со списком производителей и моделей (марками) профилей @@ -37,9 +81,6 @@ def catalog_profile(request: HttpRequest) -> HttpResponse: to_template: dict[str, object] = { 'CATALOG_PROFILE_NUM': pytils.numeral.get_plural(profile_count, "профиль,профиля,профилей") } - # Локальный помощник: slug нужен несколько раз, а повторять одну и ту же строку не хочется. - def make_slug(value: str) -> str: - return pytils.translit.slugify(value).lower() list_profile_manufactures = [] tmp_profile_manufacture = "" @@ -76,10 +117,8 @@ def catalog_profile(request: HttpRequest) -> HttpResponse: pytils.numeral.sum_string(len(list_profile_manufactures), pytils.numeral.MALE, ("производитель", "производителя", "производителей")), - 'LAST_VISIT': get_last_user_visit_list(get_last_user_visit_cookies(request)[:3]), - 'LOG_VISIT': get_last_all_user_visit_list(), - 'ticks': float(time.time() - time_start), }) + _append_visit_context(to_template, request, time_start) return render(request, "catalog/catalog_of_profiles.html", to_template) @@ -108,9 +147,6 @@ def catalog_profile_model(request: HttpRequest, manufacture_id: int, manufacture f"{model_id}-{model_slug}") # Локальные помощники держат вьюху короче и не размазывают однотипную логику по коду. - def make_slug(value: str) -> str: - return pytils.translit.slugify(value).lower() - def build_other_list(value: str) -> list[str]: # Убираем пустые куски, чтобы не плодить «пустые» характеристики в шаблоне. result = [] @@ -142,27 +178,6 @@ def catalog_profile_model(request: HttpRequest, manufacture_id: int, manufacture else: to_template[template_key] = f"{color},255,{color}" - def merchant_row_to_dict(row: dict) -> dict: - # Один маппер для строки с партнёром: ключи шаблона остаются как были. - merchant_name = row["kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__sMerchantName"] - return { - "MERCHANT_ID": row["kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__id"], - "MERCHANT_NAME": merchant_name, - "MERCHANT_NAME_T": make_slug(merchant_name), - "MERCHANT_LOGO_URL": row["kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__pMerchantLogo"], - "MERCHANT_OFFERS": row["offers_by_merchant"], - } - - def profile_row_to_dict(profile: dict) -> dict: - # И то же самое для списка соседних профилей производителя. - return { - "PROFILE_NAME": profile["sProfileBriefDescription"], - "PROFILE_ID": profile["id"], - "PROFILE_URL": make_slug(profile["sProfileName"]), - "PROFILE_RATING": profile["fProfileRating"], - "PROFILE_RATING_STARS": get_rating_set_for_stars(profile["fProfileRating"]), - } - to_template: dict[str, object] = {"CATALOG_MODEL": q_pvc_by_id, "CATALOG_MAN2URL": manufacture_name, "CATALOG_URL": f"{manufacture_id}-{manufacture_name}", @@ -208,7 +223,7 @@ def catalog_profile_model(request: HttpRequest, manufacture_id: int, manufacture .annotate(offers_by_merchant=Count("id")) .order_by("-offers_by_merchant", "kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__sMerchantName") ) - to_template.update({'MERCHANTS': [merchant_row_to_dict(row) for row in q_merchant]}) + to_template.update({'MERCHANTS': [_merchant_row_to_dict(row) for row in q_merchant]}) # Близкие профили этого же производителя нужны для быстрых переходов по карточкам. q_profiles = ( PVCprofiles.objects.filter(sProfileManufacturer=q_pvc_by_id.sProfileManufacturer) @@ -216,7 +231,7 @@ def catalog_profile_model(request: HttpRequest, manufacture_id: int, manufacture .values("id", "fProfileRating", "sProfileBriefDescription", "sProfileName") .order_by("fProfileRating") ) - to_template.update({'PROFILES': [profile_row_to_dict(profile) for profile in q_profiles]}) + to_template.update({'PROFILES': [_profile_row_to_dict(profile) for profile in q_profiles]}) # Описание профиля берём через связку каталог -> блог: это один ORM-запрос вместо сырого SQL. q_profiles_detail = ( Catalog2Profile.objects.filter( @@ -241,13 +256,7 @@ def catalog_profile_model(request: HttpRequest, manufacture_id: int, manufacture profile_blog_dat: datetime | None = max((post.dPostDataModify for post in profile_blog_posts), default=pub_dat) pub_dat = update_pub_dat(pub_dat, profile_blog_dat) or pub_dat to_template['PUB_DAT'] = pub_dat - to_template.update( - { - 'LAST_VISIT': get_last_user_visit_list(get_last_user_visit_cookies(request)[:3]), - 'LOG_VISIT': get_last_all_user_visit_list(), - 'ticks': float(time.time() - time_start), - } - ) + _append_visit_context(to_template, request, time_start) return render(request, "catalog/catalog_of_profiles_model.html", to_template) @@ -272,120 +281,76 @@ def catalog_profile_manufacture(request: HttpRequest, manufacture_id: int, manuf if q_pvc_by_id.id != manufacture_id: return redirect(f'/catalog/profile/{q_pvc_by_id.id}-' f'{pytils.translit.slugify(q_pvc_by_id.sProfileManufacturer)}') - to_template = {'CATALOG_MANUFACT': q_pvc_by_id.sProfileManufacturer, - 'CATALOG_MAN2URL': manufacture_name, - 'CATALOG_URL': f"{manufacture_id}-{manufacture_name}"} + to_template: dict[str, object] = {'CATALOG_MANUFACT': q_pvc_by_id.sProfileManufacturer, + 'CATALOG_MAN2URL': manufacture_name, + 'CATALOG_URL': f"{manufacture_id}-{manufacture_name}"} try: - # получаем информацию о производителе (статью из блога) - manufacture_description = list(PVCprofiles.objects.raw( - f"SELECT " - f" oknardia_blogposts.* " - f"FROM oknardia_catalog2profile" - f" RIGHT OUTER JOIN oknardia_pvcprofiles" - f" ON oknardia_catalog2profile.kProfile_id = oknardia_pvcprofiles.id" - f" LEFT OUTER JOIN oknardia_blogposts" - f" ON oknardia_catalog2profile.kBlogCatalog_id = oknardia_blogposts.id " - f"WHERE oknardia_catalog2profile.sCatalogCardType = {CATALOG_RECORD_FOR_PROFILE_MANUFACTURER} " - f" AND oknardia_pvcprofiles.sProfileManufacturer = '{q_pvc_by_id.sProfileManufacturer}'" - f" AND oknardia_blogposts.bCatalog IS TRUE " - f"GROUP BY oknardia_blogposts.bCatalog " - f"LIMIT 1;" - ))[0] - to_template.update({'PUB_DAT': manufacture_description.dPostDataModify}) - if PATH_FOR_IMG_BLOG in manufacture_description.sImgForBlogSocial: - to_template.update({'IMG_FOR_BLOG': manufacture_description.sImgForBlogSocial}) - to_template.update({'HEADER': manufacture_description.sPostHeader, - 'CONTENT': re.sub(r'', '', manufacture_description.sPostContent, - 0, re.IGNORECASE)}) - to_template.update({'TIZER': re.sub(r'||', - '', to_template["CONTENT"], 0, re.IGNORECASE)}) - except (ObjectDoesNotExist, IndexError, TypeError, KeyError,): - pass - 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 = '{q_pvc_by_id.sProfileManufacturer}' " - f"ORDER BY oknardia_pvcprofiles.fProfileRating;" - ) - list_profiles = [] - for i in q_profiles: - 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}) - try: - q_share_of_offers = list(PVCprofiles.objects.raw( - f"SELECT" - f" 1 AS id," - f" SUM(Q1.offers_by_model) AS offers_by_maufacture," - f" Q2.tatal_offers-SUM(Q1.offers_by_model) AS offers_other " - f"FROM (SELECT COUNT(oknardia_priceoffer.id) AS offers_by_model" - f" FROM oknardia_priceoffer" - f" LEFT OUTER JOIN oknardia_setkit" - f" ON oknardia_priceoffer.kOffer2SetKit_id = oknardia_setkit.id" - f" RIGHT OUTER JOIN oknardia_pvcprofiles" - f" ON oknardia_setkit.kSet2PVCprofiles_id = oknardia_pvcprofiles.id" - f" WHERE oknardia_pvcprofiles.sProfileManufacturer = '{q_pvc_by_id.sProfileManufacturer}') Q1," - f" (SELECT COUNT(oknardia_priceoffer.id) AS tatal_offers" - f" FROM oknardia_priceoffer) AS Q2 " - f"LIMIT 1;" - ))[0] - to_template.update({ - 'OFFERS_BY_MAUFACTURE': q_share_of_offers.offers_by_maufacture, - 'OFFERS_OTHER': q_share_of_offers.offers_other, - 'OFFERS_ANGLE': 90 + 180 * normalize(q_share_of_offers.offers_by_maufacture, - q_share_of_offers.offers_other + q_share_of_offers.offers_by_maufacture) - }) - if q_share_of_offers is not None and q_share_of_offers.offers_by_maufacture != 0: - 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.sProfileManufacturer = '{q_pvc_by_id.sProfileManufacturer}' " - f"GROUP BY oknardia_merchantbrand.sMerchantName," - f" oknardia_merchantbrand.pMerchantLogo," - f" oknardia_merchantbrand.id " - f"ORDER BY offers_by_merchant DESC;" + # Получаем статью-описание производителя через Catalog2Profile → BlogPosts. + # GROUP BY из оригинального SQL здесь не нужен: нас устраивает любая первая запись. + catalog_entry = ( + Catalog2Profile.objects.filter( + kProfile__sProfileManufacturer=q_pvc_by_id.sProfileManufacturer, + sCatalogCardType=CATALOG_RECORD_FOR_PROFILE_MANUFACTURER, + kBlogCatalog__bCatalog=True, ) - 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}) - except (ObjectDoesNotExist, IndexError, TypeError): # вообще-то, запрос q_share_of_offers всегда что-то вернёт, - pass # но на всякий случай - 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) - }) + .select_related("kBlogCatalog") + .first() + ) + if catalog_entry is None or catalog_entry.kBlogCatalog is None: + raise ObjectDoesNotExist + manufacture_description = catalog_entry.kBlogCatalog + to_template.update({'PUB_DAT': manufacture_description.dPostDataModify}) + if PATH_FOR_IMG_BLOG in (manufacture_description.sImgForBlogSocial or ""): + to_template.update({'IMG_FOR_BLOG': manufacture_description.sImgForBlogSocial}) + content = re.sub(r'', '', manufacture_description.sPostContent, 0, re.IGNORECASE) + to_template.update({'HEADER': manufacture_description.sPostHeader, 'CONTENT': content}) + to_template.update({'TIZER': re.sub( + r'||', + '', content, 0, re.IGNORECASE, + )}) + except (ObjectDoesNotExist, IndexError, TypeError, KeyError): + pass + + # Список всех профилей этого производителя для навигации по карточкам. + q_profiles = ( + PVCprofiles.objects.filter(sProfileManufacturer=q_pvc_by_id.sProfileManufacturer) + .values("id", "fProfileRating", "sProfileBriefDescription", "sProfileName") + .order_by("fProfileRating") + ) + to_template.update({'PROFILES': [_profile_row_to_dict(p) for p in q_profiles]}) + + try: + # Доля предложений этого производителя относительно всех предложений в базе. + offers_by_manufacture = PriceOffer.objects.filter( + kOffer2SetKit__kSet2PVCprofiles__sProfileManufacturer=q_pvc_by_id.sProfileManufacturer, + ).count() + total_offers = PriceOffer.objects.count() + offers_other = total_offers - offers_by_manufacture + to_template.update({ + 'OFFERS_BY_MAUFACTURE': offers_by_manufacture, + 'OFFERS_OTHER': offers_other, + 'OFFERS_ANGLE': 90 + 180 * normalize(offers_by_manufacture, total_offers), + }) + if offers_by_manufacture > 0: + # Партнёры, у которых есть предложения с профилями этого производителя. + q_merchant = ( + PriceOffer.objects.filter( + kOffer2SetKit__kSet2PVCprofiles__sProfileManufacturer=q_pvc_by_id.sProfileManufacturer, + ) + .values( + "kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__id", + "kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__sMerchantName", + "kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__pMerchantLogo", + ) + .annotate(offers_by_merchant=Count("id")) + .order_by( + "-offers_by_merchant", + "kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__sMerchantName", + ) + ) + to_template.update({'MERCHANTS': [_merchant_row_to_dict(row) for row in q_merchant]}) + except (ObjectDoesNotExist, IndexError, TypeError): + pass + _append_visit_context(to_template, request, time_start) return render(request, "catalog/catalog_of_profiles_manufacture.html", to_template) diff --git a/oknardia/web/catalog_series.py b/oknardia/web/catalog_series.py new file mode 100644 index 0000000..930ca62 --- /dev/null +++ b/oknardia/web/catalog_series.py @@ -0,0 +1,404 @@ +# -*- coding: utf-8 -*- +from django.core.exceptions import ObjectDoesNotExist +from django.shortcuts import render, redirect +from django.http import HttpRequest, HttpResponse +from django.template.loader import render_to_string +from oknardia.settings import * +from oknardia.models import ( + 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.add_func import get_flaps_for_big_pictures, touch_reload_wsgi +import time +import os +import math +import pytils + +# Каталог типовых серий зданий (пока переадресация) +def catalog_seria(request: HttpRequest) -> HttpResponse: + """ + КАТАЛОГ ТИПОВЫЙ СЕРИЙ: страница со всеми сериями зданий в базе окнардии + + :param request: HttpRequest -- входящий http-запрос + :return response: HttpResponse -- исходящий http-ответ + """ + time_start = time.time() + try: + q_seria = Seria_Info.objects.raw('SELECT' + ' oknardia_seria_info.id,' + ' oknardia_seria_info.sURL2IMG,' + ' oknardia_seria_info.sName ' + 'FROM oknardia_seria_info ' + 'WHERE oknardia_seria_info.id = oknardia_seria_info.kRoot_id ' + 'ORDER BY oknardia_seria_info.sName;') + list_seria = [] + for i in q_seria: + list_seria.append({ + "ID": i.id, + "URL": i.sURL2IMG, + "NAME": i.sName, + "NAME_T": pytils.translit.slugify(i.sName) + }) + to_template = {'SERIAS': list_seria} + except (ObjectDoesNotExist,): + to_template = {} + 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, "catalog/catalog_seria.html", to_template) + + +def catalog_seria_info(request: HttpRequest, seria_name_translit: None, seria_id: int = 843) -> HttpResponse: + """ + КАТАЛОГ ТИПОВЫЙ СЕРИЙ: страница детальной информацией по серии зданий + + :param request: HttpRequest -- входящий http-запрос + :param seria_name_translit: str -- имя серии здания (транслитерированное pytils.translit.slugify()) + :param seria_id: int -- id серии + :return response: HttpResponse -- исходящий http-ответ + """ + time_start = time.time() + msg = "" + try: + seria_id = int(seria_id) + q_seria = Seria_Info.objects.get(id=seria_id) + if q_seria.id != q_seria.kRoot_id or seria_name_translit != pytils.translit.slugify(q_seria.sName): + return redirect(f"/catalog/seria/{pytils.translit.slugify(q_seria.sName)}/all{seria_id}") + except(ObjectDoesNotExist, ValueError,): + return redirect("/catalog/") + # если есть "облегченный" шаблон с частичным пре-рендером, то используем его. + light_template = f"{PATH_FOR_SERIA_INFO_HTML_INCLUDE}{str(seria_id)}_id.html" + light_template_w_path = f"{TEMPLATES[0]['DIRS'][0]}/{light_template}" + # print(f"{TEMPLATES[0]['DIRS'][0]}/{light_template}") + # print(light_template_w_path) + # print(light_template_w_path) + if os.path.isfile(light_template_w_path): + is_hard_template = False + else: + is_hard_template = True + to_template = {} + # получаем проемы использующиеся в данной серии домов + q_windows_in_seria = Win_MountDim.objects.raw( + f"SELECT DISTINCT" + f" oknardia_win_mountdim.iWinWidth, oknardia_win_mountdim.iWinHight," + f" oknardia_win_mountdim.sDescripion, oknardia_win_mountdim.bIsDoor," + f" oknardia_win_mountdim.bIsNearDoor, oknardia_win_mountdim.sFlapConfig," + f" oknardia_win_mountdim.iWinDepth, oknardia_win_mountdim.id," + f" 1 AS iQuantity " + f"FROM oknardia_mountdim2apartment" + f" INNER JOIN oknardia_win_mountdim" + f" ON oknardia_mountdim2apartment.kMountDim_id = oknardia_win_mountdim.id" + f" INNER JOIN oknardia_apartment_type" + f" ON oknardia_mountdim2apartment.kApartment_id = oknardia_apartment_type.id " + f"WHERE oknardia_apartment_type.kSeria_id = {seria_id}" + f" ORDER BY oknardia_win_mountdim.bIsNearDoor DESC," + f" oknardia_win_mountdim.bIsDoor DESC," + f" oknardia_win_mountdim.iWinWidth," + f" oknardia_win_mountdim.iWinHight DESC;") + if is_hard_template: + # Получаем данные для отрисовки больших картинок с проёмами и передаём в "тяжёлый" шаблон + to_template.update(get_flaps_for_big_pictures(q_windows_in_seria)) + # формируем строку для включения в SQL-запрос вида "(2,8,16,46,1)" + str_for_sql_in = "(" + for count in q_windows_in_seria: + str_for_sql_in += str(count.id) + "," + str_for_sql_in = str_for_sql_in[:-1] + ")" + # print StringForSqlIN + # Получаем данные для таблички Окон по типам квартирах в серии дома + # " IFNULL(oknardia_mountdim2apartment.iQuantity, 0) AS iQuantity," \ + # tStart2 = time.time() # замер времени + q_win_in_apartment_in_seria = Win_MountDim.objects.raw( + f"SELECT" + f" oknardia_win_mountdim.id," + f" oknardia_apartment_type.sNameApartment," + f" oknardia_win_mountdim.iWinWidth," + f" oknardia_win_mountdim.iWinHight," + f" oknardia_apartment_type.id AS id_apart," + f" IFNULL(oknardia_mountdim2apartment.iQuantity, 0) AS iQuantity," + f" COUNT(oknardia_priceoffer.id) AS NumOffers " + f"FROM oknardia_apartment_type" + f" INNER JOIN oknardia_win_mountdim" + f" LEFT OUTER JOIN oknardia_mountdim2apartment" + f" ON oknardia_mountdim2apartment.kMountDim_id = oknardia_win_mountdim.id" + f" AND oknardia_mountdim2apartment.kApartment_id = oknardia_apartment_type.id" + f" LEFT OUTER JOIN oknardia_priceoffer" + f" ON oknardia_priceoffer.kOffer2MountDim_id = oknardia_win_mountdim.id" + f" LEFT OUTER JOIN oknardia_ouruser" + f" ON oknardia_ouruser.id = oknardia_priceoffer.kOfferFromUser_id " + f"WHERE oknardia_apartment_type.kSeria_id = {seria_id} " + f"AND oknardia_win_mountdim.id IN {str_for_sql_in} " + f"GROUP BY oknardia_apartment_type.id," + f" oknardia_apartment_type.sNameApartment," + f" oknardia_win_mountdim.id," + f" oknardia_mountdim2apartment.iQuantity " + f"ORDER BY oknardia_apartment_type.iSort," + f" oknardia_win_mountdim.bIsNearDoor DESC," + f" oknardia_win_mountdim.bIsDoor DESC," + f" oknardia_win_mountdim.iWinWidth," + f" oknardia_win_mountdim.iWinHight DESC;") + list_win_in_seria = list(q_windows_in_seria) + total_column = len(list_win_in_seria) - 1 + count_column = 0 + min_offer_in_row = 1000000000 + table_of_win_in_seria_by_apartmment = [] + row_for_table = [] + offer_and_merchant_per_win = [ + { + "WIN_OFFER": 0, + "WIN_MERCHANT": 0, + "WIN_W": list_win_in_seria[i].iWinWidth, + "WIN_H": list_win_in_seria[i].iWinHight, + "WIN_ID": list_win_in_seria[i].id + } for i in range(total_column + 1)] + for count in q_win_in_apartment_in_seria: + if count.iQuantity != 0: + row_for_table.append({ + "WIN_NUM": [chr(65 + count_column)], + "WIN_Q": count.iQuantity, + "WIN_ID": count.id, + "WIN_WIDTH": list_win_in_seria[count_column].iWinWidth, + "WIN_HEIGHT": list_win_in_seria[count_column].iWinHight, + "WIN_DESCRIPTION": list_win_in_seria[count_column].sDescripion, + "WIN_FLAPCFG": list_win_in_seria[count_column].sFlapConfig + }) + if min_offer_in_row > count.NumOffers: + min_offer_in_row = count.NumOffers + if offer_and_merchant_per_win[count_column]["WIN_OFFER"] < count.NumOffers: + offer_and_merchant_per_win[count_column]["WIN_OFFER"] = count.NumOffers + else: + row_for_table.append({"WIN_NUM": "—"}) + if count_column < total_column: + count_column += 1 + else: + # print row_for_table + table_of_win_in_seria_by_apartmment.append({"WIN_IN_APART": row_for_table, + "APART_NAME": count.sNameApartment, + "APART_ID": count.id_apart, + "NUM_OFFERS": min_offer_in_row}) + count_column = 0 + min_offer_in_row = 10000 + row_for_table = [] + # print(table_of_win_in_seria_by_apartmment) + # print(f"==============>{float(time.time()-tStart2)}<==============") + # print NumOffersPerColumn, NumMerchantPerColumn + to_template.update({"WIN_OFFER_AND_MERCHANT": offer_and_merchant_per_win, + "TABLE_OF_WINDOWS": table_of_win_in_seria_by_apartmment}) + # для "тяжелого шаблона" получаем навигацию страницы, данные для карты и графика ввода в эксплуатацию + if is_hard_template: + # если вызывается "тяжелый" шаблон, то нужно подготовить тяжелые данные для построения навигации + seria_id, for_seria_nav = seria_nav(seria_id) + to_template.update(for_seria_nav) # данные для навигации по сериям + to_template.update(seria_info_year(seria_id)) # данные для графика ввода зданий серии в эксплуатацию + to_template.update(seria_info_geo_code(seria_id)) # данные для карты + # т.к. обрабатывается "тяжелый шаблон" надо создать "легкий шаблон" + # для его использования в будущем. + string_prerender = render_to_string("seria_info/all_seria_info_pre_light.html", to_template) + file = open(light_template_w_path, 'w') + # file.write(AA.encode('utf-8')) + file.write(string_prerender) + file.close() + touch_reload_wsgi(light_template_w_path) + else: + seria_name = Seria_Info.objects.get(id=seria_id).sName + to_template.update({'THIS_SERIA_NAME': seria_name}) + + # to_template.update({'LOG_VISIT': GetLastAllUserVisitSeriaList(SeriaName), + # 'ticks': float(time.time()-time_start)}) + 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, light_template, to_template) + + +def seria_nav(seria_id: int = 12) -> (int, dict): + """ + Возвращает корректный seria_id и кортеж для построения навигации по сериям дома + + :param seria_id: id серии + :return: + """ + q_seria = Seria_Info.objects.raw( + 'SELECT oknardia_seria_info.id,' + ' oknardia_seria_info.sName,' + ' oknardia_seria_info.sSeriaDescription,' + ' oknardia_seria_info.kRoot_id,' + ' oknardia_seria_info.kParent_id ' + 'FROM oknardia_seria_info ' + 'WHERE oknardia_seria_info.id = oknardia_seria_info.kRoot_id ' + 'ORDER BY oknardia_seria_info.sName;') + error_seria = True + for count_seria in q_seria: + if count_seria.id == int(seria_id): + error_seria = False + break + if error_seria: + # Ошибочный seria_id. Такой базовой серии нет и надо ее найти. + try: + query = Seria_Info.objects.get(id=int(seria_id)) + if query.kRoot_id is not None: + # базовая серия прописана в kRoot_id + seria_id = query.kRoot_id + else: + # == корневой нет + # == ищем методом наименьших расстояний" + min_min = 100000000 + min_id = seria_id + for count_seria in q_seria: + if math.fabs(int(seria_id) - count_seria.id) < min_min: + min_min = math.fabs(int(seria_id) - count_seria.id) + min_id = count_seria.id + seria_id = min_id + except ObjectDoesNotExist: + seria_id = q_seria[0].id + # print(f"-->{seria_id}<--") + return all_seria_nav(seria_id, q_seria) + + +def all_seria_nav(seria_id: int, q_seria) -> (int, dict): + seria_nav_dim = [] + this_return = {} + for count_seria in q_seria: + one_seria = {} + one_seria.update({"SERIA_R": count_seria.sName, "ID2URL": count_seria.id}) + if count_seria.id == seria_id: + this_return.update({"THIS_SERIA_NAME": count_seria.sName, + "THIS_SERIA_DESCRIPTION": count_seria.sSeriaDescription}) + # one_seria.update({"SERIA_L": ""}) + one_seria.update({"SERIA_L": pytils.translit.slugify(count_seria.sName)}) + else: + one_seria.update({"SERIA_L": pytils.translit.slugify(count_seria.sName)}) + seria_nav_dim.append(one_seria) + this_return.update({"SERIA_NAV_DIM": seria_nav_dim}) + return seria_id, this_return + + +def seria_info_year(seria_id: int = 12) -> dict: + """ Возвращает данные для графика распределения сдачи серии в эксплуатацию + + :param seria_id: int -- id серии для которой нужно получить данные + :return: dict -- данные для графика распределения сдачи серии в эксплуатацию типа: + {"DATA4GRAPH": [{'YEAR': 1997, 'NUMS': 1, 'CLRS': '99'}, + {'YEAR': 1998, 'NUMS': 15, 'CLRS': 'сс'}, + {'YEAR': 1998, 'NUMS': 10, 'CLRS': 'a9'} + ] + } + """ + seria_in_years = [] + query = Seria_Info.objects.raw( + f"SELECT oknardia_building_info.iCommissioning_year as id," + f" COUNT(oknardia_building_info.iCommissioning_year) AS NumInYear " + f"FROM oknardia_building_info" + f" INNER JOIN oknardia_seria_info" + f" ON oknardia_building_info.kSeria_Link_id = oknardia_seria_info.id " + f"WHERE oknardia_seria_info.kRoot_id = {seria_id} " + f"GROUP BY oknardia_building_info.iCommissioning_year;" + ) + max_per_year = 0 + graph_color_light = 0xCC # самый светлый цвет на графике (максимальное значение) + graph_color_dark = 0x99 # самый темный цвет на графике (минимальное значение) + for YearCount in query: + if int(YearCount.NumInYear) > max_per_year: + max_per_year = int(YearCount.NumInYear) + # print("max", MaxPerYear) + for YearCount in query: + data_of_year = {} + try: + data_of_year.update({ + "YEAR": int(YearCount.id), + "NUMS": YearCount.NumInYear, + "CLRS": str(hex(int(graph_color_dark + YearCount.NumInYear * ( + graph_color_light - graph_color_dark) / max_per_year)))[2:] + }) + except ValueError: + continue + seria_in_years.append(data_of_year) + # print(seria_in_years) + return {"DATA4GRAPH": seria_in_years} + + +def seria_info_geo_code(seria_id: str = '12') -> dict: + """ Возвращает массив геокоординат зданий одной серии + + :param seria_id: str -- id серии для которой нужно получить данные + :return: dict -- массив геокоординат зданий серии + """ + data_return = {} + seria_to_geo = [] + municipal_m2 = 0 # муниципальный фонд (кв.м) + residential_m2 = 0 # жилой фонд (кв.м) + government_m2 = 0 # государственные учреждения занимают (кв.м.) + residents = 0 # количество жильцов + apartments = 0 # число квартиры + accounts = 0 # количество лицевых счетов + condition_max = 0 # максимальное значение показателя состояния здания + condition_min = 1000000 # минимальное значение показателя состояния здания + query = Building_Info.objects.raw( + f"SELECT" + f" oknardia_building_info.id," + f" oknardia_seria_info.kRoot_id as SerId," + f" oknardia_building_info.sAddress," + f" oknardia_building_info.fResidential_Area," + f" oknardia_building_info.fMunicipal_Area," + f" oknardia_building_info.fGovernment_Area," + f" oknardia_building_info.iNum_Residents," + f" oknardia_building_info.iNum_Apartments," + f" oknardia_building_info.iNum_Accounts," + f" oknardia_building_info.fCondition_House," + f" oknardia_building_info.fGeoCode_Latitude," + f" oknardia_building_info.fGeoCode_Longitude " + f"FROM oknardia_building_info" + f" INNER JOIN oknardia_seria_info" + f" ON oknardia_building_info.kSeria_Link_id = oknardia_seria_info.id " + f"WHERE oknardia_seria_info.kRoot_id IN ({seria_id});" + ) + for count in query: + if int(count.fGeoCode_Latitude) != 0 and int(count.fGeoCode_Longitude) != 0: + seria_to_geo.append({"LATITUDE": count.fGeoCode_Latitude, + "LONGITUDE": count.fGeoCode_Longitude, + "ADDR_ID": count.id, + "ADDR_LAT": pytils.translit.slugify(count.sAddress), + "ADDR_RUS": count.sAddress, + "SER_ID": count.SerId + }) + if count.fMunicipal_Area > 0: + municipal_m2 += count.fMunicipal_Area + if count.fResidential_Area > 0: + residential_m2 += count.fResidential_Area + if count.fGovernment_Area > 0: + government_m2 += count.fGovernment_Area + if count.iNum_Residents > 0: + residents += count.iNum_Residents + if count.iNum_Residents > 0: + residents += count.iNum_Residents + if count.iNum_Apartments > 0: + apartments += count.iNum_Apartments + if count.iNum_Accounts > 0: + accounts += count.iNum_Accounts + if count.fCondition_House > 0: + if count.fCondition_House > condition_max: + condition_max = count.fCondition_House + if count.fCondition_House < condition_min: + condition_min = count.fCondition_House + data_return.update({"DATA4GEO": seria_to_geo, + "MUNICIPAL_M2": municipal_m2, + "RESIDENTIAL_M2": residential_m2, + "GOVERNMENT_M2": government_m2, + "RESIDENTS": residents, + "APARTMENTS": apartments, + "ACCOUNTS": accounts, + "CONDITION_MAX": condition_max, + "CONDITION_MIN": condition_min}) + # print(seria_to_geo) + return data_return diff --git a/oknardia/web/catalog_utils.py b/oknardia/web/catalog_utils.py new file mode 100644 index 0000000..e69de29 diff --git a/oknardia/web/diagrams.py b/oknardia/web/diagrams.py index d7e9cdf..dcce5c0 100644 --- a/oknardia/web/diagrams.py +++ b/oknardia/web/diagrams.py @@ -5,7 +5,7 @@ from django.core.exceptions import ObjectDoesNotExist from time import time from oknardia.settings import * from oknardia.models import Seria_Info -from web.catalog import all_seria_nav +from web.catalog_series import all_seria_nav # from oknardia.catalog import all_seria_nav import math import os From 1afe77fde0abf841e1a23cf3a1da12cb72fe2424 Mon Sep 17 00:00:00 2001 From: erjemin Date: Mon, 20 Apr 2026 23:23:05 +0300 Subject: [PATCH 019/102] =?UTF-8?q?=20minor:=20=D0=B8=D0=B7=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B2=20=D0=B7=D0=B0=D0=BC?= =?UTF-8?q?=D0=B5=D1=80=D0=B0=D1=85=20=D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B2=D1=8C=D1=8E=D1=88=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oknardia/web/catalog.py | 4 ++-- oknardia/web/catalog_companies.py | 8 ++++---- oknardia/web/catalog_openings.py | 4 ++-- oknardia/web/catalog_profiles.py | 8 ++++---- oknardia/web/catalog_series.py | 14 +++++++------- oknardia/web/prices.py | 22 +++++++++++----------- oknardia/web/report1.py | 8 ++++---- oknardia/web/service.py | 16 ++++++++-------- oknardia/web/views.py | 6 +++--- 9 files changed, 45 insertions(+), 45 deletions(-) diff --git a/oknardia/web/catalog.py b/oknardia/web/catalog.py index 526943a..2bcceda 100644 --- a/oknardia/web/catalog.py +++ b/oknardia/web/catalog.py @@ -14,12 +14,12 @@ def catalog_root(request: HttpRequest) -> HttpResponse: :param request: HttpRequest -- входящий http-запрос :return response: HttpResponse -- исходящий http-ответ """ - time_start = time.time() + time_start = time.perf_counter() # получаем из cookies последние визиты клиента to_template = { 'LAST_VISIT': get_last_user_visit_list(get_last_user_visit_cookies(request)[:3]), 'LOG_VISIT': get_last_all_user_visit_list(), - 'ticks': float(time.time() - time_start)} + 'ticks': float(time.perf_counter() - time_start)} response = render(request, "catalog/catalog_root.html", to_template) return response diff --git a/oknardia/web/catalog_companies.py b/oknardia/web/catalog_companies.py index 3871ed1..a470988 100644 --- a/oknardia/web/catalog_companies.py +++ b/oknardia/web/catalog_companies.py @@ -15,7 +15,7 @@ import pytils def catalog_company(request: HttpRequest) -> HttpResponse: - time_start = time.time() + time_start = time.perf_counter() to_template = {} # словарь, для передачи шаблону q_company = MerchantBrand.objects.raw('SELECT' ' oknardia_merchantbrand.id,' @@ -65,13 +65,13 @@ def catalog_company(request: HttpRequest) -> HttpResponse: # получаем последние визиты всех посетителей из базы # id2log, log_visit = get_last_all_user_visit_list() 'LOG_VISIT': get_last_all_user_visit_list(), - 'ticks': float(time.time() - time_start) + 'ticks': float(time.perf_counter() - time_start) }) return render(request, "catalog/catalog_company.html", to_template) def catalog_company_detail(request: HttpRequest, company_id: str, company_name_slug: str) -> HttpResponse: - time_start = time.time() + time_start = time.perf_counter() to_template = {} # словарь, для передачи шаблону company_id = int(company_id) q_by_id = MerchantBrand.objects.get(id=company_id) @@ -156,6 +156,6 @@ def catalog_company_detail(request: HttpRequest, company_id: str, company_name_s # получаем последние визиты всех посетителей из базы # id2log, log_visit = get_last_all_user_visit_list() 'LOG_VISIT': get_last_all_user_visit_list(), - 'ticks': float(time.time() - time_start) + 'ticks': float(time.perf_counter() - time_start) }) return render(request, "catalog/catalog_company_detail.html", to_template) diff --git a/oknardia/web/catalog_openings.py b/oknardia/web/catalog_openings.py index 5fa7405..5ca0d13 100644 --- a/oknardia/web/catalog_openings.py +++ b/oknardia/web/catalog_openings.py @@ -11,7 +11,7 @@ import time import pytils def standard_opening(request: HttpRequest) -> HttpResponse: - time_start = time.time() + time_start = time.perf_counter() to_template = {} # словарь, для передачи шаблону q_seria = Seria_Info.objects.raw('SELECT oknardia_seria_info.id, oknardia_seria_info.sName ' 'FROM oknardia_seria_info ' @@ -76,7 +76,7 @@ def standard_opening(request: HttpRequest) -> HttpResponse: # получаем последние визиты всех посетителей из базы # id2log, log_visit = get_last_all_user_visit_list() 'LOG_VISIT': get_last_all_user_visit_list(), - 'ticks': float(time.time() - time_start) + 'ticks': float(time.perf_counter() - time_start) }) return render(request, "catalog/catalog_standard_opening.html", to_template) diff --git a/oknardia/web/catalog_profiles.py b/oknardia/web/catalog_profiles.py index 9335f15..a7b972f 100644 --- a/oknardia/web/catalog_profiles.py +++ b/oknardia/web/catalog_profiles.py @@ -51,7 +51,7 @@ def _append_visit_context(to_template: dict, request: HttpRequest, time_start: f to_template.update({ 'LAST_VISIT': get_last_user_visit_list(get_last_user_visit_cookies(request)[:3]), 'LOG_VISIT': get_last_all_user_visit_list(), - 'ticks': float(time.time() - time_start), + 'ticks': float(time.perf_counter() - time_start), }) @@ -65,7 +65,7 @@ def catalog_profile(request: HttpRequest) -> HttpResponse: :param request: HttpRequest -- входящий http-запрос :return response: HttpResponse -- исходящий http-ответ """ - time_start = time.time() + time_start = time.perf_counter() # Берём только те поля, которые реально нужны для построения страницы каталога. # Это позволяет не тащить лишние данные из БД и сразу работать с простыми словарями. profile_rows = list( @@ -134,7 +134,7 @@ def catalog_profile_model(request: HttpRequest, manufacture_id: int, manufacture :param model_name: модель (марка) профиля (транслитерированное pytils.translit.slugify(sProfileName)) :return response: HttpResponse -- исходящий http-ответ """ - time_start = time.time() + time_start = time.perf_counter() manufacture_id = int(manufacture_id) model_id = int(model_id) q_pvc_by_id = PVCprofiles.objects.get(id=model_id) @@ -269,7 +269,7 @@ def catalog_profile_manufacture(request: HttpRequest, manufacture_id: int, manuf :param manufacture_name: название производителя (транслитерированное pytils.translit.slugify()) :return response: HttpResponse -- исходящий http-ответ """ - time_start = time.time() + time_start = time.perf_counter() manufacture_id = int(manufacture_id) q_pvc_by_id = PVCprofiles.objects.get(id=manufacture_id) if pytils.translit.slugify(q_pvc_by_id.sProfileManufacturer) != manufacture_name: diff --git a/oknardia/web/catalog_series.py b/oknardia/web/catalog_series.py index 930ca62..8a011a2 100644 --- a/oknardia/web/catalog_series.py +++ b/oknardia/web/catalog_series.py @@ -24,7 +24,7 @@ def catalog_seria(request: HttpRequest) -> HttpResponse: :param request: HttpRequest -- входящий http-запрос :return response: HttpResponse -- исходящий http-ответ """ - time_start = time.time() + time_start = time.perf_counter() try: q_seria = Seria_Info.objects.raw('SELECT' ' oknardia_seria_info.id,' @@ -50,7 +50,7 @@ def catalog_seria(request: HttpRequest) -> HttpResponse: # получаем последние визиты всех посетителей из базы # id2log, log_visit = get_last_all_user_visit_list() 'LOG_VISIT': get_last_all_user_visit_list(), - 'ticks': float(time.time() - time_start) + 'ticks': float(time.perf_counter() - time_start) }) return render(request, "catalog/catalog_seria.html", to_template) @@ -64,7 +64,7 @@ def catalog_seria_info(request: HttpRequest, seria_name_translit: None, seria_id :param seria_id: int -- id серии :return response: HttpResponse -- исходящий http-ответ """ - time_start = time.time() + time_start = time.perf_counter() msg = "" try: seria_id = int(seria_id) @@ -113,7 +113,7 @@ def catalog_seria_info(request: HttpRequest, seria_name_translit: None, seria_id # print StringForSqlIN # Получаем данные для таблички Окон по типам квартирах в серии дома # " IFNULL(oknardia_mountdim2apartment.iQuantity, 0) AS iQuantity," \ - # tStart2 = time.time() # замер времени + # tStart2 = time.perf_counter() # замер времени q_win_in_apartment_in_seria = Win_MountDim.objects.raw( f"SELECT" f" oknardia_win_mountdim.id," @@ -186,7 +186,7 @@ def catalog_seria_info(request: HttpRequest, seria_name_translit: None, seria_id min_offer_in_row = 10000 row_for_table = [] # print(table_of_win_in_seria_by_apartmment) - # print(f"==============>{float(time.time()-tStart2)}<==============") + # print(f"==============>{float(time.perf_counter()-tStart2)}<==============") # print NumOffersPerColumn, NumMerchantPerColumn to_template.update({"WIN_OFFER_AND_MERCHANT": offer_and_merchant_per_win, "TABLE_OF_WINDOWS": table_of_win_in_seria_by_apartmment}) @@ -210,14 +210,14 @@ def catalog_seria_info(request: HttpRequest, seria_name_translit: None, seria_id to_template.update({'THIS_SERIA_NAME': seria_name}) # to_template.update({'LOG_VISIT': GetLastAllUserVisitSeriaList(SeriaName), - # 'ticks': float(time.time()-time_start)}) + # 'ticks': float(time.perf_counter()-time_start)}) 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) + 'ticks': float(time.perf_counter() - time_start) }) return render(request, light_template, to_template) diff --git a/oknardia/web/prices.py b/oknardia/web/prices.py index 0b60da2..f821ab6 100644 --- a/oknardia/web/prices.py +++ b/oknardia/web/prices.py @@ -325,7 +325,7 @@ def report_one_win_price(request: HttpRequest, win_width_mm: str = '670', win_he :param win_id: str -- ID проема (см. таблицу oknardia_win_mountdim) :return response: HttpResponse -- исходящий http-ответ """ - time_start = time.time() + time_start = time.perf_counter() to_template = {} try: # т.к. для вызова GetFlapDim4BigPictures нужно иметь внутри queryset поле iQuantity нельзя использовать @@ -439,7 +439,7 @@ def report_one_win_price(request: HttpRequest, win_width_mm: str = '670', win_he # получаем последние визиты всех посетителей из базы # id2log, log_visit = get_last_all_user_visit_list() 'LOG_VISIT': get_last_all_user_visit_list(), - 'ticks': float(time.time() - time_start) + 'ticks': float(time.perf_counter() - time_start) }) return render(request, "price/price_offers_for_one_window.html", to_template) @@ -452,11 +452,11 @@ def next_one_win_price(request: HttpRequest, win_id='16', frame_begin_n="0"): :param frame_begin_n: str -- Номер записи с которой начинается фрейм с ценами :return: HttpResponse -- """ - time_start = time.time() + time_start = time.perf_counter() to_template = report_price_frame(0, 1, 0, 0, int(frame_begin_n), 0, int(win_id)) to_template.update({'MOUNT_DIM_PER_OFFER': 1, 'WIN_ID': int(win_id), - 'ticks': float(time.time() - time_start)}) + 'ticks': float(time.perf_counter() - time_start)}) return render(request, "price/price_offers_for_one_window_frame.html", to_template) @@ -470,7 +470,7 @@ def report_price(request: HttpRequest, build_id: str = "22427", apart_id: str = :param slug: str - slug адреса здания :return: response: HttpResponse """ - time_start = time.time() + time_start = time.perf_counter() msg = "" to_template = {} try: @@ -657,14 +657,14 @@ def report_price(request: HttpRequest, build_id: str = "22427", apart_id: str = log_entry.sLogAddress = to_template["ADDRESS"] log_entry.sLogNameApartment = to_template["APART"] log_entry.sLogURL = f"/{build_id}/{apart_id}/{to_template['ADDRESS_T']}" - log_entry.dLogVisitTime = time.time() + log_entry.dLogVisitTime = time.perf_counter() log_entry.save() # UPDATE except ObjectDoesNotExist: log_entry = LogVisitPriceReport( sLogAddress=to_template["ADDRESS"], sLogNameApartment=to_template["APART"], sLogURL=f"/{build_id}/{apart_id}/{to_template['ADDRESS_T']}", - dLogVisitTime=time.time() + dLogVisitTime=time.perf_counter() ) log_entry.save() # INSERT @@ -676,11 +676,11 @@ def report_price(request: HttpRequest, build_id: str = "22427", apart_id: str = "LastURL": f"/{build_id}/{apart_id}/{to_template['ADDRESS_T']}", "LastAddress": to_template["ADDRESS"], "LastApart": to_template["APART"], - "Time": time.time()} + "Time": time.perf_counter()} last_visit.insert(0, Item) # Добавляем текущий Item в начало last_visit = json.dumps(last_visit[:3]) # упаковываем json без пробелов (три записи) # print u"сейчас запишем вот эту куку:", LastVisit - to_template.update({'ticks': float(time.time() - time_start)}) + to_template.update({'ticks': float(time.perf_counter() - time_start)}) response = render(request, "price/price_list.html", to_template) response.set_cookie("LastVisit", last_visit, max_age=7862400) # ставим или перезаписываем куки (91 день) return response @@ -702,7 +702,7 @@ def next_price_frame(request: HttpRequest, apart_id: str = "1", mount_dim_per_o :param frame_begin_n: str -- Номер записи с которой начинается фрейм с ценами :return: HttpResponse -- HTTP-ответ """ - time_start = time.time() + time_start = time.perf_counter() # получаем данные для фрейма ценовых предложений price_frame = report_price_frame(int(apart_id), int(mount_dim_per_offer), float(address_longitude), float(address_latitude), int(frame_begin_n)) @@ -711,5 +711,5 @@ def next_price_frame(request: HttpRequest, apart_id: str = "1", mount_dim_per_o 'MOUNT_DIM_PER_OFFER': mount_dim_per_offer, 'ADDRESS_LAT': address_latitude, 'ADDRESS_LON': address_longitude, - 'ticks': float(time.time() - time_start)}) + 'ticks': float(time.perf_counter() - time_start)}) return render(request, "price/price_list_frame.html", to_template) diff --git a/oknardia/web/report1.py b/oknardia/web/report1.py index 6144d08..2cf3012 100644 --- a/oknardia/web/report1.py +++ b/oknardia/web/report1.py @@ -80,7 +80,7 @@ def compare_offers(request: HttpRequest, to_compare: str = "1,2") -> HttpRespons :param to_compare: str -- список ,через запятую, id оконных наборов (Set) для сравнения :return: HttpResponse -- """ - time_start = time.time() + time_start = time.perf_counter() to_template = {} try: # Этот блок нужен для 302-переадресации, когда разные URL отдают одинаковые страницы. @@ -539,7 +539,7 @@ def compare_offers(request: HttpRequest, to_compare: str = "1,2") -> HttpRespons # получаем последние визиты всех посетителей из базы # id2log, log_visit = get_last_all_user_visit_list() 'LOG_VISIT': get_last_all_user_visit_list(), - 'ticks': float(time.time() - time_start) + 'ticks': float(time.perf_counter() - time_start) }) return render(request, "report/report_compare_set.html", to_template) @@ -551,7 +551,7 @@ def show_rating_components(request: HttpRequest, win_set: str = "1") -> HttpResp :param win_set: str -- id оконного набора, для которого показать состав рейтинга :return: HttpResponse -- """ - time_start = time.time() + time_start = time.perf_counter() to_template = {} try: win_set = int(win_set) @@ -596,5 +596,5 @@ def show_rating_components(request: HttpRequest, win_set: str = "1") -> HttpResp "коммерческое предложение, коммерческих предложения," " коммерческих предложений"), 'TEST': win_set, - 'ticks': float(time.time() - time_start)}) + 'ticks': float(time.perf_counter() - time_start)}) return render(request, "report/show_rating_components.html", to_template) diff --git a/oknardia/web/service.py b/oknardia/web/service.py index afef51c..08b54f5 100644 --- a/oknardia/web/service.py +++ b/oknardia/web/service.py @@ -16,18 +16,18 @@ def service(request: HttpRequest) -> HttpResponse: :param request: HttpRequest :return: HttpResponse """ - time_start = time.time() + time_start = time.perf_counter() # проверка на аутентификацию # print(request.user.is_authenticated) if not request.user.is_authenticated: return redirect("/service/not-denice") - return render(request, "service/index.html", {'ticks': float(time.time()-time_start)}) + return render(request, "service/index.html", {'ticks': float(time.perf_counter()-time_start)}) # страничка, на которую переадресует служебный интерфейс, если нет аутентификации. def not_denice(request): - time_start = time.time() - return render(request, "service/not_denice.html", {'ticks': float(time.time()-time_start)}) + time_start = time.perf_counter() + return render(request, "service/not_denice.html", {'ticks': float(time.perf_counter()-time_start)}) def tmp(request: HttpRequest) -> HttpResponse: @@ -36,8 +36,8 @@ def tmp(request: HttpRequest) -> HttpResponse: :param request: :return: """ - t_start = time.time() - return render(request, "service/tmp.html", {'TAU': float(time.time()-t_start)}) + t_start = time.perf_counter() + return render(request, "service/tmp.html", {'TAU': float(time.perf_counter()-t_start)}) @@ -59,7 +59,7 @@ def make_rating(request: HttpRequest) -> HttpResponse: :param request: HttpRequest -- запрос :return: HttpResponse -- ответ """ - time_start = time.time() + time_start = time.perf_counter() msg = "" # ВЫЧИСЛЯЕМ РЕЙТИНГ ПРОФИЛЕЙ # устанавливаем рейтинг всех профилей в базе в ноль @@ -364,5 +364,5 @@ def make_rating(request: HttpRequest) -> HttpResponse: obj.save() # print u"id:",i["id"], u"\tRank:", i["TmpRating"], u"\tRate:", obj.fSetRating, u"\tSet:", i["sSetName"], i["fProfileRating"], i["fGlazingRating"] to_template.update({'msg': msg}) - to_template.update({'ticks': float(time.time()-time_start)}) + to_template.update({'ticks': float(time.perf_counter()-time_start)}) return render(request, "service/make_rating.html", to_template) \ No newline at end of file diff --git a/oknardia/web/views.py b/oknardia/web/views.py index 0a72f9d..f4bc12b 100644 --- a/oknardia/web/views.py +++ b/oknardia/web/views.py @@ -113,7 +113,7 @@ def get_address(request: HttpRequest) -> HttpResponse: :param request: request :return: response ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░""" - time_start = time.time() + time_start = time.perf_counter() if request.method != 'POST': return redirect("/") if 'address' not in request.POST: @@ -149,7 +149,7 @@ def get_address(request: HttpRequest) -> HttpResponse: f"ORDER BY R2 " f"LIMIT 1;")[0] if q.R2 > 0.67: # Если расстояние между точками больше 670 метров, то не показываем результат - to_template.update({'ticks': float(time.time()-time_start)}) + to_template.update({'ticks': float(time.perf_counter()-time_start)}) to_template.update({'addr': addr}) return render(request, "popup/popup_incorrect_address.html", to_template) addr = q.sAddress @@ -292,5 +292,5 @@ def get_address(request: HttpRequest) -> HttpResponse: to_template.update({'SERIA_BASE': q1.sName, 'addr': addr, 'addr_T': pytils.translit.slugify(addr), - 'ticks': float(time.time()-time_start)}) + 'ticks': float(time.perf_counter()-time_start)}) return render(request, "popup/popup_show_apartment_variants.html", to_template) From 43f63f44612c924f103677b40ea5b3ee5645dfd1 Mon Sep 17 00:00:00 2001 From: erjemin Date: Mon, 20 Apr 2026 23:49:42 +0300 Subject: [PATCH 020/102] mod: refactor catalog_seria to ORM --- README.md | 8 ++++ oknardia/web/catalog_series.py | 71 +++++++++++++++++----------------- 2 files changed, 43 insertions(+), 36 deletions(-) diff --git a/README.md b/README.md index c458d3b..b2d63e9 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,14 @@ * Распилен `oknardia/web/catalog.py` на тематические модули (`catalog_companies.py`, `catalog_profiles.py`, `catalog_series.py`, `catalog_openings.py`) с вынесением общей логики в `catalog_utils.py`; маршруты обновлены без изменения внешних URL. * Рефакторинг `catalog_profile_model` (`/catalog/profile/...`): raw SQL ⟶ ORM, упрощена логика, вынесены helper-функции, сокращено дублирование расчёта цветов рейтинга, нормализована подготовка `LIST_OTHER`/`MERCHANTS`/`PROFILES`/`PROFILE_DETAIL`, сохранена совместимость шаблонов. * Рефакторинг `catalog_profile_manufacture` (`/catalog/profile/-`): упрощена валидация URL, убран дублирующий код маппинга для `PROFILES` и `MERCHANTS` через общие хелперы, стандартизирован хвост контекста (`LAST_VISIT`, `LOG_VISIT`, `ticks`) через `_append_visit_context`. +* Рефакторинг `catalog_seria` (`/catalog/seria/`): raw SQL ⟶ ORM для списка корневых серий, подготовка данных упрощена, хвост контекста с визитами и `ticks` вынесен в общий helper внутри `catalog_series.py`. +* +* +* +* +* +* +* #### Планы, задачи, маркеры и идеи на будущее: diff --git a/oknardia/web/catalog_series.py b/oknardia/web/catalog_series.py index 8a011a2..c2abefc 100644 --- a/oknardia/web/catalog_series.py +++ b/oknardia/web/catalog_series.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- from django.core.exceptions import ObjectDoesNotExist +from django.db.models import F from django.shortcuts import render, redirect from django.http import HttpRequest, HttpResponse from django.template.loader import render_to_string @@ -16,6 +17,20 @@ import os import math import pytils + +def _make_slug(value: str) -> str: + """Транслитерирует строку в slug (pytils).""" + return pytils.translit.slugify(value) + + +def _append_visit_context(to_template: dict, request: HttpRequest, time_start: float) -> None: + """Дописывает в контекст стандартный хвост: визиты и время выполнения.""" + to_template.update({ + 'LAST_VISIT': get_last_user_visit_list(get_last_user_visit_cookies(request)[:3]), + 'LOG_VISIT': get_last_all_user_visit_list(), + 'ticks': float(time.perf_counter() - time_start), + }) + # Каталог типовых серий зданий (пока переадресация) def catalog_seria(request: HttpRequest) -> HttpResponse: """ @@ -25,33 +40,24 @@ def catalog_seria(request: HttpRequest) -> HttpResponse: :return response: HttpResponse -- исходящий http-ответ """ time_start = time.perf_counter() - try: - q_seria = Seria_Info.objects.raw('SELECT' - ' oknardia_seria_info.id,' - ' oknardia_seria_info.sURL2IMG,' - ' oknardia_seria_info.sName ' - 'FROM oknardia_seria_info ' - 'WHERE oknardia_seria_info.id = oknardia_seria_info.kRoot_id ' - 'ORDER BY oknardia_seria_info.sName;') - list_seria = [] - for i in q_seria: - list_seria.append({ - "ID": i.id, - "URL": i.sURL2IMG, - "NAME": i.sName, - "NAME_T": pytils.translit.slugify(i.sName) - }) - to_template = {'SERIAS': list_seria} - except (ObjectDoesNotExist,): - to_template = {} - 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.perf_counter() - time_start) - }) + # Только корневые серии (id == kRoot_id), сортировка как в старом SQL. + q_seria = ( + Seria_Info.objects.filter(id=F('kRoot_id')) + .values('id', 'sURL2IMG', 'sName') + .order_by('sName') + ) + to_template: dict[str, object] = { + 'SERIAS': [ + { + 'ID': row['id'], + 'URL': row['sURL2IMG'], + 'NAME': row['sName'], + 'NAME_T': _make_slug(row['sName']), + } + for row in q_seria + ] + } + _append_visit_context(to_template, request, time_start) return render(request, "catalog/catalog_seria.html", to_template) @@ -83,7 +89,7 @@ def catalog_seria_info(request: HttpRequest, seria_name_translit: None, seria_id is_hard_template = False else: is_hard_template = True - to_template = {} + to_template: dict[str, object] ={} # получаем проемы использующиеся в данной серии домов q_windows_in_seria = Win_MountDim.objects.raw( f"SELECT DISTINCT" @@ -211,14 +217,7 @@ def catalog_seria_info(request: HttpRequest, seria_name_translit: None, seria_id # to_template.update({'LOG_VISIT': GetLastAllUserVisitSeriaList(SeriaName), # 'ticks': float(time.perf_counter()-time_start)}) - 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.perf_counter() - time_start) - }) + _append_visit_context(to_template, request, time_start) return render(request, light_template, to_template) From 4181f34bcbeeafbd7c7df22b0f1ccb21c3a76fb4 Mon Sep 17 00:00:00 2001 From: erjemin Date: Tue, 21 Apr 2026 01:05:11 +0300 Subject: [PATCH 021/102] =?UTF-8?q?=20minor:=20fix:=20=D1=8F=D0=B2=D0=BD?= =?UTF-8?q?=D0=BE=D0=B5=20=D1=83=D0=BA=D0=B0=D0=B7=D0=B0=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D1=82=D0=B8=D0=BF=D0=B0=20to=5Ftemplate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oknardia/web/blog.py | 4 ++-- oknardia/web/catalog.py | 2 +- oknardia/web/catalog_companies.py | 4 ++-- oknardia/web/catalog_openings.py | 2 +- oknardia/web/catalog_series.py | 2 -- oknardia/web/diagrams.py | 2 +- oknardia/web/prices.py | 8 ++++---- oknardia/web/report1.py | 4 ++-- oknardia/web/report2.py | 2 +- oknardia/web/service.py | 2 +- oknardia/web/user_manager.py | 10 +++++----- oknardia/web/views.py | 6 +++--- 12 files changed, 23 insertions(+), 25 deletions(-) diff --git a/oknardia/web/blog.py b/oknardia/web/blog.py index b7c938f..adfba72 100644 --- a/oknardia/web/blog.py +++ b/oknardia/web/blog.py @@ -38,7 +38,7 @@ def blog_list_posts(request: HttpRequest, page: str = "0") -> HttpResponse: except ValueError: page = 0 dim_blogposts = [] # массив блог-постов для формирования списка - to_template = {} # словарь, для передачи шаблону + to_template: dict[str, object] = {} # словарь, для передачи шаблону template = "blog/blog_list.html" # шаблон in_list = NUM_BLOG_TIZER_IN_PAGE # длина списка блогов в выдачe # проверяем нужно ли ставить кнопку BACK и куда она ссылается @@ -141,7 +141,7 @@ def blog_post(request: HttpRequest, post_id: str = "0", page_back: str = None) - back_page = int(request.GET["page-back"]) except (TypeError, KeyError): back_page = 0 - to_template = {} # словарь, для передачи шаблону + to_template: dict[str, object] = {} # словарь, для передачи шаблону template = "blog/blog_post.html" # шаблон q = BlogPosts.objects.get(id=post_id) diff --git a/oknardia/web/catalog.py b/oknardia/web/catalog.py index 2bcceda..c57184a 100644 --- a/oknardia/web/catalog.py +++ b/oknardia/web/catalog.py @@ -16,7 +16,7 @@ def catalog_root(request: HttpRequest) -> HttpResponse: """ time_start = time.perf_counter() # получаем из cookies последние визиты клиента - to_template = { + to_template: dict[str, object] = { 'LAST_VISIT': get_last_user_visit_list(get_last_user_visit_cookies(request)[:3]), 'LOG_VISIT': get_last_all_user_visit_list(), 'ticks': float(time.perf_counter() - time_start)} diff --git a/oknardia/web/catalog_companies.py b/oknardia/web/catalog_companies.py index a470988..7cc9d62 100644 --- a/oknardia/web/catalog_companies.py +++ b/oknardia/web/catalog_companies.py @@ -16,7 +16,7 @@ import pytils def catalog_company(request: HttpRequest) -> HttpResponse: time_start = time.perf_counter() - to_template = {} # словарь, для передачи шаблону + to_template: dict[str, object] = {} # словарь, для передачи шаблону q_company = MerchantBrand.objects.raw('SELECT' ' oknardia_merchantbrand.id,' ' oknardia_merchantbrand.sMerchantName,' @@ -72,7 +72,7 @@ def catalog_company(request: HttpRequest) -> HttpResponse: def catalog_company_detail(request: HttpRequest, company_id: str, company_name_slug: str) -> HttpResponse: time_start = time.perf_counter() - to_template = {} # словарь, для передачи шаблону + to_template: dict[str, object] = {} # словарь, для передачи шаблону company_id = int(company_id) q_by_id = MerchantBrand.objects.get(id=company_id) if pytils.translit.slugify(q_by_id.sMerchantName) != company_name_slug: diff --git a/oknardia/web/catalog_openings.py b/oknardia/web/catalog_openings.py index 5ca0d13..01c05c9 100644 --- a/oknardia/web/catalog_openings.py +++ b/oknardia/web/catalog_openings.py @@ -12,7 +12,7 @@ import pytils def standard_opening(request: HttpRequest) -> HttpResponse: time_start = time.perf_counter() - to_template = {} # словарь, для передачи шаблону + to_template: dict[str, object] = {} # словарь, для передачи шаблону 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 ' diff --git a/oknardia/web/catalog_series.py b/oknardia/web/catalog_series.py index c2abefc..a20cdd8 100644 --- a/oknardia/web/catalog_series.py +++ b/oknardia/web/catalog_series.py @@ -215,8 +215,6 @@ def catalog_seria_info(request: HttpRequest, seria_name_translit: None, seria_id seria_name = Seria_Info.objects.get(id=seria_id).sName to_template.update({'THIS_SERIA_NAME': seria_name}) - # to_template.update({'LOG_VISIT': GetLastAllUserVisitSeriaList(SeriaName), - # 'ticks': float(time.perf_counter()-time_start)}) _append_visit_context(to_template, request, time_start) return render(request, light_template, to_template) diff --git a/oknardia/web/diagrams.py b/oknardia/web/diagrams.py index dcce5c0..9ce748f 100644 --- a/oknardia/web/diagrams.py +++ b/oknardia/web/diagrams.py @@ -61,7 +61,7 @@ def statistic_menu(request: HttpRequest) -> HttpResponse: :return: HttpResponse -- исходящий http-ответ """ time_start = time() - to_template = {} + to_template: dict[str, object] = {} seria_id, for_seria_nav = seria_nav(0) to_template.update(for_seria_nav) # проверяем какой JS с картами и PieCharts: упакованные или нет (откуда берётся не упакованный -- не помню) diff --git a/oknardia/web/prices.py b/oknardia/web/prices.py index f821ab6..8bd8323 100644 --- a/oknardia/web/prices.py +++ b/oknardia/web/prices.py @@ -326,7 +326,7 @@ def report_one_win_price(request: HttpRequest, win_width_mm: str = '670', win_he :return response: HttpResponse -- исходящий http-ответ """ time_start = time.perf_counter() - to_template = {} + to_template: dict[str, object] = {} try: # т.к. для вызова GetFlapDim4BigPictures нужно иметь внутри queryset поле iQuantity нельзя использовать # простой запрос (см. следующую строку). @@ -453,7 +453,7 @@ def next_one_win_price(request: HttpRequest, win_id='16', frame_begin_n="0"): :return: HttpResponse -- """ time_start = time.perf_counter() - to_template = report_price_frame(0, 1, 0, 0, int(frame_begin_n), 0, int(win_id)) + to_template: dict[str, object] = report_price_frame(0, 1, 0, 0, int(frame_begin_n), 0, int(win_id)) to_template.update({'MOUNT_DIM_PER_OFFER': 1, 'WIN_ID': int(win_id), 'ticks': float(time.perf_counter() - time_start)}) @@ -472,7 +472,7 @@ def report_price(request: HttpRequest, build_id: str = "22427", apart_id: str = """ time_start = time.perf_counter() msg = "" - to_template = {} + to_template: dict[str, object] = {} try: build_id = int(build_id) apart_id = int(apart_id) @@ -706,7 +706,7 @@ def next_price_frame(request: HttpRequest, apart_id: str = "1", mount_dim_per_o # получаем данные для фрейма ценовых предложений price_frame = report_price_frame(int(apart_id), int(mount_dim_per_offer), float(address_longitude), float(address_latitude), int(frame_begin_n)) - to_template = price_frame + to_template: dict[str, object] = price_frame to_template.update({'APPARTMENT_ID': apart_id, 'MOUNT_DIM_PER_OFFER': mount_dim_per_offer, 'ADDRESS_LAT': address_latitude, diff --git a/oknardia/web/report1.py b/oknardia/web/report1.py index 2cf3012..183c520 100644 --- a/oknardia/web/report1.py +++ b/oknardia/web/report1.py @@ -81,7 +81,7 @@ def compare_offers(request: HttpRequest, to_compare: str = "1,2") -> HttpRespons :return: HttpResponse -- """ time_start = time.perf_counter() - to_template = {} + to_template: dict[str, object] = {} try: # Этот блок нужен для 302-переадресации, когда разные URL отдают одинаковые страницы. # Например, такое происходит для страницы: /compare_offers/1,2 и /compare_offers/2,1 @@ -552,7 +552,7 @@ def show_rating_components(request: HttpRequest, win_set: str = "1") -> HttpResp :return: HttpResponse -- """ time_start = time.perf_counter() - to_template = {} + to_template: dict[str, object] = {} try: win_set = int(win_set) except ValueError: diff --git a/oknardia/web/report2.py b/oknardia/web/report2.py index bf73f32..9a4515b 100644 --- a/oknardia/web/report2.py +++ b/oknardia/web/report2.py @@ -35,7 +35,7 @@ def profiles_rating(request: HttpRequest) -> HttpResponse: keys = [RANK_PVCP_HEAT_TRANSFER_NAME, RANK_PVCP_SOUNDPROOFING_NAME, RANK_PVCP_SEALS_NAME, RANK_PVCP_HEIGHT_NAME, RANK_PVCP_G_THICKNESS_NAME, RANK_PVCP_THICKNESS_NAME, RANK_PVCP_RABBET_NAME, RANK_PVCP_CAMERAS_NUM_NAME, RANK_PVCP_CAMERAS_POPULARITY_NAME] - to_template = {'KEYS': keys} + to_template: dict[str, object] = {'KEYS': keys} for profile in q_pvc_profiles: try: received_json = json.loads(profile.sProfileDescription) diff --git a/oknardia/web/service.py b/oknardia/web/service.py index 08b54f5..2f86e4c 100644 --- a/oknardia/web/service.py +++ b/oknardia/web/service.py @@ -64,7 +64,7 @@ def make_rating(request: HttpRequest) -> HttpResponse: # ВЫЧИСЛЯЕМ РЕЙТИНГ ПРОФИЛЕЙ # устанавливаем рейтинг всех профилей в базе в ноль profile_all_num = PVCprofiles.objects.all().update(fProfileRating=0.0) - to_template = {'NUM_PROFILE_TOTAL': profile_all_num} # засовываем данные в шаблон + to_template: dict[str, object] = {'NUM_PROFILE_TOTAL': profile_all_num} # засовываем данные в шаблон q = PVCprofiles.objects.raw("SELECT" " oknardia_pvcprofiles.*," " COUNT(oknardia_priceoffer.id) AS NumOffer " diff --git a/oknardia/web/user_manager.py b/oknardia/web/user_manager.py index 3a76bca..952484d 100644 --- a/oknardia/web/user_manager.py +++ b/oknardia/web/user_manager.py @@ -38,7 +38,7 @@ def menu_login_logout(request: HttpRequest) -> HttpResponse: # В дальнейшем, в случае высоких нагрузок на сервис, возможна простая деградация # с помощью отключения этого блока. Также возможен перенос исполнения функционала # LOGIN-LOGOUT на отдельный сервер. - to_template = {} # словарь, для передачи шаблону + to_template: dict[str, object] = {} # словарь, для передачи шаблону template = "user_manager/login-logout.html" # шаблон для подгрузки GOOGLE CAPTCHA if request.user.is_authenticated: to_template.update({'LOGGED_USER': request.user.username}) @@ -56,7 +56,7 @@ def confirm_email(request: HttpRequest, user_id: str = "1", hash_part_12: str = :return response: исходящий http-ответ """ time_start = time() - to_template = {} # словарь, для передачи шаблону + to_template: dict[str, object] = {} # словарь, для передачи шаблону to_template.update({'CONFIRM_OK': "NO"}) template = "index.html" # шаблон, о том, что email не подтвержден try: @@ -100,7 +100,7 @@ def restore_password(request: HttpRequest, user_id: str = "1", hash_part_12: str :return response: исходящий http-ответ """ time_start = time() - to_template = {} # словарь, для передачи шаблону + to_template: dict[str, object] = {} # словарь, для передачи шаблону to_template.update({'CONFIRM_OK': "NO"}) template = "index.html" # шаблон, о том, что email не подтвержден try: @@ -138,7 +138,7 @@ def change_password(request: HttpRequest) -> HttpResponse: if request.method != 'POST': return HttpResponseRedirect("/") try: - to_template = {} # словарь, для передачи шаблону + to_template: dict[str, object] = {} # словарь, для передачи шаблону to_template.update({'CONFIRM_OK': "NO"}) template = "user_manager/popup_confirm_email_or_restore_password_bad.html" # шаблон, о том, что всякие ошибки try: @@ -189,7 +189,7 @@ def form_user_menu_processing(request: HttpRequest) -> HttpResponse: return HttpResponseRedirect("/") if request.POST['status'] == "": return HttpResponseRedirect("/") - to_template = {} # словарь, для передачи шаблону + to_template: dict[str, object] = {} # словарь, для передачи шаблону template = "user_manager/login-logout_after.html" # шаблон для подгрузки GOOGLE CAPTCHA # БЛОК -- LOGOUT diff --git a/oknardia/web/views.py b/oknardia/web/views.py index f4bc12b..527846b 100644 --- a/oknardia/web/views.py +++ b/oknardia/web/views.py @@ -19,7 +19,7 @@ def main_init(request: HttpRequest) -> HttpResponse: :param request: входящий http-запрос :return response: исходящий http-ответ """ - to_template = {} # словарь, для передачи шаблону + to_template: dict[str, object] = {} # словарь, для передачи шаблону num_viz = 0 # как будто первый визит # проверяем куки числа визита if "NumVisit" in request.COOKIES: @@ -55,7 +55,7 @@ def tariff(request: HttpRequest) -> HttpResponse: :param request: входящий http-запрос :return response: исходящий http-ответ """ - to_template = {} # для передачи в шаблон + to_template: dict[str, object] = {} # для передачи в шаблон if request.method == 'POST': # print request.POST if 'tariff' in request.POST and 'email_' in request.POST \ @@ -119,7 +119,7 @@ def get_address(request: HttpRequest) -> HttpResponse: if 'address' not in request.POST: return redirect("/") addr = request.POST['address'] - to_template = {} + to_template: dict[str, object] = {} try: q = Building_Info.objects.get(sAddress=addr) # Если QuerySet не содержит GeoCode (такое бывает, что в Яндекс-Картах не было каких-то данных), From 91b4d635da6fcf29d65f39f30d01e23670afef49 Mon Sep 17 00:00:00 2001 From: erjemin Date: Tue, 21 Apr 2026 21:31:17 +0300 Subject: [PATCH 022/102] mod: refactor catalog_seria_info and update README/settings --- README.md | 2 +- oknardia/oknardia/settings.py | 5 +- oknardia/web/catalog_series.py | 481 +++++++++++++++++---------------- 3 files changed, 257 insertions(+), 231 deletions(-) diff --git a/README.md b/README.md index b2d63e9..6c1118d 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ * Рефакторинг `catalog_profile_model` (`/catalog/profile/...`): raw SQL ⟶ ORM, упрощена логика, вынесены helper-функции, сокращено дублирование расчёта цветов рейтинга, нормализована подготовка `LIST_OTHER`/`MERCHANTS`/`PROFILES`/`PROFILE_DETAIL`, сохранена совместимость шаблонов. * Рефакторинг `catalog_profile_manufacture` (`/catalog/profile/-`): упрощена валидация URL, убран дублирующий код маппинга для `PROFILES` и `MERCHANTS` через общие хелперы, стандартизирован хвост контекста (`LAST_VISIT`, `LOG_VISIT`, `ticks`) через `_append_visit_context`. * Рефакторинг `catalog_seria` (`/catalog/seria/`): raw SQL ⟶ ORM для списка корневых серий, подготовка данных упрощена, хвост контекста с визитами и `ticks` вынесен в общий helper внутри `catalog_series.py`. -* +* Рефакторинг `catalog_seria_info` и связанных функций в `catalog_series.py`: raw SQL ⟶ ORM (`catalog_seria_info`, `seria_nav`, `seria_info_year`, `seria_info_geo_code`), снижена нагрузка на БД за счёт предвыборки и переиспользования агрегатов (`quantities_by_pair`, `offers_by_window`), добавлены безопасные fallback-значения для пустых выборок, включена потоковая обработка `iterator(chunk_size=500)` для гео-данных, обновлены комментарии и docstring под фактическую логику (таблица окон, pre-render light/heavy шаблонов, гео+статистика серии). * * * diff --git a/oknardia/oknardia/settings.py b/oknardia/oknardia/settings.py index bd24a5f..a8b4875 100644 --- a/oknardia/oknardia/settings.py +++ b/oknardia/oknardia/settings.py @@ -218,7 +218,10 @@ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' CAPTCHA_PUBLIC_KEY = env('CAPTCHA_PUBLIC_KEY', default='') CAPTCHA_PRIVATE_KEY = env('CAPTCHA_PRIVATE_KEY', default='') -# количество коммерческих предложений во фреме отчета +# если непонятно какая серия выбрана через каталог (finger fix) выбираем серию типового строения: +DEFAULT_SERIA_ID_FOR_CATALOG = 843 # СЕРИЯ 1-515/9 -- дом в котором я живу + +# количество коммерческих предложений во фрейме отчета OFFER_PER_FRAME = 5 OFFER_PER_FRAME_FOR_ONE_FLAP = 10 # папка для хранения изображений diff --git a/oknardia/web/catalog_series.py b/oknardia/web/catalog_series.py index a20cdd8..568debc 100644 --- a/oknardia/web/catalog_series.py +++ b/oknardia/web/catalog_series.py @@ -1,11 +1,14 @@ # -*- coding: utf-8 -*- from django.core.exceptions import ObjectDoesNotExist -from django.db.models import F +from django.db.models import Count, F, IntegerField, Value from django.shortcuts import render, redirect from django.http import HttpRequest, HttpResponse from django.template.loader import render_to_string from oknardia.settings import * from oknardia.models import ( + Apartment_Type, + MountDim2Apartment, + PriceOffer, Seria_Info, Win_MountDim, Building_Info, @@ -31,10 +34,10 @@ def _append_visit_context(to_template: dict, request: HttpRequest, time_start: f 'ticks': float(time.perf_counter() - time_start), }) -# Каталог типовых серий зданий (пока переадресация) +# Каталог типовых серий зданий. def catalog_seria(request: HttpRequest) -> HttpResponse: """ - КАТАЛОГ ТИПОВЫЙ СЕРИЙ: страница со всеми сериями зданий в базе окнардии + КАТАЛОГ ТИПОВЫХ СЕРИЙ: выводит список корневых серий из каталога. :param request: HttpRequest -- входящий http-запрос :return response: HttpResponse -- исходящий http-ответ @@ -61,180 +64,175 @@ def catalog_seria(request: HttpRequest) -> HttpResponse: return render(request, "catalog/catalog_seria.html", to_template) -def catalog_seria_info(request: HttpRequest, seria_name_translit: None, seria_id: int = 843) -> HttpResponse: +def catalog_seria_info( + request: HttpRequest, + seria_name_translit: str | None, + seria_id: int = DEFAULT_SERIA_ID_FOR_CATALOG, +) -> HttpResponse: """ - КАТАЛОГ ТИПОВЫЙ СЕРИЙ: страница детальной информацией по серии зданий + КАТАЛОГ ТИПОВОЙ СЕРИИ: детальная страница по серии домов. + + Что делает вьюха: + - канонизирует URL (root-id серии + корректный slug), + - собирает таблицу окон по типам квартир, + - для "тяжелого" режима дополнительно готовит навигацию/график/гео-данные + и сохраняет pre-render include-шаблон для последующих быстрых ответов. :param request: HttpRequest -- входящий http-запрос - :param seria_name_translit: str -- имя серии здания (транслитерированное pytils.translit.slugify()) + :param seria_name_translit: str -- имя серии здания (транслитерированное через pytils) :param seria_id: int -- id серии :return response: HttpResponse -- исходящий http-ответ """ time_start = time.perf_counter() - msg = "" + # Канонизируем URL: страница серии должна открываться только по корневой серии и правильному slug. try: seria_id = int(seria_id) - q_seria = Seria_Info.objects.get(id=seria_id) + q_seria = Seria_Info.objects.only("id", "kRoot_id", "sName").get(id=seria_id) if q_seria.id != q_seria.kRoot_id or seria_name_translit != pytils.translit.slugify(q_seria.sName): return redirect(f"/catalog/seria/{pytils.translit.slugify(q_seria.sName)}/all{seria_id}") - except(ObjectDoesNotExist, ValueError,): + except (ObjectDoesNotExist, ValueError): return redirect("/catalog/") - # если есть "облегченный" шаблон с частичным пре-рендером, то используем его. - light_template = f"{PATH_FOR_SERIA_INFO_HTML_INCLUDE}{str(seria_id)}_id.html" + + # Если есть "облегченный" шаблон с частичным pre-render, используем его. + light_template = f"{PATH_FOR_SERIA_INFO_HTML_INCLUDE}{seria_id}_id.html" light_template_w_path = f"{TEMPLATES[0]['DIRS'][0]}/{light_template}" - # print(f"{TEMPLATES[0]['DIRS'][0]}/{light_template}") - # print(light_template_w_path) - # print(light_template_w_path) - if os.path.isfile(light_template_w_path): - is_hard_template = False - else: - is_hard_template = True - to_template: dict[str, object] ={} - # получаем проемы использующиеся в данной серии домов - q_windows_in_seria = Win_MountDim.objects.raw( - f"SELECT DISTINCT" - f" oknardia_win_mountdim.iWinWidth, oknardia_win_mountdim.iWinHight," - f" oknardia_win_mountdim.sDescripion, oknardia_win_mountdim.bIsDoor," - f" oknardia_win_mountdim.bIsNearDoor, oknardia_win_mountdim.sFlapConfig," - f" oknardia_win_mountdim.iWinDepth, oknardia_win_mountdim.id," - f" 1 AS iQuantity " - f"FROM oknardia_mountdim2apartment" - f" INNER JOIN oknardia_win_mountdim" - f" ON oknardia_mountdim2apartment.kMountDim_id = oknardia_win_mountdim.id" - f" INNER JOIN oknardia_apartment_type" - f" ON oknardia_mountdim2apartment.kApartment_id = oknardia_apartment_type.id " - f"WHERE oknardia_apartment_type.kSeria_id = {seria_id}" - f" ORDER BY oknardia_win_mountdim.bIsNearDoor DESC," - f" oknardia_win_mountdim.bIsDoor DESC," - f" oknardia_win_mountdim.iWinWidth," - f" oknardia_win_mountdim.iWinHight DESC;") + is_hard_template = not os.path.isfile(light_template_w_path) + + to_template: dict[str, object] = {} + # Получаем все уникальные проемы серии и сразу добавляем iQuantity=1 + # для совместимости с get_flaps_for_big_pictures(). + list_win_in_seria = list( + Win_MountDim.objects.filter(kApartment__kSeria_id=seria_id) + .annotate(iQuantity=Value(1, output_field=IntegerField())) + .only( + "id", + "iWinWidth", + "iWinHight", + "sDescripion", + "bIsDoor", + "bIsNearDoor", + "sFlapConfig", + "iWinDepth", + ) + .order_by("-bIsNearDoor", "-bIsDoor", "iWinWidth", "-iWinHight", "id") + .distinct() + ) + if is_hard_template: - # Получаем данные для отрисовки больших картинок с проёмами и передаём в "тяжёлый" шаблон - to_template.update(get_flaps_for_big_pictures(q_windows_in_seria)) - # формируем строку для включения в SQL-запрос вида "(2,8,16,46,1)" - str_for_sql_in = "(" - for count in q_windows_in_seria: - str_for_sql_in += str(count.id) + "," - str_for_sql_in = str_for_sql_in[:-1] + ")" - # print StringForSqlIN - # Получаем данные для таблички Окон по типам квартирах в серии дома - # " IFNULL(oknardia_mountdim2apartment.iQuantity, 0) AS iQuantity," \ - # tStart2 = time.perf_counter() # замер времени - q_win_in_apartment_in_seria = Win_MountDim.objects.raw( - f"SELECT" - f" oknardia_win_mountdim.id," - f" oknardia_apartment_type.sNameApartment," - f" oknardia_win_mountdim.iWinWidth," - f" oknardia_win_mountdim.iWinHight," - f" oknardia_apartment_type.id AS id_apart," - f" IFNULL(oknardia_mountdim2apartment.iQuantity, 0) AS iQuantity," - f" COUNT(oknardia_priceoffer.id) AS NumOffers " - f"FROM oknardia_apartment_type" - f" INNER JOIN oknardia_win_mountdim" - f" LEFT OUTER JOIN oknardia_mountdim2apartment" - f" ON oknardia_mountdim2apartment.kMountDim_id = oknardia_win_mountdim.id" - f" AND oknardia_mountdim2apartment.kApartment_id = oknardia_apartment_type.id" - f" LEFT OUTER JOIN oknardia_priceoffer" - f" ON oknardia_priceoffer.kOffer2MountDim_id = oknardia_win_mountdim.id" - f" LEFT OUTER JOIN oknardia_ouruser" - f" ON oknardia_ouruser.id = oknardia_priceoffer.kOfferFromUser_id " - f"WHERE oknardia_apartment_type.kSeria_id = {seria_id} " - f"AND oknardia_win_mountdim.id IN {str_for_sql_in} " - f"GROUP BY oknardia_apartment_type.id," - f" oknardia_apartment_type.sNameApartment," - f" oknardia_win_mountdim.id," - f" oknardia_mountdim2apartment.iQuantity " - f"ORDER BY oknardia_apartment_type.iSort," - f" oknardia_win_mountdim.bIsNearDoor DESC," - f" oknardia_win_mountdim.bIsDoor DESC," - f" oknardia_win_mountdim.iWinWidth," - f" oknardia_win_mountdim.iWinHight DESC;") - list_win_in_seria = list(q_windows_in_seria) + # Для "тяжелого" шаблона нужны большие картинки схем окон. + to_template.update(get_flaps_for_big_pictures(list_win_in_seria)) + + window_ids = [win.id for win in list_win_in_seria] + apartments_in_seria = list( + Apartment_Type.objects.filter(kSeria_id=seria_id) + .values("id", "sNameApartment") + .order_by("iSort", "id") + ) + apartment_ids = [apartment["id"] for apartment in apartments_in_seria] + + # Кэшируем количество проемов по паре (квартира, проем), чтобы не делать N*M обращений к БД. + quantities_by_pair = { + (row["kApartment_id"], row["kMountDim_id"]): row["iQuantity"] + for row in MountDim2Apartment.objects.filter( + kApartment_id__in=apartment_ids, + kMountDim_id__in=window_ids, + ).values("kApartment_id", "kMountDim_id", "iQuantity") + } + # Число офферов считаем один раз по каждому проему и переиспользуем при сборке таблицы. + offers_by_window = { + row["kOffer2MountDim_id"]: row["num_offers"] + for row in PriceOffer.objects.filter(kOffer2MountDim_id__in=window_ids) + .values("kOffer2MountDim_id") + .annotate(num_offers=Count("id")) + } + total_column = len(list_win_in_seria) - 1 - count_column = 0 - min_offer_in_row = 1000000000 table_of_win_in_seria_by_apartmment = [] - row_for_table = [] offer_and_merchant_per_win = [ { - "WIN_OFFER": 0, + "WIN_OFFER": offers_by_window.get(list_win_in_seria[i].id, 0), "WIN_MERCHANT": 0, "WIN_W": list_win_in_seria[i].iWinWidth, "WIN_H": list_win_in_seria[i].iWinHight, - "WIN_ID": list_win_in_seria[i].id - } for i in range(total_column + 1)] - for count in q_win_in_apartment_in_seria: - if count.iQuantity != 0: - row_for_table.append({ - "WIN_NUM": [chr(65 + count_column)], - "WIN_Q": count.iQuantity, - "WIN_ID": count.id, - "WIN_WIDTH": list_win_in_seria[count_column].iWinWidth, - "WIN_HEIGHT": list_win_in_seria[count_column].iWinHight, - "WIN_DESCRIPTION": list_win_in_seria[count_column].sDescripion, - "WIN_FLAPCFG": list_win_in_seria[count_column].sFlapConfig - }) - if min_offer_in_row > count.NumOffers: - min_offer_in_row = count.NumOffers - if offer_and_merchant_per_win[count_column]["WIN_OFFER"] < count.NumOffers: - offer_and_merchant_per_win[count_column]["WIN_OFFER"] = count.NumOffers - else: - row_for_table.append({"WIN_NUM": "—"}) - if count_column < total_column: - count_column += 1 - else: - # print row_for_table - table_of_win_in_seria_by_apartmment.append({"WIN_IN_APART": row_for_table, - "APART_NAME": count.sNameApartment, - "APART_ID": count.id_apart, - "NUM_OFFERS": min_offer_in_row}) - count_column = 0 - min_offer_in_row = 10000 - row_for_table = [] - # print(table_of_win_in_seria_by_apartmment) - # print(f"==============>{float(time.perf_counter()-tStart2)}<==============") - # print NumOffersPerColumn, NumMerchantPerColumn - to_template.update({"WIN_OFFER_AND_MERCHANT": offer_and_merchant_per_win, - "TABLE_OF_WINDOWS": table_of_win_in_seria_by_apartmment}) - # для "тяжелого шаблона" получаем навигацию страницы, данные для карты и графика ввода в эксплуатацию + "WIN_ID": list_win_in_seria[i].id, + } + for i in range(total_column + 1) + ] + + for apartment in apartments_in_seria: + row_for_table = [] + # None = в строке квартиры еще не встретилось ни одного окна. + min_offer_in_row = None + for count_column, window in enumerate(list_win_in_seria): + quantity = quantities_by_pair.get((apartment["id"], window.id), 0) + if quantity != 0: + num_offers = offers_by_window.get(window.id, 0) + row_for_table.append( + { + "WIN_NUM": [chr(65 + count_column)], + "WIN_Q": quantity, + "WIN_ID": window.id, + "WIN_WIDTH": window.iWinWidth, + "WIN_HEIGHT": window.iWinHight, + "WIN_DESCRIPTION": window.sDescripion, + "WIN_FLAPCFG": window.sFlapConfig, + } + ) + if min_offer_in_row is None or min_offer_in_row > num_offers: + min_offer_in_row = num_offers + else: + row_for_table.append({"WIN_NUM": "—"}) + + table_of_win_in_seria_by_apartmment.append( + { + "WIN_IN_APART": row_for_table, + "APART_NAME": apartment["sNameApartment"], + "APART_ID": apartment["id"], + # Если у серии нет ни одного окна, показываем 0 вместо служебного sentinel. + "NUM_OFFERS": 0 if min_offer_in_row is None else min_offer_in_row, + } + ) + + to_template.update( + { + "WIN_OFFER_AND_MERCHANT": offer_and_merchant_per_win, + "TABLE_OF_WINDOWS": table_of_win_in_seria_by_apartmment, + } + ) + + # Для "тяжелого" шаблона получаем навигацию, карту и график, затем кэшируем pre-render. if is_hard_template: - # если вызывается "тяжелый" шаблон, то нужно подготовить тяжелые данные для построения навигации seria_id, for_seria_nav = seria_nav(seria_id) - to_template.update(for_seria_nav) # данные для навигации по сериям - to_template.update(seria_info_year(seria_id)) # данные для графика ввода зданий серии в эксплуатацию - to_template.update(seria_info_geo_code(seria_id)) # данные для карты - # т.к. обрабатывается "тяжелый шаблон" надо создать "легкий шаблон" - # для его использования в будущем. + to_template.update(for_seria_nav) + to_template.update(seria_info_year(seria_id)) + to_template.update(seria_info_geo_code(seria_id)) string_prerender = render_to_string("seria_info/all_seria_info_pre_light.html", to_template) - file = open(light_template_w_path, 'w') - # file.write(AA.encode('utf-8')) - file.write(string_prerender) - file.close() + with open(light_template_w_path, "w", encoding="utf-8") as file: + file.write(string_prerender) touch_reload_wsgi(light_template_w_path) else: - seria_name = Seria_Info.objects.get(id=seria_id).sName - to_template.update({'THIS_SERIA_NAME': seria_name}) + to_template.update({"THIS_SERIA_NAME": q_seria.sName}) _append_visit_context(to_template, request, time_start) return render(request, light_template, to_template) -def seria_nav(seria_id: int = 12) -> (int, dict): +def seria_nav(seria_id: int = DEFAULT_SERIA_ID_FOR_CATALOG) -> tuple[int, dict]: """ - Возвращает корректный seria_id и кортеж для построения навигации по сериям дома + Возвращает корректный seria_id и данные навигации по корневым сериям. + + Если переданный seria_id невалиден, подбирает ближайший допустимый root-id. :param seria_id: id серии - :return: + :return: tuple[int, dict] -- (seria_id, {"SERIA_NAV_DIM": ..., "THIS_SERIA_*": ...}) """ - q_seria = Seria_Info.objects.raw( - 'SELECT oknardia_seria_info.id,' - ' oknardia_seria_info.sName,' - ' oknardia_seria_info.sSeriaDescription,' - ' oknardia_seria_info.kRoot_id,' - ' oknardia_seria_info.kParent_id ' - 'FROM oknardia_seria_info ' - 'WHERE oknardia_seria_info.id = oknardia_seria_info.kRoot_id ' - 'ORDER BY oknardia_seria_info.sName;') + q_seria = list( + Seria_Info.objects.filter(id=F("kRoot_id")) + .only("id", "sName", "sSeriaDescription", "kRoot_id", "kParent_id") + .order_by("sName") + ) + if not q_seria: + return seria_id, {"SERIA_NAV_DIM": []} error_seria = True for count_seria in q_seria: if count_seria.id == int(seria_id): @@ -248,9 +246,9 @@ def seria_nav(seria_id: int = 12) -> (int, dict): # базовая серия прописана в kRoot_id seria_id = query.kRoot_id else: - # == корневой нет - # == ищем методом наименьших расстояний" - min_min = 100000000 + # Корневой серии нет. + # Ищем методом наименьших расстояний + min_min = 100_000_000 min_id = seria_id for count_seria in q_seria: if math.fabs(int(seria_id) - count_seria.id) < min_min: @@ -259,33 +257,46 @@ def seria_nav(seria_id: int = 12) -> (int, dict): seria_id = min_id except ObjectDoesNotExist: seria_id = q_seria[0].id - # print(f"-->{seria_id}<--") return all_seria_nav(seria_id, q_seria) -def all_seria_nav(seria_id: int, q_seria) -> (int, dict): +def all_seria_nav(seria_id: int, q_seria) -> tuple[int, dict]: + """ + Формирует структуру навигации по сериям для шаблонов. + + :param seria_id: активный id серии + :param q_seria: коллекция серий (ORM-объекты или dict из values()) + :return: tuple[int, dict] -- (seria_id, словарь с SERIA_NAV_DIM и данными активной серии) + """ seria_nav_dim = [] this_return = {} + # Поддерживаем оба формата входных элементов: ORM-объекты и dict из values(). for count_seria in q_seria: - one_seria = {} - one_seria.update({"SERIA_R": count_seria.sName, "ID2URL": count_seria.id}) - if count_seria.id == seria_id: - this_return.update({"THIS_SERIA_NAME": count_seria.sName, - "THIS_SERIA_DESCRIPTION": count_seria.sSeriaDescription}) - # one_seria.update({"SERIA_L": ""}) - one_seria.update({"SERIA_L": pytils.translit.slugify(count_seria.sName)}) - else: - one_seria.update({"SERIA_L": pytils.translit.slugify(count_seria.sName)}) + seria_name = count_seria["sName"] if isinstance(count_seria, dict) else count_seria.sName + seria_id_value = count_seria["id"] if isinstance(count_seria, dict) else count_seria.id + seria_description = ( + count_seria.get("sSeriaDescription") + if isinstance(count_seria, dict) + else count_seria.sSeriaDescription + ) + one_seria = { + "SERIA_R": seria_name, + "ID2URL": seria_id_value, + "SERIA_L": pytils.translit.slugify(seria_name), + } + if seria_id_value == seria_id: + this_return.update({"THIS_SERIA_NAME": seria_name, + "THIS_SERIA_DESCRIPTION": seria_description}) seria_nav_dim.append(one_seria) this_return.update({"SERIA_NAV_DIM": seria_nav_dim}) return seria_id, this_return -def seria_info_year(seria_id: int = 12) -> dict: - """ Возвращает данные для графика распределения сдачи серии в эксплуатацию +def seria_info_year(seria_id: int = DEFAULT_SERIA_ID_FOR_CATALOG) -> dict: + """Возвращает данные для графика ввода домов серии в эксплуатацию. - :param seria_id: int -- id серии для которой нужно получить данные - :return: dict -- данные для графика распределения сдачи серии в эксплуатацию типа: + :param seria_id: int -- id корневой серии + :return: dict -- данные для графика по годам вида: {"DATA4GRAPH": [{'YEAR': 1997, 'NUMS': 1, 'CLRS': '99'}, {'YEAR': 1998, 'NUMS': 15, 'CLRS': 'сс'}, {'YEAR': 1998, 'NUMS': 10, 'CLRS': 'a9'} @@ -293,43 +304,52 @@ def seria_info_year(seria_id: int = 12) -> dict: } """ seria_in_years = [] - query = Seria_Info.objects.raw( - f"SELECT oknardia_building_info.iCommissioning_year as id," - f" COUNT(oknardia_building_info.iCommissioning_year) AS NumInYear " - f"FROM oknardia_building_info" - f" INNER JOIN oknardia_seria_info" - f" ON oknardia_building_info.kSeria_Link_id = oknardia_seria_info.id " - f"WHERE oknardia_seria_info.kRoot_id = {seria_id} " - f"GROUP BY oknardia_building_info.iCommissioning_year;" + query = list( + Building_Info.objects.filter(kSeria_Link__kRoot_id=seria_id) + .values("iCommissioning_year") + .annotate(NumInYear=Count("iCommissioning_year")) + .order_by("iCommissioning_year") ) max_per_year = 0 graph_color_light = 0xCC # самый светлый цвет на графике (максимальное значение) graph_color_dark = 0x99 # самый темный цвет на графике (минимальное значение) - for YearCount in query: - if int(YearCount.NumInYear) > max_per_year: - max_per_year = int(YearCount.NumInYear) - # print("max", MaxPerYear) - for YearCount in query: + for year_count in query: + if int(year_count["NumInYear"]) > max_per_year: + max_per_year = int(year_count["NumInYear"]) + for year_count in query: data_of_year = {} try: data_of_year.update({ - "YEAR": int(YearCount.id), - "NUMS": YearCount.NumInYear, - "CLRS": str(hex(int(graph_color_dark + YearCount.NumInYear * ( + "YEAR": int(year_count["iCommissioning_year"]), + "NUMS": year_count["NumInYear"], + "CLRS": str(hex(int(graph_color_dark + year_count["NumInYear"] * ( graph_color_light - graph_color_dark) / max_per_year)))[2:] }) except ValueError: continue seria_in_years.append(data_of_year) - # print(seria_in_years) return {"DATA4GRAPH": seria_in_years} -def seria_info_geo_code(seria_id: str = '12') -> dict: - """ Возвращает массив геокоординат зданий одной серии +def seria_info_geo_code(seria_id: int | str = DEFAULT_SERIA_ID_FOR_CATALOG) -> dict: + """Возвращает гео-точки и агрегированную статистику по серии. - :param seria_id: str -- id серии для которой нужно получить данные - :return: dict -- массив геокоординат зданий серии + Кроме массива координат, функция считает суммарные показатели серии: + жилые/муниципальные/государственные площади, число жителей, квартир, + лицевых счетов и диапазон показателя состояния домов. + + :param seria_id: int | str -- id серии, для которой нужно получить данные + :return: dict -- { + "DATA4GEO": [...], + "MUNICIPAL_M2": ..., + "RESIDENTIAL_M2": ..., + "GOVERNMENT_M2": ..., + "RESIDENTS": ..., + "APARTMENTS": ..., + "ACCOUNTS": ..., + "CONDITION_MAX": ..., + "CONDITION_MIN": ..., + } """ data_return = {} seria_to_geo = [] @@ -337,57 +357,61 @@ def seria_info_geo_code(seria_id: str = '12') -> dict: residential_m2 = 0 # жилой фонд (кв.м) government_m2 = 0 # государственные учреждения занимают (кв.м.) residents = 0 # количество жильцов - apartments = 0 # число квартиры + apartments = 0 # число квартир accounts = 0 # количество лицевых счетов condition_max = 0 # максимальное значение показателя состояния здания - condition_min = 1000000 # минимальное значение показателя состояния здания - query = Building_Info.objects.raw( - f"SELECT" - f" oknardia_building_info.id," - f" oknardia_seria_info.kRoot_id as SerId," - f" oknardia_building_info.sAddress," - f" oknardia_building_info.fResidential_Area," - f" oknardia_building_info.fMunicipal_Area," - f" oknardia_building_info.fGovernment_Area," - f" oknardia_building_info.iNum_Residents," - f" oknardia_building_info.iNum_Apartments," - f" oknardia_building_info.iNum_Accounts," - f" oknardia_building_info.fCondition_House," - f" oknardia_building_info.fGeoCode_Latitude," - f" oknardia_building_info.fGeoCode_Longitude " - f"FROM oknardia_building_info" - f" INNER JOIN oknardia_seria_info" - f" ON oknardia_building_info.kSeria_Link_id = oknardia_seria_info.id " - f"WHERE oknardia_seria_info.kRoot_id IN ({seria_id});" + condition_min = 1_000_000 # минимальное значение показателя состояния здания + query = Building_Info.objects.filter(kSeria_Link__kRoot_id=int(seria_id)).values( + "id", + "kSeria_Link__kRoot_id", + "sAddress", + "fResidential_Area", + "fMunicipal_Area", + "fGovernment_Area", + "iNum_Residents", + "iNum_Apartments", + "iNum_Accounts", + "fCondition_House", + "fGeoCode_Latitude", + "fGeoCode_Longitude", ) - for count in query: - if int(count.fGeoCode_Latitude) != 0 and int(count.fGeoCode_Longitude) != 0: - seria_to_geo.append({"LATITUDE": count.fGeoCode_Latitude, - "LONGITUDE": count.fGeoCode_Longitude, - "ADDR_ID": count.id, - "ADDR_LAT": pytils.translit.slugify(count.sAddress), - "ADDR_RUS": count.sAddress, - "SER_ID": count.SerId + # iterator() уменьшает пиковое потребление памяти на больших сериях домов. + for count in query.iterator(chunk_size=500): + latitude = count["fGeoCode_Latitude"] or 0 + longitude = count["fGeoCode_Longitude"] or 0 + municipal_area = count["fMunicipal_Area"] or 0 + residential_area = count["fResidential_Area"] or 0 + government_area = count["fGovernment_Area"] or 0 + num_residents = count["iNum_Residents"] or 0 + num_apartments = count["iNum_Apartments"] or 0 + num_accounts = count["iNum_Accounts"] or 0 + house_condition = count["fCondition_House"] or 0 + + if int(latitude) != 0 and int(longitude) != 0: + seria_to_geo.append({"LATITUDE": latitude, + "LONGITUDE": longitude, + "ADDR_ID": count["id"], + "ADDR_LAT": pytils.translit.slugify(count["sAddress"]), + "ADDR_RUS": count["sAddress"], + "SER_ID": count["kSeria_Link__kRoot_id"] }) - if count.fMunicipal_Area > 0: - municipal_m2 += count.fMunicipal_Area - if count.fResidential_Area > 0: - residential_m2 += count.fResidential_Area - if count.fGovernment_Area > 0: - government_m2 += count.fGovernment_Area - if count.iNum_Residents > 0: - residents += count.iNum_Residents - if count.iNum_Residents > 0: - residents += count.iNum_Residents - if count.iNum_Apartments > 0: - apartments += count.iNum_Apartments - if count.iNum_Accounts > 0: - accounts += count.iNum_Accounts - if count.fCondition_House > 0: - if count.fCondition_House > condition_max: - condition_max = count.fCondition_House - if count.fCondition_House < condition_min: - condition_min = count.fCondition_House + if municipal_area > 0: + municipal_m2 += municipal_area + if residential_area > 0: + residential_m2 += residential_area + if government_area > 0: + government_m2 += government_area + if num_residents > 0: + residents += num_residents + if num_apartments > 0: + apartments += num_apartments + if num_accounts > 0: + accounts += num_accounts + if house_condition > 0: + if house_condition > condition_max: + condition_max = house_condition + if house_condition < condition_min: + condition_min = house_condition data_return.update({"DATA4GEO": seria_to_geo, "MUNICIPAL_M2": municipal_m2, "RESIDENTIAL_M2": residential_m2, @@ -397,5 +421,4 @@ def seria_info_geo_code(seria_id: str = '12') -> dict: "ACCOUNTS": accounts, "CONDITION_MAX": condition_max, "CONDITION_MIN": condition_min}) - # print(seria_to_geo) return data_return From cf24fab53a98c4e32425c8cc2a0d08e8622c5289 Mon Sep 17 00:00:00 2001 From: erjemin Date: Wed, 22 Apr 2026 00:03:06 +0300 Subject: [PATCH 023/102] =?UTF-8?q?=20fix:=20=D0=BF=D1=80=D0=B5-=D1=80?= =?UTF-8?q?=D0=B5=D0=BD=D0=B4=D0=B5=D1=80=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BD=D0=B5=20=D0=B4=D0=BE=D0=BB=D0=B6=D0=BD?= =?UTF-8?q?=D1=8B=20=D0=BF=D0=BE=D0=BF=D0=B0=D0=B4=D0=B0=D1=82=D1=8C=20?= =?UTF-8?q?=D0=B2=20=D1=80=D0=B5=D0=BF=D0=BE=D0=B7=D0=B8=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oknardia/web/catalog_series.py | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/oknardia/web/catalog_series.py b/oknardia/web/catalog_series.py index 568debc..e7e314e 100644 --- a/oknardia/web/catalog_series.py +++ b/oknardia/web/catalog_series.py @@ -93,10 +93,17 @@ def catalog_seria_info( except (ObjectDoesNotExist, ValueError): return redirect("/catalog/") - # Если есть "облегченный" шаблон с частичным pre-render, используем его. - light_template = f"{PATH_FOR_SERIA_INFO_HTML_INCLUDE}{seria_id}_id.html" - light_template_w_path = f"{TEMPLATES[0]['DIRS'][0]}/{light_template}" - is_hard_template = not os.path.isfile(light_template_w_path) + # В DEV отключаем pre-render cache: всегда рендерим «тяжелый» шаблон напрямую, + # чтобы тестировать актуальную серверную логику, а не сохраненный html-файл. + if DEBUG: + light_template = "seria_info/all_seria_info_pre_light.html" + light_template_w_path = "" + is_hard_template = True + else: + # В PROD используем существующий pre-render include при наличии на диске. + light_template = f"{PATH_FOR_SERIA_INFO_HTML_INCLUDE}{seria_id}_id.html" + light_template_w_path = f"{TEMPLATES[0]['DIRS'][0]}/{light_template}" + is_hard_template = not os.path.isfile(light_template_w_path) to_template: dict[str, object] = {} # Получаем все уникальные проемы серии и сразу добавляем iQuantity=1 @@ -206,10 +213,11 @@ def catalog_seria_info( to_template.update(for_seria_nav) to_template.update(seria_info_year(seria_id)) to_template.update(seria_info_geo_code(seria_id)) - string_prerender = render_to_string("seria_info/all_seria_info_pre_light.html", to_template) - with open(light_template_w_path, "w", encoding="utf-8") as file: - file.write(string_prerender) - touch_reload_wsgi(light_template_w_path) + if not DEBUG: + string_prerender = render_to_string("seria_info/all_seria_info_pre_light.html", to_template) + with open(light_template_w_path, "w", encoding="utf-8") as file: + file.write(string_prerender) + touch_reload_wsgi(light_template_w_path) else: to_template.update({"THIS_SERIA_NAME": q_seria.sName}) From ac68214297712bcdc5ee87d881e9071223959b86 Mon Sep 17 00:00:00 2001 From: erjemin Date: Wed, 22 Apr 2026 01:24:03 +0300 Subject: [PATCH 024/102] =?UTF-8?q?add:=20management-=D0=BA=D0=BE=D0=BC?= =?UTF-8?q?=D0=B0=D0=BD=D0=B4=D0=B0=20regenerate=5Fseria=5Fprerender=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BE=D1=84=D1=84=D0=BB=D0=B0=D0=B9=D0=BD?= =?UTF-8?q?=20=D0=BF=D0=B5=D1=80=D0=B5=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= =?UTF-8?q?=20pre-render=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=20=D1=81=D0=B5=D1=80=D0=B8=D0=B9;=20=D0=BE=D0=B1=D0=BD?= =?UTF-8?q?=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20SETUP.md,=20README.md,?= =?UTF-8?q?=20MANAGEMENT=5FRUNBOOK.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MANAGEMENT_RUNBOOK.md | 175 ++++++++++++++++++ README.md | 5 +- SETUP.md | 21 ++- oknardia/web/catalog_series.py | 5 +- .../commands/regenerate_seria_prerender.py | 113 +++++++++++ 5 files changed, 312 insertions(+), 7 deletions(-) create mode 100644 MANAGEMENT_RUNBOOK.md create mode 100644 oknardia/web/management/commands/regenerate_seria_prerender.py diff --git a/MANAGEMENT_RUNBOOK.md b/MANAGEMENT_RUNBOOK.md new file mode 100644 index 0000000..8c807a6 --- /dev/null +++ b/MANAGEMENT_RUNBOOK.md @@ -0,0 +1,175 @@ +# MANAGEMENT_RUNBOOK.md + +Единый runbook по management-командам проекта. + +Документ отвечает на 3 вопроса: +- что запускать; +- когда запускать; +- как безопасно откатываться/повторять запуск. + +## Каталог команд + +1. `generate_sitemaps` — оффлайн генерация sitemap-файлов. +2ю `regenerate_seria_prerender` — оффлайн пересборка pre-render шаблонов для `catalog_seria_info`. + +## Общие правила запуска + +- Запускать команды из корня репозитория. +- Для локального/CI запуска использовать `poetry`. +- Не запускать тяжелые операции через HTTP-эндпоинты `/service/*`. +- Перезапуск веб-сервера (`gunicorn`/`uWSGI`) делать отдельным шагом оркестрации, а не из кода Django. + +Базовый шаблон запуска: + +```bash +cd /Users/e-serg/PRJ/2022-oknardia +poetry run python oknardia/manage.py [args] +``` + +## 1) Команда `generate_sitemaps` + +Назначение: +- пересобрать `sitemap.xml` и chunk-файлы в `MEDIA_ROOT/_serv_sitemap`. + +Базовый запуск: + +```bash +cd /Users/e-serg/PRJ/2022-oknardia +poetry run python oknardia/manage.py generate_sitemaps +``` + +Запуск с параметрами: + +```bash +cd /Users/e-serg/PRJ/2022-oknardia +poetry run python oknardia/manage.py generate_sitemaps \ + --compare-min-depth 2 \ + --compare-max-depth 4 \ + --max-items 40000 \ + --max-file-size 5242880 \ + --max-files-qty 998 +``` + +Когда запускать: +- после деплоя; +- по расписанию (cron/systemd timer); +- после крупных изменений данных каталога/блога. + +### Важные замечания + +Чтобы `sitemap.xml` отдавал прокси-nginx напрямую из файловой системы, нужно, чтобы он физически лежал +в `MEDIA_ROOT/_serv_sitemap/sitemap.xml`. + +Допустимо, что файл доступен по двум URL (корневой и media), но в `robots.txt` должен быть указан один +канонический вариант `sitemap.xml` + +#### NGINX snippet (alias для корневого sitemap) + +```nginx +# Корневой sitemap.xml (для привычного для поисковиков URL) +location = /sitemap.xml { + alias /<путь-к-каталогку-с-докер-приложением>/media/_serv_sitemap/sitemap.xml; + default_type application/xml; + add_header Cache-Control "public, max-age=300"; +} +``` + +## 2) Команда `regenerate_seria_prerender` + +Назначение: +- пересобрать pre-render шаблоны для страниц серий (`catalog_seria_info`) в каталоге `seria_info/prepared/`. + +Проверка без записи файлов: + +```bash +cd /Users/e-serg/PRJ/2022-oknardia +poetry run python oknardia/manage.py regenerate_seria_prerender --dry-run +``` + +Пересборка только отсутствующих файлов: + +```bash +cd /Users/e-serg/PRJ/2022-oknardia +poetry run python oknardia/manage.py regenerate_seria_prerender +``` + +Принудительная пересборка всех root-серий: + +```bash +cd /Users/e-serg/PRJ/2022-oknardia +poetry run python oknardia/manage.py regenerate_seria_prerender --force +``` + +Выборочная пересборка: + +```bash +cd /Users/e-serg/PRJ/2022-oknardia +poetry run python oknardia/manage.py regenerate_seria_prerender --seria-id 843 --seria-id 2100 --force +``` + +Когда запускать: +- после обновления логики `catalog_seria_info`; +- после массового обновления данных серий/окон/квартир; +- после очистки `seria_info/prepared/`. + +## Оркестрация и reload веб-сервера + +Важно: +- reload веб-сервера не встроен в management-команды; +- это отдельная операция окружения. + +Пример для systemd + gunicorn: + +```bash +sudo systemctl reload gunicorn +``` + +Рекомендуемый batch-сценарий: + +```bash +cd /Users/e-serg/PRJ/2022-oknardia +poetry run python oknardia/manage.py regenerate_seria_prerender --force +poetry run python oknardia/manage.py generate_sitemaps +sudo systemctl reload gunicorn +``` + +## Cron/systemd timer (пример) + +Пример cron (раз в сутки в 03:20): + +```bash +20 3 * * * cd /Users/e-serg/PRJ/2022-oknardia && poetry run python oknardia/manage.py regenerate_seria_prerender --force && poetry run python oknardia/manage.py generate_sitemaps >> /var/log/oknardia-maintenance.log 2>&1 +``` + +Если нужен reload после batch, добавляй отдельной строкой/шагом оркестратора. + +## Диагностика + +Быстрая проверка конфигурации: + +```bash +cd /Users/e-serg/PRJ/2022-oknardia +poetry run python oknardia/manage.py check +``` + +Типовые причины проблем: +- нет прав записи в директории `templates/seria_info/prepared` или `MEDIA_ROOT/_serv_sitemap`; +- устаревшее виртуальное окружение / неустановленные зависимости; +- запуск не из того каталога. + +## План миграции `/service/*` -> management commands + +Текущее направление: +- все тяжелые и административные операции переносить из HTTP в management-команды; +- `/service/*` оставлять только как thin UI/мониторинг или убрать полностью. + +Кандидаты на перенос: +- действия из `service.py` (`/service/make_rating`, sitemap/служебные задачи и т.п.); +- любые операции, которые могут идти дольше обычного web-request. + +--- + +См. также: +- `SETUP.md` +- `README.md` + diff --git a/README.md b/README.md index 6c1118d..3e3686f 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ * Рефакторинг `catalog_profile_manufacture` (`/catalog/profile/-`): упрощена валидация URL, убран дублирующий код маппинга для `PROFILES` и `MERCHANTS` через общие хелперы, стандартизирован хвост контекста (`LAST_VISIT`, `LOG_VISIT`, `ticks`) через `_append_visit_context`. * Рефакторинг `catalog_seria` (`/catalog/seria/`): raw SQL ⟶ ORM для списка корневых серий, подготовка данных упрощена, хвост контекста с визитами и `ticks` вынесен в общий helper внутри `catalog_series.py`. * Рефакторинг `catalog_seria_info` и связанных функций в `catalog_series.py`: raw SQL ⟶ ORM (`catalog_seria_info`, `seria_nav`, `seria_info_year`, `seria_info_geo_code`), снижена нагрузка на БД за счёт предвыборки и переиспользования агрегатов (`quantities_by_pair`, `offers_by_window`), добавлены безопасные fallback-значения для пустых выборок, включена потоковая обработка `iterator(chunk_size=500)` для гео-данных, обновлены комментарии и docstring под фактическую логику (таблица окон, pre-render light/heavy шаблонов, гео+статистика серии). -* +* Добавлена management-команда `regenerate_seria_prerender` для оффлайн-пересборки pre-render шаблонов `catalog_seria_info` (все или выбранные root-серии), с режимами `--dry-run` и `--force`; серверный reload (Gunicon? uWSGI или что там еще будет) должен быть вынесен из кода приложения в оркестрацию (cron/systemd/deploy step). * * * @@ -35,8 +35,7 @@ * [`AGENTS.md`](AGENTS.md) – контекст проекта для AI-ассистентов (архитектура, конвенции, рабочие сценарии). * [`SETUP.md`](SETUP.md) – пошаговая настройка окружения, запуск проекта и базовые команды разработки. -* Сервисные утилиты: - - [`SITEMAP_RUNBOOK.md`](SITEMAP_RUNBOOK.md) – sitemap (генерация, веса, cron, nginx) +* [`MANAGEMENT_RUNBOOK.md`](MANAGEMENT_RUNBOOK.md) – единый runbook по management-командам и batch-операциям. diff --git a/SETUP.md b/SETUP.md index 2f55f00..ee01922 100644 --- a/SETUP.md +++ b/SETUP.md @@ -233,6 +233,26 @@ python manage.py remove_stale_contenttypes # Удалить устаревши # Служебные python manage.py check # Проверить конфигурацию python manage.py check --deploy # Проверка для продакшена +python manage.py generate_sitemaps # Оффлайн генерация sitemap XML +python manage.py regenerate_seria_prerender --dry-run # Проверка пересборки pre-render шаблонов серий +python manage.py regenerate_seria_prerender --force # Принудительная пересборка pre-render шаблонов серий +``` + +### Пересборка pre-render шаблонов серий (рекомендуемый сценарий) + +Шаблоны для `catalog_seria_info` пересобираются оффлайн management-командой, без reload из кода Django. + +```bash +cd /path/to/project +poetry run python oknardia/manage.py regenerate_seria_prerender --force +# затем (опционально) один внешний reload процесса приложения, если это требуется вашей конфигурацией +# sudo systemctl reload gunicorn +``` + +Для выборочной пересборки используйте `--seria-id` несколько раз: + +```bash +poetry run python oknardia/manage.py regenerate_seria_prerender --seria-id 843 --seria-id 2100 --force ``` ## 📚 Дополнительные ресурсы @@ -240,7 +260,6 @@ python manage.py check --deploy # Проверка для продак - [Django документация](https://docs.djangoproject.com/en/stable/) - [AGENTS.md](./AGENTS.md) — архитектура и конвенции проекта - [README.md](./README.md) — основная информация о проекте -- [SECURITY_AUDIT_REPORT.md](./SECURITY_AUDIT_REPORT.md) — отчёт безопасности ## ❓ Решение проблем diff --git a/oknardia/web/catalog_series.py b/oknardia/web/catalog_series.py index e7e314e..9b64143 100644 --- a/oknardia/web/catalog_series.py +++ b/oknardia/web/catalog_series.py @@ -14,7 +14,7 @@ from oknardia.models import ( Building_Info, ) 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 get_flaps_for_big_pictures, touch_reload_wsgi +from web.add_func import get_flaps_for_big_pictures import time import os import math @@ -217,7 +217,6 @@ def catalog_seria_info( string_prerender = render_to_string("seria_info/all_seria_info_pre_light.html", to_template) with open(light_template_w_path, "w", encoding="utf-8") as file: file.write(string_prerender) - touch_reload_wsgi(light_template_w_path) else: to_template.update({"THIS_SERIA_NAME": q_seria.sName}) @@ -346,7 +345,7 @@ def seria_info_geo_code(seria_id: int | str = DEFAULT_SERIA_ID_FOR_CATALOG) -> d жилые/муниципальные/государственные площади, число жителей, квартир, лицевых счетов и диапазон показателя состояния домов. - :param seria_id: int | str -- id серии, для которой нужно получить данные + :param seria_id: int | str -- id серии, для которой нужно получить данные. :return: dict -- { "DATA4GEO": [...], "MUNICIPAL_M2": ..., diff --git a/oknardia/web/management/commands/regenerate_seria_prerender.py b/oknardia/web/management/commands/regenerate_seria_prerender.py new file mode 100644 index 0000000..741c572 --- /dev/null +++ b/oknardia/web/management/commands/regenerate_seria_prerender.py @@ -0,0 +1,113 @@ +# -*- coding: utf-8 -*- +from __future__ import annotations + +from pathlib import Path + +import pytils +from django.conf import settings +from django.core.management.base import BaseCommand, CommandError +from django.db.models import F +from django.test import RequestFactory + +from oknardia.models import Seria_Info +from web import catalog_series + + +class Command(BaseCommand): + """Пересоздает pre-render шаблоны для страниц серий (/catalog/seria/.../all).""" + + help = "Пересоздает pre-render шаблоны catalog_seria_info для выбранных или всех корневых серий." + + def add_arguments(self, parser): + parser.add_argument( + "--seria-id", + type=int, + action="append", + default=[], + help="ID серии (можно передавать несколько раз). По умолчанию пересоздаются все корневые серии.", + ) + parser.add_argument( + "--force", + action="store_true", + help="Пересоздать даже если pre-render файл уже существует.", + ) + parser.add_argument( + "--dry-run", + action="store_true", + help="Только показать, что будет сделано, без генерации файлов.", + ) + + def handle(self, *args, **options): + seria_ids: list[int] = options["seria_id"] + force: bool = options["force"] + dry_run: bool = options["dry_run"] + + # Берем только корневые серии, потому что для них строятся канонические URL /all. + query = Seria_Info.objects.filter(id=F("kRoot_id")).only("id", "sName").order_by("id") + if seria_ids: + query = query.filter(id__in=seria_ids) + + targets = list(query) + if not targets: + raise CommandError("Не найдено подходящих корневых серий для пересоздания pre-render.") + + templates_root = Path(settings.TEMPLATES[0]["DIRS"][0]) + prepared_dir = templates_root / settings.PATH_FOR_SERIA_INFO_HTML_INCLUDE + prepared_dir.mkdir(parents=True, exist_ok=True) + + request_factory = RequestFactory() + created = 0 + planned = 0 + skipped = 0 + + for seria in targets: + target_file = prepared_dir / f"{seria.id}_id.html" + if target_file.exists() and not force: + skipped += 1 + self.stdout.write(f"SKIP {seria.id}: {target_file}") + continue + + if dry_run: + action = "REGEN" if target_file.exists() else "CREATE" + self.stdout.write(f"{action} {seria.id}: {target_file}") + planned += 1 + continue + + if target_file.exists(): + target_file.unlink() + + slug = pytils.translit.slugify(seria.sName) + request = request_factory.get(f"/catalog/seria/{slug}/all{seria.id}") + + # В команде принудительно включаем «production-mode» для вьюхи, + # чтобы она прошла тяжелую ветку и пересоздала pre-render файл. + old_debug = catalog_series.DEBUG + try: + catalog_series.DEBUG = False + response = catalog_series.catalog_seria_info(request, slug, seria.id) + finally: + catalog_series.DEBUG = old_debug + + if response.status_code != 200: + raise CommandError( + f"Серия {seria.id}: ожидался status=200, получен {response.status_code}." + ) + if not target_file.exists(): + raise CommandError(f"Серия {seria.id}: pre-render файл не создан: {target_file}") + + created += 1 + self.stdout.write(self.style.SUCCESS(f"OK {seria.id}: {target_file}")) + + if dry_run: + self.stdout.write( + self.style.SUCCESS( + f"DRY-RUN. Обработано: {len(targets)}. Будет создано/пересоздано: {planned}. Пропущено: {skipped}." + ) + ) + else: + self.stdout.write( + self.style.SUCCESS( + f"Готово. Обработано: {len(targets)}. Создано/пересоздано: {created}. Пропущено: {skipped}." + ) + ) + From 21656e63de0000dc5ab761cea1cbd1f6062c8120 Mon Sep 17 00:00:00 2001 From: erjemin Date: Thu, 23 Apr 2026 23:32:19 +0300 Subject: [PATCH 025/102] =?UTF-8?q?=20minor:=20=D0=BE=D1=82=D0=BA=D0=BB?= =?UTF-8?q?=D1=8E=D1=87=D0=B5=D0=BD=D0=BE=20"=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=B4=D0=B5=D1=80=D0=B3=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5"?= =?UTF-8?q?=20uWSGI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.sample | 2 -- oknardia/oknardia/settings.py | 1 - oknardia/web/add_func.py | 11 +---------- 3 files changed, 1 insertion(+), 13 deletions(-) diff --git a/.env.sample b/.env.sample index ef144b7..4740f26 100644 --- a/.env.sample +++ b/.env.sample @@ -40,8 +40,6 @@ DATABASE_NAME=oknadria.sqlite3 # DATABASE_USER=name-for-db-user # DATABASE_PASSWORD=your-db-password-here -# Пути вычисляются автоматически внутри settings.py от PROJECT_ROOT -TOUCH_RELOAD=/app/logs/touch-reload.txt # Подкаталог в MEDIA_ROOT, где хранится кеш sitemap-файлов SITEMAP_SUBDIR=_serv_sitemap diff --git a/oknardia/oknardia/settings.py b/oknardia/oknardia/settings.py index a8b4875..77125f8 100644 --- a/oknardia/oknardia/settings.py +++ b/oknardia/oknardia/settings.py @@ -186,7 +186,6 @@ else: } } -TOUCH_RELOAD = env('TOUCH_RELOAD', default='') ######################################### # настройки для почтового сервера (они одинаковые для DEV и PROD) diff --git a/oknardia/web/add_func.py b/oknardia/web/add_func.py index 28dce2a..d9d4398 100644 --- a/oknardia/web/add_func.py +++ b/oknardia/web/add_func.py @@ -3,8 +3,6 @@ __author__ = 'Sergei Erjemin' from PIL import Image, ImageDraw from oknardia.settings import * -import django.utils.dateformat -import django.utils.timezone import os import math import re @@ -586,11 +584,4 @@ def sum_through(string_w_slash: str) -> int: return sum_result -def touch_reload_wsgi(s: str = ''): - """ Функция перезагружает WSGI-сервер. - - :return: None - """ - with open(TOUCH_RELOAD, 'a', encoding="utf-8") as f: - f.write(f'\nreload wsgi by cash-template - {s} - ' - f'{django.utils.dateformat.format(django.utils.timezone.now(), "Y-m-d H:i:s")}') +# Удалить: touch_reload_wsgi() — серверный reload теперь оркестрируется внешним процесс-менеджером. From 80b9abfaef837c4f94c9513cbe6a0104ac571c2c Mon Sep 17 00:00:00 2001 From: erjemin Date: Fri, 24 Apr 2026 16:35:15 +0300 Subject: [PATCH 026/102] minor: - --- oknardia/oknardia/urls.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/oknardia/oknardia/urls.py b/oknardia/oknardia/urls.py index da344b5..4701f93 100644 --- a/oknardia/oknardia/urls.py +++ b/oknardia/oknardia/urls.py @@ -57,21 +57,21 @@ urlpatterns = [ re_path(r'^stat/rating[/*]$', report2.ratings), re_path(r'^stat/rating/profiles_rank[/*]$', report2.profiles_rating), # --- КАТАЛОГ - re_path(r'^catalog[/*]$', catalog.catalog_root), + re_path(r'^catalog[/*]$', catalog.catalog_root), # ГЛАВНАЯ СТРАНИЦА КАТАЛОГА # --- --- КАТАЛОГ ПРОФИЛЕЙ - re_path(r'^catalog/profile[/*]$', catalog_profiles.catalog_profile), + re_path(r'^catalog/profile[/*]$', catalog_profiles.catalog_profile), # СПИСОК ВСЕХ ПРОФИЛЕЙ И ПРОИЗВОДИТЕЛЕЙ re_path(r'^catalog/profile/(?P\d+)-(?P\S*)' r'/(?P\d+)-(?P\S*)[/*]$', - catalog_profiles.catalog_profile_model), + catalog_profiles.catalog_profile_model), # КАРТОЧКА ПРОФИЛЯ (ИЛИ ПРОИЗВОДИТЕЛЯ) re_path(r'^catalog/profile/(?P\d+)-(?P\S*)[/*]$', catalog_profiles.catalog_profile_manufacture), - # --- --- Каталог серий типового строительства - re_path(r'^catalog/seria[/*]$', catalog_series.catalog_seria), + # --- --- КАТАЛОГ СЕРИЙ ТИПОВОГО СТРОИТЕЛЬСТВА + re_path(r'^catalog/seria[/*]$', catalog_series.catalog_seria), # СПИСОК ВСЕХ СЕРИЙ ЗДАНИЙ re_path(r'^catalog/seria/(?P[^/]*)/all(?P\d+)[/*]$', - catalog_series.catalog_seria_info), + catalog_series.catalog_seria_info), # КАРТОЧКА СЕРИИ ДОМА И ЕЕ СТАТИСТИКА re_path(r'^seria_[^/]*/all(?P\d+)/\S*$', catalog.report_all_info_seria_redirect), # для старых ссылок - # --- --- Каталог стандартных проёмов и схем открывания длч типовых серий строительства - re_path(r'^catalog/standard_opening[/*]$', catalog_openings.standard_opening), + # --- --- КАТАЛОГ СТАНДАРТНЫХ ПРОЁМОВ И СХЕМ ОТКРЫВАНИЯ ДЛЧ ТИПОВЫХ СЕРИЙ СТРОИТЕЛЬСТВА + re_path(r'^catalog/standard_opening[/*]$', catalog_openings.standard_opening), # СТРАНИЦА С ТАБЛИЦЕЙ ПРОЁМОМ # --- --- Каталог производителей окон re_path(r'^catalog/company[/*]$', catalog_companies.catalog_company), re_path(r'^catalog/company/(?P\d+)-(?P\S*)[/*]$', From d654b73d65ce663df6d6268b9492f77c42eaa9c2 Mon Sep 17 00:00:00 2001 From: erjemin Date: Fri, 24 Apr 2026 17:27:53 +0300 Subject: [PATCH 027/102] add: __init__ --- oknardia/web/management/__init__.py | 1 - oknardia/web/management/commands/__init__.py | 1 - 2 files changed, 2 deletions(-) diff --git a/oknardia/web/management/__init__.py b/oknardia/web/management/__init__.py index 633f866..40a96af 100644 --- a/oknardia/web/management/__init__.py +++ b/oknardia/web/management/__init__.py @@ -1,2 +1 @@ # -*- coding: utf-8 -*- - diff --git a/oknardia/web/management/commands/__init__.py b/oknardia/web/management/commands/__init__.py index 633f866..40a96af 100644 --- a/oknardia/web/management/commands/__init__.py +++ b/oknardia/web/management/commands/__init__.py @@ -1,2 +1 @@ # -*- coding: utf-8 -*- - From 002ed0f82a33e14d86c81ac80e01b059d32477c7 Mon Sep 17 00:00:00 2001 From: erjemin Date: Fri, 24 Apr 2026 17:31:56 +0300 Subject: [PATCH 028/102] =?UTF-8?q?=20mod:=20=D1=80=D0=B5=D1=84=D0=B0?= =?UTF-8?q?=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20"=D0=BA=D0=B0?= =?UTF-8?q?=D1=82=D0=B0=D0=BB=D0=BE=D0=B3=20=D1=82=D0=B8=D0=BF=D0=BE=D0=B2?= =?UTF-8?q?=D1=8B=D1=85=20=D0=BF=D1=80=D0=BE=D1=91=D0=BC=D0=BE=D0=B2"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +- .../catalog/catalog_standard_opening.html | 27 ++-- oknardia/web/catalog_openings.py | 151 ++++++++++-------- 3 files changed, 94 insertions(+), 87 deletions(-) diff --git a/README.md b/README.md index 3e3686f..5807fbb 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ * Рефакторинг `catalog_seria` (`/catalog/seria/`): raw SQL ⟶ ORM для списка корневых серий, подготовка данных упрощена, хвост контекста с визитами и `ticks` вынесен в общий helper внутри `catalog_series.py`. * Рефакторинг `catalog_seria_info` и связанных функций в `catalog_series.py`: raw SQL ⟶ ORM (`catalog_seria_info`, `seria_nav`, `seria_info_year`, `seria_info_geo_code`), снижена нагрузка на БД за счёт предвыборки и переиспользования агрегатов (`quantities_by_pair`, `offers_by_window`), добавлены безопасные fallback-значения для пустых выборок, включена потоковая обработка `iterator(chunk_size=500)` для гео-данных, обновлены комментарии и docstring под фактическую логику (таблица окон, pre-render light/heavy шаблонов, гео+статистика серии). * Добавлена management-команда `regenerate_seria_prerender` для оффлайн-пересборки pre-render шаблонов `catalog_seria_info` (все или выбранные root-серии), с режимами `--dry-run` и `--force`; серверный reload (Gunicon? uWSGI или что там еще будет) должен быть вынесен из кода приложения в оркестрацию (cron/systemd/deploy step). -* +* Рефакторинг `standard_opening`: raw SQL -> ORM, упрощена дедублекация, убраны лишние запросы и переменные контекста, добавлены комментарии, SEO-описание и keywords, стандартизирован хвост контекста с визитами и `ticks` через общий helper внутри `catalog_openings.py`. * * * @@ -38,7 +38,6 @@ * [`MANAGEMENT_RUNBOOK.md`](MANAGEMENT_RUNBOOK.md) – единый runbook по management-командам и batch-операциям. - --- Легаси-материалы старого README, которые могут быть полезны для понимания устройства проекта и его администрирования, а также для будущей реорганизации документации. diff --git a/oknardia/templates/catalog/catalog_standard_opening.html b/oknardia/templates/catalog/catalog_standard_opening.html index 65f0314..8d65fc5 100755 --- a/oknardia/templates/catalog/catalog_standard_opening.html +++ b/oknardia/templates/catalog/catalog_standard_opening.html @@ -1,12 +1,12 @@ {% extends "base.html" %}{% load static %} -{% block Title %} Стандартные оконные проёмы типовых серий домов :: каталог{% endblock %} +{% block Title %}Стандартные оконные проёмы и балконные блоки для типовых серий домов: размеры, схемы, каталог{% endblock %} {% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %} -{% block Description %}Каталог «Окнардия»: стандартные оконные проёмы типовых серий домов...{% endblock %} +{% block Description %}Найдите точные размеры (ширину и высоту) и схемы стандартных оконных проёмов и балконных блоков для самых распространённых типовых серий домов в России. Удобный каталог для подбора окон.{% endblock %} -{% block Keywords %}оконные проёмы, стандартные окна, стандартные оконные проемы, каталог, каталог оконных проёмов, oknardia, окнардия {{ META_KEYWORDS|default:"" }} {% endblock %} +{% block Keywords %}типовые окна, размеры окон, оконные проемы, балконный блок, стандартные окна, размеры окон в панельном доме, серия дома, каталог окон, схемы открывания окон, П-44, II-49, 1-515, oknardia, окнардия{% endblock %} {% block Date4Meta %}{{ PUB_DAT|date:"c" }}{% endblock %} @@ -58,18 +58,18 @@ {# #}
    {# ПЕРВЫЙ РАЗДЕЛ #}
    -

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

    -

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

    +

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

    +

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

    {# реклама Oknardia 250x250 СБОКУ #}
    {% include "ad/bannet-250x250.html" %}
    - +
    @@ -98,24 +98,15 @@ -{# {% for j in SERIAS %}#} -{# {% endfor %}#} {% endfor %}
    Размеры (мм){{ i.DESCRIPTION }} {% for j in i.INCLUDING_IN_SERIA %}{{ j.NAME }}{% if not forloop.last %}, {% endif %}{% endfor %} цены{% if j.id in i.INCLUDING_IN_SERIA %}#{% endif %}
    - -
    - - {# --- Баннер: НАЧАЛО --- #} -

    {% include "ad/bannet-wide.html" %}
    - {# --- Баннер: конец --- #} + {# --- Баннер: НАЧАЛО --- #}

    {% include "ad/bannet-wide.html" %}
    {# --- Баннер: конец --- #}
    {% include "report/report_last_user_visit.html" %} {% include "report/report_log_user_visit.html" %}
    -{% endblock %} - - +{% endblock %} \ No newline at end of file diff --git a/oknardia/web/catalog_openings.py b/oknardia/web/catalog_openings.py index 01c05c9..5c9eefd 100644 --- a/oknardia/web/catalog_openings.py +++ b/oknardia/web/catalog_openings.py @@ -1,82 +1,99 @@ # -*- coding: utf-8 -*- +from django.db.models import F from django.shortcuts import render from django.http import HttpRequest, HttpResponse -from oknardia.models import ( - Seria_Info, - Win_MountDim, -) +from oknardia.models import MountDim2Apartment 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 get_flaps_for_mini_pictures import time import pytils +from typing import Any +from itertools import groupby +from operator import itemgetter -def standard_opening(request: HttpRequest) -> HttpResponse: - time_start = time.perf_counter() - to_template: dict[str, object] = {} # словарь, для передачи шаблону - 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 = get_flaps_for_mini_pictures(i.sFlapConfig) - 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 - }) + +def _make_slug(value: str) -> str: + """Транслитерирует строку в slug (pytils).""" + return pytils.translit.slugify(value) + + +def _append_visit_context(to_template: dict, request: HttpRequest, time_start: float) -> None: + """Дописывает в контекст стандартный хвост: визиты и время выполнения.""" 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.perf_counter() - time_start) + 'ticks': float(time.perf_counter() - time_start), }) - return render(request, "catalog/catalog_standard_opening.html", to_template) + +def standard_opening(request: HttpRequest) -> HttpResponse: + """ + Каталог стандартных оконных проёмов и балконных блоков. + + Что делает вьюха: + - Собирает уникальные пары «проём ↔ серия» через ORM. + - Агрегирует данные для шаблона в структуру LIST_WIN_OPENING с помощью groupby. + - Добавляет в контекст последние визиты и время выполнения. + """ + time_start = time.perf_counter() + + q_win_opening = ( + MountDim2Apartment.objects.filter(kApartment__kSeria_id=F('kApartment__kSeria__kRoot_id')) + .values( + 'kMountDim_id', + 'kMountDim__sFlapConfig', + 'kMountDim__sDescripion', + 'kMountDim__bIsDoor', + 'kMountDim__bIsNearDoor', + 'kMountDim__iWinHight', + 'kMountDim__iWinWidth', + 'kApartment__kSeria_id', + 'kApartment__kSeria__sName', + ) + .distinct() + .order_by( + '-kMountDim__iWinWidth', + '-kMountDim__iWinHight', + 'kMountDim__bIsNearDoor', + 'kMountDim__bIsDoor', + 'kMountDim_id', + 'kApartment__kSeria__sName', + ) + ) + + list_windows_opening: list[dict[str, Any]] = [] + # Группируем результаты по ID проёма, чтобы собрать все серии, в которые он входит. + # `order_by` в запросе гарантирует, что все записи для одного проёма идут подряд. + for mount_dim_id, group in groupby(q_win_opening, key=itemgetter('kMountDim_id')): + rows_for_opening = list(group) + first_row = rows_for_opening[0] + description_full = first_row['kMountDim__sDescripion'] or '' + + # Собираем список серий для текущего проёма. + serias_for_opening = [ + { + 'ID': row['kApartment__kSeria_id'], + 'NAME_T': _make_slug(row['kApartment__kSeria__sName']), + 'NAME': row['kApartment__kSeria__sName'], + } + for row in rows_for_opening + ] + # Формируем данные для строки таблиц (типовой проем) + list_windows_opening.append({ + 'ID': mount_dim_id, + 'INCLUDING_IN_SERIA': serias_for_opening, + 'URL2IMG': get_flaps_for_mini_pictures(first_row['kMountDim__sFlapConfig']), + 'FLAP_CONFIG': first_row['kMountDim__sFlapConfig'], + 'DESCRIPTION': description_full.split(' для')[0].split(' (')[0], + 'DESCRIPTION_L': description_full, + 'IS_DOOR': first_row['kMountDim__bIsDoor'], + 'IS_NEAR_DOOR': first_row['kMountDim__bIsNearDoor'], + 'H': first_row['kMountDim__iWinHight'] * 10, # см -> мм + 'W': first_row['kMountDim__iWinWidth'] * 10, # см -> мм + }) + + to_template = {'LIST_WIN_OPENING': list_windows_opening} + _append_visit_context(to_template, request, time_start) + return render(request, 'catalog/catalog_standard_opening.html', to_template) From 1f03219372379d71374b9eafda2571f2ae9c13b6 Mon Sep 17 00:00:00 2001 From: erjemin Date: Fri, 24 Apr 2026 17:33:45 +0300 Subject: [PATCH 029/102] =?UTF-8?q?=20del:=20=D1=8D=D1=82=D0=BE=20=D0=BE?= =?UTF-8?q?=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=BD=D0=B5=D1=81=D0=B5=D0=BD=D0=BE=20=D0=B2=20MANAGEMEN?= =?UTF-8?q?T=5FRUNBOOK.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SITEMAP_RUNBOOK.md | 102 --------------------------------------------- 1 file changed, 102 deletions(-) delete mode 100644 SITEMAP_RUNBOOK.md diff --git a/SITEMAP_RUNBOOK.md b/SITEMAP_RUNBOOK.md deleted file mode 100644 index 0dd8e09..0000000 --- a/SITEMAP_RUNBOOK.md +++ /dev/null @@ -1,102 +0,0 @@ -# SITEMAP_RUNBOOK.md - -## Что изменено - -- Генерация sitemap выполняется только через custom management command: `generate_sitemaps`. -- Генерация через интерфейс `/service/*` и URL-роуты удалена. -- Файлы sitemap хранятся в media-каталоге: `MEDIA_ROOT/_serv_sitemap`. -- `robots.txt` указывает на `https://oknardia.ru/media/_serv_sitemap/sitemap.xml`. -- Глубина `compare_offers` по-молчанию ограничена диапазоном `2..4`. -- В `lastmod` записывается только дата (`YYYY-MM-DD`), без времени. - -## Что сейчас входит в sitemap - -- главная страница `/`; -- список и карточки блога (`/blog/Pn`, `/blogpost/...`); -- каталог профилей: корень, производители и карточки моделей; -- каталог серий домов и детальные страницы типовых серий; -- каталог оконных компаний и карточки брендов; -- каталог стандартных оконных проёмов; -- страница рейтинга профилей; -- страницы цен по адресам и по одиночным проёмам; -- страницы `compare_offers` (с `changefreq=monthly` и пониженным приоритетом). - -## Ручной запуск - -Из каталога `oknardia/`: - -```bash -poetry run python manage.py generate_sitemaps -``` - -С явными параметрами: - -```bash -poetry run python manage.py generate_sitemaps \ - --compare-min-depth 2 \ - --compare-max-depth 4 \ - --max-items 40000 \ - --max-file-size 5242880 \ - --max-files-qty 998 -``` - -## Параметры команды - -- `--compare-min-depth` — минимальная глубина комбинаций `compare_offers` (по умолчанию `2`). -- `--compare-max-depth` — максимальная глубина комбинаций `compare_offers` (по умолчанию `4`). -- `--max-items` — лимит URL в одном sitemap-файле (по умолчанию `40000`). -- `--max-file-size` — лимит размера sitemap-файла в байтах (по умолчанию `5242880`). -- `--max-files-qty` — лимит количества вложенных sitemap-файлов (по умолчанию `998`). - -## Важные переменные окружения - -- `SITE_BASE_URL` — базовый URL сайта (например, `https://oknardia.ru`). -- `SITEMAP_SUBDIR` — подкаталог в `MEDIA_ROOT` для sitemap (по умолчанию `_serv_sitemap`). - -## Что добавить в контейнер - -Минимально (после миграций и перед запуском веб-процесса): - -```bash -poetry run python manage.py generate_sitemaps || true -``` - -> `|| true` можно убрать, если хотите падать при любой ошибке генерации. - -## Вариант для расписания (когда определитесь) - -Можно запускать команду по расписанию любым внешним scheduler: - -```bash -poetry run python manage.py generate_sitemaps -``` - -- через cron хоста, -- или через отдельный scheduler-контейнер. - -### Пример внешнего cron на хосте - -Пример строки для `crontab -e` на хост-машине (запуск раз в 3 дня в 03:30) с явным именем контейнера `oknarida-backend`: - -```bash -30 3 */3 * * /usr/bin/docker exec -i oknarida-backend /bin/sh -lc 'cd /app/oknardia && poetry run python manage.py generate_sitemaps --compare-min-depth 2 --compare-max-depth 4 --max-items 40000 --max-file-size 5242880 --max-files-qty 998' >> /var/log/oknardia-sitemap.log 2>&1 -``` - -> Если путь проекта внутри контейнера отличается от `/app/oknardia`, просто замени `cd /app/oknardia` на фактический путь. - -## Прокси/NGINX - -Можно хранить физические файлы в media-volume и при этом проксировать/алиасить корневой URL `sitemap.xml` на файл из `media/_serv_sitemap`. - -Допустимо, что файл доступен по двум URL (корневой и media), но в `robots.txt` должен быть указан один канонический вариант. - -### NGINX snippet (alias для корневого sitemap) - -```nginx -# Корневой sitemap.xml (для привычного для поисковиков URL) -location = /sitemap.xml { - alias /<путь-к-каталогку-с-докер-приложением>/media/_serv_sitemap/sitemap.xml; - default_type application/xml; - add_header Cache-Control "public, max-age=300"; -} -``` From df74175504638c94883a25696ce8cecd9e600d8a Mon Sep 17 00:00:00 2001 From: erjemin Date: Sat, 25 Apr 2026 08:06:15 +0300 Subject: [PATCH 030/102] =?UTF-8?q?=20mod:=20=D1=80=D0=B5=D1=84=D0=B0?= =?UTF-8?q?=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20"=D0=BA=D0=B0?= =?UTF-8?q?=D1=82=D0=B0=D0=BB=D0=BE=D0=B3=D0=B0=20=D0=BA=D0=BE=D0=BC=D0=BF?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B9"=20(=D0=B2=D1=8C=D1=8E=D1=88=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=B8=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD=D1=8B)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +- .../templates/catalog/catalog_company.html | 93 ++- .../catalog/catalog_company_detail.html | 69 +- oknardia/web/catalog_companies.py | 648 ++++++++++++++---- 4 files changed, 612 insertions(+), 201 deletions(-) diff --git a/README.md b/README.md index 5807fbb..9463d08 100644 --- a/README.md +++ b/README.md @@ -17,8 +17,7 @@ * Рефакторинг `catalog_seria_info` и связанных функций в `catalog_series.py`: raw SQL ⟶ ORM (`catalog_seria_info`, `seria_nav`, `seria_info_year`, `seria_info_geo_code`), снижена нагрузка на БД за счёт предвыборки и переиспользования агрегатов (`quantities_by_pair`, `offers_by_window`), добавлены безопасные fallback-значения для пустых выборок, включена потоковая обработка `iterator(chunk_size=500)` для гео-данных, обновлены комментарии и docstring под фактическую логику (таблица окон, pre-render light/heavy шаблонов, гео+статистика серии). * Добавлена management-команда `regenerate_seria_prerender` для оффлайн-пересборки pre-render шаблонов `catalog_seria_info` (все или выбранные root-серии), с режимами `--dry-run` и `--force`; серверный reload (Gunicon? uWSGI или что там еще будет) должен быть вынесен из кода приложения в оркестрацию (cron/systemd/deploy step). * Рефакторинг `standard_opening`: raw SQL -> ORM, упрощена дедублекация, убраны лишние запросы и переменные контекста, добавлены комментарии, SEO-описание и keywords, стандартизирован хвост контекста с визитами и `ticks` через общий helper внутри `catalog_openings.py`. -* -* +* Рефакторинг `catalog_company` и `catalog_company_detail` (`/catalog/company`): raw SQL → ORM для получения списка компаний и их наборов, вынесены вспомогательные функции (`_get_company_statistics`, `_get_company_sets_detail`, `_format_company_for_template`, `_format_set_for_template`, `_clean_text_field`, `_lowercase_first_char`), упрощена логика форматирования данных, добавлены подробные комментарии и docstring для каждой функции, использованы `select_related` и `annotate` для оптимизации запросов, добавлена защита от `Http404` при неправильных slugs. Улучшены SEO-атрибуты, и добавлена разметка shema.org. * * diff --git a/oknardia/templates/catalog/catalog_company.html b/oknardia/templates/catalog/catalog_company.html index 42caf0d..6f9f10a 100755 --- a/oknardia/templates/catalog/catalog_company.html +++ b/oknardia/templates/catalog/catalog_company.html @@ -1,58 +1,81 @@ {% extends "base.html" %} {% load static %}{% load filters %} -{% block Title %}Каталог изготовителей и поставщиков окон{% endblock %} +{% block Title %}Каталог оконных компаний: производители и поставщики окон, рейтинг и цены{% endblock %} {% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %} -{% block Description %}Каталог изготовителей окон, партнёры «Окнардия», рейтинг, {% for i in COMPANIES %}{{ i.sMerchantName }}, {% endfor %} средняя цена окна{% endblock %} +{% block Description %}Актуальный каталог оконных компаний России. Сравните производителей и поставщиков пластиковых окон по рейтингу, ассортименту, средней цене и дате последнего обновления.{% endblock %} -{% block Keywords %}Оконные компании, {% for i in COMPANIES %}{{ i.sMerchantName }}, {% endfor %} изготовители окон, производители окон, постащики окон, партнёры, каталог компаний, каталог оконных компаний, oknardia, окнардия {{ META_KEYWORDS|default:"" }} {% endblock %} +{% block Keywords %}оконные компании, каталог компаний, производители окон, поставщики окон, рейтинг оконных компаний, сравнить цены на окна, oknardia, окнардия{% endblock %} -{% block Date4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}{% endblock %} +{% block Author4Meta %}: Каталог «Окнардия»{% endblock %} -{% block Last4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}{% endblock %} - -{% block Author4Meta %}: Каталог изготовителей окон{% endblock %} - -{% block CopyrightAuthor4Meta %}: Каталог изготовителей окон{% endblock %} +{% block CopyrightAuthor4Meta %}: Каталог «Окнардия»{% endblock %} {% block Top_Meta1 %}{# #} - {% if IMG_FOR_BLOG %} - {% else %} - {% endif %} - - - - - - - - - - - - + - - - - + + + + - - + + - - - + {# Удалить: — устаревший тег #} + + {# #}{% endblock %} +{% block ADD_TO_HEAD %}{% comment %} +JSON-LD для страницы-списка компаний: CollectionPage + ItemList с элементами Organization. +Это понятнее для поисковиков, чем legacy microdata на метатегах. +{% endcomment %} + +{% endblock %} + + {% block Main_Content %}
    {# #}
    @@ -90,7 +113,3 @@ {% include "report/report_log_user_visit.html" %}
    {% endblock %} - - - - diff --git a/oknardia/templates/catalog/catalog_company_detail.html b/oknardia/templates/catalog/catalog_company_detail.html index 03b251b..f7d4308 100755 --- a/oknardia/templates/catalog/catalog_company_detail.html +++ b/oknardia/templates/catalog/catalog_company_detail.html @@ -5,30 +5,20 @@ {% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %} -{% block Description %}«{{ COMPANY }}», описание компании «{{ COMPANY }}», оконные наборы от «{{ COMPANY }}» и их состав, характеристики «{{ COMPANY }}», рейтинг «{{ COMPANY }}», средние цены и отклонение цен «{{ COMPANY }}».{% endblock %} +{% block Description %}Производитель окон «{{ COMPANY }}» в каталоге Окнардии: оконные наборы, их состав и характеристики, независимый рейтинг качества, средние цены на замену оконных конструкций в типовых домах.{% endblock %} -{% block Keywords %}{{ COMPANY }}, компания {{ COMPANY }}, окна {{ COMPANY }}, изготовитель окон {{ COMPANY }}, производитель окон {{ COMPANY }}, поставщик окон {{ COMPANY }}, партнёр, каталог компаний, каталог оконных компаний, oknardia, окнардия {{ META_KEYWORDS|default:"" }} {% endblock %} +{% block Keywords %}{{ COMPANY }}, компания {{ COMPANY }}, окна {{ COMPANY }}, изготовитель окон {{ COMPANY }}, производитель окон {{ COMPANY }}, поставщик окон {{ COMPANY }}, партнёр, каталог компаний, каталог оконных компаний, oknardia, окнардия{% 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 Author4Meta %}: Каталог изготовителей окон{% endblock %} - -{% block CopyrightAuthor4Meta %}: Каталог изготовителей окон{% endblock %} +{% block CopyrightAuthor4Meta %}Каталог изготовителей окон{% endblock %} {% block Top_Meta1 %}{# #} - {% if IMG_FOR_BLOG %} - {% else %} - {% endif %} - - - - - + {# Microdata (itemprop) убрана — заменена на JSON-LD в блоке ADD_TO_HEAD ниже (чище, надёжнее) #} - + {# Удалить: — тег Google News 2011 г., отменён в 2014, поисковики игнорируют #} @@ -36,24 +26,59 @@ - + - + - - + + - + {# Удалить: — устарело с 2015, Twitter его не использует #} {# #}{% endblock %} +{% block Top_JS5 %} + {% endblock %} -{% block Top_JS5 %}{% endblock %} +{% block ADD_TO_HEAD %}{% comment %} + JSON-LD разметка Schema.org для страницы производителя окон. + Тип LocalBusiness описывает компанию-поставщика окон: название, контакты, адрес, геокоординаты, + логотип и ссылку на официальный сайт производителя. + Данные берутся из первого набора в SETS (все наборы принадлежат одному офису/бренду), + поэтому достаточно SETS.0 для контактной информации. + Документация: https://schema.org/LocalBusiness #}{% endcomment %} + +{% endblock %} {% block Main_Content %} diff --git a/oknardia/web/catalog_companies.py b/oknardia/web/catalog_companies.py index 7cc9d62..882ba12 100644 --- a/oknardia/web/catalog_companies.py +++ b/oknardia/web/catalog_companies.py @@ -1,11 +1,27 @@ # -*- coding: utf-8 -*- +""" +Каталог производителей и компаний. + +Модуль предоставляет views для отображения: +1. Списка всех производителей с их ключевыми показателями (рейтинг, количество + предложений, среднюю цену и т.п.) +2. Детальную информацию о конкретном производителе со всеми его оконными наборами + +Все запросы переведены на Django ORM для лучшей производительности и чистоты кода. +""" from django.shortcuts import render, redirect -from django.http import HttpRequest, HttpResponse -from django.utils import timezone +from django.http import HttpRequest, HttpResponse, Http404 +from django.db.models import Count, Avg, Max, Min, DecimalField from oknardia.models import ( MerchantBrand, + SetKit, + PriceOffer, +) +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 get_rating_set_for_stars import django.utils.dateformat import time @@ -14,148 +30,500 @@ import re import pytils +def _get_company_statistics() -> list: + """ + Получает список компаний (MerchantBrand) с агрегированной статистикой. + + Статистика включает: + - Количество оконных наборов от компании + - Средний рейтинг наборов + - Количество ценовых предложений + - Среднюю цену предложений + - Дату последнего обновления цены + + Оптимизировано для минимизации запросов к БД. + + Returns: + list: Список словарей с данными компаний + """ + # 1. Статистика по наборам (SetKit) для каждой компании + set_stats = ( + SetKit.objects + .filter(kSet2User__kMerchantOffice__kMerchantName__isnull=False) + .values('kSet2User__kMerchantOffice__kMerchantName_id') + .annotate( + num_sets=Count('id', distinct=True), + avg_rating=Avg('fSetRating') + ) + ) + set_stats_dict = { + stat['kSet2User__kMerchantOffice__kMerchantName_id']: { + 'num_sets': stat['num_sets'], + 'avg_rating': stat['avg_rating'] or 0 + } + for stat in set_stats + } + + # 2. Статистика по ценовым предложениям (PriceOffer) + companies_data = ( + PriceOffer.objects + .filter( + sOfferActive=True, + kOfferFromUser__kMerchantOffice__kMerchantName__isnull=False + ) + .values('kOfferFromUser__kMerchantOffice__kMerchantName_id') + .annotate( + num_offers=Count('id', distinct=True), + price_avg=Avg('fOfferPrice', output_field=DecimalField()), + last_update=Max('dOfferModify') + ) + .order_by('-last_update') + ) + + # 3. Получаем все объекты MerchantBrand одним запросом (решение проблемы N+1) + company_ids = [ + offer['kOfferFromUser__kMerchantOffice__kMerchantName_id'] + for offer in companies_data + ] + merchants = MerchantBrand.objects.in_bulk(company_ids) + + # 4. Собираем финальный результат + result = [] + for offer in companies_data: + company_id = offer['kOfferFromUser__kMerchantOffice__kMerchantName_id'] + merchant = merchants.get(company_id) + + if not merchant: + continue + + set_stat = set_stats_dict.get(company_id, { + 'num_sets': 0, + 'avg_rating': 0 + }) + + result.append({ + 'id': merchant.id, + 'sMerchantName': merchant.sMerchantName, + 'pMerchantLogo': merchant.pMerchantLogo, + 'NumSets': set_stat['num_sets'], + 'RatingAVG': set_stat['avg_rating'], + 'NumOffers': offer['num_offers'], + 'PriceAVG': offer['price_avg'], + 'lastUpdate': offer['last_update'] + }) + + # Сортируем по среднему рейтингу (убывание) + result.sort(key=lambda x: x['RatingAVG'], reverse=True) + + return result + + +def _format_company_for_template(company_data: dict) -> dict: + """ + Форматирует данные компании для вывода в шаблон. + + Применяет: + - Конвертацию времени в читаемый формат (e.g., "3 дня назад") + - Склонение существительных (plural forms) + - Вычисление звёзд рейтинга + - Скатывание имени в slug для URL + + Args: + company_data (dict): Словарь с данными компании + + Returns: + dict: Отформатированные данные компании + """ + formatted = company_data.copy() + + # Вычисляем звёзды на основе рейтинга + formatted['STARS'] = get_rating_set_for_stars( + formatted['RatingAVG'] + ) + + # Применяем правильные формы множественного числа + formatted['NumSets'] = pytils.numeral.get_plural( + formatted['NumSets'], + "оконный набор, оконных набора, оконных наборов" + ) + formatted['NumOffers'] = pytils.numeral.get_plural( + formatted['NumOffers'], + "вариант, варианта, вариантов" + ) + + # Конвертируем время последнего обновления в читаемый формат + if formatted['lastUpdate']: + timestamp = int( + django.utils.dateformat.format( + formatted['lastUpdate'], + 'U' + ) + ) + formatted['lastUpdate'] = pytils.dt.distance_of_time_in_words( + timestamp + ) + + # Генерируем slug из имени компании для URL + formatted['sMerchantMainURL'] = pytils.translit.slugify( + formatted['sMerchantName'] + ) + + return formatted + + def catalog_company(request: HttpRequest) -> HttpResponse: - time_start = time.perf_counter() - to_template: dict[str, object] = {} # словарь, для передачи шаблону - q_company = MerchantBrand.objects.raw('SELECT' - ' oknardia_merchantbrand.id,' - ' oknardia_merchantbrand.sMerchantName,' - ' oknardia_merchantbrand.pMerchantLogo,' - ' oknardia_merchantbrand.sMerchantMainURL,' - ' COUNT(oknardia_priceoffer.id) AS NumOffers,' - ' AVG(oknardia_priceoffer.fOfferPrice) AS PriceAVG,' - ' MAX(oknardia_priceoffer.dOfferModify) AS lastUpdate,' - ' Q.NumSets,' - ' Q.RatingAVG,' - ' 1 AS STARS ' - 'FROM (SELECT' - ' COUNT(oknardia_setkit.sSetName) AS NumSets,' - ' oknardia_merchantoffice.kMerchantName_id AS Q_ID,' - ' AVG(oknardia_setkit.fSetRating) AS RatingAVG' - ' FROM oknardia_merchantoffice' - ' INNER JOIN oknardia_ouruser' - ' ON oknardia_ouruser.kMerchantOffice_id = oknardia_merchantoffice.id' - ' INNER JOIN oknardia_setkit' - ' ON oknardia_setkit.kSet2User_id = oknardia_ouruser.id' - ' GROUP BY oknardia_merchantoffice.id,' - ' oknardia_merchantoffice.kMerchantName_id) AS Q,' - ' oknardia_ouruser' - ' INNER JOIN oknardia_merchantoffice' - ' ON oknardia_ouruser.kMerchantOffice_id = oknardia_merchantoffice.id' - ' INNER JOIN oknardia_priceoffer' - ' ON oknardia_priceoffer.kOfferFromUser_id = oknardia_ouruser.id' - ' INNER JOIN oknardia_merchantbrand' - ' ON oknardia_merchantoffice.kMerchantName_id = oknardia_merchantbrand.id' - ' WHERE Q_ID = oknardia_merchantoffice.kMerchantName_id ' - 'GROUP BY oknardia_merchantoffice.kMerchantName_id ' - 'ORDER BY Q.RatingAVG DESC;') - list_company = list(q_company) - for i in list_company: - i.STARS = get_rating_set_for_stars(i.RatingAVG) - i.NumSets = pytils.numeral.get_plural(i.NumSets, u"оконный набор, оконных набора, оконных наборов") - i.NumOffers = pytils.numeral.get_plural(i.NumOffers, u"вариант, варианта, вариантов") - i.lastUpdate = pytils.dt.distance_of_time_in_words(int(django.utils.dateformat.format(i.lastUpdate, 'U'))) - i.sMerchantMainURL = pytils.translit.slugify(i.sMerchantName) - # print("NAME:", i.sMerchantName, "\tNumSets:", i.NumSets, "\tNumOffers:", i.NumOffers, - # "\t:AverageRating:", i.RatingAVG, "\tAveragePrice:", i.PriceAVG, "\tSTARS:", i.STARS) - to_template.update({ - 'COMPANIES': list_company, - # получаем последние визиты клиента через куки - 'LAST_VISIT': get_last_user_visit_list(get_last_user_visit_cookies(request)[:3]), - # получаем последние визиты всех посетителей из базы - # id2log, log_visit = get_last_all_user_visit_list() + """ + Показывает список всех производителей с ключевыми показателями. + + GET параметры: опционально могут использоваться для фильтрации + + Контекст шаблона: + - COMPANIES (list): Список компаний с статистикой + - LAST_VISIT (list): Последние визиты текущего пользователя + - LOG_VISIT (list): Последние визиты всех пользователей + + Args: + request (HttpRequest): HTTP запрос от клиента + + Returns: + HttpResponse: Отрендеренная HTML страница со списком компаний + """ + # Получаем статистику по компаниям с использованием ORM + companies_list = _get_company_statistics() + + # Форматируем каждую компанию для вывода в шаблон + formatted_companies = [ + _format_company_for_template(company) + for company in companies_list + ] + + # Получаем информацию о посещениях для персонализации + to_template: dict[str, object] = { + 'COMPANIES': formatted_companies, + 'LAST_VISIT': get_last_user_visit_list( + get_last_user_visit_cookies(request)[:3] + ), 'LOG_VISIT': get_last_all_user_visit_list(), - 'ticks': float(time.perf_counter() - time_start) - }) + } + return render(request, "catalog/catalog_company.html", to_template) -def catalog_company_detail(request: HttpRequest, company_id: str, company_name_slug: str) -> HttpResponse: +def _lowercase_first_char(text: str) -> str: + """ + Преобразует первый символ строки в нижний регистр. + + Args: + text (str): Исходная строка + + Returns: + str: Строка с строчным первым символом (если длина > 0) + """ + return text[0].lower() + text[1:] if len(text) > 0 else text + + +def _clean_text_field(text: str, empty_values: list) -> str: + """ + Очищает текстовое поле, удаляя типичные маркеры "пусто" и преобразуя + первый символ в нижний регистр. + + Args: + text (str): Исходный текст + empty_values (list): Список значений, которые считаются "пустыми" + + Returns: + str: Очищенный текст или пустая строка если значение в empty_values + """ + if text.lower() in empty_values: + return "" + return _lowercase_first_char(text) + + +def _get_company_sets_detail(company_id: int) -> list: + """ + Получает все оконные наборы для компании с полной статистикой по ценам. + + Использует оптимизированные select_related и prefetch_related для минимизации + запросов к БД. Группирует данные по наборам (SetKit) с уникальностью. + + Args: + company_id (int): ID компании (MerchantBrand) + + Returns: + list: Список словарей с данными наборов, отсортированные по рейтингу + """ + # Получаем активные ценовые предложения для компаний с агрегацией по наборам + price_stats = ( + PriceOffer.objects + .filter( + sOfferActive=True, + kOfferFromUser__kMerchantOffice__kMerchantName_id=company_id + ) + .values('kOffer2SetKit_id') + .annotate( + num_offers=Count('id'), + price_avg=Avg('fOfferPrice', output_field=DecimalField()), + last_update=Max('dOfferModify'), + early_creation=Min('dOfferCreate') + ) + ) + + # Преобразуем в словарь для быстрого доступа по ID набора + price_stats_dict = { + stat['kOffer2SetKit_id']: { + 'num_offers': stat['num_offers'], + 'price_avg': stat['price_avg'], + 'last_update': stat['last_update'], + 'early_creation': stat['early_creation'] + } + for stat in price_stats + } + + # Получаем все наборы компании с их зависимостями + # select_related оптимизирует ForeignKey запросы (профиль, стеклопакет) + sets_queryset = ( + SetKit.objects + .filter( + kSet2User__kMerchantOffice__kMerchantName_id=company_id + ) + .select_related( + 'kSet2User', + 'kSet2User__kMerchantOffice', + 'kSet2User__kMerchantOffice__kMerchantName', + 'kSet2PVCprofiles', + 'kSet2Glazing' + ) + .order_by('-fSetRating') + ) + + # Собираем результат, комбинируя данные SetKit с агрегированной статистикой + result = [] + seen_set_ids = set() + + for setkit in sets_queryset: + # Пропускаем дубликаты наборов (может быть несколько ценовых предложений + # для одного набора) + if setkit.id in seen_set_ids: + continue + seen_set_ids.add(setkit.id) + + # Получаем статистику по ценам для этого набора + price_stat = price_stats_dict.get(setkit.id, { + 'num_offers': 0, + 'price_avg': None, + 'last_update': None, + 'early_creation': None + }) + + # Собираем все данные в один объект + result.append({ + 'setkit': setkit, + 'num_offers': price_stat['num_offers'], + 'price_avg': price_stat['price_avg'], + 'last_update': price_stat['last_update'], + 'early_creation': price_stat['early_creation'], + 'merchant_office': setkit.kSet2User.kMerchantOffice, + 'merchant_brand': setkit.kSet2User.kMerchantOffice.kMerchantName, + 'profile': setkit.kSet2PVCprofiles, + 'glazing': setkit.kSet2Glazing + }) + + return result + + +def _format_set_for_template(set_data: dict, empty_values: list) -> dict: + """ + Форматирует данные оконного набора для вывода в шаблон. + + Применяет: + - Преобразование URL в удобный для отображения формат + - Разделение email адресов на части (для обфускации) + - Вычисление звёзд рейтинга + - Конвертация времени в читаемый формат + - Создание slugs для названий и производителей + - Склонение числительных(контуры, швы и т.п.) + - Очистку пустых полей от стандартных маркеров ("нет", "—" и т.п.) + + Args: + set_data (dict): Данные набора с объектами моделей + empty_values (list): Список значений, считаемых "пустыми" + + Returns: + dict: Отформатированные данные для шаблона + """ + set_kit = set_data['setkit'] + merchant_office = set_data['merchant_office'] + merchant_brand = set_data['merchant_brand'] + profile = set_data['profile'] + glazing = set_data['glazing'] + + formatted = { + # Ключи ниже оставлены в legacy-формате, т.к. шаблон использует именно их имена. + 'sSetName': set_kit.sSetName, + 'sMerchantName': merchant_brand.sMerchantName, + 'sMerchantDescription': merchant_brand.sMerchantDescription, + 'fSetRating': { + 'RATING': set_kit.fSetRating, + 'STARS': get_rating_set_for_stars(set_kit.fSetRating) + }, + 'num_offers': set_data['num_offers'], + 'price_avg': set_data['price_avg'], + 'bSetDelivery': set_kit.bSetDelivery, + 'bSetUninstallInstall': set_kit.bSetUninstallInstall, + 'sSetImplementAll': set_kit.sSetImplementAll, + 'sSetImplementHandles': set_kit.sSetImplementHandles, + 'sMerchantMainURL': { + 'URL': merchant_office.kMerchantName.sMerchantMainURL, + 'URL_VIEW': re.sub( + r"^https?://|/$|www\.", + "", + merchant_office.kMerchantName.sMerchantMainURL + ) + }, + 'sOfficePhones': merchant_office.sOfficePhones, + 'sOfficeDescription': merchant_office.sOfficeDescription, + 'sOfficeEmails': merchant_office.sOfficeEmails, + 'sOfficeName': merchant_office.sOfficeName, + 'sOfficeAddress': merchant_office.sOfficeAddress, + 'fOfficeGeoCode_Latitude': merchant_office.fOfficeGeoCode_Latitude, + 'fOfficeGeoCode_Longitude': merchant_office.fOfficeGeoCode_Longitude, + 'sOfficeDiscountMetaFormula': merchant_office.sOfficeDiscountMetaFormula, + 'pMerchantLogo': merchant_office.kMerchantName.pMerchantLogo, + 'idPVC': profile.id, + 'sProfileBriefDescription': profile.sProfileBriefDescription, + 'iProfileCameras': profile.iProfileCameras, + 'sProfileName': { + 'NAME': profile.sProfileName, + 'NAME_T': pytils.translit.slugify(profile.sProfileName) + }, + 'sProfileManufacturer': { + 'NAME': profile.sProfileManufacturer, + 'NAME_T': pytils.translit.slugify(profile.sProfileManufacturer) + }, + 'sProfileColor': profile.sProfileColor, + 'sProfileSealDescription': profile.sProfileSealDescription, + 'fProfileSeals': pytils.numeral.sum_string( + profile.fProfileSeals, + pytils.numeral.MALE, + "контур, контура, контуров" + ), + 'sGlazingBriefDescription': glazing.sGlazingBriefDescription, + 'sGlazingManufacturer': glazing.sGlazingManufacturer, + 'sGlazingMark': glazing.sGlazingMark, + 'sGlazingToning': glazing.sGlazingToning, + 'sSetImplementCatch': _clean_text_field(set_kit.sSetImplementCatch, empty_values), + 'sSetClimateControl': _clean_text_field(set_kit.sSetClimateControl, empty_values), + 'sProfileReinforcement': _lowercase_first_char(profile.sProfileReinforcement), + 'sSetSill': _lowercase_first_char(set_kit.sSetSill), + 'sSetPanes': _lowercase_first_char(set_kit.sSetPanes), + 'sSetSlope': _lowercase_first_char(set_kit.sSetSlope), + 'sSetUninstallInstall': _lowercase_first_char(set_kit.sSetUninstallInstall), + 'sSetDelivery': _lowercase_first_char(set_kit.sSetDelivery), + 'sSetOtherConditions': _lowercase_first_char(set_kit.sSetOtherConditions), + } + + # Конвертируем даты в читаемый формат + if set_data['last_update']: + timestamp = int(django.utils.dateformat.format(set_data['last_update'], 'U')) + formatted['lastUpdate'] = pytils.dt.distance_of_time_in_words(timestamp) + + if set_data['early_creation']: + timestamp = int(django.utils.dateformat.format(set_data['early_creation'],'U')) + formatted['earlyCreation'] = pytils.dt.distance_of_time_in_words(timestamp) + + # Разделяем email на части для обфускации (показываем середину отдельно) + # На фронтенде JS собирает все обратно в валидный e-mail + if formatted['sOfficeEmails']: + try: + email_len = len(formatted['sOfficeEmails']) + k = random.randint(1, max(1, int(email_len / 2) - 1)) + formatted['sOfficeEmails'] = [ + formatted['sOfficeEmails'][0:k], + formatted['sOfficeEmails'][k:-k], + formatted['sOfficeEmails'][-k:] + ] + except (ValueError, ZeroDivisionError): + # Если ошибка при случайном разделении, оставляем как есть + pass + + return formatted + + +def catalog_company_detail( + request: HttpRequest, + company_id: str, + company_name_slug: str +) -> HttpResponse: + """ + Показывает детальную информацию о компании и все её оконные наборы. + + Производит редирект если slug в URL не совпадает с актуальным. + + GET параметры: опционально могут использоваться для фильтрации + + Контекст шаблона: + - COMPANY (str): Название компании + - COMPANY_ID (int): ID компании + - COMPANY_T (str): Slug компании + - SETS (list): Список оконных наборов с их полной информацией + - IMG_FOR_BLOG (str): Логотип компании + - LIST_NOT (list): Стандартные маркеры "пусто" + - LAST_VISIT (list): Последние визиты текущего пользователя + - LOG_VISIT (list): Последние визиты всех пользователей + - ticks (float): Время выполнения представления (в секундах) + + Args: + request (HttpRequest): HTTP запрос от клиента + company_id (str): ID компании в виде строки + company_name_slug (str): Slug названия компании из URL + + Returns: + HttpResponse: Отрендеренная HTML страница с деталью компании или редирект + """ time_start = time.perf_counter() - to_template: dict[str, object] = {} # словарь, для передачи шаблону - company_id = int(company_id) - q_by_id = MerchantBrand.objects.get(id=company_id) - if pytils.translit.slugify(q_by_id.sMerchantName) != company_name_slug: - return redirect('/catalog/company/%d-%s' % (company_id, pytils.translit.slugify(q_by_id.sMerchantName))) - to_template.update({'COMPANY': q_by_id.sMerchantName}) - to_template.update({'COMPANY_ID': company_id}) - to_template.update({'COMPANY_T': company_name_slug}) - list_not = [u"нет", u"—", ""] - to_template.update({'LIST_NOT': list_not}) - q_sets = MerchantBrand.objects.raw(f"SELECT" - f" COUNT(oknardia_priceoffer.id) AS NumOffers," - f" AVG(oknardia_priceoffer.fOfferPrice) AS priceAVG," - f" MAX(oknardia_priceoffer.dOfferModify) AS lastUpdate," - f" MIN(oknardia_priceoffer.dOfferCreate) AS earlyCreation," - f" oknardia_merchantbrand.*," - f" oknardia_merchantoffice.*," - f" oknardia_merchantoffice.id AS idMERCH," - f" oknardia_setkit.*," - f" oknardia_setkit.id AS idSET," - f" oknardia_pvcprofiles.*," - f" oknardia_pvcprofiles.id AS idPVC," - f" oknardia_glazing.*, " - f" oknardia_glazing.id AS idGLAZ " - f"FROM oknardia_ouruser" - 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" INNER JOIN oknardia_setkit" - f" ON oknardia_setkit.kSet2User_id = oknardia_ouruser.id" - f" INNER JOIN oknardia_priceoffer" - 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_glazing" - f" ON oknardia_setkit.kSet2Glazing_id = oknardia_glazing.id " - f"WHERE oknardia_merchantbrand.id = {company_id} " - f"AND oknardia_priceoffer.sOfferActive = TRUE " - f"GROUP BY oknardia_merchantoffice.id," - f" oknardia_setkit.id," - f" oknardia_setkit.fSetRating " - f"ORDER BY oknardia_setkit.fSetRating DESC;") - list_sets = list(q_sets) - for i in list_sets: - i.sMerchantMainURL = {"URL": i.sMerchantMainURL, - "URL_VIEW": re.sub(r"(?:^http://|^https://|/$|www\.)", "", i.sMerchantMainURL)} - k = random.randint(1, int(len(i.sOfficeEmails)/2) - 1) - i.sOfficeEmails = [i.sOfficeEmails[0:k], i.sOfficeEmails[k:-k], i.sOfficeEmails[-k:]] - to_template.update({'IMG_FOR_BLOG': i.pMerchantLogo}) - i.fSetRating = {"RATING": i.fSetRating, - "STARS": get_rating_set_for_stars(i.fSetRating)} - i.lastUpdate = pytils.dt.distance_of_time_in_words(int(django.utils.dateformat.format(i.lastUpdate, 'U'))) - i.earlyCreation = pytils.dt.distance_of_time_in_words(int(django.utils.dateformat.format(i.earlyCreation, 'U'))) - i.sProfileName = {"NAME": i.sProfileName, - "NAME_T": pytils.translit.slugify(i.sProfileName)} - i.sProfileManufacturer = {"NAME": i.sProfileManufacturer, - "NAME_T": pytils.translit.slugify(i.sProfileManufacturer)} - i.fProfileSeals = pytils.numeral.sum_string(i.fProfileSeals, pytils.numeral.MALE, u"контур, контура, контуров") - if i.sSetImplementCatch.lower() in list_not: - i.sSetImplementCatch = "" - if i.sSetClimateControl.lower() in list_not: - i.sSetClimateControl = "" - if len(i.sProfileReinforcement) > 0: - i.sProfileReinforcement = i.sProfileReinforcement[0].lower()+i.sProfileReinforcement[1:] - if len(i.sSetSill) > 0: - i.sSetSill = i.sSetSill[0].lower()+i.sSetSill[1:] - if len(i.sSetPanes) > 0: - i.sSetPanes = i.sSetPanes[0].lower()+i.sSetPanes[1:] - if len(i.sSetSlope) > 0: - i.sSetSlope = i.sSetSlope[0].lower()+i.sSetSlope[1:] - if len(i.sSetUninstallInstall) > 0: - i.sSetUninstallInstall = i.sSetUninstallInstall[0].lower()+i.sSetUninstallInstall[1:] - if len(i.sSetDelivery) > 0: - i.sSetDelivery = i.sSetDelivery[0].lower()+i.sSetDelivery[1:] - if len(i.sSetOtherConditions) > 0: - i.sSetOtherConditions = i.sSetOtherConditions[0].lower()+i.sSetOtherConditions[1:] - to_template.update({ - 'SETS': list_sets, - # получаем последние визиты клиента через куки - 'LAST_VISIT': get_last_user_visit_list(get_last_user_visit_cookies(request)[:3]), - # получаем последние визиты всех посетителей из базы - # id2log, log_visit = get_last_all_user_visit_list() + company_id_int = int(company_id) + + # Получаем компанию или возвращаем 404 + try: + company = MerchantBrand.objects.get(id=company_id_int) + except MerchantBrand.DoesNotExist: + raise Http404("Компания не найдена") + + # Проверяем что slug совпадает (для SEO и красивых URL) + actual_slug = pytils.translit.slugify(company.sMerchantName) + if actual_slug != company_name_slug: + return redirect( + f'/catalog/company/{company_id_int}-{actual_slug}' + ) + + # Типичные маркеры, которые означают что поле пусто + empty_values = ["нет", "—", ""] + + # Получаем все наборы компании с ценовой статистикой + sets_list = _get_company_sets_detail(company_id_int) + + # Форматируем каждый набор для вывода в шаблон + formatted_sets = [ + _format_set_for_template(set_data, empty_values) + for set_data in sets_list + ] + + to_template: dict[str, object] = { + 'COMPANY': company.sMerchantName, + 'COMPANY_ID': company_id_int, + 'COMPANY_T': company_name_slug, + 'SETS': formatted_sets, + 'HEADER': f'Изготовитель окон «{company.sMerchantName}»', + 'META_KEYWORDS': company.sMerchantName, + 'IMG_FOR_BLOG': company.pMerchantLogo, + 'LIST_NOT': empty_values, + 'LAST_VISIT': get_last_user_visit_list( + get_last_user_visit_cookies(request)[:3] + ), 'LOG_VISIT': get_last_all_user_visit_list(), - 'ticks': float(time.perf_counter() - time_start) - }) + } + + # Добавляем метрику выполнения представления + to_template['ticks'] = float(time.perf_counter() - time_start) + return render(request, "catalog/catalog_company_detail.html", to_template) From 9fb4843f8f160b7cdd80db6dae2e04b361752f76 Mon Sep 17 00:00:00 2001 From: erjemin Date: Sat, 25 Apr 2026 08:12:41 +0300 Subject: [PATCH 031/102] =?UTF-8?q?minor:=20=D0=B4=D0=B0=D1=82=D1=8B=20"Y-?= =?UTF-8?q?m-d"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oknardia/templates/base.html | 12 ++++++------ oknardia/templates/blog/blog_list.html | 4 ++-- oknardia/templates/blog/blog_post.html | 6 +++--- .../catalog/catalog_of_profiles_manufacture.html | 6 +++--- .../templates/catalog/catalog_of_profiles_model.html | 6 +++--- oknardia/templates/catalog/catalog_root.html | 6 +++--- oknardia/templates/catalog/catalog_seria.html | 6 +++--- .../templates/catalog/catalog_standard_opening.html | 6 +++--- oknardia/templates/contact.html | 4 ++-- oknardia/templates/price/price_list.html | 4 ++-- .../templates/price/price_offers_for_one_window.html | 4 ++-- oknardia/templates/rating/profiles_rating.html | 4 ++-- oknardia/templates/report/report_compare_set.html | 4 ++-- oknardia/templates/seria_info/all_stat.html | 4 ++-- oknardia/templates/tariff.html | 4 ++-- 15 files changed, 40 insertions(+), 40 deletions(-) diff --git a/oknardia/templates/base.html b/oknardia/templates/base.html index 859dd2e..d328074 100755 --- a/oknardia/templates/base.html +++ b/oknardia/templates/base.html @@ -4,14 +4,14 @@ - - - + + + - - + + @@ -26,7 +26,7 @@ {% block Top_CSS1 %}{% endblock %}{% block Top_CSS2 %}{% endblock %}{% block Top_CSS3 %}{% endblock %} {# #} {# #}{% block Top_JS1 %}{% endblock %}{% block Top_JS2 %}{% endblock %}{% block Top_JS3 %}{% endblock %}{% block Top_JS4 %}{% endblock %}{% block Top_JS5 %}{% endblock %}{% block Top_Meta1 %}{% endblock %} - + {% block ADD_TO_HEAD %}{% endblock %} diff --git a/oknardia/templates/blog/blog_list.html b/oknardia/templates/blog/blog_list.html index 9df47c3..b29d05b 100755 --- a/oknardia/templates/blog/blog_list.html +++ b/oknardia/templates/blog/blog_list.html @@ -8,9 +8,9 @@ {% block Keywords %}oknardia, окнардия, blogs, блоги, публикации, цены пластиковых окон, стоимость пластиковых окон, скидки на пластиковые окна, предложения пластиковых окон, {{ META_KEYWORDS|default:"" }} {% endblock %} -{% block Date4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}{% endblock %} +{% block Date4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"Y-m-d" }}{% else %}{% now "c" %}{% endif %}{% endblock %} -{% block Last4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}{% endblock %} +{% block Last4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"Y-m-d" }}{% else %}{% now "c" %}{% endif %}{% endblock %} {% block Author4Meta %}: Блоги{% endblock %} diff --git a/oknardia/templates/blog/blog_post.html b/oknardia/templates/blog/blog_post.html index c7a8a58..feef758 100755 --- a/oknardia/templates/blog/blog_post.html +++ b/oknardia/templates/blog/blog_post.html @@ -8,9 +8,9 @@ {% block Keywords %}oknardia, окнардия, blog, блог, публикация, {{ HEADER|striptags }}{% endblock %} -{% block Date4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}{% endblock %} +{% block Date4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"Y-m-d" }}{% else %}{% now "c" %}{% endif %}{% endblock %} -{% block Last4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}{% endblock %} +{% block Last4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"Y-m-d" }}{% else %}{% now "c" %}{% endif %}{% endblock %} {% block Author4Meta %}: {{ USERNAME }}{% if NAME1 != "" or NAME2 != "" %} ({{ NAME1 }}{% if NAME2 != "" %} {{ NAME2 }}{% endif %}){% endif %}{% endblock %} @@ -20,7 +20,7 @@ {# #}{% if NAME1 != '' or NAME2 != '' %} {% endif %} - + diff --git a/oknardia/templates/catalog/catalog_of_profiles_manufacture.html b/oknardia/templates/catalog/catalog_of_profiles_manufacture.html index 443d700..9b7017c 100755 --- a/oknardia/templates/catalog/catalog_of_profiles_manufacture.html +++ b/oknardia/templates/catalog/catalog_of_profiles_manufacture.html @@ -9,9 +9,9 @@ {% block Keywords %}{{ CATALOG_MANUFACT }}, оконные профили {{ CATALOG_MANUFACT }}, производитель {{ CATALOG_MANUFACT }}, {% for i in PROFILES %}{{ i.PROFILE_NAME }}, {% endfor %}каталог оконных профилей, каталог производителей оконных профилей, каталог профилей, оконные профили, oknardia, окнардия {{ META_KEYWORDS|default:"" }} {% endblock %} -{% block Date4Meta %}{{ PUB_DAT|date:"c" }}{% endblock %} +{% block Date4Meta %}{{ PUB_DAT|date:"Y-m-d" }}{% endblock %} -{% block Last4Meta %}{{ PUB_DAT|date:"c" }}{% endblock %} +{% block Last4Meta %}{{ PUB_DAT|date:"Y-m-d" }}{% endblock %} {% block Author4Meta %}: Каталог{% endblock %} @@ -22,7 +22,7 @@ {% if IMG_FOR_BLOG %} {% else %} {% endif %} - + diff --git a/oknardia/templates/catalog/catalog_of_profiles_model.html b/oknardia/templates/catalog/catalog_of_profiles_model.html index 7a5736d..11f5912 100755 --- a/oknardia/templates/catalog/catalog_of_profiles_model.html +++ b/oknardia/templates/catalog/catalog_of_profiles_model.html @@ -9,9 +9,9 @@ {% block Keywords %}оконный профиль {{ CATALOG_MODEL.sProfileName }}, характеристики профиля {{ CATALOG_MODEL.sProfileName }}, описание профиля {{ CATALOG_MODEL.sProfileName }}, производитель оконный профилей {{ CATALOG_MODEL.sProfileManufacturer }}, каталог оконных профилей, каталог производителей оконных профилей, каталог профилей, оконные профили, oknardia, окнардия {{ META_KEYWORDS|default:"" }} {% endblock %} -{% block Date4Meta %}{{ PUB_DAT|date:"c" }}{% endblock %} +{% block Date4Meta %}{{ PUB_DAT|date:"Y-m-d" }}{% endblock %} -{% block Last4Meta %}{{ PUB_DAT|date:"c" }}{% endblock %} +{% block Last4Meta %}{{ PUB_DAT|date:"Y-m-d" }}{% endblock %} {% block Author4Meta %}: Каталог{% endblock %} @@ -22,7 +22,7 @@ {% if IMG_FOR_BLOG %} {% else %} {% endif %} - + diff --git a/oknardia/templates/catalog/catalog_root.html b/oknardia/templates/catalog/catalog_root.html index 0ab13b5..04fdb2c 100755 --- a/oknardia/templates/catalog/catalog_root.html +++ b/oknardia/templates/catalog/catalog_root.html @@ -9,9 +9,9 @@ {% block Keywords %}Каталог, каталог оконных профилей, каталог стеклопакетов, каталог фурнитуры, каталог серий домов, каталог оконных проёмов, oknardia, окнардия {{ META_KEYWORDS|default:"" }} {% endblock %} -{% block Date4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}{% endblock %} +{% block Date4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"Y-m-d" }}{% else %}{% now "c" %}{% endif %}{% endblock %} -{% block Last4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}{% endblock %} +{% block Last4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"Y-m-d" }}{% else %}{% now "c" %}{% endif %}{% endblock %} {% block Author4Meta %}: Каталог «Окнардия»{% endblock %} @@ -21,7 +21,7 @@ {% if IMG_FOR_BLOG %} {% else %} {% endif %} - + diff --git a/oknardia/templates/catalog/catalog_seria.html b/oknardia/templates/catalog/catalog_seria.html index 91b84a5..3bcb469 100755 --- a/oknardia/templates/catalog/catalog_seria.html +++ b/oknardia/templates/catalog/catalog_seria.html @@ -9,9 +9,9 @@ {% block Keywords %}типовое строительство, панельные серии, серии домов, серии зданий, типовые дома, типовые здания, каталог серий типового строительства, oknardia, окнардия {{ META_KEYWORDS|default:"" }} {% endblock %} -{% block Date4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}{% endblock %} +{% block Date4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"Y-m-d" }}{% else %}{% now "c" %}{% endif %}{% endblock %} -{% block Last4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}{% endblock %} +{% block Last4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"Y-m-d" }}{% else %}{% now "c" %}{% endif %}{% endblock %} {% block Author4Meta %}Серии домов : {% endblock %} @@ -21,7 +21,7 @@ {% if IMG_FOR_BLOG %} {% else %} {% endif %} - + diff --git a/oknardia/templates/catalog/catalog_standard_opening.html b/oknardia/templates/catalog/catalog_standard_opening.html index 8d65fc5..b793c30 100755 --- a/oknardia/templates/catalog/catalog_standard_opening.html +++ b/oknardia/templates/catalog/catalog_standard_opening.html @@ -8,9 +8,9 @@ {% block Keywords %}типовые окна, размеры окон, оконные проемы, балконный блок, стандартные окна, размеры окон в панельном доме, серия дома, каталог окон, схемы открывания окон, П-44, II-49, 1-515, oknardia, окнардия{% endblock %} -{% block Date4Meta %}{{ PUB_DAT|date:"c" }}{% endblock %} +{% block Date4Meta %}{{ PUB_DAT|date:"Y-m-d" }}{% endblock %} -{% block Last4Meta %}{{ PUB_DAT|date:"c" }}{% endblock %} +{% block Last4Meta %}{{ PUB_DAT|date:"Y-m-d" }}{% endblock %} {% block Author4Meta %}: Каталог «Окнардия»{% endblock %} @@ -20,7 +20,7 @@ {% if IMG_FOR_BLOG %} {% else %} {% endif %} - + diff --git a/oknardia/templates/contact.html b/oknardia/templates/contact.html index 7cde0c0..358d2db 100755 --- a/oknardia/templates/contact.html +++ b/oknardia/templates/contact.html @@ -4,9 +4,9 @@ {% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %} -{% block Date4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}{% endblock %} +{% block Date4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"Y-m-d" }}{% else %}{% now "c" %}{% endif %}{% endblock %} -{% block Last4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}{% endblock %} +{% block Last4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"Y-m-d" }}{% else %}{% now "c" %}{% endif %}{% endblock %} {% block Description %}Контактная информация маркетплейс-агрегатора «Окнардии»: адрес, телефоны и email для связи, персоны.{% endblock %} diff --git a/oknardia/templates/price/price_list.html b/oknardia/templates/price/price_list.html index 2f76d80..1fe1889 100755 --- a/oknardia/templates/price/price_list.html +++ b/oknardia/templates/price/price_list.html @@ -6,9 +6,9 @@ {% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %} -{% block Date4Meta %}{{ META_DATA_PUBLISH|date:"c" }}{% endblock %} +{% block Date4Meta %}{{ META_DATA_PUBLISH|date:"Y-m-d" }}{% endblock %} -{% block Last4Meta %}{{ META_DATA_PUBLISH|date:"c" }}{% endblock %} +{% block Last4Meta %}{{ META_DATA_PUBLISH|date:"Y-m-d" }}{% endblock %} {% block Description %}Цены на окна для серии {{ APART|safe }} по адресу {{ ADDRESS }}. Размер окон (см.): {% for I_WIN_DIM in FLAP_DIM %}{{ I_WIN_DIM.iWinWidth|floatformat:0 }}x{{ I_WIN_DIM.iWinHight|floatformat:0 }}{% if forloop.last %}.{% else %}; {% endif %}{% endfor %} Оконные наборы: {% for CurOffer in PRICE_FRAME %}{{ CurOffer.SETS_NAME }} – {{ CurOffer.FIN_PRICE|stringformat:".0f" }} рублей{% if forloop.last %}.{% else %}; {% endif %}{% endfor %}{% endblock %} diff --git a/oknardia/templates/price/price_offers_for_one_window.html b/oknardia/templates/price/price_offers_for_one_window.html index 7465675..081815c 100755 --- a/oknardia/templates/price/price_offers_for_one_window.html +++ b/oknardia/templates/price/price_offers_for_one_window.html @@ -5,9 +5,9 @@ {% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %} -{% block Date4Meta %}{{ META_DATA_PUBLISH|date:"c" }}{% endblock %} +{% block Date4Meta %}{{ META_DATA_PUBLISH|date:"Y-m-d" }}{% endblock %} -{% block Last4Meta %}{{ META_DATA_PUBLISH|date:"c" }}{% endblock %} +{% block Last4Meta %}{{ META_DATA_PUBLISH|date:"Y-m-d" }}{% endblock %} {% block Top_JS4 %} diff --git a/oknardia/templates/rating/profiles_rating.html b/oknardia/templates/rating/profiles_rating.html index ac8e6f3..9f3a8c9 100755 --- a/oknardia/templates/rating/profiles_rating.html +++ b/oknardia/templates/rating/profiles_rating.html @@ -4,9 +4,9 @@ {% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %} -{# block Date4Meta %}{{ META_DATA_PUBLISH|date:"c" }}{% endblock #} +{# block Date4Meta %}{{ META_DATA_PUBLISH|date:"Y-m-d" }}{% endblock #} -{# block Last4Meta %}{{ META_DATA_PUBLISH|date:"c" }}{% endblock #} +{# block Last4Meta %}{{ META_DATA_PUBLISH|date:"Y-m-d" }}{% endblock #} {% block Description %}Тарифы и услуги маркетплейс-агрегатора Окнардия. Размещение предложений пластиковых и деревянных окон, обновление цен на окна, рекламные баннеры и виджеты на сайт оконной компании.{% endblock %} diff --git a/oknardia/templates/report/report_compare_set.html b/oknardia/templates/report/report_compare_set.html index 9c52d4f..728f11d 100755 --- a/oknardia/templates/report/report_compare_set.html +++ b/oknardia/templates/report/report_compare_set.html @@ -6,9 +6,9 @@ {% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %} -{% block Date4Meta %}{{ META_DATA_PUBLISH|date:"c" }}{% endblock %} +{% block Date4Meta %}{{ META_DATA_PUBLISH|date:"Y-m-d" }}{% endblock %} -{% block Last4Meta %}{{ META_DATA_PUBLISH|date:"c" }}{% endblock %} +{% block Last4Meta %}{{ META_DATA_PUBLISH|date:"Y-m-d" }}{% endblock %} {% block Description %}Сравнение характеристик окон от поставщиков: {% for MERCANT in LIST_MERCHANT %}{% if forloop.first %}{% else %}{% if forloop.last %} и {% else %}, {% endif %}{% endif %}{{ MERCANT }}{% endfor %}. Сравнение профилей пластиковых окон: {% for PROFILE in LIST_PROFILE %}{% if forloop.first %}{% else %}{% if forloop.last %} и {% else %}, {% endif %}{% endif %}{{ PROFILE }}{% endfor %}. Сравнение характеристик стеклопакетов: {% for GLAZING in LIST_GLAZING %}{% if forloop.first %}{% else %}{% if forloop.last %} и {% else %}, {% endif %}{% endif %}{{ GLAZING }}{% endfor %}.{% endblock %} diff --git a/oknardia/templates/seria_info/all_stat.html b/oknardia/templates/seria_info/all_stat.html index 82dfe4f..417cdb1 100755 --- a/oknardia/templates/seria_info/all_stat.html +++ b/oknardia/templates/seria_info/all_stat.html @@ -7,9 +7,9 @@ {% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %} -{# block Date4Meta %}{{ META_DATA_PUBLISH|date:"c" }}{% endblock #} +{# block Date4Meta %}{{ META_DATA_PUBLISH|date:"Y-m-d" }}{% endblock #} -{# block Last4Meta %}{{ META_DATA_PUBLISH|date:"c" }}{% endblock #} +{# block Last4Meta %}{{ META_DATA_PUBLISH|date:"Y-m-d" }}{% endblock #} {% block Description %}Статистика типового строительства СССР и России. Географи, график ввода в эксплуатацтяю, метраж. Здания проектов серии: {% for CountSeria in SERIA_NAV_DIM %}{{ CountSeria.SERIA_R }}{% if not forloop.last %}, {% endif %}{% endfor %}.{% endblock %} diff --git a/oknardia/templates/tariff.html b/oknardia/templates/tariff.html index 950156e..5969fa3 100755 --- a/oknardia/templates/tariff.html +++ b/oknardia/templates/tariff.html @@ -4,9 +4,9 @@ {% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %} -{% block Date4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}{% endblock %} +{% block Date4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"Y-m-d" }}{% else %}{% now "c" %}{% endif %}{% endblock %} -{% block Last4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}{% endblock %} +{% block Last4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"Y-m-d" }}{% else %}{% now "c" %}{% endif %}{% endblock %} {% block Description %}Тарифы и услуги маркетплейс-агрегатора Окнардия. Размещение предложений пластиковых и деревянных окон, обновление цен на окна, рекламные баннеры и виджеты на сайт оконной компании.{% endblock %} From 5e30d3f8a479497c3137aad0199779a50ec5c5ca Mon Sep 17 00:00:00 2001 From: erjemin Date: Sat, 25 Apr 2026 11:04:19 +0300 Subject: [PATCH 032/102] minor: - --- oknardia/oknardia/settings.py | 12 ------------ oknardia/oknardia/urls.py | 6 +++--- 2 files changed, 3 insertions(+), 15 deletions(-) diff --git a/oknardia/oknardia/settings.py b/oknardia/oknardia/settings.py index 77125f8..4c18e26 100644 --- a/oknardia/oknardia/settings.py +++ b/oknardia/oknardia/settings.py @@ -1,16 +1,4 @@ # -*- coding: utf-8 -*- -""" -Django settings for oknardia project. - -Generated by 'django-admin startproject' using Django 4.1.1. - -For more information on this file, see -https://docs.djangoproject.com/en/4.1/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/4.1/ref/settings/ -""" - from pathlib import Path import environ diff --git a/oknardia/oknardia/urls.py b/oknardia/oknardia/urls.py index 4701f93..7f12e2c 100644 --- a/oknardia/oknardia/urls.py +++ b/oknardia/oknardia/urls.py @@ -72,10 +72,10 @@ urlpatterns = [ re_path(r'^seria_[^/]*/all(?P\d+)/\S*$', catalog.report_all_info_seria_redirect), # для старых ссылок # --- --- КАТАЛОГ СТАНДАРТНЫХ ПРОЁМОВ И СХЕМ ОТКРЫВАНИЯ ДЛЧ ТИПОВЫХ СЕРИЙ СТРОИТЕЛЬСТВА re_path(r'^catalog/standard_opening[/*]$', catalog_openings.standard_opening), # СТРАНИЦА С ТАБЛИЦЕЙ ПРОЁМОМ - # --- --- Каталог производителей окон - re_path(r'^catalog/company[/*]$', catalog_companies.catalog_company), + # --- --- КАТАЛОГ ПРОИЗВОДИТЕЛЕЙ ОКОН + re_path(r'^catalog/company[/*]$', catalog_companies.catalog_company), # СПИСОК ВСЕХ ПРОИЗВОДИТЕЛЕЙ ОКОН re_path(r'^catalog/company/(?P\d+)-(?P\S*)[/*]$', - catalog_companies.catalog_company_detail), + catalog_companies.catalog_company_detail), # КАРТОЧКА ПРОИЗВОДИТЕЛЯ ОКОН # ЦЕНОВЫЕ ПРЕДЛОЖЕНИЯ # --- Одиночное окно re_path(r'^tsena-odnogo-okna/(?P\d+)x(?P\d+)mm/tip(?P\d+)[/*]$', From 4420bcd3d1c7416c413a5fa86de81cf5ba534717 Mon Sep 17 00:00:00 2001 From: erjemin Date: Sat, 25 Apr 2026 15:18:59 +0300 Subject: [PATCH 033/102] =?UTF-8?q?mod:=20=D0=A3=D0=BB=D1=83=D1=87=D1=88?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20SEO-=D0=B0=D1=82=D1=80=D0=B8=D0=B1=D1=83?= =?UTF-8?q?=D1=82=D1=8B,=20=D0=B8=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D1=80=D0=B0=D0=B7=D0=BC=D0=B5=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=20shema.org?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 14 +- oknardia/templates/base.html | 3 +- .../catalog/catalog_of_profiles.html | 57 +++++++- .../catalog_of_profiles_manufacture.html | 118 ++++++++++++---- .../catalog/catalog_of_profiles_model.html | 133 ++++++++++++++---- oknardia/templates/catalog/catalog_root.html | 107 +++++++++----- oknardia/templates/catalog/catalog_seria.html | 80 +++++++---- .../catalog/catalog_standard_opening.html | 84 +++++++---- .../seria_info/all_seria_info_pre_light.html | 106 +++++++++++++- oknardia/web/catalog_profiles.py | 6 +- oknardia/web/catalog_series.py | 20 ++- 11 files changed, 565 insertions(+), 163 deletions(-) diff --git a/README.md b/README.md index 9463d08..5cf7199 100644 --- a/README.md +++ b/README.md @@ -10,15 +10,15 @@ * Проект получает настройки и секреты через переменные окружения (`.env`) вместо `my_secret*.py`. * Рефакторинг создания `sitemap.xml`: raw ⟶ ORM, создание через Django-команду `generate_sitemaps` в медиа-файлы. * Рефакторинг URL `/catalog/profil/`: raw SQL ⟶ ORM, убран `last_update`, измененs SEO `description` и `keywords`. -* Распилен `oknardia/web/catalog.py` на тематические модули (`catalog_companies.py`, `catalog_profiles.py`, `catalog_series.py`, `catalog_openings.py`) с вынесением общей логики в `catalog_utils.py`; маршруты обновлены без изменения внешних URL. -* Рефакторинг `catalog_profile_model` (`/catalog/profile/...`): raw SQL ⟶ ORM, упрощена логика, вынесены helper-функции, сокращено дублирование расчёта цветов рейтинга, нормализована подготовка `LIST_OTHER`/`MERCHANTS`/`PROFILES`/`PROFILE_DETAIL`, сохранена совместимость шаблонов. -* Рефакторинг `catalog_profile_manufacture` (`/catalog/profile/-`): упрощена валидация URL, убран дублирующий код маппинга для `PROFILES` и `MERCHANTS` через общие хелперы, стандартизирован хвост контекста (`LAST_VISIT`, `LOG_VISIT`, `ticks`) через `_append_visit_context`. -* Рефакторинг `catalog_seria` (`/catalog/seria/`): raw SQL ⟶ ORM для списка корневых серий, подготовка данных упрощена, хвост контекста с визитами и `ticks` вынесен в общий helper внутри `catalog_series.py`. -* Рефакторинг `catalog_seria_info` и связанных функций в `catalog_series.py`: raw SQL ⟶ ORM (`catalog_seria_info`, `seria_nav`, `seria_info_year`, `seria_info_geo_code`), снижена нагрузка на БД за счёт предвыборки и переиспользования агрегатов (`quantities_by_pair`, `offers_by_window`), добавлены безопасные fallback-значения для пустых выборок, включена потоковая обработка `iterator(chunk_size=500)` для гео-данных, обновлены комментарии и docstring под фактическую логику (таблица окон, pre-render light/heavy шаблонов, гео+статистика серии). +* Распилен `oknardia/web/catalog.py` на тематические модули (`catalog_companies.py`, `catalog_profiles.py`, `catalog_series.py`, `catalog_openings.py`) с вынесением общей логики в `catalog_utils.py`; маршруты обновлены без изменения внешних URL. Улучшены SEO-атрибуты, и добавлена разметка shema.org. +* Рефакторинг `catalog_profile_model` (`/catalog/profile/...`): raw SQL ⟶ ORM, упрощена логика, вынесены helper-функции, сокращено дублирование расчёта цветов рейтинга, нормализована подготовка `LIST_OTHER`/`MERCHANTS`/`PROFILES`/`PROFILE_DETAIL`, сохранена совместимость шаблонов. Улучшены SEO-атрибуты, и добавлена разметка shema.org. +* Рефакторинг `catalog_profile_manufacture` (`/catalog/profile/-`): упрощена валидация URL, убран дублирующий код маппинга для `PROFILES` и `MERCHANTS` через общие хелперы, стандартизирован хвост контекста (`LAST_VISIT`, `LOG_VISIT`, `ticks`) через `_append_visit_context`. Улучшены SEO-атрибуты, и добавлена разметка shema.org. +* Рефакторинг `catalog_seria` (`/catalog/seria/`): raw SQL ⟶ ORM для списка корневых серий, подготовка данных упрощена, хвост контекста с визитами и `ticks` вынесен в общий helper внутри `catalog_series.py`. Улучшены SEO-атрибуты, и добавлена разметка shema.org. +* Рефакторинг `catalog_seria_info` и связанных функций в `catalog_series.py`: raw SQL ⟶ ORM (`catalog_seria_info`, `seria_nav`, `seria_info_year`, `seria_info_geo_code`), снижена нагрузка на БД за счёт предвыборки и переиспользования агрегатов (`quantities_by_pair`, `offers_by_window`), добавлены безопасные fallback-значения для пустых выборок, включена потоковая обработка `iterator(chunk_size=500)` для гео-данных, обновлены комментарии и docstring под фактическую логику (таблица окон, pre-render light/heavy шаблонов, гео+статистика серии). Улучшены SEO-атрибуты, и добавлена разметка shema.org. * Добавлена management-команда `regenerate_seria_prerender` для оффлайн-пересборки pre-render шаблонов `catalog_seria_info` (все или выбранные root-серии), с режимами `--dry-run` и `--force`; серверный reload (Gunicon? uWSGI или что там еще будет) должен быть вынесен из кода приложения в оркестрацию (cron/systemd/deploy step). -* Рефакторинг `standard_opening`: raw SQL -> ORM, упрощена дедублекация, убраны лишние запросы и переменные контекста, добавлены комментарии, SEO-описание и keywords, стандартизирован хвост контекста с визитами и `ticks` через общий helper внутри `catalog_openings.py`. +* Рефакторинг `standard_opening`: raw SQL -> ORM, упрощена дедублекация, убраны лишние запросы и переменные контекста, добавлены комментарии, SEO-описание и keywords, стандартизирован хвост контекста с визитами и `ticks` через общий helper внутри `catalog_openings.py`. Улучшены SEO-атрибуты и добавлена разметка shema.org. * Рефакторинг `catalog_company` и `catalog_company_detail` (`/catalog/company`): raw SQL → ORM для получения списка компаний и их наборов, вынесены вспомогательные функции (`_get_company_statistics`, `_get_company_sets_detail`, `_format_company_for_template`, `_format_set_for_template`, `_clean_text_field`, `_lowercase_first_char`), упрощена логика форматирования данных, добавлены подробные комментарии и docstring для каждой функции, использованы `select_related` и `annotate` для оптимизации запросов, добавлена защита от `Http404` при неправильных slugs. Улучшены SEO-атрибуты, и добавлена разметка shema.org. -* +* Рефакторирнг главной стртаницы каталога (`/catalog/`): Улучшены SEO-атрибуты, и добавлена разметка shema.org. * #### Планы, задачи, маркеры и идеи на будущее: diff --git a/oknardia/templates/base.html b/oknardia/templates/base.html index d328074..14ecd33 100755 --- a/oknardia/templates/base.html +++ b/oknardia/templates/base.html @@ -16,7 +16,6 @@ {% block Title %}{% endblock %} : ОКНАРДИЯ - @@ -26,7 +25,7 @@ {% block Top_CSS1 %}{% endblock %}{% block Top_CSS2 %}{% endblock %}{% block Top_CSS3 %}{% endblock %} {# #} {# #}{% block Top_JS1 %}{% endblock %}{% block Top_JS2 %}{% endblock %}{% block Top_JS3 %}{% endblock %}{% block Top_JS4 %}{% endblock %}{% block Top_JS5 %}{% endblock %}{% block Top_Meta1 %}{% endblock %} - {% block ADD_TO_HEAD %}{% endblock %} + {% block ADD_TO_HEAD %}{% endblock %} diff --git a/oknardia/templates/catalog/catalog_of_profiles.html b/oknardia/templates/catalog/catalog_of_profiles.html index 152d9af..e187032 100755 --- a/oknardia/templates/catalog/catalog_of_profiles.html +++ b/oknardia/templates/catalog/catalog_of_profiles.html @@ -13,6 +13,62 @@ {% block CopyrightAuthor4Meta %}: Каталог{% endblock %} +{% block Top_Meta1 %}{# #} + + + + + + + + + + + + + + + + +{# #}{% endblock %} + +{% block ADD_TO_HEAD %} + + {% endblock %} + {% block Main_Content %}
    {# #}
    @@ -57,4 +113,3 @@ {# ОТЛАДКА, ГАСИМ ВЕРХНЕЕ МЕНЮ #} {% endblock %} {% endcomment %} - diff --git a/oknardia/templates/catalog/catalog_of_profiles_manufacture.html b/oknardia/templates/catalog/catalog_of_profiles_manufacture.html index 9b7017c..a276ef8 100755 --- a/oknardia/templates/catalog/catalog_of_profiles_manufacture.html +++ b/oknardia/templates/catalog/catalog_of_profiles_manufacture.html @@ -9,48 +9,35 @@ {% block Keywords %}{{ CATALOG_MANUFACT }}, оконные профили {{ CATALOG_MANUFACT }}, производитель {{ CATALOG_MANUFACT }}, {% for i in PROFILES %}{{ i.PROFILE_NAME }}, {% endfor %}каталог оконных профилей, каталог производителей оконных профилей, каталог профилей, оконные профили, oknardia, окнардия {{ META_KEYWORDS|default:"" }} {% endblock %} -{% block Date4Meta %}{{ PUB_DAT|date:"Y-m-d" }}{% endblock %} - -{% block Last4Meta %}{{ PUB_DAT|date:"Y-m-d" }}{% endblock %} - {% block Author4Meta %}: Каталог{% endblock %} {% block CopyrightAuthor4Meta %}: Каталог{% endblock %} -{% block Top_Meta1 %} - - {% if IMG_FOR_BLOG %} - {% else %} - {% endif %} - - - - - - - - - +{% block Top_Meta1 %}{# #} + {# Удалить: itemprop microdata и rel=standout в head (устаревшее), используем JSON-LD ниже #} + {# Удалить: twitter:domain (устаревшее поле) #} + + - + - - - - - - - - + + + + + + + - - - {% endblock %} + + + +{# #}{% endblock %} {% block Top_JS4 %} @@ -79,6 +66,73 @@ } {% endblock %} +{% block ADD_TO_HEAD %} + + + {% endblock %} + {% block Main_Content %}
    {# #}
    @@ -105,7 +159,9 @@ {% endfor %} -

    Сравнить компонеты рейтинга профилей можно в разделе Ретинги.

    {% if not OFFERS_BY_MAUFACTURE == 0 %} +

    Сравнить компонеты рейтинга профилей можно в разделе Ретинги.
    + Методика расчёта: «Рейтинг Окнардии и как он устроен».

    {% if not OFFERS_BY_MAUFACTURE == 0 %}

    Доля предложений окон на основе профилей {{ CATALOG_MANUFACT }} в базе «Окнардия»

    Партнёры «Окнардия» использующие профили производства {{ CATALOG_MANUFACT }} в своих предложениях:
    diff --git a/oknardia/templates/catalog/catalog_of_profiles_model.html b/oknardia/templates/catalog/catalog_of_profiles_model.html index 11f5912..9cc3614 100755 --- a/oknardia/templates/catalog/catalog_of_profiles_model.html +++ b/oknardia/templates/catalog/catalog_of_profiles_model.html @@ -5,31 +5,17 @@ {% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %} -{% block Description %}Характеристики оконного профиля {{ CATALOG_MODEL.sProfileName }} производства {{ CATALOG_MODEL.sProfileManufacturer }}{% endblock %} +{% block Description %}Оконный профиль {{ CATALOG_MODEL.sProfileName }} от {{ CATALOG_MODEL.sProfileManufacturer }}: характеристики, рейтинг, комплектация и применение в оконных предложениях партнёров Окнардии.{% endblock %} {% block Keywords %}оконный профиль {{ CATALOG_MODEL.sProfileName }}, характеристики профиля {{ CATALOG_MODEL.sProfileName }}, описание профиля {{ CATALOG_MODEL.sProfileName }}, производитель оконный профилей {{ CATALOG_MODEL.sProfileManufacturer }}, каталог оконных профилей, каталог производителей оконных профилей, каталог профилей, оконные профили, oknardia, окнардия {{ META_KEYWORDS|default:"" }} {% endblock %} -{% block Date4Meta %}{{ PUB_DAT|date:"Y-m-d" }}{% endblock %} - -{% block Last4Meta %}{{ PUB_DAT|date:"Y-m-d" }}{% endblock %} - {% block Author4Meta %}: Каталог{% endblock %} {% block CopyrightAuthor4Meta %}: Каталог{% endblock %} -{% block Top_Meta1 %} - - {% if IMG_FOR_BLOG %} - {% else %} - {% endif %} - - - - - - - - +{% block Top_Meta1 %}{# #} + + @@ -37,20 +23,100 @@ - - - - - - + + + + + + - - - + + + - - - {% endblock %} + + + +{# #}{% endblock %} + +{% block ADD_TO_HEAD %} + {# JSON-LD для карточки оконного профиля и хлебных крошек #} + +{% endblock %} {% block Main_Content %}
    @@ -125,7 +191,12 @@ {% if CATALOG_MODEL.sProfileColor == "" %}—{% else %}{{ CATALOG_MODEL.sProfileColor|capfirst }}{% endif %} - {% if LIST_OTHER|length > 1 %} + {% if CATALOG_MODEL.fProfileRating > -0.1 %} +

    Рейтинг модели рассчитан алгоритмом «Окнардии» по статистическому ранжированию + характеристик (метод Манна-Уитни){% if PROFILE_RATING_SAMPLE_SIZE > 0 %} на выборке из + {{ PROFILE_RATING_SAMPLE_SIZE }} моделей профилей{% endif %}. Методика расчёта: + «Рейтинг Окнардии и как он устроен».

    {% endif %}{% if LIST_OTHER|length > 1 %}

    Прочие характеристики профиля:

      {% for LI_BULL in LIST_OTHER %}
    • {{ LI_BULL|safe }}
    • {% endfor %} diff --git a/oknardia/templates/catalog/catalog_root.html b/oknardia/templates/catalog/catalog_root.html index 04fdb2c..26984b0 100755 --- a/oknardia/templates/catalog/catalog_root.html +++ b/oknardia/templates/catalog/catalog_root.html @@ -5,30 +5,18 @@ {% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %} -{% block Description %}Каталог «Окнардия»{% endblock %} +{% block Description %}Каталог «Окнардия»: оконные и дверные профили, стеклопакеты, фурнитура, типовые серии домов, стандартные проёмы и партнёры-поставщики окон.{% endblock %} {% block Keywords %}Каталог, каталог оконных профилей, каталог стеклопакетов, каталог фурнитуры, каталог серий домов, каталог оконных проёмов, oknardia, окнардия {{ META_KEYWORDS|default:"" }} {% endblock %} -{% block Date4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"Y-m-d" }}{% else %}{% now "c" %}{% endif %}{% endblock %} - -{% block Last4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"Y-m-d" }}{% else %}{% now "c" %}{% endif %}{% endblock %} - {% block Author4Meta %}: Каталог «Окнардия»{% endblock %} {% block CopyrightAuthor4Meta %}: Каталог «Окнардия»{% endblock %} -{% block Top_Meta1 %}{# #} - {% if IMG_FOR_BLOG %} - {% else %} - {% endif %} - - - - - - - - +{% block Top_Meta1 %}{# #} + {# Удалить: itemprop microdata, rel=standout, twitter:domain — устаревшие теги #} + + @@ -36,21 +24,76 @@ - - + + - - - + + + - - - + + + - - - -{# #}{% endblock %} + + + +{# #}{% endblock %} + +{% block ADD_TO_HEAD %} + {# JSON-LD: корневая страница каталога — CollectionPage + BreadcrumbList + структура разделов #} + + +{% endblock %} {% block Main_Content %}
      @@ -66,7 +109,7 @@
      {# ПЕРВЫЙ РАЗДЕЛ С РЕКЛАМОЙ СБОКУ #}
      {# И ЕЩЁ ОДИН РАЗДЕЛ #}

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

      -

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

      +

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

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

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

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

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

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

      -

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

      +

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

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

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

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

      @@ -98,5 +141,3 @@ {% include "report/report_log_user_visit.html" %}
      {% endblock %} - - diff --git a/oknardia/templates/catalog/catalog_seria.html b/oknardia/templates/catalog/catalog_seria.html index 3bcb469..5edb583 100755 --- a/oknardia/templates/catalog/catalog_seria.html +++ b/oknardia/templates/catalog/catalog_seria.html @@ -5,30 +5,17 @@ {% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %} -{% block Description %}Каталог серий зданий и типовое панельное строительство оконного агрегатора Окнардия{% endblock %} +{% block Description %}Каталог типовых серий домов России: панельные и блочные серии, ссылки на подробные страницы серий, их планировки и стандартные оконные проёмы.{% endblock %} -{% block Keywords %}типовое строительство, панельные серии, серии домов, серии зданий, типовые дома, типовые здания, каталог серий типового строительства, oknardia, окнардия {{ META_KEYWORDS|default:"" }} {% endblock %} - -{% block Date4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"Y-m-d" }}{% else %}{% now "c" %}{% endif %}{% endblock %} - -{% block Last4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"Y-m-d" }}{% else %}{% now "c" %}{% endif %}{% endblock %} +{% block Keywords %}типовое строительство, панельные серии, серии домов, серии зданий, типовые дома, типовые здания, каталог серий типового строительства, oknardia, окнардия{% endblock %} {% block Author4Meta %}Серии домов : {% endblock %} {% block CopyrightAuthor4Meta %}Cерии домов : {% endblock %} {% block Top_Meta1 %}{# #} - {% if IMG_FOR_BLOG %} - {% else %} - {% endif %} - - - - - - - - + {# Legacy microdata (itemprop/itemscope) удалена: используем JSON-LD в ADD_TO_HEAD #} + @@ -36,23 +23,64 @@ - + - - - - + + + + - + - - - + + + {# #}{% endblock %} +{% block ADD_TO_HEAD %}{% comment %} +JSON-LD для страницы списка типовых серий домов. +CollectionPage + ItemList помогают поисковику трактовать страницу как каталог сущностей. +{% endcomment %} + +{% endblock %} + + {% block Main_Content %}
      {# #}
      diff --git a/oknardia/templates/catalog/catalog_standard_opening.html b/oknardia/templates/catalog/catalog_standard_opening.html index b793c30..d93652d 100755 --- a/oknardia/templates/catalog/catalog_standard_opening.html +++ b/oknardia/templates/catalog/catalog_standard_opening.html @@ -8,26 +8,16 @@ {% block Keywords %}типовые окна, размеры окон, оконные проемы, балконный блок, стандартные окна, размеры окон в панельном доме, серия дома, каталог окон, схемы открывания окон, П-44, II-49, 1-515, oknardia, окнардия{% endblock %} -{% block Date4Meta %}{{ PUB_DAT|date:"Y-m-d" }}{% endblock %} - -{% block Last4Meta %}{{ PUB_DAT|date:"Y-m-d" }}{% endblock %} +{# Date4Meta/Last4Meta не переопределяем: используем дефолт из base.html #} {% block Author4Meta %}: Каталог «Окнардия»{% endblock %} {% block CopyrightAuthor4Meta %}: Каталог «Окнардия»{% endblock %} {% block Top_Meta1 %}{# #} - {% if IMG_FOR_BLOG %} - {% else %} - {% endif %} - - - - - + {# Legacy microdata (itemprop/itemscope) удалена: используем JSON-LD в ADD_TO_HEAD #} - - + @@ -35,21 +25,67 @@ - + - - - - + + + + - - + + - - - -{# #}{% endblock %} + + +{# #}{% endblock %} + +{% block ADD_TO_HEAD %}{% comment %} +JSON-LD для страницы-списка типовых оконных проемов. +CollectionPage + ItemList помогают поисковику понять структуру каталога. +{% endcomment %} + +{% endblock %} {% block Main_Content %}
      diff --git a/oknardia/templates/seria_info/all_seria_info_pre_light.html b/oknardia/templates/seria_info/all_seria_info_pre_light.html index 98c0b58..6e43988 100755 --- a/oknardia/templates/seria_info/all_seria_info_pre_light.html +++ b/oknardia/templates/seria_info/all_seria_info_pre_light.html @@ -7,9 +7,107 @@ {% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %} -{% block Description %}Дома серии {{ THIS_SERIA_NAME }}: детальная информация{% endblock %} +{% block Description %}Серия {{ THIS_SERIA_NAME }}: типовые размеры оконных проёмов, схемы открывания, планировки квартир, карта зданий, статистика и цены на замену окон в домах этой серии.{% endblock %} -{% block Keywords %} {{ THIS_SERIA_NAME }}, серия {{ THIS_SERIA_NAME }}, проект {{ THIS_SERIA_NAME }}, года постройки зданий серии {{ THIS_SERIA_NAME }}, размеры окон в домах серии {{ THIS_SERIA_NAME }}, оконные проемы зданий серии {{ THIS_SERIA_NAME }}, дома серии {{ THIS_SERIA_NAME }} на карте, установка окон, цены на пластиковые окна{% endblock %} +{% block Keywords %}{{ THIS_SERIA_NAME }}, серия {{ THIS_SERIA_NAME }}, проект {{ THIS_SERIA_NAME }}, года постройки зданий серии {{ THIS_SERIA_NAME }}, размеры окон в домах серии {{ THIS_SERIA_NAME }}, оконные проемы зданий серии {{ THIS_SERIA_NAME }}, дома серии {{ THIS_SERIA_NAME }} на карте, установка окон, цены на пластиковые окна{% endblock %} + +{% block Top_Meta1 %} + {# Canonical — предотвращает дубли при возможных GET-параметрах #} + + + + + + + + + + + {% if THIS_SERIA_IMAGE_URL and THIS_SERIA_IMAGE_URL != "null.gif" %} + + {% else %} + + {% endif %} + + + + + {% if THIS_SERIA_IMAGE_URL and THIS_SERIA_IMAGE_URL != "null.gif" %} + {% else %} + {% endif %} + +{% endblock %} + +{% block ADD_TO_HEAD %}{% comment %} +JSON-LD для страницы серии типового строительства. +BreadcrumbList: Google показывает хлебные крошки в сниппете вместо сырого URL — это важно, + т.к. URL вида /catalog/seria/p-44/all7 выглядит некрасиво без расшифровки. +TechArticle: описывает страницу как технический справочный материал по серии домов. +{% endcomment %} + {# JSON-LD: BreadcrumbList #} + {# JSON-LD: TechArticle — технический справочный материал о серии типового строительства #} +{% endblock %} {% block Top_JS1 %} {% endblock %} diff --git a/oknardia/templates/catalog/catalog_company.html b/oknardia/templates/catalog/catalog_company.html index 6f9f10a..b3adf62 100755 --- a/oknardia/templates/catalog/catalog_company.html +++ b/oknardia/templates/catalog/catalog_company.html @@ -14,24 +14,24 @@ {% block CopyrightAuthor4Meta %}: Каталог «Окнардия»{% endblock %} {% block Top_Meta1 %}{# #} - + - + - - + + {# Удалить: — устаревший тег #} - - + + {# #}{% endblock %} @@ -45,12 +45,12 @@ JSON-LD для страницы-списка компаний: CollectionPage + "@type": "CollectionPage", "name": "Каталог оконных компаний: производители и поставщики окон", "description": "Актуальный каталог оконных компаний России с рейтингами, средней ценой и составом наборов.", - "url": "https://oknardia.ru/catalog/company/", + "url": "{{ request.scheme }}://{{ request.get_host }}/catalog/company/", "inLanguage": "ru-RU", "isPartOf": { "@type": "WebSite", "name": "Окнардия", - "url": "https://oknardia.ru" + "url": "{{ request.scheme }}://{{ request.get_host }}" }, "mainEntity": { "@type": "ItemList", @@ -64,8 +64,8 @@ JSON-LD для страницы-списка компаний: CollectionPage + "item": { "@type": "Organization", "name": "{{ i.sMerchantName|escapejs }}", - "url": "https://oknardia.ru/catalog/company/{{ i.id }}-{{ i.sMerchantMainURL }}", - "logo": "https://oknardia.ru/media/{{ i.pMerchantLogo }}" + "url": "{{ request.scheme }}://{{ request.get_host }}/catalog/company/{{ i.id }}-{{ i.sMerchantMainURL }}", + "logo": "{{ request.scheme }}://{{ request.get_host }}/media/{{ i.pMerchantLogo }}" } }{% if not forloop.last %},{% endif %} {% endfor %} diff --git a/oknardia/templates/catalog/catalog_company_detail.html b/oknardia/templates/catalog/catalog_company_detail.html index f7d4308..ca30475 100755 --- a/oknardia/templates/catalog/catalog_company_detail.html +++ b/oknardia/templates/catalog/catalog_company_detail.html @@ -17,7 +17,7 @@ {% block Top_Meta1 %}{# #} {# Microdata (itemprop) убрана — заменена на JSON-LD в блоке ADD_TO_HEAD ниже (чище, надёжнее) #} - + {# Удалить: — тег Google News 2011 г., отменён в 2014, поисковики игнорируют #} @@ -26,20 +26,20 @@ - + - - + + {# Удалить: — устарело с 2015, Twitter его не использует #} - - + + {# #}{% endblock %} {% block Top_JS5 %} @@ -58,11 +58,11 @@ "@type": "LocalBusiness", "name": "{{ COMPANY|escapejs }}", "description": "Производитель окон «{{ COMPANY|escapejs }}»: оконные наборы, характеристики профилей и стеклопакетов, цены на установку в типовых домах.", - "url": "https://oknardia.ru/catalog/company/{{ COMPANY_ID }}-{{ COMPANY_T }}", - "image": "{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{{ IMG_FOR_BLOG }}{% else %}https://oknardia.ru/static/img/MerDY3gpU0w.jpg{% endif %}", + "url": "{{ request.scheme }}://{{ request.get_host }}/catalog/company/{{ COMPANY_ID }}-{{ COMPANY_T }}", + "image": "{% if IMG_FOR_BLOG %}{{ request.scheme }}://{{ request.get_host }}/media/{{ IMG_FOR_BLOG }}{% else %}{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg{% endif %}", "logo": { "@type": "ImageObject", - "url": "{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{{ IMG_FOR_BLOG }}{% else %}https://oknardia.ru/static/img/MerDY3gpU0w.jpg{% endif %}" + "url": "{% if IMG_FOR_BLOG %}{{ request.scheme }}://{{ request.get_host }}/media/{{ IMG_FOR_BLOG }}{% else %}{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg{% endif %}" }{% if SETS %}, "telephone": "{{ SETS.0.sOfficePhones|striptags|escapejs }}", "address": { diff --git a/oknardia/templates/catalog/catalog_seria.html b/oknardia/templates/catalog/catalog_seria.html index 5edb583..5abbf5d 100755 --- a/oknardia/templates/catalog/catalog_seria.html +++ b/oknardia/templates/catalog/catalog_seria.html @@ -15,7 +15,7 @@ {% block Top_Meta1 %}{# #} {# Legacy microdata (itemprop/itemscope) удалена: используем JSON-LD в ADD_TO_HEAD #} - + @@ -23,20 +23,20 @@ - + - - + + - - - + + + {# #}{% endblock %} @@ -50,12 +50,12 @@ CollectionPage + ItemList помогают поисковику трактова "@type": "CollectionPage", "name": "Каталог серий типового строительства", "description": "Список типовых серий домов России с переходом на подробные страницы серий.", - "url": "https://oknardia.ru/catalog/seria/", + "url": "{{ request.scheme }}://{{ request.get_host }}/catalog/seria/", "inLanguage": "ru-RU", "isPartOf": { "@type": "WebSite", "name": "Окнардия", - "url": "https://oknardia.ru" + "url": "{{ request.scheme }}://{{ request.get_host }}" }, "mainEntity": { "@type": "ItemList", @@ -69,8 +69,8 @@ CollectionPage + ItemList помогают поисковику трактова "item": { "@type": "Thing", "name": "Серия {{ i.NAME|escapejs }}", - "url": "https://oknardia.ru/catalog/seria/{{ i.NAME_T }}/all{{ i.ID }}", - "image": "https://oknardia.ru/media/{{ i.URL }}" + "url": "{{ request.scheme }}://{{ request.get_host }}/catalog/seria/{{ i.NAME_T }}/all{{ i.ID }}", + "image": "{{ request.scheme }}://{{ request.get_host }}/media/{{ i.URL }}" } }{% if not forloop.last %},{% endif %} {% endfor %} diff --git a/oknardia/templates/catalog/catalog_standard_opening.html b/oknardia/templates/catalog/catalog_standard_opening.html index d93652d..b9f2cf3 100755 --- a/oknardia/templates/catalog/catalog_standard_opening.html +++ b/oknardia/templates/catalog/catalog_standard_opening.html @@ -17,7 +17,7 @@ {% block Top_Meta1 %}{# #} {# Legacy microdata (itemprop/itemscope) удалена: используем JSON-LD в ADD_TO_HEAD #} - + @@ -25,19 +25,19 @@ - + - - + + - - + + {# #}{% endblock %} {% block ADD_TO_HEAD %}{% comment %} @@ -50,12 +50,12 @@ CollectionPage + ItemList помогают поисковику понять с "@type": "CollectionPage", "name": "Стандартные оконные проёмы и балконные блоки", "description": "Каталог стандартных оконных проёмов и балконных блоков с размерами, схемами открывания и привязкой к типовым сериям домов.", - "url": "https://oknardia.ru/catalog/standard_opening", + "url": "{{ request.scheme }}://{{ request.get_host }}/catalog/standard_opening", "inLanguage": "ru-RU", "isPartOf": { "@type": "WebSite", "name": "Окнардия", - "url": "https://oknardia.ru" + "url": "{{ request.scheme }}://{{ request.get_host }}" }, "mainEntity": { "@type": "ItemList", @@ -70,8 +70,8 @@ CollectionPage + ItemList помогают поисковику понять с "@type": "Thing", "name": "{{ i.DESCRIPTION|escapejs }}", "description": "{{ i.DESCRIPTION_L|escapejs }}", - "url": "https://oknardia.ru/tsena-odnogo-okna/{{ i.W|stringformat:'.0f' }}x{{ i.H|stringformat:'.0f' }}mm/tip{{ i.ID }}", - "image": "https://oknardia.ru{% static i.URL2IMG %}", + "url": "{{ request.scheme }}://{{ request.get_host }}/tsena-odnogo-okna/{{ i.W|stringformat:'.0f' }}x{{ i.H|stringformat:'.0f' }}mm/tip{{ i.ID }}", + "image": "{{ request.scheme }}://{{ request.get_host }}{% static i.URL2IMG %}", "additionalProperty": [ {"@type": "PropertyValue", "name": "Ширина", "value": "{{ i.W|stringformat:'.0f' }} мм"}, {"@type": "PropertyValue", "name": "Высота", "value": "{{ i.H|stringformat:'.0f' }} мм"}, diff --git a/oknardia/templates/contact.html b/oknardia/templates/contact.html index 358d2db..63817d4 100755 --- a/oknardia/templates/contact.html +++ b/oknardia/templates/contact.html @@ -39,7 +39,7 @@ img {background-color: whitesmoke;}
      - Сергей Еремин — CEO/CTO «Окнардия», организационные вопросы, технические решения, партнерство + Сергей Еремин — CEO/CTO «Окнардия», организационные вопросы, технические решения, партнерство

      Сергей Еремин

      CEO/CTO

      организационные вопросы, технические решения, партнерство
      @@ -61,7 +61,7 @@ img {background-color: whitesmoke;}
      - Тимофей Молдованин — CFO/COO «Окнардия», финансовые и коммерческие вопросы + Тимофей Молдованин — CFO/COO «Окнардия», финансовые и коммерческие вопросы

      Тимофей Молдованин

      CFO/COO

      финансовые и коммерческие вопросы
      diff --git a/oknardia/templates/price/price_list_frame.html b/oknardia/templates/price/price_list_frame.html index 404d3d0..f46d4b4 100755 --- a/oknardia/templates/price/price_list_frame.html +++ b/oknardia/templates/price/price_list_frame.html @@ -42,7 +42,7 @@ - + {% endif %} diff --git a/oknardia/templates/price/price_offers_for_one_window_frame.html b/oknardia/templates/price/price_offers_for_one_window_frame.html index 4d236d5..b9b5c37 100755 --- a/oknardia/templates/price/price_offers_for_one_window_frame.html +++ b/oknardia/templates/price/price_offers_for_one_window_frame.html @@ -39,7 +39,7 @@ - + {% endif %} diff --git a/oknardia/templates/seria_info/all_seria_info_pre_light.html b/oknardia/templates/seria_info/all_seria_info_pre_light.html index 6e43988..1e2896d 100755 --- a/oknardia/templates/seria_info/all_seria_info_pre_light.html +++ b/oknardia/templates/seria_info/all_seria_info_pre_light.html @@ -12,7 +12,7 @@ {% block Keywords %}{{ THIS_SERIA_NAME }}, серия {{ THIS_SERIA_NAME }}, проект {{ THIS_SERIA_NAME }}, года постройки зданий серии {{ THIS_SERIA_NAME }}, размеры окон в домах серии {{ THIS_SERIA_NAME }}, оконные проемы зданий серии {{ THIS_SERIA_NAME }}, дома серии {{ THIS_SERIA_NAME }} на карте, установка окон, цены на пластиковые окна{% endblock %} {% block Top_Meta1 %} - {# Canonical — предотвращает дубли при возможных GET-параметрах #} + {# Canonical — предотвращает дубли при возможных GET-параметрах #} @@ -21,21 +21,21 @@ - + {% if THIS_SERIA_IMAGE_URL and THIS_SERIA_IMAGE_URL != "null.gif" %} - - {% else %} - - {% endif %} + + {% else %} + + {% endif %} {% if THIS_SERIA_IMAGE_URL and THIS_SERIA_IMAGE_URL != "null.gif" %} - {% else %} - {% endif %} - + {% else %} + {% endif %} + {% endblock %} {% block ADD_TO_HEAD %}{% comment %} @@ -53,25 +53,25 @@ TechArticle: описывает страницу как технический "@type": "ListItem", "position": 1, "name": "Главная", - "item": "https://oknardia.ru/" + "item": "{{ request.scheme }}://{{ request.get_host }}/" }, { "@type": "ListItem", "position": 2, "name": "Каталог", - "item": "https://oknardia.ru/catalog/" + "item": "{{ request.scheme }}://{{ request.get_host }}/catalog/" }, { "@type": "ListItem", "position": 3, "name": "Типовые серии домов", - "item": "https://oknardia.ru/catalog/seria/" + "item": "{{ request.scheme }}://{{ request.get_host }}/catalog/seria/" }, { "@type": "ListItem", "position": 4, "name": "Серия {{ THIS_SERIA_NAME|escapejs }}", - "item": "https://oknardia.ru/catalog/seria/{{ THIS_SERIA_NAME_T }}/all{{ THIS_SERIA_ID }}/" + "item": "{{ request.scheme }}://{{ request.get_host }}/catalog/seria/{{ THIS_SERIA_NAME_T }}/all{{ THIS_SERIA_ID }}/" } ] } @@ -83,9 +83,9 @@ TechArticle: описывает страницу как технический "inLanguage": "ru-RU", "headline": "Серия {{ THIS_SERIA_NAME|escapejs }}: типовые размеры оконных проёмов, схемы открывания и карта зданий", "description": "Технические характеристики оконных проёмов в домах типовой серии {{ THIS_SERIA_NAME|escapejs }}: размеры, схемы открывания, планировки квартир, карта зданий на территории России. Статистика ввода зданий в эксплуатацию по годам.", - "url": "https://oknardia.ru/catalog/seria/{{ THIS_SERIA_NAME_T }}/all{{ THIS_SERIA_ID }}/", {% if THIS_SERIA_IMAGE_URL and THIS_SERIA_IMAGE_URL != "null.gif" %} - "image": "https://oknardia.ru/media/{{ THIS_SERIA_IMAGE_URL }}",{% else %} - "image": "https://oknardia.ru/static/img/MerDY3gpU0w.jpg",{% endif %} + "url": "{{ request.scheme }}://{{ request.get_host }}/catalog/seria/{{ THIS_SERIA_NAME_T }}/all{{ THIS_SERIA_ID }}/", {% if THIS_SERIA_IMAGE_URL and THIS_SERIA_IMAGE_URL != "null.gif" %} + "image": "{{ request.scheme }}://{{ request.get_host }}/media/{{ THIS_SERIA_IMAGE_URL }}",{% else %} + "image": "{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg",{% endif %} "about": { "@type": "Thing", "name": "Серия типового строительства {{ THIS_SERIA_NAME|escapejs }}", @@ -94,16 +94,16 @@ TechArticle: описывает страницу как технический "publisher": { "@type": "Organization", "name": "Окнардия", - "url": "https://oknardia.ru", + "url": "{{ request.scheme }}://{{ request.get_host }}", "logo": { "@type": "ImageObject", - "url": "https://oknardia.ru/static/img/MerDY3gpU0w.jpg" + "url": "{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" } }, "isPartOf": { "@type": "WebSite", "name": "Окнардия — агрегатор цен на замену окон", - "url": "https://oknardia.ru" + "url": "{{ request.scheme }}://{{ request.get_host }}" } } diff --git a/oknardia/templates/service/tmp.html b/oknardia/templates/service/tmp.html index dc41435..a98584d 100755 --- a/oknardia/templates/service/tmp.html +++ b/oknardia/templates/service/tmp.html @@ -57,7 +57,7 @@ $(window).load(function(){var images = $('.half');images.each(function(i){$(this
    • Размещено 22 оконных набора в предложениях. Размещаются как пластиковые, так и деревянные окна.
    • С «Окнардией» работают уже семь оконных-компании партнёра.
    • — Добавлен функционал сравнения характеристик оконных предложений и отдельных компонентов этих предложений.
    • -
    • Создан каталог профилей, стандартных проёмов, типовых серий домов, оконных компаний. В будущем будет каталог стеклопакетов и фурнитуры… планов много.
    • +
    • Создан каталог профилей, стандартных проёмов, типовых серий домов, оконных компаний. В будущем будет каталог стеклопакетов и фурнитуры… планов много.
    • Построен алгоритм расчёта реальных рейтингов предложений, профилей, стеклопакетов и сервиса компаний. Рейтинги не на базе «общественного голосования», «опросов» или измерением «интернет-популярности», а на базе физических характеристик и измеримых параметров. Таким образом — это объектовые рейтинги.
    • Разработан виджет, который позволяет оконной компании реализовать функционал «Окнардии» на собственном сайте.
    • Расширены медиа-возможности проекта: баннеры, посты в блоге, специальное выделение.
    • From 45ad5481aa239ac2e05c269d0dc1b1bf234c12ba Mon Sep 17 00:00:00 2001 From: erjemin Date: Sun, 26 Apr 2026 14:53:49 +0300 Subject: [PATCH 035/102] =?UTF-8?q?mod:=20=D0=A0=D0=B5=D1=84=D0=B0=D0=BA?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20=D1=81=D1=82=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=86=D1=8B=20=D1=86=D0=B5=D0=BD=20=D0=BE=D0=B4?= =?UTF-8?q?=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BE=D0=BA=D0=BD=D0=B0=20(=D0=B2?= =?UTF-8?q?=D1=8C=D1=8E=D1=88=D0=BA=D0=B8,=20=D1=88=D0=B0=D0=B1=D0=BB?= =?UTF-8?q?=D0=BE=D0=BD=D1=8B,=20=D1=82=D0=B5=D1=81=D1=82=D1=8B,=20=D0=BD?= =?UTF-8?q?=D0=BE=D0=B2=D1=8B=D0=B9=20canonical-=D1=80=D0=BE=D1=83=D1=82?= =?UTF-8?q?=D0=B8=D0=BD=D0=B3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oknardia/oknardia/settings.py | 4 + oknardia/oknardia/urls.py | 15 +- .../catalog/catalog_standard_opening.html | 4 +- .../price/price_offers_for_one_window.html | 151 +++++- .../price_offers_for_one_window_frame.html | 18 +- .../report/show_big_flap_pictures.html | 2 +- .../seria_info/all_seria_info_pre_light.html | 2 +- .../management/commands/generate_sitemaps.py | 4 +- oknardia/web/prices.py | 491 +++++++++++++----- oknardia/web/test_prices.py | 250 +++++++++ 10 files changed, 777 insertions(+), 164 deletions(-) create mode 100644 oknardia/web/test_prices.py diff --git a/oknardia/oknardia/settings.py b/oknardia/oknardia/settings.py index 4c18e26..20196bc 100644 --- a/oknardia/oknardia/settings.py +++ b/oknardia/oknardia/settings.py @@ -205,8 +205,12 @@ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' CAPTCHA_PUBLIC_KEY = env('CAPTCHA_PUBLIC_KEY', default='') CAPTCHA_PRIVATE_KEY = env('CAPTCHA_PRIVATE_KEY', default='') +# МАГИЧЕСКИЕ ЧИСЛА # если непонятно какая серия выбрана через каталог (finger fix) выбираем серию типового строения: DEFAULT_SERIA_ID_FOR_CATALOG = 843 # СЕРИЯ 1-515/9 -- дом в котором я живу +DEFAULT_WIN_WIDTH_MM = 670 # Ширина типового окна для ID=16 (если не выбрано) +DEFAULT_WIN_HEIGHT_MM = 2160 # Высота типового окна для ID=16 (если не выбрано) +DEFAULT_WIN_ID = 16 # ID типового окна (если не выбрано) # количество коммерческих предложений во фрейме отчета OFFER_PER_FRAME = 5 diff --git a/oknardia/oknardia/urls.py b/oknardia/oknardia/urls.py index 7f12e2c..589d81e 100644 --- a/oknardia/oknardia/urls.py +++ b/oknardia/oknardia/urls.py @@ -62,9 +62,9 @@ urlpatterns = [ re_path(r'^catalog/profile[/*]$', catalog_profiles.catalog_profile), # СПИСОК ВСЕХ ПРОФИЛЕЙ И ПРОИЗВОДИТЕЛЕЙ re_path(r'^catalog/profile/(?P\d+)-(?P\S*)' r'/(?P\d+)-(?P\S*)[/*]$', - catalog_profiles.catalog_profile_model), # КАРТОЧКА ПРОФИЛЯ (ИЛИ ПРОИЗВОДИТЕЛЯ) + catalog_profiles.catalog_profile_model), # СТРАНИЦА ОПИСАНИЯ МОДЕЛИ ПРОФИЛЯ re_path(r'^catalog/profile/(?P\d+)-(?P\S*)[/*]$', - catalog_profiles.catalog_profile_manufacture), + catalog_profiles.catalog_profile_manufacture), # КАРТОЧКА ОПИСАНИЯ ПРОИЗВОДИТЕЛЯ ПРОФИЛЯ # --- --- КАТАЛОГ СЕРИЙ ТИПОВОГО СТРОИТЕЛЬСТВА re_path(r'^catalog/seria[/*]$', catalog_series.catalog_seria), # СПИСОК ВСЕХ СЕРИЙ ЗДАНИЙ re_path(r'^catalog/seria/(?P[^/]*)/all(?P\d+)[/*]$', @@ -75,12 +75,15 @@ urlpatterns = [ # --- --- КАТАЛОГ ПРОИЗВОДИТЕЛЕЙ ОКОН re_path(r'^catalog/company[/*]$', catalog_companies.catalog_company), # СПИСОК ВСЕХ ПРОИЗВОДИТЕЛЕЙ ОКОН re_path(r'^catalog/company/(?P\d+)-(?P\S*)[/*]$', - catalog_companies.catalog_company_detail), # КАРТОЧКА ПРОИЗВОДИТЕЛЯ ОКОН + catalog_companies.catalog_company_detail), # КАРТОЧКА ПРОИЗВОДИТЕЛЯ-УСТНОАЩИКА ОКОН # ЦЕНОВЫЕ ПРЕДЛОЖЕНИЯ - # --- Одиночное окно + # --- ОДИНОЧНОЕ ОКНО + re_path(r'^catalog/standard_opening/price-(?P\d+)x(?P\d+)mm-tip(?P\d+)[/*]$', + prices.report_one_win_price), # КАНОНИЧЕСКИЙ SEO-URL СТРАНИЦЫ ЦЕН ДЛЯ ОДНОГО ПРОЕМА re_path(r'^tsena-odnogo-okna/(?P\d+)x(?P\d+)mm/tip(?P\d+)[/*]$', - prices.report_one_win_price), - re_path(r'^next_price_one_flap_frame/idW(?P\d+)N(?P\d+)\S*$', prices.next_one_win_price), + prices.redirect_one_win_price_legacy), # LEGACY-URL: 301 -> КАНОНИЧЕСКИЙ ПУТЬ + re_path(r'^next_price_one_flap_frame/idW(?P\d+)N(?P\d+)\S*$', + prices.next_one_win_price), # ПОДГРУЖАЕМЫЙ ФРЕЙМ С ЦЕНОВЫМИ ПРЕДЛОЖЕНИЯМИ ДЛЯ ОДНОГО ПРОЕМА # --- Ценовая выдача re_path(r'^(?P\d+)/(?P\d+)/(?P[\s\S]*)$', prices.report_price), # --- Подгружаемый фрейм ценовая выдачи diff --git a/oknardia/templates/catalog/catalog_standard_opening.html b/oknardia/templates/catalog/catalog_standard_opening.html index b9f2cf3..a881ef4 100755 --- a/oknardia/templates/catalog/catalog_standard_opening.html +++ b/oknardia/templates/catalog/catalog_standard_opening.html @@ -70,7 +70,7 @@ CollectionPage + ItemList помогают поисковику понять с "@type": "Thing", "name": "{{ i.DESCRIPTION|escapejs }}", "description": "{{ i.DESCRIPTION_L|escapejs }}", - "url": "{{ request.scheme }}://{{ request.get_host }}/tsena-odnogo-okna/{{ i.W|stringformat:'.0f' }}x{{ i.H|stringformat:'.0f' }}mm/tip{{ i.ID }}", + "url": "{{ request.scheme }}://{{ request.get_host }}/catalog/standard_opening/price-{{ i.W|stringformat:'.0f' }}x{{ i.H|stringformat:'.0f' }}mm-tip{{ i.ID }}", "image": "{{ request.scheme }}://{{ request.get_host }}{% static i.URL2IMG %}", "additionalProperty": [ {"@type": "PropertyValue", "name": "Ширина", "value": "{{ i.W|stringformat:'.0f' }} мм"}, @@ -133,7 +133,7 @@ CollectionPage + ItemList помогают поисковику понять с {% if i.IS_DOOR %}да{% else %}—{% endif %} {{ i.DESCRIPTION }} {% for j in i.INCLUDING_IN_SERIA %}{{ j.NAME }}{% if not forloop.last %}, {% endif %}{% endfor %} - цены + цены {% endfor %} diff --git a/oknardia/templates/price/price_offers_for_one_window.html b/oknardia/templates/price/price_offers_for_one_window.html index 081815c..4edef68 100755 --- a/oknardia/templates/price/price_offers_for_one_window.html +++ b/oknardia/templates/price/price_offers_for_one_window.html @@ -5,11 +5,12 @@ {% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %} +{# SEO блоки дат:#} +{# - Date4Meta: дата публикации (первого появления) — используем дату модификации данных. #} +{# - Last4Meta: дата последнего обновления — будет по умолчанию now из base.html. #} {% block Date4Meta %}{{ META_DATA_PUBLISH|date:"Y-m-d" }}{% endblock %} -{% block Last4Meta %}{{ META_DATA_PUBLISH|date:"Y-m-d" }}{% endblock %} - -{% block Top_JS4 %} +{% block Top_JS4 %}{# Для построения круговой диаграммы #} {% endblock %} +{% block ADD_TO_HEAD %}{% comment %} + JSON-LD микроразметка для поисковых систем (Schema.org): + - BreadcrumbList: хлебные крошки для навигации в поиске + - Organization: информация о бренде/компании + - Product: типовое окно с полной информацией + - Рейтинги и цены берутся из таблицы предложений (price_offers_for_one_window_frame.html) + {% endcomment %}{% endblock %} + {% block Description %}Цены на типовое окно {% for I_WIN_DIM in FLAP_DIM %}{{ I_WIN_DIM.iWinWidth|floatformat:0 }}x{{ I_WIN_DIM.iWinHight|floatformat:0 }} см. для домов серий {% for I in SERIA_FOR_WIN %}{% if forloop.last %} и {% elif forloop.first %}{% else %}, {% endif %}{{ I.sName }}{% endfor %}{% endfor %}.{% endblock %} {% comment %}{% block Description %}Цены на пластиковые окна для серии {{ BASE_SERIA }} ({{ APART }} квартира, {{ ADDRESS }}) :: {% for CurOffer in PRICE_FRAME %}Поставщик: {{ CurOffer.MERCHANT }}; Комплектация: {{ CurOffer.SETS_NAME }}; Цена: {{ CurOffer.FIN_PRICE }}₽ :: {% endfor %}{% endblock %}{% endcomment %} @@ -146,12 +281,14 @@ $(function () { // инициализация и обработка попове
      -

      Цены на окно {% for I_WIN_DIM in FLAP_DIM %}{{ I_WIN_DIM.iWinWidth_mm|floatformat:0 }}×{{ I_WIN_DIM.iWinHight_mm|floatformat:0 }}{% endfor %} мм. (типовое)

      +

      Цены на окно {% for I_WIN_DIM in FLAP_DIM %}{{ I_WIN_DIM.iWinWidth_mm|floatformat:0 }}×{{ I_WIN_DIM.iWinHight_mm|floatformat:0 }}{% endfor %} мм. (типовое)

      -

      Типовой проём {% for I_WIN_DIM in FLAP_DIM %}{{ I_WIN_DIM.iWinWidth|floatformat:1 }}×{{ I_WIN_DIM.iWinHight|floatformat:1 }}{% endfor %} cм. представлен в домах серий: {% for I in SERIA_FOR_WIN %}{% if forloop.last %} и {% elif forloop.first %}{% else %}, {% endif %}{{ I.sName }}{% endfor %}. База «Окнардии» размещено {{ NUM_TOTAL_OFFER_N_WORD }} цен для окон в такой проем (из них в архиве {{ NUM_ARCHIVE_OFFER }}). Предложено {{ NUM_FLAP_VARIATION_IN_WORD }} открывания от {{ NUM_TOTAL_FIRM_N_WORD }}.

      +

      Типовой проём {% for I_WIN_DIM in FLAP_DIM %}{{ I_WIN_DIM.iWinWidth|floatformat:1 }}×{{ I_WIN_DIM.iWinHight|floatformat:1 }}{% endfor %} cм. представлен в домах серий: {% for I in SERIA_FOR_WIN %}{% if forloop.last %} и {% elif forloop.first %}{% else %}, {% endif %}{{ I.sName }}{% endfor %}. База «Окнардии» размещено {{ NUM_TOTAL_OFFER_N_WORD }} цен для окон в такой проем (из них в архиве {{ NUM_ARCHIVE_OFFER }}). Предложено {{ NUM_FLAP_VARIATION_IN_WORD }} открывания от {{ NUM_TOTAL_FIRM_N_WORD }}.

      - {# Микроразмектка: названеи продукта #} + {# Микроразметка: название продукта и марка #} + +
      @@ -176,8 +313,6 @@ $(function () { // инициализация и обработка попове

      В таблице представлены только цены поставщиков из базы «Окнардия». Клик на названии набора отобразит детальную спецификацию каждого предложения: профиль рамы и створки, схему стеклопакета, фурнитуру, элементы отлива, подоконника, откоса, системы климат-контроля) и сопутствующие услуги. Предложения выводятся блоками. Очередной блок выводится кнопкой «Ещё коммерческие предложения окон» под таблицей. Детальные технические характеристики стеклопакетов, профилей и описание сопутствующих услуг можно посмотреть и сравнить с помощью кнопки «Сравнить выбранные».

      - {# Микроразмектка: названеи продукта #} -
      diff --git a/oknardia/templates/price/price_offers_for_one_window_frame.html b/oknardia/templates/price/price_offers_for_one_window_frame.html index b9b5c37..c507b27 100755 --- a/oknardia/templates/price/price_offers_for_one_window_frame.html +++ b/oknardia/templates/price/price_offers_for_one_window_frame.html @@ -6,8 +6,8 @@ {% if forloop.first %} {# красивые чекбоксы BEGIN #}
      {# красивые чекбоксы END #} - -

      {{ CurOffer.MERCHANT }} – {{ CurOffer.SETS_NAME }}

      + +

      {{ CurOffer.MERCHANT }} – {{ CurOffer.SETS_NAME }}

      ■ Профиль: {{ CurOffer.PVC_NAME|safe }} ({{ CurOffer.PVC_MANUFACTURER }}) ■ {{ CurOffer.GLAZING_NAME_B|safe }} ({{ CurOffer.GLAZING_MARK }}) @@ -29,17 +29,15 @@
      {{ CurOffer.SETS_DATA_MODIFY|date:"d.M.Y" }} - - + + для оконого набора «{{ CurOffer.SETS_NAME }}» компании «{{ CurOffer.MERCHANT }}» состоит из:{% else %}Рейтинг не присвоен{% endif %}" - data-toggle="popover">рейтинг: {% for Star in CurOffer.SETS_RATING_STARTS %}{% if Star == 0 %}{% else %}{% endif %}{% endfor %} {% if CurOffer.SETS_RATING > -0.1 %} {{ CurOffer.SETS_RATING|stringformat:".2f" }}{% endif %} + data-toggle="popover">рейтинг: {% for Star in CurOffer.SETS_RATING_STARTS %}{% if Star == 0 %}{% else %}{% endif %}{% endfor %} {% if CurOffer.SETS_RATING > -0.1 %}{{ CurOffer.SETS_RATING|stringformat:".2f" }}{% endif %}
      - - - {% endif %} @@ -50,10 +48,8 @@ {{ CurOffer.TOTAL|stringformat:".2f"|price_format }} {% if CurOffer.DISCOUNT < 0.1 %}—{% else %}−{{ CurOffer.DISCOUNT|stringformat:".1f" }}%{% endif %} - + Итого: {{ CurOffer.FIN_PRICE|stringformat:".2f"|price_format }}  - - {% if CurOffer.DIM|length == 1 %} diff --git a/oknardia/templates/report/show_big_flap_pictures.html b/oknardia/templates/report/show_big_flap_pictures.html index 417448a..6b7a2e3 100755 --- a/oknardia/templates/report/show_big_flap_pictures.html +++ b/oknardia/templates/report/show_big_flap_pictures.html @@ -6,7 +6,7 @@ {{ I_WIN_DIM.iWinWidth|stringformat:".0f" }}0×{{ I_WIN_DIM.iWinHight|stringformat:".0f" }}0 мм.
      {% if not I_WIN_DIM.iQuantity == 0 %} {{ I_WIN_DIM.iQuantity }} шт.{% for I_II in I_WIN_DIM.qStr %}{% endfor %}
      {% endif %} {{ I_WIN_DIM.sDescription }}{% if not I_WIN_DIM.iQuantity == 0 %}
      - цены только этого типового окна{% endif %} + цены только этого типового окна{% endif %}
      {% endfor %}{% comment %} + {# --- Open Graph (OG) --- #} + + + + + + {# --- Twitter Card --- #} + + + + {# --- Даты публикации и обновления --- #} + + +{% endblock %} {% block Top_JS3%} {% if MAP_JS %}{% else %} +{% endblock %} + {% block Top_JS3%}{% endblock %} - {% block Top_CSS1 %}{% endblock %} {% block Main_Content %}
      -

      Сравнении оконных наборов:{% for Count in SET_LIST %}{% if forloop.first %} {% else %}{% if forloop.last %} и {% else %}, {% endif %}{% endif %}{{ Count.SET_NAME }}{% if forloop.last %}.{% endif %}{% endfor %}

      + {# Хлебные крошки: Главная → Каталог → Оконные наборы (ссылка) → текущее сравнение #} + + {# Исправлена опечатка: «Сравнении» → «Сравнение» #} +

      Сравнение оконных наборов:{% for Count in SET_LIST %}{% if forloop.first %} {% else %}{% if forloop.last %} и {% else %}, {% endif %}{% endif %}{{ Count.SET_NAME }}{% if forloop.last %}.{% endif %}{% endfor %}

      Оконный набор — это комплект оконного профиля (рамы и сворки), стеклопакета, фурнитуры и уплотнителей — готовое окно в сборе для установки в проём. В набор может входить отлив, подоконник, откос, встраиваемые системы климат-контроля, оконная фурнитура открывания, запоры, уплотнители, москитная сетка… а также сопутствующие услуги: демонтаж старых и установка новых окон, доставка, гарантийное обслуживание, уборка, вынос и утилизация строительного мусора, защитное укрытие мебели на время монтажа и другое.

      -

      В таблицу сравнения услуг и условий, входящих в оконные наборы, добавлены следующие производители и поставщики:

      + {# h4 → h2 для правильной иерархии заголовков (SEO); визуальный размер сохраняем через style #} +

      В таблицу сравнения услуг и условий, входящих в оконные наборы, добавлены следующие производители и поставщики:

        {% for MERCANT in LIST_MERCHANT %}
      • {{ MERCANT }}.
      • {% endfor %}
      -

      В средней части таблице вы сможете сравнить характеристики оконных профилей в наборах:

      +

      В средней части таблицы вы сможете сравнить характеристики оконных профилей в наборах:

        {% for PROFILE in LIST_PROFILE %}
      • {{ PROFILE }}.
      • {% endfor %}
      -

      Нижний блок таблицы посвящен характеристикам и сравнению стеклопакетов в наборах. Формулы выбранных стеклопакетов:

      +

      Нижний блок таблицы посвящен характеристикам и сравнению стеклопакетов в наборах. Формулы выбранных стеклопакетов:

        {% for GLAZING in LIST_GLAZING %}
      • {{ GLAZING }}.
      • {% endfor %}
      @@ -66,14 +231,18 @@ Поставщик:
      компания, предлагающая установку окон{% for Count in SET_LIST %} -

      {{ Count.MERCHANT }}


      + + {# h2 в ячейке таблицы — семантический мусор; заменяем на strong #} + {{ Count.MERCHANT }}
      {{ Count.MERCHANT }}
      {% if Count.IS_COMMERCIAL %}{{ Count.MERCHANT_URL_SHOT|truncatechars:30 }}{% else %}{{ Count.MERCHANT_URL_SHOT|truncatechars:30 }}{% endif %}
      в каталоге
      {% endfor %} - + + Название набора:{% for Count in SET_LIST %} {{ Count.SET_NAME|truncatechars:25 }}{% endfor %} - + + Рейтиг «Окнардии»:{% for Count in SET_LIST %} {% for Star in Count.RATING_SET %}{% if Star == 0 %}{% else %}{% endif %}{% endfor %} {% if Count.RATING_SET_N > 0.1 %}{{ Count.RATING_SET_N|stringformat:".2f" }}{% endif %} {% if Count.PROFILE_FILLET != "" %}{{ Count.PROFILE_FILLET }}{% else %}—{% endif %}{% endfor %} Уплотнитель:{% for Count in SET_LIST %} - {% if Count.PROFILE_SEAL_DESCRIPTION != "" %}{{ Count.PROFILE_SEAL_DESCRIPTION|capfirst }}{% else %}—{% endif %}{% endfor %} + {% if Count.PROFILE_SEAL_DESCRIPTION != "" %}{{ Count.PROFILE_SEAL_DESCRIPTION|capfirst }}{% else %}—{% endif %}{% endfor %} Прочие характеристики:{% for Count in SET_LIST %} {% if Count.PROFILE_OTHER != "" %}{{ Count.PROFILE_OTHER }}{% else %}—{% endif %}{% endfor %} From 065c51681d1885190fb16e09a2bf61ba96dc570c Mon Sep 17 00:00:00 2001 From: erjemin Date: Fri, 8 May 2026 18:04:51 +0300 Subject: [PATCH 051/102] =?UTF-8?q?add:=20=D1=80=D0=B0=D0=B7=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=20=D1=81=D1=80=D0=B0=D0=B2=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=BE=D0=BA=D0=BE=D0=BD=D0=BD=D1=8B=D1=85=20=D0=BD=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oknardia/templates/catalog/catalog_root.html | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/oknardia/templates/catalog/catalog_root.html b/oknardia/templates/catalog/catalog_root.html index 26984b0..fbb1519 100755 --- a/oknardia/templates/catalog/catalog_root.html +++ b/oknardia/templates/catalog/catalog_root.html @@ -69,6 +69,11 @@ "@type": "CollectionPage", "name": "Производители и поставщики окон", "url": "{{ request.scheme }}://{{ request.get_host }}/catalog/company/" + }, + { + "@type": "CollectionPage", + "name": "Оконные наборы: характеристики, комплектации и сравнение", + "url": "{{ request.scheme }}://{{ request.get_host }}/catalog/sets/" } ] } @@ -119,8 +124,10 @@

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

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

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

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

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

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

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

      Оконные наборы: характеристики, комплектации и сравнение

      +

      Готовые комплектации окон разных поставщиков: профиль, стеклопакет, фурнитура и монтаж в одном предложении. Сравнивайте предложения компаний устанавливающих окна по характеристикам (теплопередача, звукоизоляция, состав услуг, рейтинг «Окнардии» и многое другое).

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

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

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

      From 8da90ad0fd165ae58bf1b2b7341c45c7f62574b5 Mon Sep 17 00:00:00 2001 From: erjemin Date: Sat, 9 May 2026 14:40:54 +0300 Subject: [PATCH 052/102] =?UTF-8?q?mod:=20=D1=80=D0=B0=D0=B7=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=20=D1=81=D1=80=D0=B0=D0=B2=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=BE=D0=BA=D0=BE=D0=BD=D0=BD=D1=8B=D1=85=20=D0=BD=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oknardia/oknardia/urls.py | 2 + oknardia/templates/catalog/catalog_sets.html | 385 +++++++++++++++++++ oknardia/web/catalog.py | 74 +++- 3 files changed, 457 insertions(+), 4 deletions(-) create mode 100644 oknardia/templates/catalog/catalog_sets.html diff --git a/oknardia/oknardia/urls.py b/oknardia/oknardia/urls.py index 720ed1a..1c5f25c 100644 --- a/oknardia/oknardia/urls.py +++ b/oknardia/oknardia/urls.py @@ -76,6 +76,8 @@ urlpatterns = [ re_path(r'^catalog/company[/*]$', catalog_companies.catalog_company), # СПИСОК ВСЕХ ПРОИЗВОДИТЕЛЕЙ ОКОН re_path(r'^catalog/company/(?P\d+)-(?P\S*)[/*]$', catalog_companies.catalog_company_detail), # КАРТОЧКА ПРОИЗВОДИТЕЛЯ-УСТАНОВЩИКА ОКОН + # --- --- КАТАЛОГ ОКОННЫХ НАБОРОВ (SetKit) — список комплектаций с переходом к сравнению + re_path(r'^catalog/sets[/*]$', catalog.catalog_sets), # ЦЕНОВЫЕ ПРЕДЛОЖЕНИЯ # --- ОДИНОЧНОЕ ОКНО re_path(r'^catalog/standard_opening/price-(?P\d+)x(?P\d+)mm-tip(?P\d+)[/*]$', diff --git a/oknardia/templates/catalog/catalog_sets.html b/oknardia/templates/catalog/catalog_sets.html new file mode 100644 index 0000000..96e97cf --- /dev/null +++ b/oknardia/templates/catalog/catalog_sets.html @@ -0,0 +1,385 @@ +{% extends "base.html" %} +{% load static %} +{% load filters %} + +{% block Title %}Оконные наборы: характеристики, комплектации и сравнение — каталог «Окнардия»{% endblock %} + +{% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %} + +{% block Description %}Каталог оконных наборов «Окнардия»: готовые комплектации для замены окон с профилем, стеклопакетом и монтажом в одном предложении. Подробные характеристики, рейтинг и сравнение от разных поставщиков.{% endblock %} + +{% block Keywords %}оконные наборы, комплектации окон, сравнение окон, профиль и стеклопакет, монтаж окон, окнардия{% endblock %} + +{% block Top_Meta1 %} + + + + + + + + + + + + + +{% endblock %} + +{% block ADD_TO_HEAD %} +{# JSON-LD: CollectionPage каталога наборов — BreadcrumbList + ItemList с кратким описанием каждого Product #} + + +{# CSS для плавающей панели выбора сравнения #} + +{% endblock %} + +{% block Main_Content %} +
      + + {# Хлебные крошки #} +
      +
      + +

      Оконные наборы: характеристики, комплектации и сравнение

      +

      Оконный набор — готовая комплектация для замены окон в вашем доме: профиль, стеклопакет, + фурнитура и монтаж в одном предложении от компаний-партнёров «Окнардии». + Отметьте несколько интересных наборов и сравните их детально по всем характеристикам.

      +
      +
      + + {# Список карточек #} + {% for item in SET_LIST %} +
      + + {# ---- ШАПКА КАРТОЧКИ: название + рейтинг + логотип ---- #} +
      +
      + + {# Название + звёздочки рейтинга #} +
      +

      {{ item.kit.sSetName }}

      +
      + {% for star in item.stars %}{% if star %}{% else %}{% endif %}{% endfor %}{% if item.kit.fSetRating > 0.1 %} {{ item.kit.fSetRating|stringformat:".2f" }}{% endif %} +
      +
      + + {# Логотип компании — кликабельный, ведёт на карточку компании в каталоге #} +
      + {% if item.merchant_logo %} + {% if item.merchant_id %}{% endif %} + {{ item.merchant_name }} + {% if item.merchant_id %}{% endif %} + {% endif %} +
      + +
      +
      {# /panel-heading #} + + {# ---- ТЕЛО КАРТОЧКИ: три колонки — условия | профиль | стеклопакет ---- #} +
      +
      + + {# == Колонка 1: компания и условия поставки == #} +
      +

      Поставщик

      + {% if item.merchant_id %} +

      + + {{ item.merchant_name }} + +

      + {% elif item.merchant_name %} +

      {{ item.merchant_name }}

      + {% endif %} + + + {% if item.kit.sSetImplementAll %} + + {% endif %} + {% if item.kit.sSetImplementHandles %} + + {% endif %} + {% if item.kit.sSetImplementHinges %} + + {% endif %} + {% if item.kit.sSetImplementLatch %} + + {% endif %} + {% if item.kit.sSetImplementLimiter %} + + {% endif %} + {% if item.kit.sSetImplementCatch %} + + {% endif %} + {% if item.kit.sSetClimateControl|length > 3 %} + + {% endif %} + + + + + + + + + + + + + + + + + + + + + {% if item.kit.sSetOtherConditions %} + + {% endif %} +
      Фурнитура:{{ item.kit.sSetImplementAll|capfirst }}
       Ручки:{{ item.kit.sSetImplementHandles|capfirst }}
       Петли:{{ item.kit.sSetImplementHinges|capfirst }}
       Запоры:{{ item.kit.sSetImplementLatch|capfirst }}
       Огранич.:{{ item.kit.sSetImplementLimiter|capfirst }}
       Фиксаторы:{{ item.kit.sSetImplementCatch|capfirst }}
      Климат-конт.:{{ item.kit.sSetClimateControl|capfirst }}
      Подоконник: + {% if item.kit.sSetSill %}{{ item.kit.sSetSill|capfirst }}{% else %}—{% endif %} +
      Водоотлив: + {% if item.kit.sSetPanes %}{{ item.kit.sSetPanes|capfirst }}{% else %}—{% endif %} +
      Откос: + {% if item.kit.sSetSlope %}{{ item.kit.sSetSlope|capfirst }}{% else %}—{% endif %} +
      Доставка: + {{ item.kit.sSetDelivery|capfirst }} +
      Монтаж: + {{ item.kit.sSetUninstallInstall|capfirst }} +
      Прочее:{{ item.kit.sSetOtherConditions|capfirst }}
      +
      {# /col компания #} + + {# == Колонка 2: профиль == #} +
      +

      + Профиль: + {{ item.profile.sProfileName }} + — {{ item.profile.sProfileManufacturer }} +

      + {% if item.profile.sProfileBriefDescription %} +

      {{ item.profile.sProfileBriefDescription }}

      + {% endif %} + + + {% if item.profile.iProfileCameras %}{% endif %} + {% if item.profile.iProfileThickness > 5 %}{% endif %} + {% if item.profile.iProfileGlazingThickness > 4 %}{% endif %} + {% if item.profile.fProfileHeatTransf > 0.1 %}{% endif %} + {% if item.profile.fProfileSoundproofing > 1 %}{% endif %} + {% if item.profile.fProfileSeals > 0 %}{% endif %} + {% if item.profile.iProfileHeight > 15 %}{% endif %} + {% if item.profile.iProfileRabbet > 1 %}{% endif %} + {% if item.profile.sProfileColor %}{% endif %} + {% if item.profile.sProfileReinforcement %}{% endif %} + {% if item.profile.sProfileSealDescription %}{% endif %} + {% if item.profile.sProfileFillet %}{% endif %} + {% if item.profile.sProfileOther %}{% endif %} +
      Производитель:{{ item.profile.sProfileManufacturer }}
      Камер рамы/створки:{{ item.profile.iProfileCameras }} шт.
      Монтажная ширина:{{ item.profile.iProfileThickness }} мм
      Макс. толщина СП:{{ item.profile.iProfileGlazingThickness }} мм
      Теплопередача Ro:{{ item.profile.fProfileHeatTransf }} м²·°C/Вт
      Звукоизоляция:{{ item.profile.fProfileSoundproofing }} дБ
      Контуры уплотнения:{{ item.profile.fProfileSeals }} шт.
      Высота в проёме:{{ item.profile.iProfileHeight }} мм
      Фальц рамы:{{ item.profile.iProfileRabbet }} мм
      Цвет:{{ item.profile.sProfileColor|capfirst }}
      Армирование:{{ item.profile.sProfileReinforcement }}
      Уплотнитель:{{ item.profile.sProfileSealDescription|capfirst }}
      Штапик:{{ item.profile.sProfileFillet }}
      Прочие хар-ки:{{ item.profile.sProfileOther }}
      +
      {# /col профиль #} + + {# == Колонка 3: стеклопакет == #} +
      +

      + Стеклопакет: {{ item.glazing.sGlazingName }} +

      + {% if item.glazing.sGlazingBriefDescription %} +

      {{ item.glazing.sGlazingBriefDescription|capfirst }}

      + {% endif %} + + {% if item.glazing.sGlazingMark and item.glazing.sGlazingMark != "—" %}{% endif %} + {% if item.glazing.sGlazingManufacturer and item.glazing.sGlazingManufacturer != "—//—" and item.glazing.sGlazingManufacturer != "—" %}{% endif %} + {% if item.glazing.iGlazingCamerasN >= 1 %}{% endif %} + {% if item.glazing.iGlazingThickness >= 3 %}{% endif %} + {% if item.glazing.fGlazingHeatTransfer > 0.1 %}{% endif %} + {% if item.glazing.fGlazingSoundproofing >= 10 %}{% endif %} + {% if item.glazing.fGlazingLightTransmission >= 1 %}{% endif %} + {% if item.glazing.fGlazingPassingSun >= 1 %}{% endif %} + {% if item.glazing.sGlazingLightReflectance and item.glazing.sGlazingLightReflectance != "—/—" %}{% endif %} + {% if item.glazing.sGlazingReflectionAndAbsorptionOfHeat and item.glazing.sGlazingReflectionAndAbsorptionOfHeat != "—/—" %}{% endif %} + {% if item.glazing.sGlazingToning %}{% endif %} +
      Схема:{{ item.glazing.sGlazingMark }}
      Производитель:{{ item.glazing.sGlazingManufacturer }}
      Камер:{{ item.glazing.iGlazingCamerasN }} шт.
      Толщина:{{ item.glazing.iGlazingThickness }} мм
      Теплопередача Ro:{{ item.glazing.fGlazingHeatTransfer }} м²·°C/Вт
      Звукоизоляция:{{ item.glazing.fGlazingSoundproofing }} дБ
      Светопропускание:{{ item.glazing.fGlazingLightTransmission }} %
      Солнцепропускание:{{ item.glazing.fGlazingPassingSun }} %
      Светоотражение:{{ item.glazing.sGlazingLightReflectance }} %
      Теплоотражение/погл.:{{ item.glazing.sGlazingReflectionAndAbsorptionOfHeat }} %
      Тонирование:{{ item.glazing.sGlazingToning|capfirst }}
      +
      {# /col стеклопакет #} + +
      {# /row #} +
      {# /panel-body #} + + {# ---- ПОДВАЛ КАРТОЧКИ: чекбокс «отметить» + кнопка сравнения ---- #} + + +
      {# /panel kit-card #} + {% empty %} +
      Нет доступных оконных наборов.
      + {% endfor %} + + {# --- Баннер --- #} +

      {% include "ad/bannet-wide.html" %}
      + +
      + {% include "report/report_last_user_visit.html" %} + {% include "report/report_log_user_visit.html" %} +
      + +
      {# /container-fluid #} + +{% endblock %} + +{% block Top_JS3 %}{% endblock %} + diff --git a/oknardia/web/catalog.py b/oknardia/web/catalog.py index c57184a..b09f747 100644 --- a/oknardia/web/catalog.py +++ b/oknardia/web/catalog.py @@ -1,10 +1,14 @@ # -*- coding: utf-8 -*- -from django.shortcuts import render, redirect -from django.http import HttpRequest, HttpResponse -from oknardia.models import Seria_Info -from web.report1 import get_last_all_user_visit_list, get_last_user_visit_cookies, get_last_user_visit_list import time +import pytils.translit +from django.http import HttpRequest, HttpResponse +from django.shortcuts import render, redirect + +from oknardia.models import Seria_Info, SetKit +from web.add_func import get_rating_set_for_stars +from web.report1 import get_last_all_user_visit_list, get_last_user_visit_cookies, get_last_user_visit_list + def catalog_root(request: HttpRequest) -> HttpResponse: """ Корневая страница каталога @@ -24,6 +28,68 @@ def catalog_root(request: HttpRequest) -> HttpResponse: return response +def catalog_sets(request: HttpRequest) -> HttpResponse: + """ Каталог оконных наборов (SetKit) — список всех активных комплектаций, отсортированных по рейтингу. + + Для каждого набора собирается dict с полями набора, профиля, стеклопакета и компании-установщика. + Цепочка FK: SetKit.kSet2User → OurUser.kMerchantOffice → MerchantOffice.kMerchantName (MerchantBrand). + Слаги URL формируются через pytils.translit.slugify. + + :param request: HttpRequest -- входящий http-запрос + :return response: HttpResponse -- исходящий http-ответ + """ + time_start = time.perf_counter() + + qs = ( + SetKit.objects + .filter(sSetActive=True) + .select_related( + 'kSet2PVCprofiles', + 'kSet2Glazing', + 'kSet2User__kMerchantOffice__kMerchantName', + ) + .order_by('-fSetRating') + ) + + kits: list[dict] = [] + for kit in qs: + # достаём бренд через цепочку FK (всё уже прогружено через select_related) + try: + office = kit.kSet2User.kMerchantOffice + brand = office.kMerchantName if office else None + except Exception: + office = brand = None + + profile = kit.kSet2PVCprofiles + glazing = kit.kSet2Glazing + + kits.append({ + 'kit': kit, + 'stars': get_rating_set_for_stars(kit.fSetRating), + 'profile': profile, + 'glazing': glazing, + # компания-установщик + 'merchant_id': brand.id if brand else None, + 'merchant_slug': pytils.translit.slugify(brand.sMerchantName) if brand else "", + 'merchant_name': brand.sMerchantName if brand else "", + 'merchant_logo': str(brand.pMerchantLogo) if brand and brand.pMerchantLogo else "", + 'merchant_url': brand.sMerchantMainURL if brand else "", + # слаги для ссылок на профиль в каталоге профилей + 'profile_manufacturer_slug': pytils.translit.slugify( + profile.sProfileManufacturer) if profile else "", + 'profile_slug': pytils.translit.slugify( + profile.sProfileName) if profile else "", + }) + + to_template: dict[str, object] = { + 'SET_LIST': kits, + 'LAST_VISIT': get_last_user_visit_list(get_last_user_visit_cookies(request)[:3]), + 'LOG_VISIT': get_last_all_user_visit_list(), + 'ticks': float(time.perf_counter() - time_start), + } + return render(request, "catalog/catalog_sets.html", to_template) + + def report_all_info_seria_redirect(request: HttpRequest, seria_id: str = "12") -> HttpResponse: """ Переадресация старых URL, т.к. их сколько-то есть (было) во внешних ссылках From 5a507f3e17a50003db35fbd4e495aa2c5aa3cb62 Mon Sep 17 00:00:00 2001 From: erjemin Date: Sat, 9 May 2026 14:55:26 +0300 Subject: [PATCH 053/102] =?UTF-8?q?mod:=20=D1=81=D0=B2=D1=8F=D0=B7=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D1=8C=20=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=86=D0=B0=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D0=BD=D0=B8=D0=B8?= =?UTF-8?q?=20-->=20=D0=BD=D0=B0=D0=B1=D0=BE=D1=80=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D1=81=D1=80=D0=B0=D0=B2=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oknardia/templates/catalog/catalog_company_detail.html | 9 ++++++++- oknardia/web/catalog_companies.py | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/oknardia/templates/catalog/catalog_company_detail.html b/oknardia/templates/catalog/catalog_company_detail.html index 6acb34f..2044442 100755 --- a/oknardia/templates/catalog/catalog_company_detail.html +++ b/oknardia/templates/catalog/catalog_company_detail.html @@ -138,7 +138,14 @@ {# ПРАВАЯ КОЛОНКА: НАЧАЛО #}
      - +

      Оконный набор: «{{ i.sSetName|safe }}»

      +

      + Оконный набор: «{{ i.sSetName|safe }}» + + в каталоге наборов + +

      +
      {% for Star in i.fSetRating.STARS %}{% if Star == 0 %}{% else %}{% endif %}{% endfor %} {% if i.fSetRating.RATING > -0.01 %} {{ i.fSetRating.RATING|stringformat:".2f" }}{% endif %}
      diff --git a/oknardia/web/catalog_companies.py b/oknardia/web/catalog_companies.py index 882ba12..b4f448a 100644 --- a/oknardia/web/catalog_companies.py +++ b/oknardia/web/catalog_companies.py @@ -359,6 +359,7 @@ def _format_set_for_template(set_data: dict, empty_values: list) -> dict: formatted = { # Ключи ниже оставлены в legacy-формате, т.к. шаблон использует именно их имена. + 'idSetKit': set_kit.id, 'sSetName': set_kit.sSetName, 'sMerchantName': merchant_brand.sMerchantName, 'sMerchantDescription': merchant_brand.sMerchantDescription, From 4abd8a43f167dbdb34fcce4a24c5fb55b8d58be9 Mon Sep 17 00:00:00 2001 From: erjemin Date: Sat, 9 May 2026 15:05:03 +0300 Subject: [PATCH 054/102] =?UTF-8?q?mod:=20=D0=B1=D0=BB=D0=BE=D0=BA=20"?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=D0=B8=D0=BD"=20=D0=BF=D0=BE=D0=B4=D0=B3?= =?UTF-8?q?=D1=80=D1=83=D0=B6=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D1=82=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=BA=D0=BE=20=D0=BF=D0=BE=20=D0=BA=D0=BB=D0=B8?= =?UTF-8?q?=D0=BA=D1=83=20=D0=BD=D0=B0=20=D0=BC=D0=B5=D0=BD=D1=8E=20"?= =?UTF-8?q?=D0=92=D1=85=D0=BE=D0=B4"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oknardia/templates/base.html | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/oknardia/templates/base.html b/oknardia/templates/base.html index c49f5e5..215c975 100755 --- a/oknardia/templates/base.html +++ b/oknardia/templates/base.html @@ -25,7 +25,38 @@ {% block Top_CSS1 %}{% endblock %}{% block Top_CSS2 %}{% endblock %}{% block Top_CSS3 %}{% endblock %} {# #} {# #}{% block Top_JS1 %}{% endblock %}{% block Top_JS2 %}{% endblock %}{% block Top_JS3 %}{% endblock %}{% block Top_JS4 %}{% endblock %}{% block Top_JS5 %}{% endblock %}{% block Top_Meta1 %}{% endblock %} - {% block ADD_TO_HEAD %}{% endblock %} + {% block ADD_TO_HEAD %}{% endblock %} @@ -57,7 +88,7 @@
    • Обратная связь
    - +
{% endblock %} From 8a485b756b26b40f6029d0d9b11e5e4fdef9a942 Mon Sep 17 00:00:00 2001 From: erjemin Date: Sat, 9 May 2026 21:21:20 +0300 Subject: [PATCH 055/102] =?UTF-8?q?mod:=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D0=B5=20=D0=BE=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=D0=B4=D0=BD?= =?UTF-8?q?=D0=B8=D1=85=20=D0=B2=D0=B8=D0=B7=D0=B8=D1=82=D0=B0=D1=85=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=BF=D0=BE=D0=BB=D0=BD=D0=BE=D1=81=D1=82=D1=8C?= =?UTF-8?q?=D1=8E=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=B5=D1=81=D0=B5=D0=BD?= =?UTF-8?q?=D1=8B=20=D1=81=20=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80=D0=B0=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BA=D0=BB=D0=B8=D0=B5=D0=BD=D1=82=20(=D0=B2?= =?UTF-8?q?=20JS).=20=D0=9E=D1=82=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=20?= =?UTF-8?q?=D0=B8=D0=B7=20=D0=BA=D0=BE=D0=BD=D1=82=D0=B5=D0=BA=D1=81=D1=82?= =?UTF-8?q?=D0=B0=20=D0=B2=D1=81=D0=B5=D1=85=20=D1=88=D0=B0=D0=B1=D0=BB?= =?UTF-8?q?=D0=BE=D0=BD=D0=BE=D0=B2=20LAST=5FVISIT=20=D0=B8=20=D1=81=D0=B2?= =?UTF-8?q?=D1=8F=D0=B7=D0=B0=D0=BD=D0=BD=D1=8B=D0=B5=20=D1=81=20=D0=BD?= =?UTF-8?q?=D0=B8=D0=BC=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=B2=20=D0=B2=D1=8C=D1=8E=D1=88=D0=BA=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oknardia/templates/popup/popup_index.html | 6 +- oknardia/templates/price/price_list.html | 20 ++-- .../report/report_last_user_visit.html | 77 +++++++++++++-- oknardia/web/catalog.py | 4 +- oknardia/web/catalog_companies.py | 14 +-- oknardia/web/catalog_openings.py | 4 +- oknardia/web/catalog_profiles.py | 3 +- oknardia/web/catalog_series.py | 3 +- oknardia/web/prices.py | 24 +---- oknardia/web/report1.py | 18 ---- oknardia/web/test_prices.py | 9 -- oknardia/web/tests.py | 38 +------ oknardia/web/views.py | 18 +--- public/static/js/track_user_visit.js | 98 +++++++++++++++++++ 14 files changed, 193 insertions(+), 143 deletions(-) create mode 100644 public/static/js/track_user_visit.js diff --git a/oknardia/templates/popup/popup_index.html b/oknardia/templates/popup/popup_index.html index d430198..af285cc 100755 --- a/oknardia/templates/popup/popup_index.html +++ b/oknardia/templates/popup/popup_index.html @@ -75,11 +75,7 @@ - {% if LAST_VISIT %}
Ваши последние просмотры:
- -
{% endif %} + {% include 'report/report_last_user_visit.html' with background_color="None" %}

{% endwith %} \ No newline at end of file diff --git a/oknardia/templates/price/price_list.html b/oknardia/templates/price/price_list.html index 444075b..ac5a178 100755 --- a/oknardia/templates/price/price_list.html +++ b/oknardia/templates/price/price_list.html @@ -107,7 +107,8 @@ {% endblock %} -{% block Top_JS3%} + diff --git a/oknardia/web/catalog.py b/oknardia/web/catalog.py index b09f747..484b326 100644 --- a/oknardia/web/catalog.py +++ b/oknardia/web/catalog.py @@ -7,7 +7,7 @@ from django.shortcuts import render, redirect from oknardia.models import Seria_Info, SetKit from web.add_func import get_rating_set_for_stars -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_list def catalog_root(request: HttpRequest) -> HttpResponse: @@ -21,7 +21,6 @@ def catalog_root(request: HttpRequest) -> HttpResponse: time_start = time.perf_counter() # получаем из cookies последние визиты клиента to_template: dict[str, object] = { - 'LAST_VISIT': get_last_user_visit_list(get_last_user_visit_cookies(request)[:3]), 'LOG_VISIT': get_last_all_user_visit_list(), 'ticks': float(time.perf_counter() - time_start)} response = render(request, "catalog/catalog_root.html", to_template) @@ -83,7 +82,6 @@ def catalog_sets(request: HttpRequest) -> HttpResponse: to_template: dict[str, object] = { 'SET_LIST': kits, - 'LAST_VISIT': get_last_user_visit_list(get_last_user_visit_cookies(request)[:3]), 'LOG_VISIT': get_last_all_user_visit_list(), 'ticks': float(time.perf_counter() - time_start), } diff --git a/oknardia/web/catalog_companies.py b/oknardia/web/catalog_companies.py index b4f448a..8d0005b 100644 --- a/oknardia/web/catalog_companies.py +++ b/oknardia/web/catalog_companies.py @@ -17,11 +17,7 @@ from oknardia.models import ( SetKit, PriceOffer, ) -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_list from web.add_func import get_rating_set_for_stars import django.utils.dateformat import time @@ -179,7 +175,6 @@ def catalog_company(request: HttpRequest) -> HttpResponse: Контекст шаблона: - COMPANIES (list): Список компаний с статистикой - - LAST_VISIT (list): Последние визиты текущего пользователя - LOG_VISIT (list): Последние визиты всех пользователей Args: @@ -200,9 +195,6 @@ def catalog_company(request: HttpRequest) -> HttpResponse: # Получаем информацию о посещениях для персонализации to_template: dict[str, object] = { 'COMPANIES': formatted_companies, - 'LAST_VISIT': get_last_user_visit_list( - get_last_user_visit_cookies(request)[:3] - ), 'LOG_VISIT': get_last_all_user_visit_list(), } @@ -469,7 +461,6 @@ def catalog_company_detail( - SETS (list): Список оконных наборов с их полной информацией - IMG_FOR_BLOG (str): Логотип компании - LIST_NOT (list): Стандартные маркеры "пусто" - - LAST_VISIT (list): Последние визиты текущего пользователя - LOG_VISIT (list): Последние визиты всех пользователей - ticks (float): Время выполнения представления (в секундах) @@ -518,9 +509,6 @@ def catalog_company_detail( 'META_KEYWORDS': company.sMerchantName, 'IMG_FOR_BLOG': company.pMerchantLogo, 'LIST_NOT': empty_values, - 'LAST_VISIT': get_last_user_visit_list( - get_last_user_visit_cookies(request)[:3] - ), 'LOG_VISIT': get_last_all_user_visit_list(), } diff --git a/oknardia/web/catalog_openings.py b/oknardia/web/catalog_openings.py index 5c9eefd..e5bced4 100644 --- a/oknardia/web/catalog_openings.py +++ b/oknardia/web/catalog_openings.py @@ -3,7 +3,7 @@ from django.db.models import F from django.shortcuts import render from django.http import HttpRequest, HttpResponse from oknardia.models import MountDim2Apartment -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_list from web.add_func import get_flaps_for_mini_pictures import time import pytils @@ -20,8 +20,6 @@ def _make_slug(value: str) -> str: def _append_visit_context(to_template: dict, request: HttpRequest, time_start: float) -> None: """Дописывает в контекст стандартный хвост: визиты и время выполнения.""" to_template.update({ - # получаем последние визиты клиента через куки - 'LAST_VISIT': get_last_user_visit_list(get_last_user_visit_cookies(request)[:3]), # получаем последние визиты всех посетителей из базы 'LOG_VISIT': get_last_all_user_visit_list(), 'ticks': float(time.perf_counter() - time_start), diff --git a/oknardia/web/catalog_profiles.py b/oknardia/web/catalog_profiles.py index d19dbe5..fa70c4f 100644 --- a/oknardia/web/catalog_profiles.py +++ b/oknardia/web/catalog_profiles.py @@ -7,7 +7,7 @@ from django.shortcuts import render, redirect from django.http import HttpRequest, HttpResponse from oknardia.settings import * from oknardia.models import Catalog2Profile, PVCprofiles, PriceOffer -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_list from web.add_func import normalize, get_rating_set_for_stars import time import json @@ -49,7 +49,6 @@ def _profile_row_to_dict(profile: dict) -> dict: def _append_visit_context(to_template: dict, request: HttpRequest, time_start: float) -> None: """Дописывает в контекст стандартный хвост: визиты и время выполнения.""" to_template.update({ - 'LAST_VISIT': get_last_user_visit_list(get_last_user_visit_cookies(request)[:3]), 'LOG_VISIT': get_last_all_user_visit_list(), 'ticks': float(time.perf_counter() - time_start), }) diff --git a/oknardia/web/catalog_series.py b/oknardia/web/catalog_series.py index 2c46124..77129d0 100644 --- a/oknardia/web/catalog_series.py +++ b/oknardia/web/catalog_series.py @@ -13,7 +13,7 @@ from oknardia.models import ( 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_list from web.add_func import get_flaps_for_big_pictures import time import os @@ -29,7 +29,6 @@ def _make_slug(value: str) -> str: def _append_visit_context(to_template: dict, request: HttpRequest, time_start: float) -> None: """Дописывает в контекст стандартный хвост: визиты и время выполнения.""" to_template.update({ - 'LAST_VISIT': get_last_user_visit_list(get_last_user_visit_cookies(request)[:3]), 'LOG_VISIT': get_last_all_user_visit_list(), 'ticks': float(time.perf_counter() - time_start), }) diff --git a/oknardia/web/prices.py b/oknardia/web/prices.py index 4c78c0c..57e0ce6 100644 --- a/oknardia/web/prices.py +++ b/oknardia/web/prices.py @@ -14,7 +14,7 @@ from oknardia.models import ( MountDim2Apartment, ) from oknardia.settings import * -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_list from web.add_func import normalize, get_rating_set_for_stars, get_flaps_for_big_pictures, get_flaps_for_mini_pictures, \ get_geo_distance import django.utils.dateformat @@ -57,11 +57,8 @@ def _append_visit_context( """Дописывает в контекст стандартный хвост: визиты и время выполнения.""" if log_visit is None: log_visit = get_last_all_user_visit_list() - if last_visit_cookie is None: - last_visit_cookie = get_last_user_visit_cookies(request) to_template.update({ - 'LAST_VISIT': get_last_user_visit_list(last_visit_cookie[:3]), 'LOG_VISIT': log_visit, 'ticks': float(time.perf_counter() - time_start), }) @@ -956,29 +953,14 @@ def report_price(request: HttpRequest, build_id: str = "22427", apart_id: str = ) log_entry.save() # INSERT - # получаем последние визиты клиента через куки - last_visit = get_last_user_visit_cookies(request) - # Для блока LAST_VISIT показываем историю до текущего захода. - last_visit_for_context = list(last_visit) - # подготавливаем данные о текущем посещении для помещения в cookie - Item = { - "LastURL": new_url, - "LastAddress": to_template["ADDRESS"], - "LastApart": to_template["APART"], - "Time": time.perf_counter()} - last_visit.insert(0, Item) # Добавляем текущий Item в начало - last_visit = json.dumps(last_visit[:3]) # упаковываем json без пробелов (три записи) - # print u"сейчас запишем вот эту куку:", LastVisit + # Вызываем контекст без параметра last_visit_cookie (получит из кук автоматически) _append_visit_context( to_template=to_template, request=request, time_start=time_start, log_visit=log_visit, - last_visit_cookie=last_visit_for_context, ) - response = render(request, "price/price_list.html", to_template) - response.set_cookie("LastVisit", last_visit, max_age=7862400) # ставим или перезаписываем куки (91 день) - return response + return render(request, "price/price_list.html", to_template) def next_price_frame(request: HttpRequest, apart_id: str = "1", mount_dim_per_offer: str = "1", diff --git a/oknardia/web/report1.py b/oknardia/web/report1.py index c394f31..5818843 100644 --- a/oknardia/web/report1.py +++ b/oknardia/web/report1.py @@ -95,21 +95,6 @@ def _bounds(items: list, field: str, threshold=None) -> tuple[float, float]: return min(vals), max(vals) -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), меняет в нем даты на описание типа "три недели назад" и возвращает обратно. @@ -417,10 +402,7 @@ def compare_offers(request: HttpRequest, to_compare: str = "1,2") -> HttpRespons except SetKit.DoesNotExist: pass 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.perf_counter() - time_start) }) diff --git a/oknardia/web/test_prices.py b/oknardia/web/test_prices.py index c7e8e2d..596f43e 100644 --- a/oknardia/web/test_prices.py +++ b/oknardia/web/test_prices.py @@ -158,9 +158,6 @@ class ReportOneWinPriceTests(TestCase): sOfferActive=False, ) - @patch("web.prices.get_last_all_user_visit_list", return_value=[]) - @patch("web.prices.get_last_user_visit_list", return_value=[]) - @patch("web.prices.get_last_user_visit_cookies", return_value=[]) @patch("web.prices.get_flaps_for_mini_pictures", return_value="img/test-mini.png") @patch( "web.prices.get_flaps_for_big_pictures", @@ -178,9 +175,6 @@ class ReportOneWinPriceTests(TestCase): self, mocked_big_pictures, mocked_mini_pictures, - mocked_cookies, - mocked_last_visits, - mocked_all_visits, ): """Вьюха должна собирать тот же ключевой контекст, но уже без raw SQL.""" request = self.factory.get( @@ -216,9 +210,6 @@ class ReportOneWinPriceTests(TestCase): self.assertIn("META_DATA_PUBLISH", context) self.assertTrue(mocked_big_pictures.called) self.assertTrue(mocked_mini_pictures.called) - self.assertTrue(mocked_cookies.called) - self.assertTrue(mocked_last_visits.called) - self.assertTrue(mocked_all_visits.called) def test_report_one_win_price_redirects_to_canonical_dimensions(self): """Если SEO-размеры в URL неверные, вьюха должна редиректить на канонический URL.""" diff --git a/oknardia/web/tests.py b/oknardia/web/tests.py index 0dfef8f..79209a1 100644 --- a/oknardia/web/tests.py +++ b/oknardia/web/tests.py @@ -156,14 +156,8 @@ class CatalogProfileViewTests(TestCase): return profile, sibling, brand, blog - @patch("web.catalog.get_last_all_user_visit_list", return_value=["all-visits"]) - @patch("web.catalog.get_last_user_visit_list", return_value=["last-visits"]) - @patch("web.catalog.get_last_user_visit_cookies", return_value=["cookie-1", "cookie-2", "cookie-3"]) def test_catalog_profile_handles_empty_catalog( self, - mocked_cookies, - mocked_last_visits, - mocked_all_visits, ): """Пустой каталог не должен падать и должен отдавать ожидаемый контекст.""" with self.assertNumQueries(1): @@ -174,20 +168,10 @@ class CatalogProfileViewTests(TestCase): self.assertEqual(context["CATALOG_PROFILE_NUM"], "0 профилей") self.assertEqual(context["CATALOG_MANUFACT_NUM"], 0) self.assertEqual(context["CATALOG_PROFILE_MAN1_NAME2"], []) - self.assertEqual(context["LAST_VISIT"], ["last-visits"]) - self.assertEqual(context["LOG_VISIT"], ["all-visits"]) - self.assertTrue(mocked_cookies.called) - self.assertTrue(mocked_last_visits.called) - self.assertTrue(mocked_all_visits.called) - @patch("web.catalog.get_last_all_user_visit_list", return_value=[]) - @patch("web.catalog.get_last_user_visit_list", return_value=[]) - @patch("web.catalog.get_last_user_visit_cookies", return_value=[]) + def test_catalog_profile_groups_and_sorts_profiles( self, - mocked_cookies, - mocked_last_visits, - mocked_all_visits, ): """Каталог должен группировать профили по производителю и сохранять сортировку.""" self._create_profile(name="Alpha Basic", brief="Альфа База", manufacturer="Альфа", days_ago=5) @@ -224,20 +208,9 @@ class CatalogProfileViewTests(TestCase): # Проверяем итоговые счетчики и структуру контекста. self.assertEqual(context["CATALOG_MANUFACT_NUM"], 2) self.assertEqual(context["CATALOG_PROFILE_NUM"], "4 профиля") - self.assertEqual(context["LAST_VISIT"], []) - self.assertEqual(context["LOG_VISIT"], []) - self.assertTrue(mocked_cookies.called) - self.assertTrue(mocked_last_visits.called) - self.assertTrue(mocked_all_visits.called) - @patch("web.catalog.get_last_all_user_visit_list", return_value=[]) - @patch("web.catalog.get_last_user_visit_list", return_value=[]) - @patch("web.catalog.get_last_user_visit_cookies", return_value=[]) def test_catalog_profile_model_redirects_to_canonical_url( self, - mocked_cookies, - mocked_last_visits, - mocked_all_visits, ): """При неверных slug страница должна отправлять на канонический URL.""" profile = self._create_profile(name="Alpha Basic", brief="Альфа База", manufacturer="Альфа", days_ago=5) @@ -248,14 +221,8 @@ class CatalogProfileViewTests(TestCase): self.assertEqual(response.status_code, 302) self.assertEqual(response["Location"], f"/catalog/profile/{profile.id}-alfa/{profile.id}-alpha-basic") - @patch("web.catalog.get_last_all_user_visit_list", return_value=[]) - @patch("web.catalog.get_last_user_visit_list", return_value=[]) - @patch("web.catalog.get_last_user_visit_cookies", return_value=[]) def test_catalog_profile_model_renders_related_data( self, - mocked_cookies, - mocked_last_visits, - mocked_all_visits, ): """Карточка профиля должна собираться через ORM и отдавать все ключевые блоки.""" profile, sibling, brand, blog = self._create_catalog_profile_model_fixture() @@ -287,7 +254,4 @@ class CatalogProfileViewTests(TestCase): self.assertEqual(context["IMG_FOR_BLOG"], blog.sImgForBlogSocial) self.assertEqual(context["PUB_DAT"].date(), blog.dPostDataModify.date()) self.assertEqual(context["LIST_OTHER"], ["Контур:2", "Цвет:Белый"]) - self.assertTrue(mocked_cookies.called) - self.assertTrue(mocked_last_visits.called) - self.assertTrue(mocked_all_visits.called) diff --git a/oknardia/web/views.py b/oknardia/web/views.py index f3ca3de..edfe6e3 100644 --- a/oknardia/web/views.py +++ b/oknardia/web/views.py @@ -16,7 +16,7 @@ import pytils def main_init(request: HttpRequest) -> HttpResponse: - """ Главная страница (статичная, только с проверками куков) + """ Главная страница (статичная, только с проверками кук) :param request: входящий http-запрос :return response: исходящий http-ответ @@ -28,22 +28,6 @@ def main_init(request: HttpRequest) -> HttpResponse: # стоят куки, и это не первый визит num_viz = request.COOKIES["NumVisit"] # читаем число визитов num_viz = int(num_viz) + 1 # увеличиваем порядковый номер визитов - # ПРОВЕРЯЧЕМ КУКИ ПРОСМОТРЕ ЦЕНОВЫХ ПРЕДЛОЖЕНИЙ - if "LastVisit" in request.COOKIES: - # стоят куки - last_visit = json.loads(request.COOKIES["LastVisit"]) - last_visit2 = [] - for i in last_visit: - last_visit2.append({ - "Time": datetime.datetime.fromtimestamp(i["Time"]), - "LastURL": i["LastURL"], - "LastAddress": i["LastAddress"], - "LastApart": i["LastApart"] - }) - to_template.update({'LAST_VISIT': last_visit2[:3]}) - else: - to_template.update({'LAST_VISIT': None}) - to_template.update({'META_DOCUMENT_STATE': u"Static"}) # Эта страничка статичная (в шаблон) to_template.update({'NV': num_viz}) # to_template.update(csrf(request)) # токен, для метода POST и GET response = render(request, "index.html", to_template) diff --git a/public/static/js/track_user_visit.js b/public/static/js/track_user_visit.js new file mode 100644 index 0000000..1776e8d --- /dev/null +++ b/public/static/js/track_user_visit.js @@ -0,0 +1,98 @@ +/** + * Логика записи визитов пользователя в cookies. + * Отслеживает последние посещения страниц с ценовой выдачей. + * + * Используемые данные из HTML: + * - data-current-url: текущий URL страницы + * - data-address: адрес здания + * - data-apart: тип квартиры + * + * Сохраняет в куку 'LastVisit' максимум 3 последних визита в формате JSON. + */ + +function trackUserVisit(currentUrl, address, apart) { + // Функция для получения значения куки по имени + function getCookieValue(name) { + try { + if (document.cookie) { + const cookies = document.cookie.split('; '); + for (let cookie of cookies) { + const [cookieName, cookieValue] = cookie.split('='); + if (cookieName === name) { + return decodeURIComponent(cookieValue); + } + } + } + } catch (e) { + console.warn('Ошибка при чтении куки:', e); + } + return null; + } + + // Функция для установки куки с заданным сроком жизни + function setCookie(name, value, maxAge) { + try { + const cookieValue = encodeURIComponent(value); + let cookieString = `${name}=${cookieValue}; path=/`; + if (maxAge) { + cookieString += `; max-age=${maxAge}`; + } + document.cookie = cookieString; + } catch (e) { + console.warn('Ошибка при установке куки:', e); + } + } + + // Получаем последние визиты из куки (если есть) + let lastVisits = []; + const cookieValue = getCookieValue('LastVisit'); + if (cookieValue) { + try { + lastVisits = JSON.parse(cookieValue); + } catch (e) { + console.warn('Ошибка при разборе JSON из куки LastVisit:', e); + lastVisits = []; + } + } + + // Создаём новый item посещения с текущей информацией + const newItem = { + LastURL: currentUrl, + LastAddress: address, + LastApart: apart, + Time: performance.now() // используем performance.now() как аналог time.perf_counter() в Python + }; + + // Добавляем новый item в начало списка + lastVisits.unshift(newItem); + + // Оставляем максимум 3 последних записи + lastVisits = lastVisits.slice(0, 4); + + // Упаковываем в JSON (JSON.stringify без пробелов для компактности) + const jsonData = JSON.stringify(lastVisits); + + // Устанавливаем куки на 91 день (7862400 секунд) + setCookie('LastVisit', jsonData, 7862400); +} + +/** + * Инициализация отслеживания при загрузке документа. + * Ищет элемент с атрибутами data-current-url, data-address, data-apart + * и вызывает trackUserVisit с полученными значениями. + */ +document.addEventListener('DOMContentLoaded', function() { + // Ищем элемент со встроенными данными (например, скрытый div в шаблоне) + const trackingElement = document.querySelector('[data-current-url]'); + + if (trackingElement) { + const currentUrl = trackingElement.getAttribute('data-current-url'); + const address = trackingElement.getAttribute('data-address'); + const apart = trackingElement.getAttribute('data-apart'); + + if (currentUrl && address && apart) { + trackUserVisit(currentUrl, address, apart); + } + } +}); + From b74e70e4f74cabac35bedc4940f3722e4dd99934 Mon Sep 17 00:00:00 2001 From: erjemin Date: Sat, 9 May 2026 21:43:13 +0300 Subject: [PATCH 056/102] =?UTF-8?q?mod:=20JS=20=D0=B2=D1=8B=D0=BD=D0=B5?= =?UTF-8?q?=D1=81=D0=B5=D0=BD=20=D0=B2=D0=BE=20=D0=B2=D0=BD=D0=B5=D1=88?= =?UTF-8?q?=D0=BD=D0=B8=D0=B9=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../report/report_last_user_visit.html | 69 +------------------ public/static/js/last_user_visit.js | 55 +++++++++++++++ 2 files changed, 58 insertions(+), 66 deletions(-) create mode 100644 public/static/js/last_user_visit.js diff --git a/oknardia/templates/report/report_last_user_visit.html b/oknardia/templates/report/report_last_user_visit.html index 727eede..1a490e7 100755 --- a/oknardia/templates/report/report_last_user_visit.html +++ b/oknardia/templates/report/report_last_user_visit.html @@ -1,71 +1,8 @@ - +{% load static %}
- + diff --git a/public/static/js/last_user_visit.js b/public/static/js/last_user_visit.js new file mode 100644 index 0000000..793df58 --- /dev/null +++ b/public/static/js/last_user_visit.js @@ -0,0 +1,55 @@ +/** + * Отслеживание последних визитов пользователя из браузерных кук. + * Читает куку 'LastVisit', парсит JSON и выводит список ссылок на уже просмотренные ценовые отчёты. + */ +document.addEventListener('DOMContentLoaded', function() { + // Функция для получения значения куки по имени + function getCookieValue(name) { + try { + if (document.cookie) { + const cookies = document.cookie.split('; '); + for (let cookie of cookies) { + const [cookieName, cookieValue] = cookie.split('='); + if (cookieName === name) { + return decodeURIComponent(cookieValue); + } + } + } + } catch (e) { + console.warn('Ошибка при чтении куки LastVisit:', e); + } + return null; + } + + // Получаем куку с визитами + const cookieValue = getCookieValue('LastVisit'); + if (cookieValue) { + try { + const visits = JSON.parse(cookieValue); + // Проверяем, есть ли визиты + if (visits && visits.length > 0) { + const listContainer = document.getElementById('last_visits_list'); + const lastUserVisitContainer = document.getElementById('last_user_visit_container'); + // Очищаем список перед заполнением + listContainer.innerHTML = ''; + // При перезагрузке страницы текущий визит уже записан, поэтому пропускаем первый + const visitsToShow = visits.slice(1); + // Выводим предыдущие визиты (не текущий) + for (let i = 0; i < visitsToShow.length; i++) { + const item = visitsToShow[i]; + const li = document.createElement('li'); + // Форматируем текст ссылки: адрес (тип квартиры) + const linkText = `Цены на окна для серии ${item.LastApart} (${item.LastAddress})`; + li.innerHTML = `${linkText}`; + listContainer.appendChild(li); + } + // Если есть данные для отображения, показываем блок + if (visitsToShow.length > 0) { + lastUserVisitContainer.style.display = 'block'; + } + } + } catch (e) { + console.warn('Ошибка при разборе JSON из кук LastVisit:', e); + } + } +}); \ No newline at end of file From ece99a398ef02db5f88104fe85cc6bbec02ae41a Mon Sep 17 00:00:00 2001 From: erjemin Date: Sat, 9 May 2026 21:53:49 +0300 Subject: [PATCH 057/102] =?UTF-8?q?del:=20=D0=BB=D0=B8=D1=88=D0=BD=D0=B8?= =?UTF-8?q?=D0=B9=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oknardia/templates/index.html | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/oknardia/templates/index.html b/oknardia/templates/index.html index d854a62..8a27e04 100755 --- a/oknardia/templates/index.html +++ b/oknardia/templates/index.html @@ -7,10 +7,7 @@ {% block Keywords %}Цены на окна, цены на пластиковые окна, стоимость замены окон, пластиковые окна в квартиру, скидки на пластиковые окна, окна в квартиру, размеры окон, скидки на пластиковые окна, характеристики пластиковых окон, окна в панельный дом, окна в блочный дом.{% endblock %} -{% block Top_JS1 %}{# comment #} -{# endcomment #} +{% block Top_JS1 %} {% endblock %} From 71c8bbc9eae79806ec6b4c10d67d05cb61d0cfdf Mon Sep 17 00:00:00 2001 From: erjemin Date: Sun, 10 May 2026 14:53:15 +0300 Subject: [PATCH 058/102] =?UTF-8?q?del:=20=D0=BB=D0=B8=D1=88=D0=BD=D0=B8?= =?UTF-8?q?=D0=B9=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/static/js/geo.js | 360 ---------------------------------------- 1 file changed, 360 deletions(-) delete mode 100755 public/static/js/geo.js diff --git a/public/static/js/geo.js b/public/static/js/geo.js deleted file mode 100755 index 9ed5c1c..0000000 --- a/public/static/js/geo.js +++ /dev/null @@ -1,360 +0,0 @@ -//****NOTE*****: SEE THIS NOTE REGARDING the 404 -//http://code.google.com/p/geo-location-javascript/issues/detail?id=48 - -// Copyright 2007, Google Inc. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// 3. Neither the name of Google Inc. nor the names of its contributors may be -// used to endorse or promote products derived from this software without -// specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Sets up google.gears.*, which is *the only* supported way to access Gears. -// -// Circumvent this file at your own risk! -// -// In the future, Gears may automatically define google.gears.* without this -// file. Gears may use these objects to transparently fix bugs and compatibility -// issues. Applications that use the code below will continue to work seamlessly -// when that happens. - -(function() { - // We are already defined. Hooray! - if (window.google && google.gears) { - return; - } - - var factory = null; - - // Firefox - if (typeof(GearsFactory)!= 'undefined') { - factory = new GearsFactory(); - } else { - // IE - try { - factory = new ActiveXObject('Gears.Factory'); - // privateSetGlobalObject is only required and supported on IE Mobile on - // WinCE. - if (factory.getBuildInfo().indexOf('ie_mobile') != -1) { - factory.privateSetGlobalObject(this); - } - } catch (e) { - // Safari - if ((typeof(navigator.mimeTypes) != 'undefined') - && navigator.mimeTypes["application/x-googlegears"]) { - factory = document.createElement("object"); - factory.style.display = "none"; - factory.width = 0; - factory.height = 0; - factory.type = "application/x-googlegears"; - document.documentElement.appendChild(factory); - if(factory && (typeof(factory.create) == 'undefined')) { - // If NP_Initialize() returns an error, factory will still be created. - // We need to make sure this case doesn't cause Gears to appear to - // have been initialized. - factory = null; - } - } - } - } - - // *Do not* define any objects if Gears is not installed. This mimics the - // behavior of Gears defining the objects in the future. - if (!factory) { - return; - } - - // Now set up the objects, being careful not to overwrite anything. - // - // Note: In Internet Explorer for Windows Mobile, you can't add properties to - // the window object. However, global objects are automatically added as - // properties of the window object in all browsers. - if (!window.google) { - google = {}; - } - - if (!google.gears) { - google.gears = {factory: factory}; - } -})(); - -// -//geo-location-javascript v0.4.8 -//http://code.google.com/p/geo-location-javascript/ -// -//Copyright (c) 2009 Stan Wiechers -//Licensed under the MIT licenses. -// -//Revision: $Rev$: -//Author: $Author$: -//Date: $Date$: -// -var bb_success; -var bb_error; -var bb_blackberryTimeout_id=-1; - -function handleBlackBerryLocationTimeout() -{ - if(bb_blackberryTimeout_id!=-1) - { - bb_error({message:"Timeout error", code:3}); - } -} -function handleBlackBerryLocation() -{ - clearTimeout(bb_blackberryTimeout_id); - bb_blackberryTimeout_id=-1; - if (bb_success && bb_error) - { - if(blackberry.location.latitude==0 && blackberry.location.longitude==0) - { - //http://dev.w3.org/geo/api/spec-source.html#position_unavailable_error - //POSITION_UNAVAILABLE (numeric value 2) - bb_error({message:"Position unavailable", code:2}); - } - else - { - var timestamp=null; - //only available with 4.6 and later - //http://na.blackberry.com/eng/deliverables/8861/blackberry_location_568404_11.jsp - if (blackberry.location.timestamp) - { - timestamp=new Date(blackberry.location.timestamp); - } - bb_success({timestamp:timestamp, coords: {latitude:blackberry.location.latitude,longitude:blackberry.location.longitude}}); - } - //since blackberry.location.removeLocationUpdate(); - //is not working as described http://na.blackberry.com/eng/deliverables/8861/blackberry_location_removeLocationUpdate_568409_11.jsp - //the callback are set to null to indicate that the job is done - - bb_success = null; - bb_error = null; - } -} - -var geo_position_js=function() { - - var pub = {}; - var provider=null; - var u="undefined"; - - pub.showMap = function(latitude,longitude) - { - if(typeof(blackberry)!=u) - { - blackberry.launch.newMap({"latitude":latitude*100000,"longitude":-longitude*100000}); - } - else - { - window.location="http://maps.google.com/maps?q=loc:"+latitude+","+longitude; - } - } - - - pub.getCurrentPosition = function(success,error,opts) - { - provider.getCurrentPosition(success, error,opts); - } - - - pub.init = function() - { - try - { - if (typeof(geo_position_js_simulator)!=u) - { - provider=geo_position_js_simulator; - } - else if (typeof(bondi)!=u && typeof(bondi.geolocation)!=u) - { - provider=bondi.geolocation; - } - else if (typeof(navigator.geolocation)!=u) - { - provider=navigator.geolocation; - pub.getCurrentPosition = function(success, error, opts) - { - function _success(p) - { - //for mozilla geode,it returns the coordinates slightly differently - if(typeof(p.latitude)!=u) - { - success({timestamp:p.timestamp, coords: {latitude:p.latitude,longitude:p.longitude}}); - } - else - { - success(p); - } - } - provider.getCurrentPosition(_success,error,opts); - } - } - else if(typeof(window.blackberry)!=u && blackberry.location.GPSSupported) - { - - // set to autonomous mode - if(typeof(blackberry.location.setAidMode)==u) - { - return false; - } - blackberry.location.setAidMode(2); - //override default method implementation - pub.getCurrentPosition = function(success,error,opts) - { - //alert(parseFloat(navigator.appVersion)); - //passing over callbacks as parameter didn't work consistently - //in the onLocationUpdate method, thats why they have to be set - //outside - bb_success=success; - bb_error=error; - //function needs to be a string according to - //http://www.tonybunce.com/2008/05/08/Blackberry-Browser-Amp-GPS.aspx - if(opts['timeout']) - { - bb_blackberryTimeout_id=setTimeout("handleBlackBerryLocationTimeout()",opts['timeout']); - } - else - //default timeout when none is given to prevent a hanging script - { - bb_blackberryTimeout_id=setTimeout("handleBlackBerryLocationTimeout()",60000); - } - blackberry.location.onLocationUpdate("handleBlackBerryLocation()"); - blackberry.location.refreshLocation(); - } - provider=blackberry.location; - } - else if(typeof(window.google)!="undefined" && typeof(google.gears)!="undefined") - { - provider=google.gears.factory.create('beta.geolocation'); - pub.getCurrentPosition = function(successCallback, errorCallback, options) - { - function _successCallback(p) - { - if(typeof(p.latitude)!="undefined") - { - successCallback({timestamp:p.timestamp, coords: {latitude:p.latitude,longitude:p.longitude}}); - } - else - { - successCallback(p); - } - } - provider.getCurrentPosition(_successCallback,errorCallback,options); - } - - } - else if ( typeof(Mojo) !=u && typeof(Mojo.Service.Request)!="Mojo.Service.Request") - { - provider=true; - pub.getCurrentPosition = function(success, error, opts) - { - - parameters={}; - if(opts) - { - //http://developer.palm.com/index.php?option=com_content&view=article&id=1673#GPS-getCurrentPosition - if (opts.enableHighAccuracy && opts.enableHighAccuracy==true) - { - parameters.accuracy=1; - } - if (opts.maximumAge) - { - parameters.maximumAge=opts.maximumAge; - } - if (opts.responseTime) - { - if(opts.responseTime<5) - { - parameters.responseTime=1; - } - else if (opts.responseTime<20) - { - parameters.responseTime=2; - } - else - { - parameters.timeout=3; - } - } - } - - - r=new Mojo.Service.Request('palm://com.palm.location', { - method:"getCurrentPosition", - parameters:parameters, - onSuccess: function(p){success({timestamp:p.timestamp, coords: {latitude:p.latitude, longitude:p.longitude,heading:p.heading}});}, - onFailure: function(e){ - if (e.errorCode==1) - { - error({code:3,message:"Timeout"}); - } - else if (e.errorCode==2) - { - error({code:2,message:"Position unavailable"}); - } - else - { - error({code:0,message:"Unknown Error: webOS-code"+errorCode}); - } - } - }); - } - - } - else if (typeof(device)!=u && typeof(device.getServiceObject)!=u) - { - provider=device.getServiceObject("Service.Location", "ILocation"); - - //override default method implementation - pub.getCurrentPosition = function(success, error, opts) - { - function callback(transId, eventCode, result) { - if (eventCode == 4) - { - error({message:"Position unavailable", code:2}); - } - else - { - //no timestamp of location given? - success({timestamp:null, coords: {latitude:result.ReturnValue.Latitude, longitude:result.ReturnValue.Longitude, altitude:result.ReturnValue.Altitude,heading:result.ReturnValue.Heading}}); - } - } - //location criteria - var criteria = new Object(); - criteria.LocationInformationClass = "BasicLocationInformation"; - //make the call - provider.ILocation.GetLocation(criteria,callback); - } - } - - } - catch (e){ - if(typeof(console)!=u) - { - console.log(e); - } - return false; - } - return provider!=null; - } - - - return pub; -}(); \ No newline at end of file From b615d2caa4c36013ac06906320bbf52fa95c848d Mon Sep 17 00:00:00 2001 From: erjemin Date: Sun, 10 May 2026 14:53:45 +0300 Subject: [PATCH 059/102] =?UTF-8?q?fix:=20=D0=9F=D0=BE=D0=BA=D0=B0=D0=B7?= =?UTF-8?q?=D1=8B=D0=B2=D0=B0=D1=82=D1=8C=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BD?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=B3=D0=B4=D0=B0=20=D0=B5=D1=81=D1=82=D1=8C=20?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=D0=B8=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oknardia/templates/base.html | 2 +- oknardia/templates/user_manager/login-logout.html | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/oknardia/templates/base.html b/oknardia/templates/base.html index 215c975..f28fb71 100755 --- a/oknardia/templates/base.html +++ b/oknardia/templates/base.html @@ -88,7 +88,7 @@
  • Обратная связь
  • - + {% endblock %} diff --git a/oknardia/templates/user_manager/login-logout.html b/oknardia/templates/user_manager/login-logout.html index b034419..d9ee54b 100755 --- a/oknardia/templates/user_manager/login-logout.html +++ b/oknardia/templates/user_manager/login-logout.html @@ -11,8 +11,8 @@ LOGIN-LOGOUT на отдельный сервер. Даннеа Google reCAPTCHA: https://www.google.com/recaptcha/admin#site/319090428?setup -Публичный Ключ: 6Lf87gQTAAAAALmkG5ZsO0eJSvdSXcRvkxoPJCDB -Секретный ключ: 6Lf87gQTAAAAADlqsJQToiWqg7urOWPrbfG_9zJB +Публичный Ключ: cм. `.env` +Секретный ключ: cм. `.env` {% endcomment %} ||', - '', to_template["CONTENT"], 0, re.IGNORECASE))}) + content = to_template.get('CONTENT', '') + to_template.update({'TIZER': sanitize_slug(str(content))}) # получаем следующую по дате запись try: q1 = BlogPosts.objects.filter(dPostDataBegin__gt=q.dPostDataBegin, dPostDataBegin__lt=timezone.now(), bPublished=True, bArchive=False).order_by('dPostDataBegin')[0] - to_template.update({'FORW_HEADER_T': pytils.translit.slugify(safe_html_spec_symbols(q1.sPostHeader)).lower(), + to_template.update({'FORW_HEADER_T': sanitize_slug(q1.sPostHeader).lower(), 'FORW_ID': q1.id}) except(IndexError, ObjectDoesNotExist, BlogPosts.DoesNotExist): to_template.update({'FORW_DISABLE': True}) @@ -181,7 +179,7 @@ def blog_post(request: HttpRequest, post_id: str = "0", page_back: str = None) - try: q1 = BlogPosts.objects.filter(dPostDataBegin__lt=q.dPostDataBegin, bPublished=True, bArchive=False).order_by('-dPostDataBegin')[0] - to_template.update({'BACK_HEADER_T': pytils.translit.slugify(safe_html_spec_symbols(q1.sPostHeader)).lower(), + to_template.update({'BACK_HEADER_T': sanitize_slug(q1.sPostHeader).lower(), 'BACK_ID': q1.id}) except(IndexError, ObjectDoesNotExist, BlogPosts.DoesNotExist): to_template.update({'BACK_DISABLE': True}) diff --git a/oknardia/web/catalog.py b/oknardia/web/catalog.py index 484b326..20dde2d 100644 --- a/oknardia/web/catalog.py +++ b/oknardia/web/catalog.py @@ -1,12 +1,11 @@ # -*- coding: utf-8 -*- import time -import pytils.translit from django.http import HttpRequest, HttpResponse from django.shortcuts import render, redirect from oknardia.models import Seria_Info, SetKit -from web.add_func import get_rating_set_for_stars +from web.add_func import get_rating_set_for_stars, sanitize_slug from web.report1 import get_last_all_user_visit_list, get_last_user_visit_list @@ -32,7 +31,7 @@ def catalog_sets(request: HttpRequest) -> HttpResponse: Для каждого набора собирается dict с полями набора, профиля, стеклопакета и компании-установщика. Цепочка FK: SetKit.kSet2User → OurUser.kMerchantOffice → MerchantOffice.kMerchantName (MerchantBrand). - Слаги URL формируются через pytils.translit.slugify. + Слаги URL формируются через sanitize_slug. :param request: HttpRequest -- входящий http-запрос :return response: HttpResponse -- исходящий http-ответ @@ -69,15 +68,13 @@ def catalog_sets(request: HttpRequest) -> HttpResponse: 'glazing': glazing, # компания-установщик 'merchant_id': brand.id if brand else None, - 'merchant_slug': pytils.translit.slugify(brand.sMerchantName) if brand else "", + 'merchant_slug': sanitize_slug(brand.sMerchantName) if brand else "", 'merchant_name': brand.sMerchantName if brand else "", 'merchant_logo': str(brand.pMerchantLogo) if brand and brand.pMerchantLogo else "", 'merchant_url': brand.sMerchantMainURL if brand else "", # слаги для ссылок на профиль в каталоге профилей - 'profile_manufacturer_slug': pytils.translit.slugify( - profile.sProfileManufacturer) if profile else "", - 'profile_slug': pytils.translit.slugify( - profile.sProfileName) if profile else "", + 'profile_manufacturer_slug': sanitize_slug(profile.sProfileManufacturer) if profile else "", + 'profile_slug': sanitize_slug(profile.sProfileName) if profile else "", }) to_template: dict[str, object] = { @@ -99,7 +96,7 @@ def report_all_info_seria_redirect(request: HttpRequest, seria_id: str = "12") - seria_id = int(seria_id) q_seria = Seria_Info.objects.get(id=seria_id) if q_seria.id == q_seria.kRoot_id: - return redirect("f/catalog/seria/{pytils.translit.slugify(q_seria.sName)}/all{seria_id}") + return redirect(f"/catalog/seria/{sanitize_slug(q_seria.sName)}/all{seria_id}") except (Seria_Info.DoesNotExist, ValueError): return redirect("/catalog/seria") return redirect("/catalog/seria") diff --git a/oknardia/web/catalog_companies.py b/oknardia/web/catalog_companies.py index 8d0005b..a8cea76 100644 --- a/oknardia/web/catalog_companies.py +++ b/oknardia/web/catalog_companies.py @@ -17,8 +17,8 @@ from oknardia.models import ( SetKit, PriceOffer, ) -from web.report1 import get_last_all_user_visit_list, get_last_user_visit_list -from web.add_func import get_rating_set_for_stars +from web.report1 import get_last_all_user_visit_list +from web.add_func import get_rating_set_for_stars, sanitize_slug import django.utils.dateformat import time import random @@ -131,12 +131,10 @@ def _format_company_for_template(company_data: dict) -> dict: dict: Отформатированные данные компании """ formatted = company_data.copy() - # Вычисляем звёзды на основе рейтинга formatted['STARS'] = get_rating_set_for_stars( formatted['RatingAVG'] ) - # Применяем правильные формы множественного числа formatted['NumSets'] = pytils.numeral.get_plural( formatted['NumSets'], @@ -146,7 +144,6 @@ def _format_company_for_template(company_data: dict) -> dict: formatted['NumOffers'], "вариант, варианта, вариантов" ) - # Конвертируем время последнего обновления в читаемый формат if formatted['lastUpdate']: timestamp = int( @@ -158,12 +155,8 @@ def _format_company_for_template(company_data: dict) -> dict: formatted['lastUpdate'] = pytils.dt.distance_of_time_in_words( timestamp ) - # Генерируем slug из имени компании для URL - formatted['sMerchantMainURL'] = pytils.translit.slugify( - formatted['sMerchantName'] - ) - + formatted['sMerchantMainURL'] = sanitize_slug(formatted['sMerchantName']) return formatted @@ -387,11 +380,11 @@ def _format_set_for_template(set_data: dict, empty_values: list) -> dict: 'iProfileCameras': profile.iProfileCameras, 'sProfileName': { 'NAME': profile.sProfileName, - 'NAME_T': pytils.translit.slugify(profile.sProfileName) + 'NAME_T': sanitize_slug(profile.sProfileName) }, 'sProfileManufacturer': { 'NAME': profile.sProfileManufacturer, - 'NAME_T': pytils.translit.slugify(profile.sProfileManufacturer) + 'NAME_T': sanitize_slug(profile.sProfileManufacturer) }, 'sProfileColor': profile.sProfileColor, 'sProfileSealDescription': profile.sProfileSealDescription, @@ -482,7 +475,7 @@ def catalog_company_detail( raise Http404("Компания не найдена") # Проверяем что slug совпадает (для SEO и красивых URL) - actual_slug = pytils.translit.slugify(company.sMerchantName) + actual_slug = sanitize_slug(company.sMerchantName) if actual_slug != company_name_slug: return redirect( f'/catalog/company/{company_id_int}-{actual_slug}' diff --git a/oknardia/web/catalog_openings.py b/oknardia/web/catalog_openings.py index e5bced4..3f02a9d 100644 --- a/oknardia/web/catalog_openings.py +++ b/oknardia/web/catalog_openings.py @@ -3,20 +3,14 @@ from django.db.models import F from django.shortcuts import render from django.http import HttpRequest, HttpResponse from oknardia.models import MountDim2Apartment -from web.report1 import get_last_all_user_visit_list, get_last_user_visit_list -from web.add_func import get_flaps_for_mini_pictures +from web.report1 import get_last_all_user_visit_list +from web.add_func import get_flaps_for_mini_pictures, sanitize_slug import time -import pytils from typing import Any from itertools import groupby from operator import itemgetter -def _make_slug(value: str) -> str: - """Транслитерирует строку в slug (pytils).""" - return pytils.translit.slugify(value) - - def _append_visit_context(to_template: dict, request: HttpRequest, time_start: float) -> None: """Дописывает в контекст стандартный хвост: визиты и время выполнения.""" to_template.update({ @@ -73,7 +67,7 @@ def standard_opening(request: HttpRequest) -> HttpResponse: serias_for_opening = [ { 'ID': row['kApartment__kSeria_id'], - 'NAME_T': _make_slug(row['kApartment__kSeria__sName']), + 'NAME_T': sanitize_slug(row['kApartment__kSeria__sName']), 'NAME': row['kApartment__kSeria__sName'], } for row in rows_for_opening diff --git a/oknardia/web/catalog_profiles.py b/oknardia/web/catalog_profiles.py index fa70c4f..0b9e701 100644 --- a/oknardia/web/catalog_profiles.py +++ b/oknardia/web/catalog_profiles.py @@ -7,8 +7,8 @@ from django.shortcuts import render, redirect from django.http import HttpRequest, HttpResponse from oknardia.settings import * from oknardia.models import Catalog2Profile, PVCprofiles, PriceOffer -from web.report1 import get_last_all_user_visit_list, get_last_user_visit_list -from web.add_func import normalize, get_rating_set_for_stars +from web.report1 import get_last_all_user_visit_list +from web.add_func import normalize, get_rating_set_for_stars, sanitize_slug import time import json import re @@ -17,19 +17,13 @@ import pytils # --------------------------------------------------------------------------- # Модульные хелперы, общие для всех вьюх этого файла # --------------------------------------------------------------------------- - -def make_slug(value: str) -> str: - """Транслитерирует строку в slug (pytils).""" - return pytils.translit.slugify(value).lower() - - def _merchant_row_to_dict(row: dict) -> dict: """Преобразует ORM-строку с данными партнёра в словарь для шаблона.""" merchant_name = row["kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__sMerchantName"] return { "MERCHANT_ID": row["kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__id"], "MERCHANT_NAME": merchant_name, - "MERCHANT_NAME_T": make_slug(merchant_name), + "MERCHANT_NAME_T": sanitize_slug(merchant_name), "MERCHANT_LOGO_URL": row["kOffer2SetKit__kSet2User__kMerchantOffice__kMerchantName__pMerchantLogo"], "MERCHANT_OFFERS": row["offers_by_merchant"], } @@ -40,7 +34,7 @@ def _profile_row_to_dict(profile: dict) -> dict: return { "PROFILE_NAME": profile["sProfileBriefDescription"], "PROFILE_ID": profile["id"], - "PROFILE_URL": make_slug(profile["sProfileName"]), + "PROFILE_URL": sanitize_slug(profile["sProfileName"]), "PROFILE_RATING": profile["fProfileRating"], "PROFILE_RATING_STARS": get_rating_set_for_stars(profile["fProfileRating"]), } @@ -94,11 +88,11 @@ def catalog_profile(request: HttpRequest) -> HttpResponse: list_profile_manufactures.append({ "PROF_MAN_ID": profile["id"], "PROF_MAN": profile["sProfileManufacturer"], - "PROF_MAN_T": make_slug(profile["sProfileManufacturer"]), + "PROF_MAN_T": sanitize_slug(profile["sProfileManufacturer"]), "PROF_MAN_LIST": [{ "PROF_NAME_ID": profile["id"], "PROF_NAME": profile["sProfileBriefDescription"], - "PROF_NAME_T": make_slug(profile["sProfileName"]), + "PROF_NAME_T": sanitize_slug(profile["sProfileName"]), }] }) else: @@ -106,7 +100,7 @@ def catalog_profile(request: HttpRequest) -> HttpResponse: list_profile_manufactures[-1]["PROF_MAN_LIST"].append({ "PROF_NAME_ID": profile["id"], "PROF_NAME": profile["sProfileBriefDescription"], - "PROF_NAME_T": make_slug(profile["sProfileName"]), + "PROF_NAME_T": sanitize_slug(profile["sProfileName"]), }) to_template.update({ @@ -128,17 +122,17 @@ def catalog_profile_model(request: HttpRequest, manufacture_id: int, manufacture :param request: HttpRequest -- входящий http-запрос :param manufacture_id: id профиля. Предполагается, что это первый id при сортировке по sProfileBriefDescription - :param manufacture_name: название производителя (транслитерированное pytils.translit.slugify()) + :param manufacture_name: название производителя (транслитерированное sanitize_slug()) :param model_id: id модели (марки) профиля - :param model_name: модель (марка) профиля (транслитерированное pytils.translit.slugify(sProfileName)) + :param model_name: модель (марка) профиля (транслитерированное sanitize_slug(sProfileName)) :return response: HttpResponse -- исходящий http-ответ """ time_start = time.perf_counter() manufacture_id = int(manufacture_id) model_id = int(model_id) q_pvc_by_id = PVCprofiles.objects.get(id=model_id) - manufacturer_slug = pytils.translit.slugify(q_pvc_by_id.sProfileManufacturer) - model_slug = pytils.translit.slugify(q_pvc_by_id.sProfileName) + manufacturer_slug = sanitize_slug(q_pvc_by_id.sProfileManufacturer) + model_slug = sanitize_slug(q_pvc_by_id.sProfileName) if manufacturer_slug != manufacture_name \ or model_slug != model_name \ or manufacture_id != model_id: @@ -268,21 +262,21 @@ def catalog_profile_manufacture(request: HttpRequest, manufacture_id: int, manuf :param request: HttpRequest -- входящий http-запрос :param manufacture_id: id профиля. Предполагается, что это первый id при сортировке по sProfileBriefDescription - :param manufacture_name: название производителя (транслитерированное pytils.translit.slugify()) + :param manufacture_name: название производителя (транслитерированное sanitize_slug()) :return response: HttpResponse -- исходящий http-ответ """ time_start = time.perf_counter() manufacture_id = int(manufacture_id) q_pvc_by_id = PVCprofiles.objects.get(id=manufacture_id) - if pytils.translit.slugify(q_pvc_by_id.sProfileManufacturer) != manufacture_name: + if sanitize_slug(q_pvc_by_id.sProfileManufacturer) != manufacture_name: return redirect(f'/catalog/profile/{manufacture_id}-' - f'{pytils.translit.slugify(q_pvc_by_id.sProfileManufacturer)}') + f'{sanitize_slug(q_pvc_by_id.sProfileManufacturer)}') else: q_pvc_by_id = PVCprofiles.objects.order_by('id') \ .filter(sProfileManufacturer=q_pvc_by_id.sProfileManufacturer).first() if q_pvc_by_id.id != manufacture_id: return redirect(f'/catalog/profile/{q_pvc_by_id.id}-' - f'{pytils.translit.slugify(q_pvc_by_id.sProfileManufacturer)}') + f'{sanitize_slug(q_pvc_by_id.sProfileManufacturer)}') to_template: dict[str, object] = {'CATALOG_MANUFACT': q_pvc_by_id.sProfileManufacturer, 'CATALOG_MAN2URL': manufacture_name, 'CATALOG_URL': f"{manufacture_id}-{manufacture_name}"} diff --git a/oknardia/web/catalog_series.py b/oknardia/web/catalog_series.py index 77129d0..021135f 100644 --- a/oknardia/web/catalog_series.py +++ b/oknardia/web/catalog_series.py @@ -14,18 +14,13 @@ from oknardia.models import ( Building_Info, ) from web.report1 import get_last_all_user_visit_list, get_last_user_visit_list -from web.add_func import get_flaps_for_big_pictures +from web.add_func import get_flaps_for_big_pictures, sanitize_slug import time import os import math import pytils -def _make_slug(value: str) -> str: - """Транслитерирует строку в slug (pytils).""" - return pytils.translit.slugify(value) - - def _append_visit_context(to_template: dict, request: HttpRequest, time_start: float) -> None: """Дописывает в контекст стандартный хвост: визиты и время выполнения.""" to_template.update({ @@ -54,7 +49,7 @@ def catalog_seria(request: HttpRequest) -> HttpResponse: 'ID': row['id'], 'URL': row['sURL2IMG'], 'NAME': row['sName'], - 'NAME_T': _make_slug(row['sName']), + 'NAME_T': sanitize_slug(row['sName']), } for row in q_seria ] @@ -87,8 +82,8 @@ def catalog_seria_info( try: seria_id = int(seria_id) q_seria = Seria_Info.objects.only("id", "kRoot_id", "sName").get(id=seria_id) - if q_seria.id != q_seria.kRoot_id or seria_name_translit != pytils.translit.slugify(q_seria.sName): - return redirect(f"/catalog/seria/{pytils.translit.slugify(q_seria.sName)}/all{seria_id}") + if q_seria.id != q_seria.kRoot_id or seria_name_translit != sanitize_slug(q_seria.sName): + return redirect(f"/catalog/seria/{sanitize_slug(q_seria.sName)}/all{seria_id}") except (ObjectDoesNotExist, ValueError): return redirect("/catalog/") @@ -295,7 +290,7 @@ def all_seria_nav(seria_id: int, q_seria) -> tuple[int, dict]: one_seria = { "SERIA_R": seria_name, "ID2URL": seria_id_value, - "SERIA_L": pytils.translit.slugify(seria_name), + "SERIA_L": sanitize_slug(seria_name), } if seria_id_value == seria_id: # Изображение серии: используется в OG-image в шаблоне seria_info @@ -309,7 +304,7 @@ def all_seria_nav(seria_id: int, q_seria) -> tuple[int, dict]: "THIS_SERIA_DESCRIPTION": seria_description, # ID и slug серии нужны для canonical URL и JSON-LD в шаблоне "THIS_SERIA_ID": seria_id_value, - "THIS_SERIA_NAME_T": pytils.translit.slugify(seria_name), + "THIS_SERIA_NAME_T": sanitize_slug(seria_name), # URL изображения серии для OG-тегов (путь относительно /media/) "THIS_SERIA_IMAGE_URL": str(seria_image) if seria_image else "", }) @@ -417,7 +412,7 @@ def seria_info_geo_code(seria_id: int | str = DEFAULT_SERIA_ID_FOR_CATALOG) -> d seria_to_geo.append({"LATITUDE": latitude, "LONGITUDE": longitude, "ADDR_ID": count["id"], - "ADDR_LAT": pytils.translit.slugify(count["sAddress"]), + "ADDR_LAT": sanitize_slug(count["sAddress"]), "ADDR_RUS": count["sAddress"], "SER_ID": count["kSeria_Link__kRoot_id"] }) diff --git a/oknardia/web/management/commands/generate_sitemaps.py b/oknardia/web/management/commands/generate_sitemaps.py index c658a1e..f789688 100644 --- a/oknardia/web/management/commands/generate_sitemaps.py +++ b/oknardia/web/management/commands/generate_sitemaps.py @@ -36,8 +36,7 @@ from oknardia.models import ( SetKit, Win_MountDim, ) -import pytils - +from web.add_func import sanitize_slug # Namespace схемы sitemap.xml по стандарту sitemaps.org. SITEMAP_XMLNS = "http://www.sitemaps.org/schemas/sitemap/0.9" @@ -138,7 +137,7 @@ class BuildingOffersSitemap(Sitemap): if not root_id: continue for apart_id in apartments_by_root.get(root_id, []): - yield (building.id, apart_id, pytils.translit.slugify(building.sAddress)) + yield (building.id, apart_id, sanitize_slug(building.sAddress)) def location(self, item: tuple[int, int, str]) -> str: build_id, apart_id, address_slug = item @@ -147,7 +146,7 @@ class BuildingOffersSitemap(Sitemap): building = Building_Info.objects.select_related('kSeria_Link__kRoot').get(id=build_id) seria = building.kSeria_Link.kRoot seria_id = seria.id - seria_slug = pytils.translit.slugify((seria.sName or "").strip()).lower() + seria_slug = sanitize_slug((seria.sName or "")) except Exception: # fallback на старый роутинг, если что-то пошло не так return f"/{build_id}/{apart_id}/{address_slug}" @@ -250,7 +249,7 @@ class BlogPostSitemap(Sitemap): ).only("id", "sPostHeader", "dPostDataModify") def location(self, item: BlogPosts) -> str: - return f"/blogpost/{item.id}/{pytils.translit.slugify(item.sPostHeader).lower()}" + return f"/blogpost/{item.id}/{sanitize_slug(item.sPostHeader)}" def lastmod(self, item: BlogPosts) -> date | datetime | None: return item.dPostDataModify @@ -270,7 +269,7 @@ class ProfileManufactureSitemap(Sitemap): ) def location(self, item: dict) -> str: - manufacturer_slug = pytils.translit.slugify(item["sProfileManufacturer"]).lower() + manufacturer_slug = sanitize_slug(item["sProfileManufacturer"]) return f"/catalog/profile/{item['first_id']}-{manufacturer_slug}" def lastmod(self, item: dict) -> date | datetime | None: @@ -287,8 +286,8 @@ class ProfileModelSitemap(Sitemap): return PVCprofiles.objects.only("id", "sProfileManufacturer", "sProfileName", "dProfileModify") def location(self, item: PVCprofiles) -> str: - manufacturer_slug = pytils.translit.slugify(item.sProfileManufacturer).lower() - model_slug = pytils.translit.slugify(item.sProfileName).lower() + manufacturer_slug = sanitize_slug(item.sProfileManufacturer) + model_slug = sanitize_slug(item.sProfileName) # Исторически канонический URL использует id модели и в сегменте manufacturer_id, и в segment model_id. return f"/catalog/profile/{item.id}-{manufacturer_slug}/{item.id}-{model_slug}" @@ -308,7 +307,7 @@ class SeriaDetailSitemap(Sitemap): ) def location(self, item: Seria_Info) -> str: - return f"/catalog/seria/{pytils.translit.slugify(item.sName).lower()}/all{item.id}" + return f"/catalog/seria/{sanitize_slug(item.sName)}/all{item.id}" def lastmod(self, item: Seria_Info) -> date | datetime | None: return item.dSeriaInfoModify @@ -329,7 +328,7 @@ class CompanyDetailSitemap(Sitemap): ) def location(self, item: MerchantBrand) -> str: - return f"/catalog/company/{item.id}-{pytils.translit.slugify(item.sMerchantName).lower()}" + return f"/catalog/company/{item.id}-{sanitize_slug(item.sMerchantName)}" def lastmod(self, item: MerchantBrand) -> date | datetime | None: return getattr(item, "last_offer_modify", None) or getattr(item, "last_office_modify", None) diff --git a/oknardia/web/management/commands/regenerate_seria_prerender.py b/oknardia/web/management/commands/regenerate_seria_prerender.py index 741c572..df25e2b 100644 --- a/oknardia/web/management/commands/regenerate_seria_prerender.py +++ b/oknardia/web/management/commands/regenerate_seria_prerender.py @@ -3,7 +3,6 @@ from __future__ import annotations from pathlib import Path -import pytils from django.conf import settings from django.core.management.base import BaseCommand, CommandError from django.db.models import F @@ -11,6 +10,7 @@ from django.test import RequestFactory from oknardia.models import Seria_Info from web import catalog_series +from web.add_func import sanitize_slug class Command(BaseCommand): @@ -76,7 +76,7 @@ class Command(BaseCommand): if target_file.exists(): target_file.unlink() - slug = pytils.translit.slugify(seria.sName) + slug = sanitize_slug(seria.sName) request = request_factory.get(f"/catalog/seria/{slug}/all{seria.id}") # В команде принудительно включаем «production-mode» для вьюхи, diff --git a/oknardia/web/prices.py b/oknardia/web/prices.py index 57e0ce6..837abd3 100644 --- a/oknardia/web/prices.py +++ b/oknardia/web/prices.py @@ -15,8 +15,8 @@ from oknardia.models import ( ) from oknardia.settings import * from web.report1 import get_last_all_user_visit_list, get_last_user_visit_list -from web.add_func import normalize, get_rating_set_for_stars, get_flaps_for_big_pictures, get_flaps_for_mini_pictures, \ - get_geo_distance +from web.add_func import get_rating_set_for_stars, get_flaps_for_big_pictures, get_flaps_for_mini_pictures, \ + get_geo_distance, sanitize_slug import django.utils.dateformat import time import os @@ -26,11 +26,6 @@ from types import SimpleNamespace import pytils -def _slugify_lower(value: str | None) -> str: - """Транслитерирует строку в slug и всегда приводит к нижнему регистру.""" - return pytils.translit.slugify((value or "").strip()).lower() - - def _one_win_price_canonical_path(win_width_mm: int | str, win_height_mm: int | str, win_id: int | str) -> str: """Возвращает канонический путь страницы цен для одного типового окна.""" return f"/catalog/standard_opening/price-{int(win_width_mm)}x{int(win_height_mm)}mm-tip{int(win_id)}/" @@ -271,9 +266,9 @@ def report_price_frame(apartment_id: int, mount_dim_per_offer: int, address_long 'GLAZING_TONING': offer.sGlazingToning, 'PVC_ID': offer.pwc_id, 'PVC_NAME': offer.sProfileName, - 'PVC_NAME_T': _slugify_lower(offer.sProfileName), + 'PVC_NAME_T': sanitize_slug(offer.sProfileName), 'PVC_MANUFACTURER': offer.sProfileManufacturer, - 'PVC_MANUFACTURER_T': _slugify_lower(offer.sProfileManufacturer), + 'PVC_MANUFACTURER_T': sanitize_slug(offer.sProfileManufacturer), 'PVC_SEAL': offer.sProfileSealDescription, 'SETS_CLIMATE_CONTROL': offer.sSetClimateControl, 'SETS_SILL': offer.sSetSill, @@ -530,9 +525,9 @@ def report_price_frame(apartment_id: int, mount_dim_per_offer: int, address_long 'GLAZING_TONING': i2.sGlazingToning, 'PVC_ID': i2.pwc_id, 'PVC_NAME': i2.sProfileName, - 'PVC_NAME_T': _slugify_lower(i2.sProfileName), + 'PVC_NAME_T': sanitize_slug(i2.sProfileName), 'PVC_MANUFACTURER': i2.sProfileManufacturer, - 'PVC_MANUFACTURER_T': _slugify_lower(i2.sProfileManufacturer), + 'PVC_MANUFACTURER_T': sanitize_slug(i2.sProfileManufacturer), 'PVC_SEAL': i2.sProfileSealDescription, 'SETS_CLIMATE_CONTROL': i2.sSetClimateControl, 'SETS_SILL': i2.sSetSill, @@ -710,7 +705,7 @@ def report_one_win_price(request: HttpRequest, list_seria_for_win.append(SimpleNamespace( id=seria_item['kApartment__kSeria__id'], sName=seria_name, - sNameLat=_slugify_lower(seria_name), + sNameLat=sanitize_slug(seria_name), num_variation_of_apartment=pytils.numeral.sum_string( seria_item['num_variation_of_apartment'], pytils.numeral.MALE, @@ -793,7 +788,7 @@ def report_price(request: HttpRequest, build_id: str = "22427", apart_id: str = # если кто-то нахимичит ID квартиры не для этого дома, то сделаем так, что он будет от этого дома! apart_inside = any(ap.id == apart_id for ap in list_apart) - address_slug = _slugify_lower(building.sAddress) + address_slug = sanitize_slug(building.sAddress) if not apart_inside or slug != address_slug: # Переадресация 302, если с apart_id (ID-квартиры нахимичили) или slug-ом. # Нужно для склейки парных URL в поисковиках @@ -867,7 +862,7 @@ def report_price(request: HttpRequest, build_id: str = "22427", apart_id: str = # узнаем базовую серию дома q_base_seria = building.kSeria_Link.kRoot - base_seria_slug = _slugify_lower(q_base_seria.sName) + base_seria_slug = sanitize_slug(q_base_seria.sName) to_template.update({'BASE_SERIA': q_base_seria.sName, 'BASE_SERIA_LAT': base_seria_slug, 'BASE_SERIA_ID': q_base_seria.id}) @@ -1015,8 +1010,8 @@ def report_price_new(request, seria_id, seria_slug, apart_id, address_id, addres except Exception: return redirect("/") # Проверяем slug'и, если не совпадает — делаем 301 на канонический URL (новый формат) - seria_slug_real = pytils.translit.slugify((seria.sName or "").strip()).lower() - address_slug_real = pytils.translit.slugify((building.sAddress or "").strip()).lower() + seria_slug_real = sanitize_slug((seria.sName or "").strip()).lower() + address_slug_real = sanitize_slug((building.sAddress or "").strip()).lower() if seria_slug != seria_slug_real or address_slug != address_slug_real: # Новый формат: /price/seriaID--/appartAD/addressID--/ return redirect(f"/price/seriaID{seria_id}--{seria_slug_real}/appartID{apart_id}/addressID{address_id}--{address_slug_real}/", permanent=True) @@ -1037,10 +1032,7 @@ def report_price_legacy_redirect(request, build_id, apart_id, slug): except Exception: return redirect("/") import pytils - seria_slug = pytils.translit.slugify((seria.sName or "").strip()).lower() - address_slug = pytils.translit.slugify((building.sAddress or "").strip()).lower() + seria_slug = sanitize_slug((seria.sName or "").strip()).lower() + address_slug = sanitize_slug((building.sAddress or "").strip()).lower() # Новый формат: /price/seriaID--/appartID/addressID--/ return redirect(f"/price/seriaID{seria.id}--{seria_slug}/appartID{apart_id}/addressID{build_id}--{address_slug}/", permanent=True) - seria_slug = pytils.translit.slugify((seria.sName or "").strip()).lower() - address_slug = pytils.translit.slugify((building.sAddress or "").strip()).lower() - return redirect(f"/price/seriaID{seria.id}--{seria_slug}/appartID{apart_id}/addressID{build_id}--{address_slug}/", permanent=True) diff --git a/oknardia/web/report1.py b/oknardia/web/report1.py index 5818843..14a3b99 100644 --- a/oknardia/web/report1.py +++ b/oknardia/web/report1.py @@ -7,7 +7,7 @@ from django.utils import timezone from django.db.models import F, Q, ExpressionWrapper, BooleanField, Max, Count, Avg from oknardia.models import LogVisitPriceReport, SetKit from oknardia.settings import * -from web.add_func import normalize, get_rating_set_for_stars, sum_through +from web.add_func import normalize, get_rating_set_for_stars, sum_through, sanitize_slug # from time import time import django.utils.dateformat import time @@ -290,7 +290,7 @@ def compare_offers(request: HttpRequest, to_compare: str = "1,2") -> HttpRespons "MERCHANT": i.sMerchantName, "MERCHANT_ID": i.MERCHANT_ID, "IS_COMMERCIAL": i.bCommercial, - "MERCHANT_T": pytils.translit.slugify(i.sMerchantName), + "MERCHANT_T": sanitize_slug(i.sMerchantName), "MERCHANT_URL": i.sMerchantMainURL, "MERCHANT_URL_SHOT": re.sub(r"(?:^https?://|/$|www\.)", "", i.sMerchantMainURL), "SET_NAME": i.sSetName, @@ -300,9 +300,9 @@ def compare_offers(request: HttpRequest, to_compare: str = "1,2") -> HttpRespons "RATING_SET_COLOR": rating_set_color, "PROFILE_ID": i.PROFILE_ID, "PROFILE_NAME": i.sProfileName, - "PROFILE_NAME_T": pytils.translit.slugify(i.sProfileName), + "PROFILE_NAME_T": sanitize_slug(i.sProfileName), "PROFILE_MANUFACTURER": i.sProfileManufacturer, - "PROFILE_MANUFACTURER_T": pytils.translit.slugify(i.sProfileManufacturer), + "PROFILE_MANUFACTURER_T": sanitize_slug(i.sProfileManufacturer), "PROFILE_NUM_COLOR": i.sProfileColor, "PROFILE_NUM_CAMERAS": i.iProfileCameras, # Число камер рамы/створки "PROFILE_NUM_CAMERAS_COLOR": _color_hi(profile_num_cameras, min_cameras, max_cameras, threshold=1), diff --git a/oknardia/web/report2.py b/oknardia/web/report2.py index 9a4515b..aa87ea6 100644 --- a/oknardia/web/report2.py +++ b/oknardia/web/report2.py @@ -3,7 +3,7 @@ from django.shortcuts import render, redirect from django.http import HttpRequest, HttpResponse from oknardia.models import PVCprofiles from oknardia.settings import * -from web.add_func import normalize, get_rating_set_for_stars +from web.add_func import normalize, get_rating_set_for_stars, sanitize_slug from time import time import json import pytils @@ -73,9 +73,9 @@ def profiles_rating(request: HttpRequest) -> HttpResponse: "ID": profile.id, "R_REAL": rating_real, "BRAND": profile.sProfileManufacturer, - "BRAND_URL": pytils.translit.slugify(profile.sProfileManufacturer), + "BRAND_URL": sanitize_slug(profile.sProfileManufacturer), "NAME": profile.sProfileName, - "NAME_URL": pytils.translit.slugify(profile.sProfileName), + "NAME_URL": sanitize_slug(profile.sProfileName), "K_ARR": k_arr, "RATING_STAR": get_rating_set_for_stars(profile.fProfileRating), "RATING_N": profile.fProfileRating, diff --git a/oknardia/web/views.py b/oknardia/web/views.py index edfe6e3..62e9a69 100644 --- a/oknardia/web/views.py +++ b/oknardia/web/views.py @@ -6,12 +6,8 @@ from django.db.models import ExpressionWrapper, FloatField, F, Count from django.db.models.functions import Abs from smtplib import SMTPException from oknardia.models import Seria_Info, Building_Info, Apartment_Type -from web.add_func import get_yandex_geocode_by_address, get_geo_distance -import json -import datetime +from web.add_func import get_yandex_geocode_by_address, get_geo_distance, sanitize_slug import time -import pytils - # from django.core.context_processors import csrf @@ -240,9 +236,9 @@ def get_address(request: HttpRequest) -> HttpResponse: to_template.update({ 'SERIA_BASE': q1.sName if q1 else "", 'BASE_SERIA_ID': seria_root.id if seria_root else "", - 'BASE_SERIA_LAT': pytils.translit.slugify((seria_root.sName or "").strip()).lower() if seria_root else "", + 'BASE_SERIA_LAT': sanitize_slug((seria_root.sName or "").strip()) if seria_root else "", 'addr': addr, - 'addr_T': pytils.translit.slugify(addr), + 'addr_T': sanitize_slug(addr), 'ticks': float(time.perf_counter() - time_start), }) return render(request, "popup/popup_show_apartment_variants.html", to_template) From bcc8c569705bd2071b536f473fcc573bf8263b4e Mon Sep 17 00:00:00 2001 From: erjemin Date: Mon, 11 May 2026 00:18:36 +0300 Subject: [PATCH 062/102] =?UTF-8?q?add:=20=D0=B0=D0=B2=D1=82=D0=BE=D0=B7?= =?UTF-8?q?=D0=B0=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20SEO-?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D0=B5=D0=B9=20=D0=B4=D0=BB=D1=8F=20=D0=B1?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oknardia/oknardia/models.py | 46 +++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/oknardia/oknardia/models.py b/oknardia/oknardia/models.py index 734a82a..4e9ec69 100644 --- a/oknardia/oknardia/models.py +++ b/oknardia/oknardia/models.py @@ -1064,6 +1064,52 @@ class BlogPosts(models.Model): def __str__(self): return self.__unicode__() + def save(self, *args, **kwargs): + """Переопределённый метод save() для автоматической генерации слага и SEO-полей. + + При сохранении записи блога: + - Генерируется sSlug из sPostHeader если тот пуст + - Генерируется sMetaDescription из текста контента (тизер) + - Генерируется sMetaKeywords из заголовка + """ + # Шаг 1: Автоматически генерируем слаг из заголовка, если он не указан + if not self.sSlug and self.sPostHeader: + from web.add_func import sanitize_slug + self.sSlug = sanitize_slug(self.sPostHeader, max_length=200) + + # Шаг 2: Автоматически генерируем sMetaDescription из контента (тизер) + if not self.sMetaDescription and self.sPostContent: + import re + from web.add_func import sanitize_slug + + # Удаляем теги из контента + content_clean = re.sub(r'', '', self.sPostContent, flags=re.IGNORECASE) + + # Генерируем тизер (очищенный текст без HTML) + tizer = sanitize_slug(content_clean, max_length=200) + + # Обрезаем до 160 символов для мета-description + if len(tizer) > 160: + # Обрезаем слово целиком (не посередине) + tizer = tizer[:160].rsplit(' ', 1)[0] + '...' if ' ' in tizer[:160] else tizer[:160] + + self.sMetaDescription = tizer + + # Шаг 3: Автоматически генерируем sMetaKeywords из заголовка + if not self.sMetaKeywords and self.sPostHeader: + from web.add_func import sanitize_slug + import re + + # Берём заголовок и удаляем HTML-теги + header_clean = re.sub(r'<[^>]+>', '', self.sPostHeader) + header_clean = header_clean.strip() + + # Генерируем ключевые слова: фиксированные + заголовок + fixed_keywords = u"oknardia, окнардия, блог, публикация" + self.sMetaKeywords = f"{fixed_keywords}, {header_clean}"[:256] + + super().save(*args, **kwargs) + class Meta: # db_table = "jtb_BlogPost" verbose_name = u"Запись в блоге каталоге" From 9f4b86a4180343880c398b07deb3cda4f77eb305 Mon Sep 17 00:00:00 2001 From: erjemin Date: Mon, 11 May 2026 00:45:22 +0300 Subject: [PATCH 063/102] =?UTF-8?q?add:=20Custom=20Management=20Command=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=B0=D0=B2=D1=82=D0=BE=D0=B7=D0=B0=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20SEO-=D0=B0=D1=82?= =?UTF-8?q?=D1=80=D0=B8=D0=B1=D1=83=D1=82=D0=BE=D0=B2=20=D0=B1=D0=BB=D0=BE?= =?UTF-8?q?=D0=B3=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MANAGEMENT_RUNBOOK.md | 115 ++++++++++- .../commands/populate_seo_fields.py | 189 ++++++++++++++++++ 2 files changed, 303 insertions(+), 1 deletion(-) create mode 100644 oknardia/web/management/commands/populate_seo_fields.py diff --git a/MANAGEMENT_RUNBOOK.md b/MANAGEMENT_RUNBOOK.md index 8c807a6..a758a58 100644 --- a/MANAGEMENT_RUNBOOK.md +++ b/MANAGEMENT_RUNBOOK.md @@ -10,7 +10,8 @@ ## Каталог команд 1. `generate_sitemaps` — оффлайн генерация sitemap-файлов. -2ю `regenerate_seria_prerender` — оффлайн пересборка pre-render шаблонов для `catalog_seria_info`. +2. `regenerate_seria_prerender` — оффлайн пересборка pre-render шаблонов для `catalog_seria_info`. +3. `populate_seo_fields` — автозаполнение SEO-полей блога из существующих данных. ## Общие правила запуска @@ -112,6 +113,118 @@ poetry run python oknardia/manage.py regenerate_seria_prerender --seria-id 843 - - после массового обновления данных серий/окон/квартир; - после очистки `seria_info/prepared/`. +## 3) Команда `populate_seo_fields` + +Назначение: +- автозаполнить SEO-поля (`sSlug`, `sMetaDescription`, `sMetaKeywords`) для всех существующих записей блога. + +Используется: +- при первом развертывании новой версии с автогенерацией SEO-полей; +- при восстановлении из бэкапа где SEO-поля пусты; +- при изменении логики автогенерации (с флагом `--force`). + +### Базовый запуск + +Заполнить только пустые SEO-поля (стандартный вариант): + +```bash +cd /Users/e-serg/PRJ/2022-oknardia +poetry run python oknardia/manage.py populate_seo_fields +``` + +### Параметры запуска + +**`--dry-run`** — только показать что будет сделано (без сохранения в БД): + +```bash +poetry run python oknardia/manage.py populate_seo_fields --dry-run +``` + +**`--force`** — переполнить ВСЕ SEO-поля, даже уже заполненные: + +```bash +poetry run python oknardia/manage.py populate_seo_fields --force +``` + +**`--clean`** — очистить все SEO-поля перед заполнением (для переделки): + +```bash +poetry run python oknardia/manage.py populate_seo_fields --clean +``` + +**Комбинация флагов** — сухой прогон переполнения всех полей: + +```bash +poetry run python oknardia/manage.py populate_seo_fields --dry-run --force +``` + +### Что заполняется + +| Поле | Источник | Результат | +|------|----------|-----------| +| `sSlug` | `sPostHeader` | URL-безопасный слаг (max 200 символов) | +| `sMetaDescription` | `sPostContent` | Первые 160 символов (исключая теги ``) | +| `sMetaKeywords` | `sPostHeader` | Заголовок + префикс "oknardia, окнардия, блог, публикация" (max 256 символов) | + +Пример результата: + +```python +sPostHeader = "Профиль Brusbox Super Aero" +↓ +sSlug = "profil-brusbox-super-aero" +sMetaDescription = "brusbox-super-aero-pyatikamernaya-profil-sistema..." +sMetaKeywords = "oknardia, окнардия, блог, публикация, Профиль Brusbox Super Aero" +``` + +### Когда запускать + +- **После первого развертывания** — заполнить SEO-поля всех 29 существующих постов одной командой. +- **Один раз** — команда идемпотентна (при повторном запуске не будет ничего менять, т.к. пустые поля остатся). +- **При изменении логики** — использовать `--clean --force` для полной переделки всех SEO-полей. + +### Пример полного сценария + +```bash +cd /Users/e-serg/PRJ/2022-oknardia + +# Шаг 1: Проверить что будет заполнено +poetry run python oknardia/manage.py populate_seo_fields --dry-run + +# Шаг 2: Если результат устраивает — запустить реально +poetry run python oknardia/manage.py populate_seo_fields + +# Шаг 3: Проверить что заполнилось +poetry run python oknardia/manage.py shell -c " +from oknardia.models import BlogPosts +posts = BlogPosts.objects.all() +print(f'Пусто sSlug: {posts.filter(sSlug=\"\").count()}') +print(f'Пусто sMetaDescription: {posts.filter(sMetaDescription=\"\").count()}') +print(f'Пусто sMetaKeywords: {posts.filter(sMetaKeywords=\"\").count()}') +" +``` + +### Возвращаемая информация + +``` +====================================================================== +ИТОГОВЫЙ ОТЧЕТ +====================================================================== + +✓ sSlug заполнено: 28 раз +✓ sMetaDescription заполнено: 28 раз +✓ sMetaKeywords заполнено: 28 раз +✓ Записей обновлено в БД: 28 +✗ Ошибок при обработке: 0 + +✅ Обновлено 28 записей успешно! +``` + +### Откат и безопасность + +- ✅ **Безопасна для повторного запуска** — пустые поля не изменяются при повторной работе. +- ✅ **Откат через SQL** — если нужно очистить, используй: `UPDATE oknardia_blogposts SET sSlug='', sMetaDescription='', sMetaKeywords='';` +- ✅ **Всегда используй `--dry-run`** перед первым запуском для проверки. + ## Оркестрация и reload веб-сервера Важно: diff --git a/oknardia/web/management/commands/populate_seo_fields.py b/oknardia/web/management/commands/populate_seo_fields.py new file mode 100644 index 0000000..605def7 --- /dev/null +++ b/oknardia/web/management/commands/populate_seo_fields.py @@ -0,0 +1,189 @@ +# -*- coding: utf-8 -*- +from __future__ import annotations + +""" +Management-команда для автозаполнения SEO-полей (sSlug, sMetaDescription, sMetaKeywords) +у всех существующих записей блога. + +Эта команда используется один раз при миграции на новую версию, +которая добавила автогенерацию SEO-полей в save() метод BlogPosts. + +Использование: + python manage.py populate_seo_fields + python manage.py populate_seo_fields --dry-run # только показать что будет сделано + python manage.py populate_seo_fields --clean # очистить все SEO-поля перед заполнением +""" + +import re +from datetime import datetime + +from django.core.management.base import BaseCommand +from django.utils import timezone + +from oknardia.models import BlogPosts +from web.add_func import sanitize_slug + + +class Command(BaseCommand): + help = "Автозаполняет SEO-поля (sSlug, sMetaDescription, sMetaKeywords) для всех записей блога" + + def add_arguments(self, parser): + parser.add_argument( + "--dry-run", + action="store_true", + help="Только показать, что будет сделано, без сохранения в БД", + ) + parser.add_argument( + "--clean", + action="store_true", + help="Очистить все SEO-поля перед заполнением (для переделки)", + ) + parser.add_argument( + "--force", + action="store_true", + help="Перезаполнить SEO-поля (даже если они уже содержат значения)", + ) + + def handle(self, *args, **options): + dry_run = options.get("dry_run", False) + clean = options.get("clean", False) + force = options.get("force", False) + + self.stdout.write(self.style.HTTP_INFO("=" * 70)) + self.stdout.write(self.style.HTTP_INFO("АВТОЗАПОЛНЕНИЕ SEO-ПОЛЕЙ БЛОГА")) + self.stdout.write(self.style.HTTP_INFO("=" * 70)) + + # Получаем все посты + posts_qs = BlogPosts.objects.all() + total_posts = posts_qs.count() + self.stdout.write(f"\n✓ Всего записей в блоге: {total_posts}") + + if total_posts == 0: + self.stdout.write(self.style.WARNING("⚠ Записей не найдено. Нечего заполнять.")) + return + + # Опционально очищаем + if clean and not dry_run: + self.stdout.write("\n🧹 Очищаем существующие SEO-поля...") + posts_qs.update(sSlug="", sMetaDescription="", sMetaKeywords="") + self.stdout.write(self.style.SUCCESS(" ✓ SEO-поля очищены")) + + # Фильтруем посты по пустым полям + if force: + filtered_posts = posts_qs + self.stdout.write(f"\n✓ Режим FORCE: будут переполнены ВСЕ {total_posts} записей") + else: + filtered_posts = posts_qs.filter( + sSlug="", # noqa: F841 + ) | posts_qs.filter(sMetaDescription="") | posts_qs.filter(sMetaKeywords="") + filtered_posts = posts_qs.filter( + sSlug="", + ) | posts_qs.filter(sMetaDescription="") | posts_qs.filter(sMetaKeywords="") + + posts_to_update = filtered_posts.count() + self.stdout.write(f"✓ Записей для обновления: {posts_to_update}") + + if posts_to_update == 0: + self.stdout.write(self.style.SUCCESS("\n✅ Все записи уже имеют заполненные SEO-поля!")) + return + + # Статистика по типам полей + stats = { + "sSlug": 0, + "sMetaDescription": 0, + "sMetaKeywords": 0, + "updated": 0, + "errors": 0, + } + + # Обновляем каждый пост + self.stdout.write("\n🔄 Обробатываем посты...\n") + + for idx, post in enumerate(filtered_posts, 1): + try: + old_values = { + "sSlug": post.sSlug, + "sMetaDescription": post.sMetaDescription, + "sMetaKeywords": post.sMetaKeywords, + } + + # Генерируем sSlug + if not post.sSlug and post.sPostHeader: + post.sSlug = sanitize_slug(post.sPostHeader, max_length=200) + stats["sSlug"] += 1 + + # Генерируем sMetaDescription + if not post.sMetaDescription and post.sPostContent: + content_clean = re.sub(r"", "", post.sPostContent, flags=re.IGNORECASE) + tizer = sanitize_slug(content_clean, max_length=200) + + if len(tizer) > 160: + # Обрезаем по последнему пробелу перед 160-й позицией + tizer = tizer[:160].rsplit(" ", 1)[0] + "..." if " " in tizer[:160] else tizer[:160] + + post.sMetaDescription = tizer + stats["sMetaDescription"] += 1 + + # Генерируем sMetaKeywords + if not post.sMetaKeywords and post.sPostHeader: + header_clean = re.sub(r"<[^>]+>", "", post.sPostHeader).strip() + fixed_keywords = "oknardia, окнардия, блог, публикация" + post.sMetaKeywords = f"{fixed_keywords}, {header_clean}"[:256] + stats["sMetaKeywords"] += 1 + + new_values = { + "sSlug": post.sSlug, + "sMetaDescription": post.sMetaDescription, + "sMetaKeywords": post.sMetaKeywords, + } + + # Логируем изменения + changes = [] + if old_values["sSlug"] != new_values["sSlug"]: + changes.append(f"sSlug: '{old_values['sSlug'][:30]}...' → '{new_values['sSlug'][:30]}...'") + if old_values["sMetaDescription"] != new_values["sMetaDescription"]: + desc_old = (old_values["sMetaDescription"] or "").strip() or "(пусто)" + desc_new = new_values.get("sMetaDescription", "").strip() or "(пусто)" + changes.append(f"sMetaDescription: '{desc_old[:40]}...' → '{desc_new[:40]}...'") + if old_values["sMetaKeywords"] != new_values["sMetaKeywords"]: + kw_old = (old_values["sMetaKeywords"] or "").strip() or "(пусто)" + kw_new = new_values.get("sMetaKeywords", "").strip() or "(пусто)" + changes.append(f"sMetaKeywords: '{kw_old[:40]}...' → '{kw_new[:40]}...'") + + # Вывод текущего прогресса + self.stdout.write( + f" [{idx:3d}/{posts_to_update}] Post #{post.id}: {post.sPostHeader[:50]}..." + ) + if changes: + for change in changes: + self.stdout.write(f" → {change}") + self.stdout.write("") + + # Сохраняем + if not dry_run: + post.save(update_fields=["sSlug", "sMetaDescription", "sMetaKeywords"]) + stats["updated"] += 1 + + except Exception as e: + self.stdout.write(self.style.ERROR(f" ❌ Ошибка при обработке поста #{post.id}: {str(e)}")) + stats["errors"] += 1 + + # Итоговой отчет + self.stdout.write("\n" + "=" * 70) + self.stdout.write(self.style.SUCCESS("ИТОГОВЫЙ ОТЧЕТ")) + self.stdout.write("=" * 70) + + self.stdout.write(f"\n✓ sSlug заполнено: {stats['sSlug']} раз") + self.stdout.write(f"✓ sMetaDescription заполнено: {stats['sMetaDescription']} раз") + self.stdout.write(f"✓ sMetaKeywords заполнено: {stats['sMetaKeywords']} раз") + self.stdout.write(f"✓ Записей обновлено в БД: {stats['updated']}") + self.stdout.write(f"✗ Ошибок при обработке: {stats['errors']}") + + if dry_run: + self.stdout.write(self.style.WARNING("\n⚠️ Режим DRY-RUN: изменения НЕ были сохранены в БД")) + else: + self.stdout.write(self.style.SUCCESS(f"\n✅ Обновлено {stats['updated']} записей успешно!")) + + if stats["errors"] > 0: + self.stdout.write(self.style.ERROR(f"\n❌ Было {stats['errors']} ошибок. Проверьте логи.")) + From b719b58c7b6afa7f56d8b892073c80a9654a4ad2 Mon Sep 17 00:00:00 2001 From: erjemin Date: Mon, 11 May 2026 15:09:30 +0300 Subject: [PATCH 064/102] =?UTF-8?q?minor:=20=D0=BD=D0=B5=D0=BD=D1=83=D0=B6?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20import?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oknardia/web/report2.py | 1 - 1 file changed, 1 deletion(-) diff --git a/oknardia/web/report2.py b/oknardia/web/report2.py index aa87ea6..511c94b 100644 --- a/oknardia/web/report2.py +++ b/oknardia/web/report2.py @@ -6,7 +6,6 @@ from oknardia.settings import * from web.add_func import normalize, get_rating_set_for_stars, sanitize_slug from time import time import json -import pytils def ratings(request: HttpRequest) -> HttpResponse: From db6cd46915194c13ac575a178494dc7c309c0bac Mon Sep 17 00:00:00 2001 From: erjemin Date: Mon, 11 May 2026 15:10:35 +0300 Subject: [PATCH 065/102] =?UTF-8?q?minor:=20=D0=BD=D0=B5=D0=BD=D1=83=D0=B6?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20import?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oknardia/web/prices.py | 1 - 1 file changed, 1 deletion(-) diff --git a/oknardia/web/prices.py b/oknardia/web/prices.py index 837abd3..29ad3fa 100644 --- a/oknardia/web/prices.py +++ b/oknardia/web/prices.py @@ -1031,7 +1031,6 @@ def report_price_legacy_redirect(request, build_id, apart_id, slug): apart_id = min_apart.id except Exception: return redirect("/") - import pytils seria_slug = sanitize_slug((seria.sName or "").strip()).lower() address_slug = sanitize_slug((building.sAddress or "").strip()).lower() # Новый формат: /price/seriaID--/appartID/addressID--/ From 37f0535ddf76691ca6565a6130dc21e9fbfec465 Mon Sep 17 00:00:00 2001 From: erjemin Date: Mon, 11 May 2026 15:13:04 +0300 Subject: [PATCH 066/102] =?UTF-8?q?minor:=20=D0=BD=D0=B5=D0=BD=D1=83=D0=B6?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20import?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oknardia/web/catalog_series.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/oknardia/web/catalog_series.py b/oknardia/web/catalog_series.py index 021135f..898aeee 100644 --- a/oknardia/web/catalog_series.py +++ b/oknardia/web/catalog_series.py @@ -13,12 +13,10 @@ from oknardia.models import ( Win_MountDim, Building_Info, ) -from web.report1 import get_last_all_user_visit_list, get_last_user_visit_list +from web.report1 import get_last_all_user_visit_list from web.add_func import get_flaps_for_big_pictures, sanitize_slug import time import os -import math -import pytils def _append_visit_context(to_template: dict, request: HttpRequest, time_start: float) -> None: From c62fbceaaf19188bea1dde4a225aeba784446626 Mon Sep 17 00:00:00 2001 From: erjemin Date: Mon, 11 May 2026 17:36:37 +0300 Subject: [PATCH 067/102] =?UTF-8?q?fix:=20=D1=82=D0=B8=D0=B7=D0=B5=D1=80?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BD=D0=B5=20=D0=B4=D0=BE=D0=BB=D0=B6=D0=B5?= =?UTF-8?q?=D0=BD=20=D1=82=D1=80=D0=B0=D0=BD=D1=81=D0=BB=D0=B8=D1=82=D0=B8?= =?UTF-8?q?=D1=80=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=D1=81=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oknardia/oknardia/models.py | 11 +++-------- .../web/management/commands/populate_seo_fields.py | 4 ++-- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/oknardia/oknardia/models.py b/oknardia/oknardia/models.py index 4e9ec69..3d7c9f3 100644 --- a/oknardia/oknardia/models.py +++ b/oknardia/oknardia/models.py @@ -8,7 +8,8 @@ from datetime import date, datetime from django.utils import timezone from django.contrib.auth.models import User from oknardia.settings import * - +from web.add_func import sanitize_slug, safe_html_spec_symbols +import re # Таблица: Каталог профилей, стеклопакетов (добавлено 09.авг.2017) # create table oknardia_catalog2profile @@ -1074,19 +1075,15 @@ class BlogPosts(models.Model): """ # Шаг 1: Автоматически генерируем слаг из заголовка, если он не указан if not self.sSlug and self.sPostHeader: - from web.add_func import sanitize_slug self.sSlug = sanitize_slug(self.sPostHeader, max_length=200) # Шаг 2: Автоматически генерируем sMetaDescription из контента (тизер) if not self.sMetaDescription and self.sPostContent: - import re - from web.add_func import sanitize_slug - # Удаляем теги из контента content_clean = re.sub(r'', '', self.sPostContent, flags=re.IGNORECASE) # Генерируем тизер (очищенный текст без HTML) - tizer = sanitize_slug(content_clean, max_length=200) + tizer = safe_html_spec_symbols(content_clean) # Обрезаем до 160 символов для мета-description if len(tizer) > 160: @@ -1097,8 +1094,6 @@ class BlogPosts(models.Model): # Шаг 3: Автоматически генерируем sMetaKeywords из заголовка if not self.sMetaKeywords and self.sPostHeader: - from web.add_func import sanitize_slug - import re # Берём заголовок и удаляем HTML-теги header_clean = re.sub(r'<[^>]+>', '', self.sPostHeader) diff --git a/oknardia/web/management/commands/populate_seo_fields.py b/oknardia/web/management/commands/populate_seo_fields.py index 605def7..2e0bdb0 100644 --- a/oknardia/web/management/commands/populate_seo_fields.py +++ b/oknardia/web/management/commands/populate_seo_fields.py @@ -21,7 +21,7 @@ from django.core.management.base import BaseCommand from django.utils import timezone from oknardia.models import BlogPosts -from web.add_func import sanitize_slug +from web.add_func import sanitize_slug, safe_html_spec_symbols class Command(BaseCommand): @@ -115,7 +115,7 @@ class Command(BaseCommand): # Генерируем sMetaDescription if not post.sMetaDescription and post.sPostContent: content_clean = re.sub(r"", "", post.sPostContent, flags=re.IGNORECASE) - tizer = sanitize_slug(content_clean, max_length=200) + tizer = safe_html_spec_symbols(content_clean) if len(tizer) > 160: # Обрезаем по последнему пробелу перед 160-й позицией From 0efc12fe7ac654721ccbc05312093724a92f222f Mon Sep 17 00:00:00 2001 From: erjemin Date: Mon, 11 May 2026 18:29:10 +0300 Subject: [PATCH 068/102] =?UTF-8?q?mod:=20SEO-=D1=82=D0=B5=D0=B3=D0=B8=20?= =?UTF-8?q?=D0=B8=20JSON-LD=20(chema.org)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oknardia/templates/blog/blog_list.html | 148 +++++++++++++++++++++---- oknardia/web/blog.py | 33 +++++- 2 files changed, 157 insertions(+), 24 deletions(-) diff --git a/oknardia/templates/blog/blog_list.html b/oknardia/templates/blog/blog_list.html index b29d05b..80131f2 100755 --- a/oknardia/templates/blog/blog_list.html +++ b/oknardia/templates/blog/blog_list.html @@ -1,20 +1,121 @@ {% extends "base.html" %}{% load static %} -{% block Title %}Блоги: Стр.{{ PAGE_BACK|add:"1" }}{% endblock %} +{% block Title %}Блог Окнардии для компаний-поставщиков окон и их клиентов — Страница {{ PAGE_BACK|add:"1" }}{% endblock %} {% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %} -{% block Description %}Блоги «Окнардия» :: {% for i1 in DIM_BLOGPOST %}{{ i1.HEADER_D }}{% if not forloop.last %}, {% endif %}{% endfor %}{% endblock %} +{% block Description %}Блог Окнардии для компаний-поставщиков окон и их клиентов: публикации о пластиковых окнах, продвижении услуг замены окон, ценах и трендах — Страница {{ PAGE_BACK|add:"1" }}{% endblock %} -{% block Keywords %}oknardia, окнардия, blogs, блоги, публикации, цены пластиковых окон, стоимость пластиковых окон, скидки на пластиковые окна, предложения пластиковых окон, {{ META_KEYWORDS|default:"" }} {% endblock %} +{% block Keywords %}{{ META_KEYWORDS }}{% endblock %} -{% block Date4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"Y-m-d" }}{% else %}{% now "c" %}{% endif %}{% endblock %} +{% block Date4Meta %}{% if META_DATA_PUB %}{{ META_DATA_PUB|date:"Y-m-d" }}{% else %}{% now "c" %}{% endif %}{% endblock %} -{% block Last4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"Y-m-d" }}{% else %}{% now "c" %}{% endif %}{% endblock %} +{% block Last4Meta %}{% if META_DATA_MODIFY %}{{ META_DATA_MODIFY|date:"Y-m-d" }}{% else %}{% now "c" %}{% endif %}{% endblock %} -{% block Author4Meta %}: Блоги{% endblock %} +{% block Author4Meta %}: Блоги Окнардия{% endblock %} -{% block CopyrightAuthor4Meta %}: Блоги{% endblock %} +{% block CopyrightAuthor4Meta %}: Блоги Окнардия{% endblock %} + +{% block Top_Meta1 %}{# #} + + {% if PAGE_BACK > 0 %}{% endif %} + {% if FORW_BUTTON %}{% endif %} + {# #} + + + + + + + {% if META_IMAGE %}{% else %}{% endif %} + + + + + {% if META_IMAGE %}{% else %}{% endif %} +{# #}{% endblock %} + +{% block ADD_TO_HEAD %}{# #} + +{# #}{% endblock %} {% block Top_JS3%} {% endblock %} +{% block ADD_TO_HEAD %}{# #} + +{# #}{% endblock %} + {% block Main_Content %}
    {% if not IS_ARCHIVE %} @@ -78,7 +124,7 @@
    {# Листалка: НАЧАЛО #}
    -
    +
    +
    {# Листалка: КОНЕЦ #}  {# --- Баннер: НАЧАЛО --- #}

    {% include "ad/bannet-wide.html" %}
    @@ -102,5 +148,4 @@ {% block Top_Nav_Bar %} {# ОТЛАДКА, ГАСИМ ВЕРХНЕЕ МЕНЮ #} {% endblock %} -{% endcomment %} - +{% endcomment %} \ No newline at end of file diff --git a/oknardia/web/blog.py b/oknardia/web/blog.py index 20343ac..6719d96 100644 --- a/oknardia/web/blog.py +++ b/oknardia/web/blog.py @@ -183,22 +183,27 @@ def blog_post(request: HttpRequest, post_id: str = "0", page_back: str = None) - 'ID': q.id}) if PATH_FOR_IMG_BLOG in q.sImgForBlogSocial.name: to_template.update({'IMG_FOR_BLOG': q.sImgForBlogSocial}) - to_template.update({'PUB_DAT': q.dPostDataBegin, - 'PUB_MODIFY': q.dPostDataModify, - 'HEADER': q.sPostHeader, - 'HEADER_T': sanitize_slug(q.sPostHeader).lower(), - 'USER_STATUS': q.kBlogAuthorUser.get_sUserStatus_display(), - 'USER_AVATAR': q.kBlogAuthorUser.sUserAvatarImg, - 'USER_TITLE': q.kBlogAuthorUser.sUserJobTitle, - 'USER_FROM_ID_OFFICE': q.kBlogAuthorUser.kMerchantOffice, - 'CONTENT': re.sub(r'', '', q.sPostContent, 0, re.IGNORECASE)}) + to_template.update({ + 'PUB_DAT': q.dPostDataBegin, + 'PUB_MODIFY': q.dPostDataModify, + 'HEADER': safe_html_spec_symbols(q.sPostHeader), + 'HEADER_T': sanitize_slug(q.sPostHeader), + 'USER_STATUS': q.kBlogAuthorUser.get_sUserStatus_display(), + 'USER_AVATAR': q.kBlogAuthorUser.sUserAvatarImg, + 'USER_TITLE': q.kBlogAuthorUser.sUserJobTitle, + 'USER_FROM_ID_OFFICE': q.kBlogAuthorUser.kMerchantOffice, + 'CONTENT': re.sub(r'', '', q.sPostContent, 0, re.IGNORECASE), + 'MOD_DAT': q.dPostDataModify, + 'META_DESC': q.sMetaDescription, + 'META_KW': q.sMetaKeywords + }) content = to_template.get('CONTENT', '') - to_template.update({'TIZER': sanitize_slug(str(content))}) + to_template.update({'TIZER': safe_html_spec_symbols(str(content))}) # получаем следующую по дате запись try: q1 = BlogPosts.objects.filter(dPostDataBegin__gt=q.dPostDataBegin, dPostDataBegin__lt=timezone.now(), bPublished=True, bArchive=False).order_by('dPostDataBegin')[0] - to_template.update({'FORW_HEADER_T': sanitize_slug(q1.sPostHeader).lower(), + to_template.update({'FORW_HEADER_T': sanitize_slug(q1.sPostHeader), 'FORW_ID': q1.id}) except(IndexError, ObjectDoesNotExist, BlogPosts.DoesNotExist): to_template.update({'FORW_DISABLE': True}) @@ -206,7 +211,7 @@ def blog_post(request: HttpRequest, post_id: str = "0", page_back: str = None) - try: q1 = BlogPosts.objects.filter(dPostDataBegin__lt=q.dPostDataBegin, bPublished=True, bArchive=False).order_by('-dPostDataBegin')[0] - to_template.update({'BACK_HEADER_T': sanitize_slug(q1.sPostHeader).lower(), + to_template.update({'BACK_HEADER_T': sanitize_slug(q1.sPostHeader), 'BACK_ID': q1.id}) except(IndexError, ObjectDoesNotExist, BlogPosts.DoesNotExist): to_template.update({'BACK_DISABLE': True}) From a5736e19c7508601354cd620cc714ffece885cff Mon Sep 17 00:00:00 2001 From: erjemin Date: Mon, 11 May 2026 19:44:32 +0300 Subject: [PATCH 072/102] =?UTF-8?q?minor:=20=D0=BF=D0=B5=D0=B9=D0=B4=D0=B6?= =?UTF-8?q?=D0=B8=D0=BD=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BE=D0=B1=D0=B5=D1=80?= =?UTF-8?q?=D0=BD=D1=83=D1=82=D0=B0=20=D0=B2=20nav?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oknardia/templates/blog/blog_list.html | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/oknardia/templates/blog/blog_list.html b/oknardia/templates/blog/blog_list.html index 8a5227d..95529f7 100755 --- a/oknardia/templates/blog/blog_list.html +++ b/oknardia/templates/blog/blog_list.html @@ -153,9 +153,7 @@ $(window).load(function(){var images = $('.half');images.each(function(i){$(this {% endfor %} - - {# Листалка пагинации #} -
    + {# Листалка пагинации #}
    + {# Баннер #}
    {% include "ad/bannet-wide.html" %}
    From d028f853568deaa36025154398220ddc5e74198b Mon Sep 17 00:00:00 2001 From: erjemin Date: Mon, 11 May 2026 20:12:48 +0300 Subject: [PATCH 073/102] =?UTF-8?q?mod:=20=D1=83=D0=BB=D1=83=D1=87=D1=88?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE?= =?UTF-8?q?=D0=B4=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D1=8C=20+=D1=80=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=BD=D0=B5=D0=B7=D0=B0=D0=B2=D0=B8=D1=81=D0=B8=D0=BC=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oknardia/web/autocomplete_addr.py | 77 ++++++++++++++++++------------- 1 file changed, 45 insertions(+), 32 deletions(-) diff --git a/oknardia/web/autocomplete_addr.py b/oknardia/web/autocomplete_addr.py index d2e32ad..59d7f39 100755 --- a/oknardia/web/autocomplete_addr.py +++ b/oknardia/web/autocomplete_addr.py @@ -1,44 +1,57 @@ # -*- coding: utf-8 -*- __author__ = 'Sergei Erjemin' -from django.http import HttpResponse -from django.shortcuts import HttpResponseRedirect -from django.http import HttpRequest, HttpResponse +from django.http import HttpResponse, HttpResponseRedirect +from django.http import HttpRequest from oknardia.models import Building_Info -# from time import clock +import json import re -import urllib def autocomplete_addr(request: HttpRequest) -> HttpResponse: - """ Функция для автозаполнения формы выбора адреса. Получает методом GET переменную "term" и по ее образцу - ищет доступные адреса в базе адреса из таблицы Building_Info + """Функция для автозаполнения формы выбора адреса. + + Получает методом GET переменную "term" и по её образцу ищет доступные адреса + в таблице Building_Info. Результаты возвращаются в JSON формате для jQuery UI. :param request: входящий http-запрос - :return response: исходящий http-ответ + :return: JSON ответ с массивом адресов или редирект на главную """ - # Для автозаполнения используется JQuery_UI: http://jqueryui.com/ - # Пример и инструкции по использованию: http://professorweb.ru/my/javascript/jquery/level4/4_5.php - # - # ВНИМАНИЕ ТЕХНИЧЕСКИЙ ДОЛГ,: Более навороченный, по описанию лучше подходящий компонент автозаполнения - # https://www.devbridge.com/sourcery/components/jquery-autocomplete/ не заработал. Ну и хрен с ним! - # - # ВНИМАНИЕ ТЕХНИЧЕСКИЙ ДОЛГ: возможен "перегрев" при частом обращении -- [Errno 10053] - # Предположительно из-за отсутсвия csrfmiddlewaretoken-серилизации Django. Проблема пофикусена(?) 2014-11-14 - # tStart = clock() - if request.method == 'GET' and 'term' in request.GET: - part_blocks = re.split(r"[,/;\s.\\:]+", str(request.GET['term'])) - if request.GET['use_filter'] == "only_known": - q_autocomplete = Building_Info.objects.filter(kSeria_Link__kRoot_id__isnull=False) - else: - q_autocomplete = Building_Info.objects - for i in part_blocks: - q_autocomplete = q_autocomplete.filter(sAddress__icontains=i) - q_autocomplete = q_autocomplete.all().order_by('sAddress') - to_response = "" - for i in q_autocomplete[:10]: - to_response += '"' + i.sAddress + u'",' - to_response = '[' + to_response[0:-1] + ']' # Убираем последнюю запятую - return HttpResponse(to_response) - else: + if request.method != 'GET' or 'term' not in request.GET: return HttpResponseRedirect("/") + + # Получаем поисковый термин и очищаем его + search_term = str(request.GET.get('term', '')).strip() + if not search_term: + return HttpResponse('[]', content_type='application/json') + + # Разбиваем на части для поиска по компонентам адреса (город, улица, номер) + part_blocks = re.split(r"[,/;\s.\\:]+", search_term) + part_blocks = [p.strip().lower() for p in part_blocks if p.strip()] # Приводим к нижнему регистру + + # Начинаем с базового набора или фильтруем только по известным сериям + if request.GET.get('use_filter') == "only_known": + q_autocomplete = Building_Info.objects.filter( + kSeria_Link__kRoot_id__isnull=False + ) + else: + q_autocomplete = Building_Info.objects + + # Получаем адреса и фильтруем на уровне Python для гарантированной регистронезависимости + # (особенно важно для русского текста в SQLite и, возможно, других БД) + all_addresses = q_autocomplete.values_list('sAddress', flat=True).distinct() + + filtered_addresses = [] + for address in all_addresses: + address_lower = address.lower() + # Проверяем, содержатся ли все части поиска в адресе (без учета регистра) + if all(part in address_lower for part in part_blocks): + filtered_addresses.append(address) + + # Сортируем и ограничиваем до 10 результатов + addresses = sorted(filtered_addresses)[:10] + + # Конвертируем в JSON (безопаснее, чем ручная конкатенация) + result = json.dumps(list(addresses), ensure_ascii=False) + + return HttpResponse(result, content_type='application/json; charset=utf-8') From 5cd2acc84c726f27ee9bdd4762633926c14ee410 Mon Sep 17 00:00:00 2001 From: erjemin Date: Mon, 11 May 2026 20:15:18 +0300 Subject: [PATCH 074/102] =?UTF-8?q?add:=20=D0=BD=D0=B5=D0=B4=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D1=8E=D1=89=D0=B8=D0=B5=20=D0=BA=D0=B0=D1=80=D1=82?= =?UTF-8?q?=D0=B8=D0=BD=D0=BA=D0=B8=20=D1=81=D1=85=D0=B5=D0=BC=D1=8B=20?= =?UTF-8?q?=D0=BE=D1=82=D0=BA=D1=80=D1=8B=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/static/img/_miniflap.cfg/(GV)(L_).png | Bin 0 -> 344 bytes public/static/img/_miniflap.cfg/(LV)(L_).png | Bin 0 -> 329 bytes public/static/img/_miniflap.cfg/(VG)(L).png | Bin 0 -> 281 bytes public/static/img/_miniflap.cfg/(VG)(X).png | Bin 0 -> 280 bytes public/static/img/_miniflap.cfg/(_G)(VL).png | Bin 0 -> 339 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/static/img/_miniflap.cfg/(GV)(L_).png create mode 100644 public/static/img/_miniflap.cfg/(LV)(L_).png create mode 100644 public/static/img/_miniflap.cfg/(VG)(L).png create mode 100644 public/static/img/_miniflap.cfg/(VG)(X).png create mode 100644 public/static/img/_miniflap.cfg/(_G)(VL).png diff --git a/public/static/img/_miniflap.cfg/(GV)(L_).png b/public/static/img/_miniflap.cfg/(GV)(L_).png new file mode 100644 index 0000000000000000000000000000000000000000..a377aea6c17a12e82c74b3032d56d443ba71a97f GIT binary patch literal 344 zcmV-e0jK_nP)r5QzAgFJ7|u3?R!eP173>)$4A6k{%5= z#uWp=6KMco#g6=3j>XJQ%0&DABT~!UcB!wN^F&%j!LO2Hc8b|~B5kAgaXat}Xs&^h zn5q69oQOQ>+|r&6RfMw!Ft)#YwNRq0bDl^W%g$3DpcW`m77hpwwoV#D{qt=V+`Qk~ zPHzt=Q4tQPcdsW@7A|!{<@b^bd+2gaHW0LqIiy0H&c37Ki&6SjcWJh4zAa7*60`H5I=AX qLKb?5Bnc9Rm2-E3rQ$#Of%5_JA-jp(X+z%t00000G$F43?IX0ajgPsRrMAwJu2p63TP)oV3CNn69c z!vZ2|c_u{;*_RcOV?<3vE?0kq)GxNp!Ic{EV2~VC+W9KnOt26t_dN?ILrRLASpZdp z6B%0%Fat_-38#phH2}zCfO?=rSva3DANVfRlgt-~ReTpNDgS`Fgu6SOBcVhQoCjNz zsZ`PS#faM2tEzc1qGm*`h+Js?;cx%|*2FVRe76F!Y5VGt4DYnrDj9eZIE4(~J%Sqr zm;&`?GxA)zrU_uH?^-~6d^y~6Eo${;6;65z6OJb}$fNawW5AzKXG!|sbrKF6%vAc1 btuHuVl&ZqrQZLM-00000NkvXXu0mjfU>kDA~UeLj|@HRLst2l{eRnJe{oWp*5(9 zSsezfgqj!-rc>Ki@4e`5{n-k8RSmJ)*1ro4F+f(G1gc`S!`wR#QmBf}CY(8!LrmK+ zmA#OH%PwLG*u`enLjpFjSx6EIcJ0I*nz<)?)jjg_Y=H%~YWiy65kGh|fW>!jk~67n fHI(Pv`r!EjR6>xEOcHR!00000NkvXXu0mjfDwTPE literal 0 HcmV?d00001 diff --git a/public/static/img/_miniflap.cfg/(VG)(X).png b/public/static/img/_miniflap.cfg/(VG)(X).png new file mode 100644 index 0000000000000000000000000000000000000000..86cf60f4615efbce12e80e43ffefa6f803de456b GIT binary patch literal 280 zcmV+z0q6dSP)6Gp1!dyrfu8acu23O zK##-b`Xc~fA`bxB<(>Fg*UCBXWlbdaug*8ln8>?ov$sSVM*__|BPO3+U#JR;0r=Kk zO3wVxbjCzJ#BXr6E=&Ixhqqx`=?{YeecjFHfY!{V9r)D5Rxz~k003B)C}Em35CE(z zi&#o-ujA$f(G=p5${zZksc)sPJFGWIz)B^aL3ie)Rx~PXv;=HK`iiFd!4m*)3X%Hiz$XiPHKj`v20rJB&N? zDY6SU>OQAe`L7yXxHGy`12*ACqw-~v0-4z(KqxlgW-XmGMcfROc8|>R Date: Tue, 12 May 2026 10:50:06 +0300 Subject: [PATCH 075/102] =?UTF-8?q?mod:=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B8=20JSON-LD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oknardia/templates/index.html | 70 +++++++++++++++++++++++++++++++---- 1 file changed, 63 insertions(+), 7 deletions(-) diff --git a/oknardia/templates/index.html b/oknardia/templates/index.html index 8a27e04..583be90 100755 --- a/oknardia/templates/index.html +++ b/oknardia/templates/index.html @@ -1,21 +1,77 @@ {% extends "base.html" %} {% load static %} -{% block Title %}: выбор пластиковых окон в квартиру. Поставщики, цены, описания, характеристики, отзывы.{% endblock %} +{% block Title %}Окнардия: агрегатор цен на пластиковые окна и услуги их установки{% endblock %} -{% block Description %}Окнардия: Здесь собраны цены на установку пластиковых окон. Просто введите адрес и получите актуальные предложения от ведущих поставщиков окон, подробные характеристики профилей и стеклопакетов, информацию о скидках. Никаких предварительных замеров! Мы уже знаем размеры проёмов в квартире, рекомендованные схемы открывания, требования к стеклопакетам, профилю и многое другое. Замена пластиковых окон — ответственное мероприятие. Мы помогаем сделать объективный выбор.{% endblock %} +{% block Description %}Агрегатор цен на пластиковые окна в типовых домах России. Введите адрес, укажите тип квартиры и сравните цены поставщиков на установку и характеристики предложений: оконный профиль, стеклопакет, скидки, дополнительные услуги.{% endblock %} -{% block Keywords %}Цены на окна, цены на пластиковые окна, стоимость замены окон, пластиковые окна в квартиру, скидки на пластиковые окна, окна в квартиру, размеры окон, скидки на пластиковые окна, характеристики пластиковых окон, окна в панельный дом, окна в блочный дом.{% endblock %} +{% block Keywords %}цены на окна, пластиковые окна, замена окон, услуги установки окон, профили окон, стеклопакеты, скидки на окна, окна в квартиру, размеры оконных проёмов, поставщики окон{% endblock %} -{% block Top_JS1 %} - +{% block Author4Meta %}ОКНАРДИЯ — Оконный Агрегатор{% endblock %} + +{% block CopyrightAuthor4Meta %}ОКНАРДИЯ — Оконный Агрегатор{% endblock %} + +{% block Top_Meta1 %}{# #} + + {# #} + + + + + + + + {# #} + + + + + +{# #}{% endblock %} + +{% block Top_JS1 %} {% endblock %} -{% block Top_CSS2 %} - +{% block Top_CSS2 %} {% endblock %} +{% block ADD_TO_HEAD %}{# #} + +{# #}{% endblock %} + {% block Main_Content %} после скрипта', + 'Текст после скрипта', + 'Удаление содержимого script-тега' + ), + ( + 'Текст со стилем', + 'Текст со стилем', + 'Удаление содержимого style-тега' + ), + ( + 'Цена: 100 № (№ = №)', + 'Цена: 100 № ( № = №)', + 'Замена числовых мнемоник (№) на Unicode' + ), + ( + 'Символы: — … © ®', + 'Символы: — … © ®', + 'Замена именованных мнемоник' + ), + ( + '
    Новая
    строка', + 'Новая строка', + 'Удаление br-тегов' + ), + ( + '

    Текст

    без разрывов', + 'Текст без разрывов', + 'Удаление nobr-тегов' + ), + ( + 'Множество пробелов\n\n\tи табуляций', + 'Множество пробелов и табуляций', + 'Очистка множественных пробелов и переносов' + ), + ( + 'function foo() { return 42; } остаток', + 'остаток', + 'Удаление содержимого code-тега' + ), + ( + '
    preformatted\n  text
    после', + 'после', + 'Удаление содержимого pre-тега' + ), + ( + ' Текст с пробелами в начале и конце ', + 'Текст с пробелами в начале и конце', + 'Trim пробелов в начале/конце' + ), + ( + 'Число A (A) и B (B)', + 'Число A (A) и B (B)', + 'Замена десятичных и шестнадцатеричных мнемоник' + ), + ] + + print("=" * 80) + print("ТЕСТЫ ДЛЯ safe_html_spec_symbols") + print("=" * 80) + + passed = 0 + failed = 0 + + for idx, (input_str, expected, description) in enumerate(test_cases, 1): + result = safe_html_spec_symbols(input_str) + is_passed = result == expected + + status = "✓ PASS" if is_passed else "✗ FAIL" + print(f"\n{idx}. {status}: {description}") + print(f" Вход: {repr(input_str[:60])}") + print(f" Ожидаемо: {repr(expected)}") + print(f" Получено: {repr(result)}") + + if is_passed: + passed += 1 + else: + failed += 1 + + print("\n" + "=" * 80) + print(f"Результаты: {passed} пройдено, {failed} не пройдено из {len(test_cases)}") + print("=" * 80) + + return failed == 0 + + +if __name__ == '__main__': + success = test_safe_html_spec_symbols() + sys.exit(0 if success else 1) + diff --git a/tests/test_safe_html_standalone.py b/tests/test_safe_html_standalone.py new file mode 100644 index 0000000..000b61c --- /dev/null +++ b/tests/test_safe_html_standalone.py @@ -0,0 +1,236 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Тесты для функции safe_html_spec_symbols() из oknardia/web/add_func.py + +Проверяет: +1. Удаление содержимого исключённых тегов (script, style, code, kbd, pre, var, samp) +2. Удаление обычных HTML-тегов +3. Замену HTML-мнемоник на Unicode (именованные, десятичные, шестнадцатеричные) +4. Очистку лишних пробелов +""" + +import sys +import os + +# Добавим путь к проекту для импорта (подъём на одну папку выше, т.к. тесты в папке tests/) +sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'oknardia')) + +from web.add_func import safe_html_spec_symbols + + +def test_remove_script_tags(): + """Тест 1: Удаление содержимого тегов после' + result = safe_html_spec_symbols(html) + assert 'alert' not in result, f"Script-содержимое не удалено: {result}" + assert 'Текст' in result and 'после' in result, f"Обычный текст потеряется: {result}" + print("✓ Тест 1 (удаление и после' + result = safe_html_spec_symbols(html) + assert 'xss' not in result and 'script' not in result, f"SVG содержимое не удалено: {result}" + assert 'Текст' in result and 'после' in result, f"Обычный текст потеряется: {result}" + print("✓ Тест 3c (удаление , ): пройден") + + +def test_remove_html_tags(): + """Тест 4: Удаление обычных HTML-тегов""" + html = '

    Параграф с полужирным и курсивом

    спан' + result = safe_html_spec_symbols(html) + assert '<' not in result and '>' not in result, f"HTML-теги не удалены: {result}" + assert 'Параграф' in result and 'полужирным' in result and 'курсивом' in result, \ + f"Текст из тегов потеряется: {result}" + print("✓ Тест 4 (удаление HTML-тегов): пройден") + + +def test_named_entities(): + """Тест 5: Замена именованных HTML-мнемоник""" + html = ' < > " ' & € © ®' + result = safe_html_spec_symbols(html) + # html.unescape преобразует мнемоники в символы + assert '&' not in result or 'amp' not in result, f"Мнемоники не заменены: {result}" + assert '€' in result, f"Euro не заменён: {result}" + assert '©' in result, f"Copyright не заменён: {result}" + assert '®' in result, f"Registered не заменён: {result}" + print("✓ Тест 5 (именованные мнемоники): пройден") + + +def test_numeric_entities_decimal(): + """Тест 6: Замена десятичных числовых мнемоник (&#ЧИСЛО;)""" + html = '№ © €' # № © € + result = safe_html_spec_symbols(html) + assert '№' in result, f"Decimal entity № не заменена: {result}" + assert '©' in result, f"Decimal entity © не заменена: {result}" + assert '€' in result, f"Decimal entity € не заменена: {result}" + print("✓ Тест 6 (десятичные мнемоники): пройден") + + +def test_numeric_entities_hex(): + """Тест 7: Замена шестнадцатеричных числовых мнемоник (&#xHEX;)""" + html = '€ © №' # € © № + result = safe_html_spec_symbols(html) + assert '€' in result, f"Hex entity € не заменена: {result}" + assert '©' in result, f"Hex entity © не заменена: {result}" + assert '№' in result, f"Hex entity № не заменена: {result}" + print("✓ Тест 7 (шестнадцатеричные мнемоники): пройден") + + +def test_whitespace_cleanup(): + """Тест 8: Очистка лишних пробелов""" + html = 'Текст с множественными пробелами\nи\tтабуляцией' + result = safe_html_spec_symbols(html) + assert ' ' not in result, f"Лишние пробелы не удалены: {repr(result)}" + assert 'Текст с множественными пробелами и табуляцией' == result, \ + f"Ожидается 'Текст с множественными пробелами и табуляцией', получено: {repr(result)}" + print("✓ Тест 8 (очистка пробелов): пройден") + + +def test_strip_edges(): + """Тест 9: Удаление пробелов в начале и конце""" + html = ' Текст ' + result = safe_html_spec_symbols(html) + assert result == 'Текст', f"Пробелы не удалены: {repr(result)}" + print("✓ Тест 9 (удаление пробелов в начале/конце): пройден") + + +def test_complex_html(): + """Тест 10: Комплексный тест с комбинацией всего""" + html = ''' +
    +

    Текст   с мнемониками: € №№ €

    + + + Ещё текст © 2024 +
    + ''' + result = safe_html_spec_symbols(html) + + # Проверяем, что исключены опасные теги + assert 'malicious_code' not in result, f"Script не удалён: {result}" + assert 'display: none' not in result, f"Style не удалён: {result}" + + # Проверяем, что обычный текст остался + assert 'Текст' in result and 'Ещё текст' in result, f"Обычный текст потеряился: {result}" + + # Проверяем, что HTML-теги удалены + assert '<' not in result and '>' not in result, f"HTML-теги не удалены: {result}" + + # Проверяем, что мнемоники заменены + assert '€' in result, f"Мнемоники не заменены: {result}" + assert '©' in result, f"Copyright не заменён: {result}" + + print(f"✓ Тест 10 (комплексный): пройден") + print(f" Результат: {result[:80]}...") + + +def test_empty_string(): + """Тест 11: Пустая строка""" + result = safe_html_spec_symbols('') + assert result == '', f"Ожидается пустая строка, получено: {repr(result)}" + print("✓ Тест 11 (пустая строка): пройден") + + +def test_only_html_tags(): + """Тест 12: Строка только с HTML-тегами""" + html = '

    ' + result = safe_html_spec_symbols(html) + assert result == '', f"Ожидается пустая строка, получено: {repr(result)}" + print("✓ Тест 12 (только теги): пройден") + + +def test_russian_text(): + """Тест 13: Русский текст с мнемониками""" + html = 'Цена: 1000 ₽ «Российский» — лучший выбор' + result = safe_html_spec_symbols(html) + assert 'Цена' in result, f"Русский текст потеряется: {result}" + assert '«' in result and '»' in result, f"Кавычки не заменены: {result}" + assert '—' in result, f"Длинное тире не заменено: {result}" + print(f"✓ Тест 13 (русский текст): пройден") + + +if __name__ == '__main__': + print("=" * 60) + print("Запуск тестов функции safe_html_spec_symbols()") + print("=" * 60) + + tests = [ + test_remove_script_tags, + test_remove_style_tags, + test_remove_code_tags, + test_remove_object_tags, + test_remove_form_tags, + test_remove_svg_canvas, + test_remove_html_tags, + test_named_entities, + test_numeric_entities_decimal, + test_numeric_entities_hex, + test_whitespace_cleanup, + test_strip_edges, + test_complex_html, + test_empty_string, + test_only_html_tags, + test_russian_text, + ] + + failed = 0 + for test in tests: + try: + test() + except AssertionError as e: + print(f"✗ {test.__name__} ОШИБКА: {e}") + failed += 1 + except Exception as e: + print(f"✗ {test.__name__} ИСКЛЮЧЕНИЕ: {e}") + failed += 1 + + print("=" * 60) + if failed == 0: + print(f"✅ Все {len(tests)} тестов пройдены успешно!") + else: + print(f"❌ Провалено {failed} из {len(tests)} тестов") + sys.exit(1) + print("=" * 60) + diff --git a/tests/test_sanitize_slug.py b/tests/test_sanitize_slug.py new file mode 100644 index 0000000..ab299c5 --- /dev/null +++ b/tests/test_sanitize_slug.py @@ -0,0 +1,202 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Тесты для функции sanitize_slug() из oknardia/web/add_func.py + +Проверяет: +1. Очистку от HTML-разметки +2. Транслитерацию русского текста +3. Замену пробелов и недопустимых символов на дефисы +4. Удаление множественных дефисов +5. Обрезку по максимальной длине +""" + +import sys +import os + +# Добавим путь к проекту для импорта (подъём на одну папку выше, т.к. тесты в папке tests/) +sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'oknardia')) + +from web.add_func import sanitize_slug + + +def test_russian_text_simple(): + """Тест 1: Простой русский текст""" + result = sanitize_slug('Привет мир') + assert result == 'privet-mir', f"Ожидается 'privet-mir', получено: {result}" + print("✓ Тест 1 (простой русский текст): пройден") + + +def test_russian_text_with_special_chars(): + """Тест 2: Русский текст со спецсимволами""" + result = sanitize_slug('Тест!!! @#$%% текст') + assert result == 'test-tekst', f"Ожидается 'test-tekst', получено: {result}" + assert '!' not in result and '@' not in result and '#' not in result, \ + f"Спецсимволы не удалены: {result}" + print("✓ Тест 2 (русский текст со спецсимволами): пройден") + + +def test_html_tags_removal(): + """Тест 3: Удаление HTML-тегов""" + text = '

    Русский текст в тегах

    ' + result = sanitize_slug(text) + assert '<' not in result and '>' not in result, f"HTML-теги не удалены: {result}" + # pytils транслитирует по-своему (может быть 'russkij' вместо 'russkii', 'tegah' вместо 'tagah') + assert 'russ' in result and 'tekst' in result and 'teg' in result, f"Текст потеряился: {result}" + print("✓ Тест 3 (удаление HTML-тегов): пройден") + + +def test_html_entities(): + """Тест 4: Обработка HTML-мнемоник""" + text = 'Цена: 100 рублей — отличный © 2024' + result = sanitize_slug(text) + # Проверяем основной смысл: есть слова, есть цифры, нет пробелов и HTML + assert 'tsena' in result and '100' in result and '2024' in result, \ + f"Мнемоники не обработаны правильно: {result}" + assert ' ' not in result and '&' not in result and '<' not in result, \ + f"Остались проблемные символы: {result}" + print("✓ Тест 4 (HTML-мнемоники): пройден") + + +def test_multiple_spaces(): + """Тест 5: Множественные пробелы и табуляция""" + text = 'Текст с множественными пробелами\n\tи табуляцией' + result = sanitize_slug(text) + assert '--' not in result, f"Множественные дефисы не удалены: {result}" + # Проверяем что результат - это слаг (только буквы, цифры и дефисы) + assert all(c.isalnum() or c == '-' for c in result), f"Недопустимые символы в результате: {result}" + print("✓ Тест 5 (множественные пробелы): пройден") + + +def test_leading_trailing_dashes(): + """Тест 6: Дефисы в начале и конце""" + text = ' - - - Текст - - - ' + result = sanitize_slug(text) + assert not result.startswith('-'), f"Дефис в начале не удалён: {result}" + assert not result.endswith('-'), f"Дефис в конце не удалён: {result}" + print("✓ Тест 6 (дефисы в начале/конце): пройден") + + +def test_complex_html_and_text(): + """Тест 7: Комплексный тест с HTML и текстом""" + text = '

    Мой блюдо — это традиционный борщ (украинский)

    ' + result = sanitize_slug(text) + # Проверяем основной смысл: есть ключевые слова, нет HTML, нет пробелов + assert 'moj' in result and 'blyudo' in result and 'borsch' in result and 'ukrainskij' in result, \ + f"Основной текст потеряился: {result}" + assert '<' not in result and '>' not in result and '&' not in result, f"HTML остался: {result}" + assert ' ' not in result, f"Пробелы не удалены: {result}" + print(f"✓ Тест 7 (комплексный): пройден") + print(f" Результат: {result}") + + +def test_numbers_preserved(): + """Тест 8: Цифры сохраняются""" + text = 'Выпуск 2024-05-10 номер 42' + result = sanitize_slug(text) + assert '2024' in result and '05' in result and '10' in result and '42' in result, \ + f"Цифры потеряны: {result}" + print("✓ Тест 8 (цифры сохраняются): пройден") + + +def test_english_text(): + """Тест 9: Английский текст""" + text = 'Hello World - English Text' + result = sanitize_slug(text) + assert result == 'hello-world-english-text', f"Ожидается 'hello-world-english-text', получено: {result}" + print("✓ Тест 9 (английский текст): пройден") + + +def test_mixed_languages(): + """Тест 10: Смешанные языки""" + text = 'Python программирование для всех' + result = sanitize_slug(text) + assert 'python' in result and 'programmirovanie' in result, f"Смешанные языки обработаны неправильно: {result}" + print("✓ Тест 10 (смешанные языки): пройден") + + +def test_max_length(): + """Тест 11: Ограничение по длине""" + long_text = 'А ' * 100 # Очень длинный текст + result = sanitize_slug(long_text, max_length=50) + assert len(result) <= 52, f"Слишком длинный результат: {len(result)} > 52" # +2 для границы + print(f"✓ Тест 11 (ограничение по длине): пройден (длина: {len(result)})") + + +def test_custom_separator(): + """Тест 12: Пользовательский разделитель""" + text = 'Русский текст для проверки' + result_dash = sanitize_slug(text, separator='-') + result_underscore = sanitize_slug(text, separator='_') + assert '-' in result_dash and '_' not in result_dash, f"Дефис не использован: {result_dash}" + assert '_' in result_underscore and '-' not in result_underscore, f"Подчеркивание не использовано: {result_underscore}" + print("✓ Тест 12 (пользовательский разделитель): пройден") + + +def test_empty_string(): + """Тест 13: Пустая строка""" + result = sanitize_slug('') + assert result == '', f"Ожидается пустая строка, получено: {result}" + print("✓ Тест 13 (пустая строка): пройден") + + +def test_only_special_chars(): + """Тест 14: Только спецсимволы или пустые результаты""" + # pytils.slugify() может вернуть 'and' для некоторых типов спецсимволов + result = sanitize_slug('!@#$%^&*()') + # Проверяем что результат "пустой" или очень короткий + assert len(result) <= 4, f"Слишком длинный результат для только спецсимволов: {result}" + print("✓ Тест 14 (только спецсимволы): пройден") + + +def test_cyrillic_numbers(): + """Тест 15: Кириллица с числами""" + text = 'Статья № 42 от 2024-01-15' + result = sanitize_slug(text) + assert '42' in result and '2024' in result, f"Числа потеряны: {result}" + assert 'stat' in result, f"Основной текст потеряился: {result}" + print("✓ Тест 15 (кириллица с числами): пройден") + + +if __name__ == '__main__': + print("=" * 70) + print("Запуск тестов функции sanitize_slug()") + print("=" * 70) + + tests = [ + test_russian_text_simple, + test_russian_text_with_special_chars, + test_html_tags_removal, + test_html_entities, + test_multiple_spaces, + test_leading_trailing_dashes, + test_complex_html_and_text, + test_numbers_preserved, + test_english_text, + test_mixed_languages, + test_max_length, + test_custom_separator, + test_empty_string, + test_only_special_chars, + test_cyrillic_numbers, + ] + + failed = 0 + for test in tests: + try: + test() + except AssertionError as e: + print(f"✗ {test.__name__} ОШИБКА: {e}") + failed += 1 + except Exception as e: + print(f"✗ {test.__name__} ИСКЛЮЧЕНИЕ: {e}") + failed += 1 + + print("=" * 70) + if failed == 0: + print(f"✅ Все {len(tests)} тестов пройдены успешно!") + else: + print(f"❌ Провалено {failed} из {len(tests)} тестов") + sys.exit(1) + print("=" * 70) + diff --git a/tests/test_seo_autogen.py b/tests/test_seo_autogen.py new file mode 100644 index 0000000..6654db9 --- /dev/null +++ b/tests/test_seo_autogen.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Тестирование автогенерации SEO-полей в BlogPosts.save() +""" +import os +import sys +import django + +# Добавим путь к проекту (подъём на одну папку выше, т.к. тесты в папке tests/) +sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'oknardia.settings') +django.setup() + +from oknardia.models import BlogPosts, OurUser + +print("=" * 70) +print("ТЕСТИРОВАНИЕ АВТОГЕНЕРАЦИИ SEO-ПОЛЕЙ В save()") +print("=" * 70) + +# Получим автора +our_user = OurUser.objects.first() +if not our_user: + print("❌ Не найден пользователь OurUser") + exit(1) + +# Создаём тестовый пост (БЕЗ сохранения) +post = BlogPosts( + sPostHeader="Тест: Привет мир!!! @#$", + sPostContent="

    Это содержание поста для тестирования. Здесь может быть много текста с HTML-разметкой. Давайте посмотрим, как работает автогенерация тизера и ключевых слов.

    Вторая строка текста.

    ", + bPublished=True, + kBlogAuthorUser=our_user, + # Оставляем SEO-поля пустыми, чтобы они автогенерировались + sSlug="", + sMetaDescription="", + sMetaKeywords="" +) + +print("\n✓ ИСХОДНЫЕ ДАННЫЕ:") +print(f" Заголовок: {post.sPostHeader}") +print(f" Содержание: {post.sPostContent[:100]}...") +print(f" sSlug (пусто): '{post.sSlug}'") +print(f" sMetaDescription: '{post.sMetaDescription}'") +print(f" sMetaKeywords: '{post.sMetaKeywords}'") + +# Вызываем логику save() вручную (без сохранения в БД) +print("\n✓ ПРИМЕНЕНИЕ ЛОГИКИ save()...") + +# Генерируем слаг +if not post.sSlug and post.sPostHeader: + from web.add_func import sanitize_slug + post.sSlug = sanitize_slug(post.sPostHeader, max_length=200) + +# Генерируем description +if not post.sMetaDescription and post.sPostContent: + import re + from web.add_func import sanitize_slug + + content_clean = re.sub(r'', '', post.sPostContent, flags=re.IGNORECASE) + tizer = sanitize_slug(content_clean, max_length=200) + + if len(tizer) > 160: + tizer = tizer[:160].rsplit(' ', 1)[0] + '...' if ' ' in tizer[:160] else tizer[:160] + + post.sMetaDescription = tizer + +# Генерируем keywords +if not post.sMetaKeywords and post.sPostHeader: + from web.add_func import sanitize_slug + import re + + header_clean = re.sub(r'<[^>]+>', '', post.sPostHeader) + header_clean = header_clean.strip() + + fixed_keywords = "oknardia, окнардия, блог, публикация" + post.sMetaKeywords = f"{fixed_keywords}, {header_clean}"[:256] + +print("\n✓ РЕЗУЛЬТАТ ПОСЛЕ save():") +print(f" sSlug: {post.sSlug}") +print(f" sMetaDescription: {post.sMetaDescription} (длина: {len(post.sMetaDescription)})") +print(f" sMetaKeywords: {post.sMetaKeywords} (длина: {len(post.sMetaKeywords)})") + +print("\n" + "=" * 70) +print("✅ Все SEO-поля сгенерированы корректно!") +print("=" * 70) + From ce63d7d42b09a79ea40c30c58ee4fcad7a0f3864 Mon Sep 17 00:00:00 2001 From: erjemin Date: Thu, 14 May 2026 20:42:37 +0300 Subject: [PATCH 087/102] =?UTF-8?q?mod:=20=D0=BA=D0=B0=D1=80=D1=82=D0=B8?= =?UTF-8?q?=D0=BD=D0=BA=D0=B8=20=D1=80=D0=B5=D0=BA=D0=BE=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B4=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20=D1=81=D1=85?= =?UTF-8?q?=D0=B5=D0=BC=20=D0=BE=D1=82=D0=BA=D1=80=D1=8B=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../static/img/_flap.cfg/014x153H153W-(S).png | Bin 861 -> 1073 bytes .../static/img/_flap.cfg/014x153H225W-(S).png | Bin 567 -> 716 bytes .../static/img/_flap.cfg/055x142H142W-(G).png | Bin 0 -> 2353 bytes .../static/img/_flap.cfg/055x142H210W-(G).png | Bin 2143 -> 2126 bytes .../static/img/_flap.cfg/062x132H132WN(G).png | Bin 0 -> 2730 bytes .../static/img/_flap.cfg/062x132H210WN(G).png | Bin 2261 -> 2274 bytes .../static/img/_flap.cfg/066x142H142WN(G).png | Bin 0 -> 2728 bytes .../static/img/_flap.cfg/066x142H216WN(G).png | Bin 2299 -> 2273 bytes .../static/img/_flap.cfg/067x216H216D-(L).png | Bin 3395 -> 3273 bytes .../static/img/_flap.cfg/068x207H207D-(L).png | Bin 3309 -> 3221 bytes .../static/img/_flap.cfg/068x210H210D-(G).png | Bin 3324 -> 3161 bytes .../static/img/_flap.cfg/068x222H222D-(L).png | Bin 3296 -> 3171 bytes .../static/img/_flap.cfg/070x150H150WN(G).png | Bin 0 -> 2729 bytes .../static/img/_flap.cfg/070x150H207WN(G).png | Bin 2432 -> 2279 bytes .../static/img/_flap.cfg/070x216H216D-(L).png | Bin 3412 -> 3268 bytes .../static/img/_flap.cfg/070x218H218D-(L).png | Bin 3426 -> 3288 bytes .../static/img/_flap.cfg/073x153H153WN(G).png | Bin 0 -> 2714 bytes .../static/img/_flap.cfg/073x153H225WN(G).png | Bin 2378 -> 2284 bytes .../static/img/_flap.cfg/073x206H206D-(L).png | Bin 3394 -> 3169 bytes .../static/img/_flap.cfg/073x215H215D-(G).png | Bin 3344 -> 3163 bytes .../static/img/_flap.cfg/073x225H225D-(L).png | Bin 3301 -> 3170 bytes .../static/img/_flap.cfg/074x142H142W-(L).png | Bin 0 -> 3179 bytes .../static/img/_flap.cfg/074x142H216W-(L).png | Bin 2413 -> 2238 bytes .../static/img/_flap.cfg/075x152H152WN(G).png | Bin 0 -> 2706 bytes .../static/img/_flap.cfg/075x152H215WN(G).png | Bin 2456 -> 2252 bytes .../static/img/_flap.cfg/076x225H225D-(L).png | Bin 3306 -> 3139 bytes .../static/img/_flap.cfg/076x235H235D-(G).png | Bin 3377 -> 3203 bytes .../static/img/_flap.cfg/077x140H140WN(G).png | Bin 0 -> 3234 bytes .../static/img/_flap.cfg/077x140H216WN(G).png | Bin 2474 -> 2263 bytes .../static/img/_flap.cfg/077x142H142W-(G).png | Bin 0 -> 3252 bytes .../static/img/_flap.cfg/077x142H216W-(G).png | Bin 2488 -> 2258 bytes .../static/img/_flap.cfg/077x153H153WN(G).png | Bin 2968 -> 2694 bytes .../static/img/_flap.cfg/077x153H206WN(G).png | Bin 2529 -> 2246 bytes .../static/img/_flap.cfg/077x153H225WN(G).png | Bin 2431 -> 2252 bytes .../static/img/_flap.cfg/082x225H225D-(L).png | Bin 3452 -> 3200 bytes .../static/img/_flap.cfg/087x142H142WN(G).png | Bin 0 -> 3221 bytes .../static/img/_flap.cfg/087x142H216WN(G).png | Bin 2570 -> 2607 bytes .../static/img/_flap.cfg/087x142H218WN(G).png | Bin 2554 -> 2579 bytes .../static/img/_flap.cfg/094x142H142W-(L).png | Bin 0 -> 3466 bytes .../static/img/_flap.cfg/094x142H216W-(L).png | Bin 2649 -> 2636 bytes .../img/_flap.cfg/112x153H153WN(G)(L_).png | Bin 0 -> 3772 bytes .../img/_flap.cfg/112x153H225WN(G)(L_).png | Bin 2929 -> 2740 bytes .../static/img/_flap.cfg/114x140H140WN(G).png | Bin 0 -> 3617 bytes .../static/img/_flap.cfg/114x140H210WN(G).png | Bin 2835 -> 2870 bytes .../img/_flap.cfg/116x140H140WN(G)(L_).png | Bin 0 -> 4122 bytes .../img/_flap.cfg/116x140H216WN(G)(L_).png | Bin 3171 -> 3053 bytes .../img/_flap.cfg/116x142H142W-(G_)(L).png | Bin 0 -> 4098 bytes .../img/_flap.cfg/116x142H142WN(G)(L_).png | Bin 4238 -> 4126 bytes .../img/_flap.cfg/116x142H216W-(G_)(L).png | Bin 3168 -> 3089 bytes .../img/_flap.cfg/116x142H216WN(G)(L_).png | Bin 3195 -> 3077 bytes .../static/img/_flap.cfg/117x132H132WN(G).png | Bin 0 -> 3536 bytes .../static/img/_flap.cfg/117x132H225WN(G).png | Bin 2590 -> 2584 bytes .../img/_flap.cfg/120x132H132WN(G)(L_).png | Bin 0 -> 4326 bytes .../img/_flap.cfg/120x132H210WN(G)(L_).png | Bin 3263 -> 3163 bytes .../img/_flap.cfg/123x152H152WN(G)(L_).png | Bin 0 -> 4074 bytes .../img/_flap.cfg/123x152H222WN(G)(L_).png | Bin 3253 -> 3141 bytes .../img/_flap.cfg/123x153H153WN(G)(L_).png | Bin 0 -> 4046 bytes .../img/_flap.cfg/123x153H206WN(G)(L_).png | Bin 3392 -> 3270 bytes .../img/_flap.cfg/126x138H138WN(G)(L).png | Bin 0 -> 4291 bytes .../img/_flap.cfg/126x138H207WN(G)(L).png | Bin 3351 -> 3254 bytes .../img/_flap.cfg/127x154H154W-(G_)(L).png | Bin 0 -> 4121 bytes .../img/_flap.cfg/127x154H222W-(G_)(L).png | Bin 3323 -> 3232 bytes .../img/_flap.cfg/128x132H132W-(G)(L).png | Bin 4587 -> 4522 bytes .../img/_flap.cfg/128x132H210W-(G)(L).png | Bin 3338 -> 3245 bytes .../img/_flap.cfg/128x132H225W-(G)(L).png | Bin 3195 -> 3132 bytes .../img/_flap.cfg/128x134H134W-(G)(L).png | Bin 4543 -> 4454 bytes .../img/_flap.cfg/128x134H134WN(L)(L).png | Bin 0 -> 4333 bytes .../img/_flap.cfg/128x134H207W-(G)(L).png | Bin 3380 -> 3280 bytes .../img/_flap.cfg/128x134H207WN(L)(L).png | Bin 3365 -> 3319 bytes .../img/_flap.cfg/128x138H138W-(G)(L).png | Bin 4458 -> 4323 bytes .../img/_flap.cfg/128x138H207W-(G)(L).png | Bin 3392 -> 3284 bytes .../img/_flap.cfg/130x140H140W-(G)(L).png | Bin 4463 -> 4335 bytes .../img/_flap.cfg/130x140H210W-(G)(L).png | Bin 3392 -> 3284 bytes .../img/_flap.cfg/130x150H150W-(G)(L).png | Bin 4270 -> 4171 bytes .../img/_flap.cfg/130x150H207W-(G)(L).png | Bin 3430 -> 3316 bytes .../img/_flap.cfg/131x152H152W-(G)(L).png | Bin 4246 -> 4153 bytes .../img/_flap.cfg/131x152H152W-(G)(L_).png | Bin 4319 -> 4214 bytes .../img/_flap.cfg/131x152H222W-(G)(L).png | Bin 3306 -> 3228 bytes .../img/_flap.cfg/131x152H222W-(G)(L_).png | Bin 3362 -> 3261 bytes .../img/_flap.cfg/132x153H153W-(G)(L_).png | Bin 4298 -> 4193 bytes .../img/_flap.cfg/132x153H153WN(G)(L_).png | Bin 4298 -> 4193 bytes .../img/_flap.cfg/132x153H206W-(G)(L_).png | Bin 3536 -> 3355 bytes .../img/_flap.cfg/132x153H225W-(G)(L_).png | Bin 3344 -> 3248 bytes .../img/_flap.cfg/132x153H225WN(G)(L_).png | Bin 3344 -> 3248 bytes .../img/_flap.cfg/133x140H140WN(G)(L_).png | Bin 0 -> 4449 bytes .../img/_flap.cfg/133x140H210WN(G)(L_).png | Bin 3455 -> 3314 bytes .../img/_flap.cfg/133x156H156W-(G)(L_).png | Bin 4322 -> 4223 bytes .../img/_flap.cfg/133x156H156WN(G)(L_).png | Bin 0 -> 4223 bytes .../img/_flap.cfg/133x156H235W-(G)(L_).png | Bin 3291 -> 3178 bytes .../img/_flap.cfg/133x156H235WN(G)(L_).png | Bin 3291 -> 3178 bytes .../img/_flap.cfg/137x154H154WN(G)(L_).png | Bin 0 -> 4246 bytes .../img/_flap.cfg/137x154H222WN(G)(L_).png | Bin 3435 -> 3290 bytes .../img/_flap.cfg/146x140H140W-(G)(L_).png | Bin 4844 -> 4752 bytes .../img/_flap.cfg/146x140H216W-(G)(L_).png | Bin 3495 -> 3418 bytes .../img/_flap.cfg/146x142H142WN(G)(L_).png | Bin 0 -> 4687 bytes .../img/_flap.cfg/146x142H216WN(G)(L_).png | Bin 3521 -> 3441 bytes .../img/_flap.cfg/147x142H142W-(G)(L_).png | Bin 4831 -> 4744 bytes .../img/_flap.cfg/147x142H142WN(G)(L_).png | Bin 0 -> 4744 bytes .../img/_flap.cfg/147x142H210W-(G)(L_).png | Bin 3610 -> 3555 bytes .../img/_flap.cfg/147x142H210WN(G)(L_).png | Bin 3610 -> 3555 bytes .../img/_flap.cfg/147x142H216W-(G)(L_).png | Bin 3558 -> 3485 bytes .../img/_flap.cfg/147x142H218W-(G)(L_).png | Bin 3496 -> 3425 bytes .../img/_flap.cfg/149x113H113W-(G)(L).png | Bin 0 -> 5643 bytes .../img/_flap.cfg/149x113H153W-(G)(L).png | Bin 4417 -> 0 bytes .../img/_flap.cfg/149x113H225W-(G)(L).png | Bin 3386 -> 3338 bytes .../img/_flap.cfg/151x152H152WN(G)(L_).png | Bin 0 -> 4540 bytes .../img/_flap.cfg/151x152H215WN(G)(L_).png | Bin 3668 -> 3600 bytes .../img/_flap.cfg/151x153H153W-(G)(L_).png | Bin 4640 -> 4544 bytes .../img/_flap.cfg/151x153H225W-(G)(L_).png | Bin 3554 -> 3468 bytes .../img/_flap.cfg/156x153H153WN(G)(L_).png | Bin 4678 -> 4578 bytes .../img/_flap.cfg/156x153H225WN(G)(L_).png | Bin 3613 -> 3552 bytes .../img/_flap.cfg/167x132H132WN(G)(L)(L).png | Bin 0 -> 5687 bytes .../img/_flap.cfg/167x132H225WN(G)(L)(L).png | Bin 3757 -> 3673 bytes .../img/_flap.cfg/170x142H142W-(G)(L_)(L).png | Bin 5637 -> 5552 bytes .../_flap.cfg/170x142H142WN(G_)(G_)(L).png | Bin 0 -> 5419 bytes .../img/_flap.cfg/170x142H210W-(G)(L_)(L).png | Bin 4135 -> 4015 bytes .../_flap.cfg/170x142H210WN(G_)(G_)(L).png | Bin 4038 -> 3918 bytes .../img/_flap.cfg/174x140H140W-(G)(L_)(L).png | Bin 5817 -> 5688 bytes .../img/_flap.cfg/174x140H216W-(G)(L_)(L).png | Bin 4062 -> 3967 bytes .../img/_flap.cfg/176x142H142W-(G)(L_)(L).png | Bin 0 -> 5678 bytes .../img/_flap.cfg/176x142H216W-(G)(L_)(L).png | Bin 4116 -> 4025 bytes .../img/_flap.cfg/186x132H132W-(G)(L_)(L).png | Bin 6168 -> 6091 bytes .../img/_flap.cfg/186x132H210W-(G)(L_)(L).png | Bin 4222 -> 4171 bytes .../_flap.cfg/188x153H153W-(G_)(G_)(L).png | Bin 5596 -> 5500 bytes .../_flap.cfg/188x153H225W-(G_)(G_)(L).png | Bin 4111 -> 3990 bytes .../img/_flap.cfg/190x140H140W-(G)(L_)(L).png | Bin 6032 -> 5967 bytes .../img/_flap.cfg/190x140H210W-(G)(L_)(L).png | Bin 4387 -> 4199 bytes .../_flap.cfg/190x156H156W-(G)(L_)(LV).png | Bin 6120 -> 5976 bytes .../_flap.cfg/190x156H235W-(G)(L_)(LV).png | Bin 4350 -> 4243 bytes .../img/_flap.cfg/191x152H152W-(G)(L_)(L).png | Bin 5793 -> 5700 bytes .../img/_flap.cfg/191x152H222W-(G)(L_)(L).png | Bin 4274 -> 4203 bytes .../img/_flap.cfg/191x153H153W-(G)(L_)(L).png | Bin 5794 -> 5683 bytes .../img/_flap.cfg/191x153H206W-(G)(L_)(L).png | Bin 4503 -> 4460 bytes .../img/_flap.cfg/191x153H225W-(G)(L_)(L).png | Bin 4245 -> 4152 bytes .../img/_flap.cfg/194x132H132W-(G)(L)(L).png | Bin 6376 -> 6298 bytes .../img/_flap.cfg/194x132H225W-(G)(L)(L).png | Bin 4174 -> 4121 bytes .../img/_flap.cfg/194x138H138W-(G)(L)(L).png | Bin 6185 -> 6100 bytes .../img/_flap.cfg/194x138H207W-(G)(L)(L).png | Bin 4464 -> 4408 bytes .../img/_flap.cfg/206x142H142W-(G)(G)(L).png | Bin 6313 -> 6220 bytes .../img/_flap.cfg/206x142H216W-(G)(G)(L).png | Bin 4487 -> 4386 bytes .../img/_flap.cfg/208x142H142W-(G)(L_)(L).png | Bin 6253 -> 6221 bytes .../img/_flap.cfg/208x142H218W-(G)(L_)(L).png | Bin 4412 -> 4388 bytes .../img/_flap.cfg/208x150H150W-(G)(L)(L).png | Bin 6127 -> 6046 bytes .../img/_flap.cfg/208x150H207W-(G)(L)(L).png | Bin 4683 -> 4608 bytes .../img/_flap.cfg/215x134H134W-(G)(L)(G).png | Bin 7109 -> 7038 bytes .../img/_flap.cfg/215x134H207W-(G)(L)(G).png | Bin 4897 -> 4728 bytes .../img/_flap.cfg/222x152H152W-(G)(L)(L).png | Bin 6344 -> 6272 bytes .../img/_flap.cfg/222x152H215W-(G)(L)(L).png | Bin 4770 -> 4632 bytes .../img/_flap.cfg/230x142H142W-(G)(L_)(L).png | Bin 0 -> 6711 bytes .../img/_flap.cfg/230x142H216W-(G)(L_)(L).png | Bin 4815 -> 4797 bytes .../img/_flap.cfg/232x153H153W-(G)(L_)(L).png | Bin 6306 -> 6284 bytes .../img/_flap.cfg/232x153H225W-(G)(L_)(L).png | Bin 4677 -> 4654 bytes .../_flap.cfg/258x132H132W-(G)(L)(G)(L).png | Bin 7804 -> 7721 bytes .../_flap.cfg/258x132H225W-(G)(L)(G)(L).png | Bin 5037 -> 4976 bytes 154 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/static/img/_flap.cfg/055x142H142W-(G).png create mode 100644 public/static/img/_flap.cfg/062x132H132WN(G).png create mode 100644 public/static/img/_flap.cfg/066x142H142WN(G).png create mode 100644 public/static/img/_flap.cfg/070x150H150WN(G).png create mode 100644 public/static/img/_flap.cfg/073x153H153WN(G).png create mode 100644 public/static/img/_flap.cfg/074x142H142W-(L).png create mode 100644 public/static/img/_flap.cfg/075x152H152WN(G).png create mode 100644 public/static/img/_flap.cfg/077x140H140WN(G).png create mode 100644 public/static/img/_flap.cfg/077x142H142W-(G).png create mode 100644 public/static/img/_flap.cfg/087x142H142WN(G).png create mode 100644 public/static/img/_flap.cfg/094x142H142W-(L).png create mode 100644 public/static/img/_flap.cfg/112x153H153WN(G)(L_).png create mode 100644 public/static/img/_flap.cfg/114x140H140WN(G).png create mode 100644 public/static/img/_flap.cfg/116x140H140WN(G)(L_).png create mode 100644 public/static/img/_flap.cfg/116x142H142W-(G_)(L).png create mode 100644 public/static/img/_flap.cfg/117x132H132WN(G).png create mode 100644 public/static/img/_flap.cfg/120x132H132WN(G)(L_).png create mode 100644 public/static/img/_flap.cfg/123x152H152WN(G)(L_).png create mode 100644 public/static/img/_flap.cfg/123x153H153WN(G)(L_).png create mode 100644 public/static/img/_flap.cfg/126x138H138WN(G)(L).png create mode 100644 public/static/img/_flap.cfg/127x154H154W-(G_)(L).png create mode 100644 public/static/img/_flap.cfg/128x134H134WN(L)(L).png create mode 100644 public/static/img/_flap.cfg/133x140H140WN(G)(L_).png create mode 100644 public/static/img/_flap.cfg/133x156H156WN(G)(L_).png create mode 100644 public/static/img/_flap.cfg/137x154H154WN(G)(L_).png create mode 100644 public/static/img/_flap.cfg/146x142H142WN(G)(L_).png create mode 100644 public/static/img/_flap.cfg/147x142H142WN(G)(L_).png create mode 100644 public/static/img/_flap.cfg/149x113H113W-(G)(L).png delete mode 100644 public/static/img/_flap.cfg/149x113H153W-(G)(L).png create mode 100644 public/static/img/_flap.cfg/151x152H152WN(G)(L_).png create mode 100644 public/static/img/_flap.cfg/167x132H132WN(G)(L)(L).png create mode 100644 public/static/img/_flap.cfg/170x142H142WN(G_)(G_)(L).png create mode 100644 public/static/img/_flap.cfg/176x142H142W-(G)(L_)(L).png create mode 100644 public/static/img/_flap.cfg/230x142H142W-(G)(L_)(L).png diff --git a/public/static/img/_flap.cfg/014x153H153W-(S).png b/public/static/img/_flap.cfg/014x153H153W-(S).png index bb3b9a6f108e9c34f03638246756b9803923b323..baac19d10de32cd232ec2886584b1cf72b452fe7 100644 GIT binary patch literal 1073 zcmeAS@N?(olHy`uVBq!ia0vp^`V0(=UpUx+thFmkzA!K_|L}Bi45^s&_U_r-+YTbG z4<9p|PqYeZyHy|^x0844LZcw|(*+3%ADw152%UV$`BV1`bAYip|D=1&EIn}z{)^)F z=iR%1f91~~KO7FJ_@JOT`O1q=i+=8`5!rD!Z$DpfCFf*=L5?g>P3+IFmp@}OtMJ^f z>!w=&Woz73eEQ1Hyquody4WxOx#9Bv(LY|_{VcCt8+)#>=hXX&EuJ$VNJjNfX?koJ zN)SBpc(~qLN)S0?&aO~2t(?VcTenM~ z_(J83sd)TuG?%pO{Kl5u$AM~v*z7e|Q&o{u#+kKdQHwFOK27uPN7H&uTJI*RR-Z#M z8((g@&`}UpCxQsR;w#54GsS*e^G5?@^|KcY=PeHRD<$^bsoC{f`|pq3{%`oFe|+U1v317lZ2g|DuYads ze*d)h&a;1XmTK!G1tfBy4jOjRmd{%G&pj8Ow+4jc zi~cUcE0t4yq_-T*y0xHJQ@L~r&nBhriHi=(-9A3;edI=i7q2*<)oV`rY;^304EtBB zV-oM*zu%R->GfBux)&YkBI{vr&$*w=PCxyW{c?igu^o5w_Aj@ofAO?Cyo+v-PuBkB z)c*YVc%K^6$5ZD2H+=XrU;qEN9}~~Y{<{9`!pF^V#X#5BhgDq7TyJUHm4EzxeaqjN zmye6Oigot8AJqoI=biU&YgW&D`h8i&QZP&{`ZI4G$MdKn)?fp;H zfqR00u;|(BJH{x_$=15B*{{->@BpS(Uo;P-7-snIZfagn-p-P%s4!LA0n{Qvn| z%X8p7?bXNESGs0YLj17whx;`ot^cgASs)p7)1>Ytl0p6(pJ?8O+sV}#{|dX!eioCG<@!X?xcfy}HeNy$E3~pX`5N8owe~{Fn7PPr3j4 Thx5yT*@nT>)z4*}Q$iB}0Fk1f diff --git a/public/static/img/_flap.cfg/014x153H225W-(S).png b/public/static/img/_flap.cfg/014x153H225W-(S).png index 0185e5d31841814a73c7f922d8ca1f26b327bf39..3c76b5a77d3bc31aac155064e3a953761e753087 100644 GIT binary patch literal 716 zcmeAS@N?(olHy`uVBq!ia0vp^3JeU4UpUx+te8dml?)6_lRaG=Ln`LHy?ZcMDp11p z;cMkt9GMySAU;OH01$q+;aU5=`}g<%e_MV1_1ELe{1~7TFa^ZXH?1FhxXRtX zzy4!?bm_kxdMBUW^l!M!%;&B5?`vI^b~tZA4zrvf|4gj}$0agMN(qUZw<}J5&KV)2 z+1|jRaa@h@zSzIF_Ob@X%lw2lD1ltJLG-{=$Ja9?omqNZPAMudZDZMClOSzmVD; z>iHe2{t8D(f!*HTV6#B=^$e(NoM=HN^FAq1aJ*38YWJ6OL-m2gv(Im-Z#~zu@-oYs z4wxw<(A&QJ@4J3a^Yaz;24GmVH@uPkFzrbk>z()CYxlEqbTkwV81~r7f5yjUZIoc- RJ76kh@O1TaS?83{1ONx*4p{&I literal 567 zcmeAS@N?(olHy`uVBq!ia0vp^3JeU4UpUx+te8dml|arvPZ!6KiaBrZUd%mYAi{dV z{ix8~#mO7kvY%*Ym+&5YAtS5&*QqN=)WD*4Tj{;{7LUHX6QWMjEM1NWbr$z@%vh%R z^wDRVrFo$esbp}VUQ?(;K6RQr|0<|yB!-tp6{{z zx2O2t7Z!%DX+^Q`moJUUYKw>|OYqU-;_t_JGxlI@=eRxR9+{<>lgM9sYH!yBPS7UVN8xy!f|1X$s(fG&RQxdBP`B>w6;M>*1qLDuUi|M{AG|B**|jC= vAf*%dEL@IE;)ZtXkHa%i;4*l+`njxgN@xNA7Q3RE diff --git a/public/static/img/_flap.cfg/055x142H142W-(G).png b/public/static/img/_flap.cfg/055x142H142W-(G).png new file mode 100644 index 0000000000000000000000000000000000000000..f6b9553c79bfe9cb2bc2db17912baf72086aff62 GIT binary patch literal 2353 zcmc&$c~BEq7~d=_F4%-!m}up4vjI~ZkJc6pa+ri*pj@_E2#Oe|md=y`7mp!cn1m?F zs1Qe58HrM>wc|8{c(v((x{LmyBNMy^R1m|!NKq?6selFSd(jSf%(T;g`p3R~?|t9z zyTA9IWl@@%?;GfgAP7GxQS}-4a|pug$GySKWK4=g5PUF6rC6e~{eJt>uCCn43$OmT z-DVBR-`-{oTKY}UnnR7&kh$@@&V8;w5;%A6MHkbQ754RRRpHvcSaj%4<8U1DbmUpz zlcojJMnW00-?X^Ktz|>UI$~7v1Ng-N-UgaV$GR-~7}6?1AFJf;=gHwyO`F)`Tci8U zE8@1fTgw-W7FA~&yEhLH_O+;s??$QG>u8PCeZJ&0mvv^7kBMC#vtHn1h<2yS+pm)v zubP5A;RKp_FPL6^61Vd*Pxtua2I=kLV1G2Tvr1pToUZlGzEqG*VKogvSPg_|2LR-& z?qIq%94ws=zXVk0{U5rmgiL%F>pByI=CQYePhd({iY>k?WU?W`HB+!06*1nW)$vO0 zeUiPJMj9f(WTt2JX_|0s^}H!#pPNOeK{cQ_nUz)M?yIoI}*yfta#M{TOa=*Z&9N)?;G+sWmL7aZbjl18w%HKz8^LAb2NjSW zWamaKF20Fb4KuoW75`B(=0`NdT3iaHV;ab=v8dL2fHoHSH*A6E7%s4_1V0dFdJw>Q zo0xov3OerH5^m)CbnJuG5t+-cQDf0W!)dctqI3wLjF7C7Jc4tYm}1C3N6UAnVsmKI z6Mt@!PlpYnavB3|<+y+{ttCNm$;=TlKQcHG@1~3;J{>xUl4$v5;l@2gLm}i(yAT*0 zk4eO)7FdijQJ#A#Et?^#FT>MP@M9uSlgyfC?N-`>h#qDWBV)D69DGezhYkZoq7T@8bkYv(#uOuSOJ6EFA# zUkxjt`J&mCuVU6J2P2`QNS=E=Z6+G_!qzZpN}2)`JBiU$Orac%hV=LH+!E5{)8Pj_ zDm<6vMSd_usMs6v1h7YYKaWC>gc@OkEnWdgfBaVx2vFs-K(qd6=^Fz7FVbV+Ws4k3 ziN!pAjW^>>lH*R`aKGy#+Lh59)qlC93Fd2%J0Xyua zfhCc6jHS_QyqPo=0w&;4+Bjh{X%%Q;K~ZPWw_xV$6W}4%@B0=^4+6jv^qLgtfeJxR zdW1j^#Jr&}9Xp%}^ms7;RpEFeUspKZNRNl(6}~ib28amts8r{%RZ%G%EWy9WK(&FY zqonR4+Dx+NER+hVhGk2voNzV;<)|cZ2N~G6Q^j;aRD9|cA&?-}=>+>NhyFz%g44<8dwEDx=dRJN-OJVC&_tXOggO-^V&S9AdO*D05=bJjY3DyHu!#Qc1^;rz+=cgHRHPk z>^Y?mC5N{mo)a?eIJ%rB0OQ5WYVCwXHHBOwad4?1J-8iw7`$lKVHw~uW8OBPp?H;y*#aWhS4GO2Nl_4Fax{!{S=>u$XvF%fE(X1s4kxb6*H&BAuegIe`Wt zv=KVtY@Em2Q1{Zj8W!Bq1*C=tU6U3HcK@S-ZCiXsry*_TwdTK{9Iw1X>U(qV4IEm5-jhG~qJ|gwa3Au+ Qz*7iGN=Q@HD7D7F0O(F?pa1{> literal 0 HcmV?d00001 diff --git a/public/static/img/_flap.cfg/055x142H210W-(G).png b/public/static/img/_flap.cfg/055x142H210W-(G).png index 15dc9bcd1e14ef3298158bdf7c72609c8615c8ea..97cd728f09d63188d2bd5e8647c30c524d4bb300 100644 GIT binary patch literal 2126 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 KkY6<}QTz=98!?gq diff --git a/public/static/img/_flap.cfg/062x132H132WN(G).png b/public/static/img/_flap.cfg/062x132H132WN(G).png new file mode 100644 index 0000000000000000000000000000000000000000..9adb57db019f5a317adc9307f39a8e124b400236 GIT binary patch literal 2730 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 literal 2299 zcmeH}|5sCG9LLufGAO`pfs270Crohy69vP{3iEpnG7D#ZXtWIuO!@bCfO6 zMg>EdoQ_``a}E@k5P1z8Q>Vd!*aV3hnAv6q14{W)pUaQcAJ7l|^4jNlp1nU`?tMPb zbLFom@AUNW^B@oip1fV$-SDd-5T2PKuK?>>#pGoIf&2}R``Q~HG(NK4DDv+katHcf zeK$td|D0jX*2^`FLoWIKUMH?y?dPV_I|qEyqVILZ2Ta=3=e0{AH#&CQ_?9<4df;kS zsh97}{Nt++%7lUCZSGYY(9~d#h7|ufcAiR4Bc4h?-f*wdbh*s8Nj++3o!#Ca-U(Ee zmKHxfv>>IAIi1eBlBK2Ci>8YyDNTp3I0IYGd5>S?8bd|XUly*IIdI%wmly`?eR*#xnWGg=A?G`{aM=Ze`3Ca~F$ zh1-4`IK!Joh(HqB<62uO365O>^y$Ir8tVp>^|%@Doh6$Uw+j>)ReAfJ6FB#2aOQX7 z6yL;|GlHplhR}?bsic5(X6rywAW#`f0j7r1fRs=l`b0(;haFXWpP0yvstI-hD)Mla zp8?9+?z>Fv%_QYt*IkN39;@@J@Rc&dYf?TMLoKTsx*sA0I}8nFXWUp^zlv z{HLaEq`3fPKnlDMhnv8WPAox9$JXkFl@2y|?-F-V;Juc7m~Ui)n3!oLgD0tQCkwW8JIWUFkp{zt2()lg0iya#YiZUacdB4= z8+$o?wYnvTI4XJx22ftm!#EaaX&BOj7AT7@zD_ch`M*$)eK3#;sR#ooU=E&I&T2}x zQ@}^=P2!^lygO#>>Tk(a4U5wY3-_JN<^pco2M5oUG|}jfpY9XMvGp|ifnsqt6`eY= zb0UFcWFMrdWqZq`|~fc91#9$(CcavLbL$8ySOhO9IZ#yMgOz)|mLri(KRu zeG|k^q(=e=8PUK!j8}l4xl49$)(V;WklR$?L-X^%FU`Kdx6O2X-s~r2a&D5M4D}Ys zu0Q`cP%nUbte*(vz=Hw>)RsqNnBK8}PL|NwMj*Kv=y;di2i)BZtcpOh#7AcnNHTer z4cMv1sTsq0A^@I|OpyhQug7l6vLWBJE)Z$sMP)0~Q3Gt&3b}n8KfAod-Ajpx8^v;q zBqK<>lM!#KWt21r=5qg3Xf1`%5VlS=_G^%Cp6u|lbv9x9gLKC!R?ps9Dc(ho_1Q3D z^v=GBcE^bNR$8C!E%HYfcZmA%b8-II?6#BGQjpFIjT0q}y0LV+3obMv^z1-KAu??D z&s@RMIVG!9hC6L(h;7?=6e_p-Ws+DryM#iwWNhcyi!PjTp;=~YJ^7;C^azf$I`<0J z8wtlp?#4vd{BGkVK4SA5q@wZy(IEJ5NeWOIj9ZJ4sskgK*5ZHmIljoL3gbv`=V?IK z^fr-ZX*^4Y$rDV@Pmv!Y!v*_eLHERyp)w3}#E5Ng-$8H&N1<`=5f5|mg|}2#Z`;{5 zpz93t=8Fotws52u9#6aG7S=)hxr02!Hq!SHB;n_vn8ik4m0|8s0!-GyxvO!5zX%}r zAtG%RFN7nVs_Su~tr~aw@V@&3%?LkyC>^ocf{&6|VcE`uV1|0TvckTfVAp88L29^u z6m%U=pM39jIB7bXce3fK|6#w{_kJ%g-QQTAcV%+VKW`zpnr8RZ9DsYOXmRFI!`DAg sDNZk6Pyc#n{XhA)OZ-3hKs0~4obL9RyDN;5z();%7njV{#USN>0n*Cj82|tP diff --git a/public/static/img/_flap.cfg/067x216H216D-(L).png b/public/static/img/_flap.cfg/067x216H216D-(L).png index fbd7abf8270d85c2bbb67023f135b909a2c4f3ff..fc7dfd5b0e1723cccc8e4c713632bd6b9fd9e8d9 100644 GIT binary patch literal 3273 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 literal 3395 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 diff --git a/public/static/img/_flap.cfg/068x207H207D-(L).png b/public/static/img/_flap.cfg/068x207H207D-(L).png index 2465136adce676fcc2052e32956f5b806e6b6b7f..4cbe609c0da7cdaf1f965d33767baaecc2ff01a4 100644 GIT binary patch literal 3221 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 DZ|{#R literal 3309 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 U*MTQF;BSnUk7oe2++!#2Kd$V-CIA2c diff --git a/public/static/img/_flap.cfg/068x210H210D-(G).png b/public/static/img/_flap.cfg/068x210H210D-(G).png index a4c15b37b3e4ad17bd519acd549eb5dd39110c02..66ba6e90f5c63f49cdff81e23050a283ca133330 100644 GIT binary patch literal 3161 zcmb7Hdpy&7AKx(j#>Q`xthxR+(TU2E4pNxS<%A-)gf?9`Arw+64nOk~i7s-E(`C9z za?2@oT*g!+p(1rkn^bdBmU=omQP1}`J+J3^y`JZv=dW$wy>Fk(zT0xw_MZBS zB*y;J(wd81+jlt)YrE`x_BF9N+hEZFe$g!h4dUZ;>#m81YS7-8^iN-=f1lu()tWl* zv%dJZD}e_&uuvl!w*W#s&_Xu1gNBS?@OB=QP8+)Eq_e3dC9VBdHT=5ytHVpA^>_c< zJ?xefQqG7ke=sOvdB}1lvCPrMXa1>CezQY2zK< zAROs?j>YqR$=XDH&oMwIICB9auM;ZDdjt?pciaI&=Ny}-^AadLw>3qEcK{7WX&z+A z&F}I-v93V0Qs`a9;(5OX8qX6Akl{q2!N}{v5z;smlO_WMrHaj?yagK5J4}%&ZJ?o8 zj{(F7D{oY36@XTXSBqKbYB|uDCL17AWT2r~)qx|}v8a-r1Q5DnHmWNJ8gH~sk+D@k zBYORQfT*|fL2Il)4zbS#7V0w!G~Rd_2;HzNXY%1IXATtF)wAQ!8aBuwre0v9)KQ@E zk9!`2aM>Jus_8;%GCt2qa!k1^7;xL-5a}mOsl)v>51+Vhjp#iLCaxq8B5qv{?e`K?LCBW|i{KxQ#s=Gikyy%7-`Lbh$>QdGB2Rq7v$odRnFAZKpIsl5E*9E(VJdi)MTiRSxF)L_!CQB{{HKS7knsgq zHx=C0PR68zR`rURvD93US`k347x5G!R60uqzepS?#M2T3Ud7-}ZDtkE?abR;D(-_| z+j$J{1(o zAedgoP2hC6Ld3;`2_ySERKaYnZ5613Vf-dwv`fWC(^N;$Clv&qz#UZeAS0@f+zwD9 z2wjNRY@#Xz*`TuH;%)r@L=?@Ut69!&sG`ESz**-D1rOVoO!`AUspwJNEBEwcRhP@C z)-oRSV+IumAmObdRe~yk8$KV;;2MPMss0~8a6=`L3|Z(>$$taEeRala5Jt`rf#Sb_ zV9Ty&{#(3u{)}456N`u$uiQAzAm9R;=U-X`GTDf`*UY3j{3!pDDn}b{Sr#rlg4yJD zD?r{7$rk&W0IhL1@r-~iD9ysz<=tL0Z1u-R-`Ij>QQz2w-EzQYw7>iopBP&(!xrx- zeLvF=#o!zPC@^WOHhrcCIagd}*u6h59K?I&z)ISr-2iHGtR+!Z-eUFjGX2=*paA7N8Mn72iEgSXvyiicR{QZu$70OxXgI1Od8MGAa zJJ(5P){$D4OhEWB4h$Zul8r*_4Y%6uq8{5fq3B>waVp7B=a%B-m`ymi#2dG1*JTEW zHZ-DWstGa0$w)6U;;b~L<>U28F7_#?=E<(^o-m)~fLXGBbhhk;l!LqsYrV&jEE*@1 zImhlfNVZv8pd}kgT^WSm_l5Xi)ifDuWq~r*&Sl67yHZd_45>>-$O&I=(ayMy5^{zl zF4&jggn@^Sq9ML?r{C0q4VoKAVjQM|s;YHY{=wWG*1Ck_@@N`e$IXXjl(nppX|e9+ zd%0LF`Es@*j+8fFGMe)|7TN8G5`P%d+XD67*P4@D;en;-qA zGq=pU8EM^%4!v!xZO*)rnz4o5cqn6E34&4u5 zx+EaePrZh07e|t3pZW|%Wk<)6*dzw4t#5JWZ-l%oL%P4a;?3RC%Rfj6Zv51qet03E zOfC-WfKHz%KO(SXiP>Xw%Z}<>x2jX-3eWJZ$!ZisIe=9PyyyZ2)FblDc%NO+`&@j@ zT-%0^dT;}(1zrrnFVG6>NH3z?z-_RQ!xo2TqQS~P^vWig|yG>>YStXy${<+Oe8SXc4BrwdLnt8Y%HJOQ(U0$v?vy>JY|Zojf`b|J>(*rwxYWc9M>|)qe^yK z_w=Q`2Og9r&LKcSxvruVb6843_#gNO(x!0F59R!Gb-NGtR1C=YAGL8 z&uf>^?n=U!K5safa8oNH_dDs=k*H1+VLbaShJg1zM!3F6hrhFZNc*_-?}0Sm05$i) z9i*te-=nZPU%`*k2bBN^h!6bG8B&Me^9c< zJGZ6Un9B7{)bB8cnaLz}bM!pf$<8FSN&Q28<|E&LJMO7LM+mmr4ep_>(Zns}zD;Np zk80zF#i086CV~%eH$OF?n840y*d5UtOLV99d7~O7-}7u~CPgbG(MZ)$P$A)Yb~LNa zYRN3d3x|*u)u;ZlY&rk*9aVP%ddAO4bPEHYo@18x%Z6pw*00d)(7Ng9$JuLdAu&R# zf`SVP@6qV(WU@^#cJViTb4eQVODI?E&fMXxn@MDwcA&uRHY3T~2=NL{bibLIy2G_9F@28Jw}h z+^{{>X2hFytD)N0bh^O%vkZP1VKtffYFtlX^jQMu?B%&-yc^4kxS!mvMHhs9&e%g- z#P`f_cyrusY4TdDsq6INQD|N3laB?K3(m7fPBT7G-UXmnH?La>bYK3qGxg2l7E5!N zF$2TNlw{JiaMSz8ltV{pGOd+mKmD(t=-}(_iD_5e)Y*M-i2rB9l~5p^$(}w7{xT4} L_`bX}Mw|2UqW)8|N*<6w#x=167kWfwDvt!0(s3?_O z5*3psrBrG)rkAd=wUjM2#j1@ADc+QQe`lsY-}m!5pU*t=e4g*~eZJo_=Q5H2e=j=C zj7B1n=&M&@f#9=}L?Vwt`TzxO@$)2+3|d!XE7zr!4!wAhV&2WbRHJ-vZlaAr%`NA# zKIamB#YPKS>)uDddaNXI+y_eQKlHw=I=pdZODcVull-59V+Fz$kyh^}$A>#Rbp5`4 z8-MvFa_kUE46FX%k?J+E^v(K;M*EDp>Y8$NDsA_F7Eisa$hy}*dUIfWC&#mihY;lF zl$fCwmMyBVloq-uZ2<0|0dTNFkg!D|-`e&OilXr%*0#J_~><0+<2764|3@w7p>) z^piEW3(k<^&`%2i*x<+Ka+R|zq)2=^E<@c~8O-Mgq4m7w1ZW^YLo$_$j3pjF} zgMgpBkPCkc^#pvhDVlyEztCl{bum{0UzbZ^*QZ|XW?eCJ(Z78VR1mr$2eRhMZ2j;v z>>ykg<#(2e`Mm=c?^n-8|6Xkh6h3zeh1CxH3@ZgF=x13N{T*vF{iDxZbd(J|N;XJ< z;=armZ?9Vi6#msr%)cLad|WUa9bEuCN__4Ric@iTdsQ+}7*?||!+zlLt+)W53IhYA z3lK2C!yXKZJO?UW8*|{Y9*=gjFR`-$A0Ork+3x`QJ(u!fw=gh3`Zh~+`K5wFm%MH_ zFjy6WDiGB_7etA~nOEy}Ez(Dr7D(?#dN)h43`$(c#5l}Mp-Xr+gh-)sK>xtSS&B7s z(MLq3k8@@d>UgEuLmm!!;mhQroiJhOFH@yqX(UwYLD17Kh~8*us!U~qr7_SlFM`&U ziv~3G4>DCECQiUOuprFhBB6=ZD?c-QD!1^`Kl??kD~8GiPS4(sx_EN9xQ?N#gA5uyI28|YjmQ! zkSNYi=JS}&j~y_=()q~_x&-uiwC*%eZQ^q^(w&xF8mZBln;@RwZ>x6H zr*U1{vecs&0R6%3`JgFx~Lfg6>%F4Kzt{c}e7*w17p=f2)+lM-7^I6qs}tEa2s+bT%Rlh=F34XZ(=vWn z39xVp1*i<*D5rQr4ggE~9T?RE5HqR4I;k}d4Hbb9a+&RSKA=XMNnR57y%048 zOHepA=xYthN3}aq^fi3XAPFLt@wk?uO+pPKh5@@dboO!<15uEWd4Y*w1HM(;h1#zH zyD8T1?j4xMw>vW4xkj(xM(t<8L&mX;;;~uZtmd(Z>tmB8vAqp^9nEqd1)SETGTh@o z5jgR$$J@GR)I^>vZ>MIsKi*8uU-z5iC`9~zkG;K?_4_S|9oeQ_;?=W}N>7eh`3?g& z;CRa&ub(g&uXhIpt9_@Rp3#P=?;I=JSjE{-7I!ZcgSrgRSV0h z%kYv|N|kO=mcQ>(yktL582Bp0txi<3g#wnA_1muSg_zFrd0+1h|G`Zjm{qYEu3X1b z8nEA*RBUDdh{e>Cy*&|cH~YI0rormNj|Dr7E0y#aPO_V5l>K$6Ivl-rz9K_-Fcu%@ zh)Nc&2)T?TolKH`l(aAW6S5wLPlPP`S$J?aesGsq+CZ_f76*(@?@XaM>DyRK0!FC^ zNNqkwm3>AhkKZSI-(eO-^OD1F4U)a7tfEk59gXb0npM=5{q}NJkWLZ9%jOeb=?!#% zYo3T_r?Gbm1NTGKSASaGL@7~;@EhKkP5-rzf1Sx8d;iL89*7hBvqMKBYwH4$VAr*0 zQ<+KNQTBTi%nz2Q3j=RK)k|}qqASjB!+*aDTL#O0gn=rkdK1ccm0ry%8nrxjonqr6 z4(OQ^Jw{742-wc3?E6j3*DW&huyLK?kVIKF&Bi4+V044>1KFF-Dw@hX6lv{Ijzp$R z57=&2Irjd+-r}*E5*JxIPZ6<$RTMqkjJ8CEc};vu+P&}ke;SR^r6-D)ZL_SrG==?Y zbilnaU;W0*v5sriGTGyqCP)?QO@!Wq=I&YK%Eoju>-l&&-_+ESN!|XvThr(QPH>F}&a#k5NLLojRka@v zDu1DFp;Oz63lc76fN7Uhv+|~1GcGT%RM~bMmKr}lABW2}&aq~dTE6P-ppJy!fnt`X z-_|QA&Q17>=JsV#&ye8Mv!dLD!yWY^_;q46v$Qd5gMAzF+5y0*;ZGa6&(HhfPQmK8 zbSmDoMgpDC$^4u_9l6Os>Rb5EA5Rq|+@_UD&bI#3Hy|5Bq>JB3O}LqMDR@=LqEUD8 zll6Z?UdQ$b+~)sSP@SL9N2~u54}putQISV>n~d2t!(j_vh3#1;h4&q?Q>P^nYjV`KS4icq+5TvaL_J8mrl0o566H)Jc!s)G zAYQ<tdVklJgE@SQ`u{!S|IbzE`x`Jr?Eb{9C z$Cqk&jw)Dh;;IZ4c{Zg`E;g4)9h+05kTPnaai;AXNzNx#38~=DtmswvhTuX{$DNrc z`x%T^ChNK3b5t?xRl-eMpw8`7YJ%Z7e8h7ijzUea8-R~^tP+ld^9U7t8v$O7HRV)%u zFEq}Zz2{`ZV1lo(m&q$-sD^-x;ab!`lB;tcJk3HX19Wo1%zFEHgh#iwzM zQSxW!rC8nZumjyk;Tc}-w9ku2vHk!&bEa-=xHy}cSv;0Vp~}xA!{6SOQ>k!_`9#Aw z`3k#z=nF?M&gi}Fs8f2&%Ne{7{qJM^$fw+G5$9KKjo8f67&H!wr%XX5Am3meggmw>4DM9XO}wML$iTSCN&8 zuQq$YIwV-a?B%bfyVBQY1DXF2~27=oqH;;FA5-9KWYRT6*27qwx!-kXTeuMRADrjJ_L=U zDK|>crqG}r9|WD&bbh&VbTM^1C<&xiH5#qa2>ifR{G(nH|FvZ0F?9omKci;1s#ns4 ziJDzlTD`lBzesS#T1B^d4WqQk%6K&}Q6HzmtAVXQqi9I=9{BYx!+Bx#_6Of9cZUyP zcyHCxeFhYMyqc=q%~d3;sVbmhtftN)aES{ZDd{Ma4E26;5i#=I;eV}FP!@ozagOF{ z>96Ui+}-N!aEij;p`PhtoCiAyXMx5U)+NBp97!W$J5ryR!cV^MK~LW6(Z!JZK~S%s zEkurLk7I?j`>^<-k%bIoWMK{yb)?E0rc@DNt|CCi(pUVXVud)r2V_$&)_rv&Kqf0Z z=(}vNVfW(rOk}fy*u@wMGeS@B8BCO<#~MONB-YTI0RveIW5Vtw^boXe2 zU*d?s_4oCx+x-(_%C=MqHlyPjP{Z5gGDV{=<5vC&It!pcQ=p3{odvgX5SeSuM!EpV z89qFo%|umi*##k%7I}q}x)_|Wp5IK+IC?4%mNA*A&N>S84iE>O*~kFEXv(t6*bj5R zal>Nm&eA1T6M!;^vq8tHqrMG#0u()X5RBCk4aP*3Ald{+mx+T0Y>WOpXEypOE~kw3 zSz;AQC-Gsi30f1))R6~^EkLXT*4a#aXQ36=;cTYFsvZ+2J-xElpsIB&qYpC0Cy-9jgI4kP9&X<(3_8Ay+(M>`J|I$Z{LruIA{ufu2rnh zD4PG*ZyCaTF1Eg5FM-~0AL!NiT0>ml&5+#tU72#ng$_r*ny-cD=2q^a?GK3P*%=g5 zS{Dcx*TFEiFVG5`@dLbf>&4Ve{P%Br<5Pd?F?H)Kdpq}V$j8}19`#3j%5*tXHrJ5r zT4A|;ew1UWYIa8TwHd?@$tc3vzn!a21Z{C@gJU?B);vj(R~5(>i|EfUIi07^*0ytk z#d#f)R%42A?Dw>9K0aSf^B?(|5h9(e|5Jf&Z1t+ z`n{3z^rfp>1J{+(9W8k>8k8j~Yw%1vKQL9DHQYjt4h{Bwfvz?$z3k}3J9(;uyjprj zN;R)MK+ErtR3q*O$U-7-t||C;`{tKCYV^V2O)fQ+>q-TUQzv#gLr-SypWq``#Z3Cz zlthF_1f+}DLAEG&-vA-|JKoS2n8Dc;o`dj;eO+f5pu$J?AiVU!+O(%#%kkdku$+`G z@*%QEvaU2yqX$E(55f2Abh(e$tzbg}nt;v@kp?`h*f%3?a(&ePpeWmWQ@vlLoPh8$ zEAa^z;yI#+r0eUR_2MH#(>w{_4Y|+Gu0*`vEjLJLZCrc^KKfa)KqoufwTdBn;`gzqhSwJ#htU<4{Tnz=rj2Z-&1^N|7liPF zvfR5!%C?)?C}$mSb*+xOdTg^Giu0FC)Asn)TmoF;7P)*W&cL58d)7bjxh1+^vLV0c zV2PMamoscBJz{dE{O`Fwv`ey!Z?l+OCq5W{doRiHJx?XXaVGu=;ePu+SsdIc zpm}7f-c`in1k@p{$=6(wu*36(ZYJ49z~cD1-kj25>FJK`4c`63H*q!oj{k|L-W@#(B7Og%>oL>sBF`B$z^vapy zf)@074|q+IstoxL5k9tq_R95+6qaTy4J^zWYv+Gt7-MEdhpVQAZmno8n&td1=#Z(% zg)aU(X_$AW>%{VySCJm@hcYMW;VD<08UlRDWsgs?G&@SxpE#BGDU9Gao)Yqa^B3VM z_bhyMAW3}XYi$C2@IzD{a?HAkdK{a3?!5yCl^-RieQHiHybv|q^HqQH1g^#(e5PC5 z|Jitsa%8jM7mN8F2sdAUA;dZ!n9m;HM%<|H&t5ZVzNABEBex_4_D59DnN*#D`w+Rh zTV_l9JlJ?1BbSQySBWrgl3Ub7){SN4O%AQ%LWJ*6%)=Do^|{n%PTFR2YM}jPapBVV z)af1!RJ0-N@fUWq^bOXx^+8=yy`@>nkzlO5q@F5ZHERzyg%_}zS2%92w~4ei^8ZCt zX1H&&AR;YKXG>?PCy~6(F6)DzHI&sU_seRie(H^Z5RX=GNr5A_H{(Z|ChIF?gG5hk$oiwCY;V=zU-nT|B+LxM+edoJ5r@I}W)b;2=T z>O<%Xss3`Lsfgqe{NC+y1Jw&F89(NaiVg{vU|xH4{IM0`g~9RyImEiYNwE(1#g%=) zVS;YhOnn6MExC?XpctJk5mNT^DFek$+&R@CD^_vy48?>`<*@WALH5Va>E<#Yopl}? zb24e8TC!rV)(sX-1vl`$c#YV{mToOm{ai1o3;s)?eK*Si3b}%7ss(`)h0a zh5$~YKmJ^=X7ck zFlxUf<+-F9)Gt&Ejs9v{OLP70=o^p8fTDnDMt|eS*AGri zM~%nti6$zC{pW|>=5=s>@_OOyx-DC_co)uY|1dcCstI2)3g!`@#GBeSDK3&0HAtERDAm6JS zu^EY&m5G=qyvK_vvD&f}eRXKPv_PI^Nw-Qu|Nb52mwEw%_I1SqYssw&IeiIx=TW(b zS+Qu4DFQikzknu#P$Bux+5#B^pi)T@%FAJ~{!$B1{x~4Xu52ne|O9F#s2n~7Ru%CJ+gQbigzmHycU#b!0U0(p0RMg7Ojij zc>L8SFVio0y=dHdzi8wSEgFBxq%aGk#Ecm)QxfA_J1ooNQLR`YFoO519WG1bRGky0VRm(s>yoE}^q^T0hlBmv z4#VG%=|E=vMRa7e(-fuzr&72+sW#kV-yu;FW=NFC!Ft?3hbWbMO`$@sL6lm&#>s)b zrU9_j9=3sN4#P0TJnIs7T~;W-jAf=^#xj#R*p$02h?4eE9;$vc31GUMi0rOb2Y|`m z1=nP62bc@5xa%&6046d&6%&~c#7K<&5!9HD2&lX6;_$*8R}wp?l~|YDci9B~a2W?M z545=J9*hFa)cJJG)cG_H_Wrul$ene;0AsKYj~CMH$ZXm(QeATU>do-0)u122twY@0 zTb2M5em)5kejfC5--3wT35f)lXbIjv+8G?rS*kV^H~v&&+-Q-+!491_j{kWQ$c~}H zSHe<(BMCSj07s?FAOZ~ow5LyI)B@usFmhy`LDb8* z*w^;`Y2?K8SZL5F^^g`Q`rD?GSTC$3&FbsL+ zNCG?Rj5tAj7i4yUf2E#pAhXA}p7CNm+<`GFMl1ugAr@N=XuJhdE>dAz%XAJQUUEr; zcA~=bS&j!HaQ6m1iOF^R@tR9dbE1G_H*kQ{BFIil><@6!=5*L@C@$OiiiaV@qV#@2 z4|yk|)Y5J{BD?z;v5w!4HGyAYP2mptP)-8OctQ$hJb}X@+&4xL&0IH48~ByRc96kt z=H{}&sF@3+zM04&NGwPQYOxwPHHA81dBi~IW(sBsED%AyKp`N*FbHpN zcoz>c_8CB-`-~u#w)Zru?hSUabYT}8fSg)46F8|k&lC&!n(BazgJM+uU_Hp7I+58_ zu;KiL4Idk9*mCxuNWBRBkM~k`C-#FWn;A*3=6ANQ$`gO#Iwq9UQcxk~DnN#J6WQT3 zQXRkG)L_nVUtgbOc=ax*DwaQTNx zA+ys{JdvF(unV*u_((81D{eH@WkvL$Wrmd-@SRl~Ct|D-yM#pJ(sa zG%-SNGuv$;u0Y!Dsy{QAnW$BIQdCk2GyY6QYeEzp)8*OwFX39~``DSa)Y6LMMQ=D7 zya~UXrn%uvjVs7(sf3doPPdk@2!s-+6H428(KljQ)0f;<6twZ(mzzM3JvC`74dWcy zlL*%CexsRX{r9@vQGsrqjn{Sk@1|@8rdr9tv-=G3=}xv7XoOC=3Yi zn&u4YIF_&}K24NmCd2oJtsjo#=cJr@&vTik z@ZABQkZ;u;0j(sH+La*_eE(H0PP)=-`*NFH`#xvdl%OY+m;(2Hy*ZB{e1`7@n><&B z>lZZtVJ@9sdMwUy87|`=b_AuiDj&ynw6fn(%5+{Ab(|cc^=WPvX3F8btFdHSWaRh`oOraTPRwdUMrn zrOPpOp4JA@anQkLRE zdxZN_JGc#o>j#7rEk3N<1eP8T(W7Oz&Ejbe-FX)|bk zWN!HGdk-(5F}i9Y>xCa#WW>l*Ep=HG2R)vn7D8cM?&P2m`oOb;jedHlDG6k_0gvIC z(^QGi&?(|XjaOh+oSUb$>=w7~i6Ab!nRQg#yD~ELzDVM!atbiebm@4K&8h zRDDTVe*-RpxN}>liw)kMdh3AjC&iXS%_W8IGbl55^df2I*CAA}OL`2V)ycXZcewr2 zNOl%CGTP>P_6s8#IYRQ~!`qLOFGS1{oX41S_S1#30-VQG->Q`65`p_w6j$g_^Bl<~ zA%`mySYzb1)%?rp=1z?C`QeW#ls5319|=yB4@;EZ=xX&bTb{jos-9X=s71hdud{Z%$@v9m{TC8j!lFE2mw5D}b> z+{^Xm0!$4<^3wz~##JbnL@O0>-PD4A4Qg>EQvh{f;NcE)Izm@`eS|7H!VOmqw$`L2 z5S+2nf|YS0@DF+$k@8L${;IvYyPcJVgB53t{Q}?NB@r2q?7j_bJdMy#e7i25CNtXk z=TkXVhLY1F4H#D3(eD&!)?x06C`BA#lT@)#96iit>t}-MYA7x>sUpw^_lU$8_%rgw z&Q5b8qF?@E^%%ZK0`AFEY3%+orZYZeG}c|m%-%yA+BRK|d#pj#gyN=bb-`sOb|5n< zaprs$c+9BdHk)@gTEL1PtiC)kk<75#soHd`DXZuE>aOi(*P_0nw!x_bEj|Ucd>)z1 zI2Aenz1|!?@b#;-P&!NicVE3Z{ff7z4y1FcLd81WjfAVZP+T8k&@Dn&m~WG0zu3gp zpsGc64)1UMm#+p2mr*?*4Q`uP%IX~<=+jGc0e=CjzpO$Ziff-7p1-z fc%=yWv84M<`^VC?%@4qvi-IHR0I|@H@yGuGTL1Ks diff --git a/public/static/img/_flap.cfg/070x150H150WN(G).png b/public/static/img/_flap.cfg/070x150H150WN(G).png new file mode 100644 index 0000000000000000000000000000000000000000..d378503951077bcf5e9a961f1a8ee4ebccd8286f GIT binary patch literal 2729 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 a&X{p!`;Zz>&tvct)FVDNNqK}^RQzvyrCJF9 literal 0 HcmV?d00001 diff --git a/public/static/img/_flap.cfg/070x150H207WN(G).png b/public/static/img/_flap.cfg/070x150H207WN(G).png index ef367e2a24ec96894fda7bbf375574a8cb753f2c..a052ee8360e7a147ea27b21213268395985b26d8 100644 GIT binary patch literal 2279 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 CFoZDx literal 3412 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 diff --git a/public/static/img/_flap.cfg/070x218H218D-(L).png b/public/static/img/_flap.cfg/070x218H218D-(L).png index a84e7268ca6512e954b1b0f8cb3a24bc09b8394d..ddd81371eec36b54130e3f7bc2e3ca4735e2d46f 100644 GIT binary patch literal 3288 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℘5n4zZkK7+|c{=acA0ptOpF_*-9E=TO zoPnI*_j8ca}4eA}9kl@sS%nWma3SdMM9oAqw5z1PQ+GpeLGOnW zzqDe_OYDsWZ8I62;+l`QnAY5^*f-tIA#}nfLg+_1CqQ!QEB=PM?OqzeWWzSq zi)%S}yhBB(6e9BrkE_?AsTQ2FRHshD0^`sELBY#LyD*ikpMRGH=f00axv5b9~@cK0?kWZKj~W zsL@V-jZn0R*tl%%1BSL)pJce&v~NlIKt8~8zTCj1gV%=R2i6$1Zc4?Nak?I%C;OWS zMvI8P&(uUSj zx8Mb3cQ03PDNNgp@8A66>&#cO^w^YSEdh8N9Ch3)-X71G_>2WyaoNFY>95pk87dCS z&Lwxv&h89KTi%{G_e%VKp9YFAhIZ5D%AeO~bl3}jgfzeOn&xa;NC96g(0Y%}?sr{7 G)BXpDt-9O* literal 3426 zcmYk9dpuO>AIHy`Oikl5215wr9+N1nOD=M#yAObFK2>+Wv)L;5e;wy)-Mx8Ja zEv*aU#JbqIYZeIVk-7B->X&Hi4b(5jZ-~-kK|u`-_f|KY>+P1c`R{4eNt7C<5*2Qb~XYdf;^=(8jVUOTs@75+}B}ewMM`PI| zTuh3-Xjwom6no?w*}gc?zVyNiQN@qEmu(9Bt&>l1GM{P8%EFp2hCQ-d z&R$uf;|=xz-;K&UwdR8+PwUEjma!`weZGADw4)4GDOmd1P3BXj@=|5K4CP5Xby$~7 z7t3~CifMnclFT>7U;52M<~vxQa|%ByFR;^-!R+dDjw=J-%+~&79huK1W~JYNzgO^N zt=DSn(vPxo0J};RZn>L{u&Y8RA!ZLZ9ho_{6R8)4js8BrL zc_R+#xDf&7?7D?AYNq?4^XaeTI+n%`n~?uLY(Va}6TLQ;_N;h;_N;U zBGltg=#a-N5W+EVbG~CQ2+>ypLe!ZCBX>+?A@(0bQTCgG5EFiQ;sh3i2n`>HnB3;q z@b%_;0CZ+3Dmybkh)KgZWZX~|!txpjk>ife&uIZ6=G9Edb7~+2m#Yk4x6A^DBiA46fTK0AqBI{~PX2Gbrnk^6Dd%bR`Z83MCyA)TP_jDkF-&KT4OTTm^DnFw1i zils%AytA&zrP*2ldsaPC|BDK7@~0P6GF1^*Jl~4<*kt6gy$t|b0U%{F0O$jN{dqK_ zZwz#dNHrsiT7v-~-4Or`0l<*}0EYlTM`@w%Z5QSw?MHHEq$`0M9| zg-ZkhW+#z-U`q!!R!&_xqzn~@PVE~*8@Wfk1l>Gjx9Xr94Q|M_KMT6OhQi#o+tOjC zvUdtLukRwb{n!Q`;|RhgF2ukzTU&C7auur?q2!0!qgxYw!T4hk=ZHFyl%D|NSSS_~ z1UJUyeHe{G(BU!wyaDwFbO+Ww7N#8qWkxp4thdWT#w{oaJ0@BmMTw??AX!*dVkVYA zBn=+C0~s59G>JgQjpKkrPk$3dkG2UoFxtdSj1G}RjUERM_AWYd$HEghBF#{g$YX$U z+)tI5=m!|ogLh>PlSt%_aXfJ7m~Eoy90QEwKH9`YAHcXWQfAE?Hym_ZU64pt-mVy= z_)VZGImRe@+1zikJ0^4?lm&&otav4tU*QMx{}W_RW?~*V%x|Ch^y$;&xW=A8z~_91 zd;iXjp8QUWYC)*a9y3ki><(=}_ZWgMwAMm5vbWLXNsaxiT?Z_Qc+v2X?yjr34=DLf zoV1iLT2>wm_NY^6k*l3Pc%h@>P)+K~O5LJm7S}~FoUee7tvDoHPD6SUi*)r#_U#YE z^o8ToW$MM4Wlha0n^Coj-R>3EjxNVu+r~UDa=D-TZGrt%Ym)n(Va;!O_|wmO{Iiv| zIk<AiyEe1E(sv`$oNGQx=a z(Ww>N{LN?k1FJR)MF}Ta^NsQ6$HY{;VI10781D;6?N4R_sR7-kOdBAiwV7JDpjBy3 z-HS%8wlR5_XDLEcR+9U5*UAr%bL|SnvCB0^x;+{9a^5r;|8cs_^IZKb)+@8>9(>Zd zF^VzSoV9>1*iL&yC{V9bBZ4&!&EHm~W<)k?FaO>5qI9o668L7X_#N|gexb&Rdj<)=ier(9k2hG*0)x_0odxH03R$-ty*{u7jWXGkc zj4CsYQR}dSZ9}W?hrss{&)LGgOMiQs8;6v*wvb4J#xAufGHLDDW=g;X%z9;{p`W#x z+F}A`bp@o`q6vxbe$+*gYh~@%#`t~ZP!;o}dEtUGJyA-gl^3jB|LRW8tQf7Cmi+6 zSk4|XcIL!{%H6RYI2$2#_C{7&n(rQr2v>p#*NObS)&_B3q73<49*7%PSHj#-^u#}| zN-FmbPvKQY4|p4DVvaEw{)t#78l?lUS8er7QsH z*5_X>Y)><3E+qLNTTVDvYJP#wCIO14Q&LkNgj+iC)+<7qe#8ysL?i78%4*Jd7fc+4Zt5|xq30t4wtNZD$!f{L;n+Ut?p4^QsO2`>-;rF>(o%~zO z!jc9Z`8x(^R}D{SSASm4Xfpd!8;{_dne;dYE3`fm!Hcry-~SNa5(0ajo9?SRW75JV z4Vv@4rxug0KUezc8`x`A>fq&6`DE*Ly%rPbNZi&$=@1sjW-qK2%im1ocZ;?*CG%CuJ?uE8J+@(YR>N($PVX3 z;k=6K{SkurSuH&%(18C+@-~8LHH)pm)qBwG2xV5;NYUN))29}uHPX>RTc~5Horf;z z_S{so`dsePS}8RYVQUoX|C>H?`N6>1-wpgVh?14V?`n*K5rOoXHQwvUOB+~a(2_clo5#B@M<_z?%q;U_8ZN#Wl9;l1AuVDqq66X|}o7lz+k!6)C^^$btC39)&Y z;>CZ?Yh80Di^5GsV$I`-;K^_$CX`d14Nv1ov@Q%MgdVIr474Fv3OCG>fN{#9CbRsWE}NH1R5iCm;_GsmTv zUHGJi<(f*PB5x!Mv%8K7uu5BtC!3d!>hyGid3r^{bOAOBTfDfWsq+q;rnuY-MG1Lt z8OqU?QsHuB?~_tqPc8K08`QBbF)Lt%@YC~d&L}uE@P;|MtCpeB5Ux7)RQOBjCSG2U zRi2~D+5!3he^bCg5F8F=e=kcOy}T)n|1^Kab-wccvd6BL3jUoSU(W*+j(be*{{Yl* B?veli diff --git a/public/static/img/_flap.cfg/073x153H153WN(G).png b/public/static/img/_flap.cfg/073x153H153WN(G).png new file mode 100644 index 0000000000000000000000000000000000000000..741ec154f9b5f5fce61151878e7aab702d5e95d3 GIT binary patch literal 2714 zcma)83se(V8U|KjVgx6N5|ly-Z-pcZDj>cHL4hDDK6p4FZVzi%1V%&%MX^YL1QhT& z>msnGN>8-{ivdQAk26GFP0|NZyB zGxvV~Rc?r1>o{ZH3>zC8$Czkw0{FMs*x3F6*@Mxtf3UJ_Y-a3;5l3v6oqkU0ju>w_ zN9p^RVYcCobMwk_P;tn=?R)Fo7DiT`^;b5%o_+qiJ9|b_%4*yfs}>FHKF|KqTySNw z=y$4D%S!gW`qBDy!p8E$ldnD-d}EpXDBYbXU;Un+6IBxW^~z5!jx5NvPV~$AAC^qK zF=Ulu`(M9$Sv#oz@WfiR?$&{6ao@QmYT%DUebVrXO&Q;~v^*&P`^`B*dC6vH0Jp)& zJzmKbtv_*-d8W2Z%RF;`Hy8=i72L7Mz4M{`SbQs2#04q-voRUK+hov+Er7q$i46cG znN|_5;M(;}7xi>>!!8z&G-zfa{MPEGWtLJ-rt%x8gH@D{m&tewjS(8yMF7tO)%

  • }L()P&poHf8ZGpYjrc_ z6E@boCDh7j4HARH(fIndZX^m{&lV=a7ALK4Kz@Z|&GV%!(VEjycsNJ66SmlDb$WR* zY|Zng+@m!gMA0;dOWhwt;C`^Mm}802>Kf(6p4N6Q)flJwHUj6u!uxDXlvWokFXmZC z{i(D#&2kY<(@oO~3NSwnKj<76ewYqKc@I}_qc~pG7MkB_- z#It!CxUBKXmo7mO}{tHIYuXt!Z#H79o+k-b{;0_tK|4W0<(ZCvw3jvJA^MzaL! z;#t4um_)vGUOP_%JrZ|%Vn1!?0_<)66MvQFKZt3dLSj9!!H>aS6P@t zn75c3Ftq5H?6Eg8>@)ll!mcO^1%x@r)KG~Ih&6j)!8Ep@K6&UF1FKYwrx4~HrmHn* zQI)Kfhcx;Qf6u^D72^nz5n@_Viw>NS-RB_%e#4I#U@cf=($Gf?tVb~(N|-m8R#c#2 zr)A@QNIY+NKLh(pQMigQZ#E58qG1iPCO<^L8-7f`0!)`Qben-ml;evCbDn7^9*>LA z3_@6@V!VXNSYWzZi=L{HJ@iAGy@$IPSf+A(FMWnH{?#JP)00Hu$d z2WH94bv%@aqq^!udLO}fH&K2=R?aN7&fwZTnj@HYD*%B&0PF$^qI0KfrX=acgZKE} zA+rV3T3UYLz2p0J;yRRv?)_!bIC!M;a6iNqEOj0qpBmH@1X>KwOiki z^iT5bLz21-J(%q5B4*#`O2|u zB4e3qe-nDDN;=|&H1o&_U{(~kQh8ze9I*d=$lDO6Q;hAVzrUGn7z-oJ`KtYmXxItq zI1h>UA}1kilcHcdVMbL$O=#G0X)Oy#f%J=M>9^I727->D1|7kV%`awIV#IW#u+z7PQ0{SR&_4jpp}iAy6bBZ6E!$!% z294%Qus+Wo^dB|de^~sTY>Sf^w517eecp6xWrP};>OZsEJ3;@N1@jX*mNlvjdtzv{ z`b!aB$mR#LEN)`Z_$Hk6L0+IAszE<&h55l8Ai);q7yL^c%Pg_Pjw*>%pM@=nDjy{p zCHc!3RdrH)v1bndbFv~JI25}cR}=mfVsfff&gP#9wl-(M|5=NZ}dg?`%KVgu6UCn!g|1Ic;L1;>9hZ^n?EeU%%oG literal 0 HcmV?d00001 diff --git a/public/static/img/_flap.cfg/073x153H225WN(G).png b/public/static/img/_flap.cfg/073x153H225WN(G).png index c4633eee086675d4e0a2a805eab302acc476ce24..7d27905133a9e3c36d30a3321bb6320f1d6cd5d8 100644 GIT binary patch literal 2284 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 diff --git a/public/static/img/_flap.cfg/073x206H206D-(L).png b/public/static/img/_flap.cfg/073x206H206D-(L).png index 19a05d8df6d6e3fcf8e096e0abba9cd6bf0f5a36..b1dbfdcf85253ce3645d19648436e53e7eaf55c6 100644 GIT binary patch literal 3169 zcmb7HX;f3!8ihC@P>t6ZQc;KrN~}-=@}LYMEFp*kik4P`Od6``GdQ3Ei6ST>+%$$z z5y3?W6`w<&AVw>LL{JHcXpqFFpiGB9I8gcP`kjuCDcdykGZx-#L5lZ-3|H z+#CL;jbXFx9PO;EtY)uW!}uCJrB+tf?`O>fqXUl~U$e6MY}s1Is&BaBftUTlgz$DY!GKZx#F=X?4;)j!H*s(5kaOa4_+eW!;RV2_GN9vDpAYsH`R|` z8Q$4XAM>#o9uPCc6aJbnGAw4~RlIUyQ&A4gr?7PVA}-lg^0(n7H-NJD4mvtd8mp0Vjst5ip59tBX-=1Y?c^5j+$66~)|B?bT89`= zt{j(y>nsB%YmRfYQ#PAo1;D88{b!(@iA!FgdBz2{bLxDslPecJw)^ow3U1=3sWybqqR}mF+MjKlYVM)j;VdX=aMn$xs!8DEyCwwFzG@x z%8$}^qGy5rBfdKujv#9W(0b^{@!e-(tgB{VaxM?wodaXZnu*D|WBBeuIMr1%fzEaR zh^J?xL?ujZ56rc}(9fcgFiP9Q=Z0YD=xNglnOY;vora+oq7flVYvh||U?k|-(NUtb zJd`#)6E6|K#3dT@WONKK$%o%9(eO}_`V)9bG2F0NV@4xO7GAMfhn?j+$(_p7x}$AT zU%$^|jDLkuECFpXQQXAq<(OP>&~J%Ub_mBwdW`eElc)DDLX}--+e(&o=aZGJ-Tx#= z@z*ZL%Ad9`XSu~h7Q-`Qwid%bUk#OSsi`tR_BHheC^G&HT(KX!)5T#wai_~A(P=1J z8`m1@u1RkV4G+3VuDTys@I#TLm63RIY&j%7cEk{ zp@%{a$+r~s!85|s*cvm_L&Q;mrKxur@=VdNc_ZeaC+jTD4eQ|+@1u#g@vZTICP`s?cr{I7%LyN!XMZlrm(u4X_1-n}Y!R0lmMHu}Di3}gj*2)) zy)VhZ3NK#@T+Ner6wO=j{#`Cw;a(^@VV%1)&o2`gsRN*{;-#+Lq)*u{0cvmc6xA*c zpemX7iK+rnrSASj1sXRGK>mCdy9!8sW&IF%l0D2Q_L&6a~&%i3j(Jf@K=4b)GsD52&qVULa zyk}s60OTWAfc%{^r;6fQL9JuU7U~!GIN~IpPp`>D&V|(F-^Jdb1IycgmuDg+{42nvL`H)3Rt3 zG{S-i(&Msd1T=~O5qfuzV>mP$s9{YDf&-Dvnv-^IpK|=CCc@iTb>XW@BD(?3M&ARn z^V0ijWjZvQ&rJxXqc0Gh6SF6Q&!q&@bKy5;x_%&K?C4nG*UAsZJ3aaxEnSsMA6_U8 zVS-;JmrXw{8Bbudn-WL?ZX-Og_Tti!&t^pPE?z8D+LF`{qNMR5>Z&wIAyE3cjV!o( z`K;*zvts4whbsl_?4dUYS>xZmo5%{bh;Ql)dtHdbhgvqc_dZCT!!s||w5utWW#4%k zzr{w6`|rMq4S4ZT^yZi5N7!(jEdL0lTCe)Islu~Tu(IcmgWaY|xW{+2+DnIJ$_@13*#vQG&4bmhdQS(c%?W<|N z)Ymt|x%6-+JvCU8AS_&~%zR0EGh#i<)ML)gLIo-gy&4M~%u4z6uYhKq}(i6<>x z`Zf&~){OC_osQJw2)IgKDg_lGaly(Q6P%G0_dbx=%6Ks><0cCWF-XYIaGivp%$Cjf zBesT)3yft-^ClnNUZm*`M>d~ETo?9YKxSIrd$G^FiLQ(HFD0zk8_#c$$0`KFzdEM+ z5>w12I`&AvV01(fV5w~-q)aR@m?Fc~|2C*qDf~JyVSVH9o&`z28(C)aGqok^Ni1eB zA?a2s^|owms2~OUc-q-;q%ygruXw%asgLeyfca{*vLl;Ro$EWWanNF4Bl<<;`)Xr) zuO+s)LJCuYsFI2Id-lw~0aNHyF?JNv{|jky*jHMyp@S*UFCjz+$!_}0ijw0>2#Op8 z=AJgPlo9F<9midluM}L6OvKvfxa)9Ad!*5ak@kd_)Z7@rY4di_-$O#H_c{4z!dM!0 zmoKp+6Ch3~1m^%ka1wwO0FlCwNss8nB+aeg90gpP(op}9yT1oJ=;zcQPSvTlM#h`f zsk$|zGe7jJi+2=smU3hphqg&}^1m{4J!g9bUWn0`&(+Ty*5ojpf?2(>Ro}J(tKX*eAt?w?y0fJYsP+w{Xc|X~!`@n6bqDaSdUyYWHA-dEF36(f zgYlBu{Ay-TAyD66DGIhE)yBlxnlFM1XuCx|l3bPf?#=H0-U9FR%D0$oy!vzkU6} VIosUBz+VTewV@js*Mhfa{ueM?8Grx) literal 3394 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 Ir;yYC1@o6mWB>pF diff --git a/public/static/img/_flap.cfg/073x215H215D-(G).png b/public/static/img/_flap.cfg/073x215H215D-(G).png index 52e10d6074971dcdd87e3a9a50ae6d60871c23cb..4356ce28e852e624ad5046449fd0615e5961f7b4 100644 GIT binary patch literal 3163 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 literal 3301 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 L4#KZs-+cdH%`te{ diff --git a/public/static/img/_flap.cfg/074x142H142W-(L).png b/public/static/img/_flap.cfg/074x142H142W-(L).png new file mode 100644 index 0000000000000000000000000000000000000000..012fc55c8b7b58a1b76ecf9649a042034da8cab6 GIT binary patch literal 3179 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 literal 2413 zcmeH}ZBSEZ8ivz~CZLf(V6lkuAs=l}0f$rr0wn|jB56v)A%0-P0h%fwH7-FVf@=sE zD225YbQmI1ETTDL4gpk()ku&9ij0_~um~&DW^E0ib&N<5-RI2yYj^+ekNtDy&V4`U zeV$3?ecw~g=W(eH?hYgpiJB14Nrq1~iS*WU$_h|y?qoHIWFMNqi547bn0+vC<C+ zbh_jVUyqZ$Uer-hto!-sHC4Uo50{Vad~@(hTUq4fh_-IW?jCDO_OY6u6VKh6@LhO1 z-D`aGR*>!GZyB$z*?b=&=(lCUi{8iqWv%<~=Cy&g}JM>c(RBQ1R2osHo$w z7w@YU&tMI6BO{G(UWapURhf*>k7f@4lxn@ zZHfp;Tq01dBZ7kbObEsY?m>`6783zkMFbVf+TptmmmvFPhEK=ab*{vtywp;t2;ch- zROIDL;nC|l3K6(A6OX!8x z_3R{lH`WCWHeU=O?EO@*lj~!^u6#k*>19CP=XC^gTL@+o<-GlO2#QSvv;GN8=3q5v ziZ1!1s@o3G`0~{qFogOt3}o7^hN(M8D+pVAfUq$b$KU$~_y zFTg~%w}zk*<$O<&6sac~afUy?!L-a?`Ux7L`rzqTnPsO+XNViZGVJq|Fd9#-7FV0qr>eZ6=^& zFQ8KZ=-LUm%E8#G-siZ3bp8GQ!R;+oMuBRm1HMLne1~CRCAq2jkC-V?GZ6}A@yB|G zfobSx7^DI~rvYlL0szz42VM%G)2L?%7^o{FAsSA%i zJ=vS#%8;=_L0;&EX0mW!r0I}i5?t;$6Xf|xaJdsud#LOrxZB^tj!9d(_yQN}XQ zN6WJuFD#u&(rh0L3c4scfVBixZ!2ndsJpy**9uDArpAGh<(LV>DD0m1Qng2t~2-s>PZY{0ji z{xyS{_9&zX77^ndf|{MciA}Ds;HN{-r_1;i6z6v25cbA(VEYe2pRQ8jO{bZcdfPHx zRT6fSHgipHv(r^2U?a4dBYNB0x~f?03T^vjYcb^bl z@iu*FCyT@*KhQjKwv^b(*5h*^X%?QHY&$*|ujzNT+_jT=;K?x>8AROQKfd;m+kDS=QzGJYJQ90~tve(#z zQc9B(d);RYwtcXiI01ae;4t9Jm%#NOgCpXge2IrGw_B_gCQ=YA1#v{MEMzr;l_FFG z`xaS+V139+1T!NJ2u2tB32`1;D(c%o#d(=8er1>je(=DA0ioF%RAs2tRY+0o@<7wT zunQ)13r^IaY5G-Qdd~tvh5^x+0Uvz{NY4dGl5`cd^|0JmRieJZH*wJXRp!qiKaYd% z+xP21YU7}N&u8aBs^jbt>_MgiUfpJH;Rm%E0B}T#%vFD?nP~LFVr%Df-SV zY9zlLJyraq=2&-ztfqG80sY^1%J1(t;@0a)cxHZF^Orq63(sQJ`I=Sd{@Z2vpRdUO jyMK6V_#ga9UagcbedGAq6SqIZYZNIVmd9yhi{$?T5wK+z diff --git a/public/static/img/_flap.cfg/075x152H152WN(G).png b/public/static/img/_flap.cfg/075x152H152WN(G).png new file mode 100644 index 0000000000000000000000000000000000000000..6227a4a0ff5a86a2390d0449bc4caca3ea7fe02e GIT binary patch literal 2706 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 literal 0 HcmV?d00001 diff --git a/public/static/img/_flap.cfg/075x152H215WN(G).png b/public/static/img/_flap.cfg/075x152H215WN(G).png index ee3b3712e5b4d132c6494667571d616fcabf3b0c..760f33cc185a4423254ceb1252fc19d470d0beac 100644 GIT binary patch literal 2252 zcmeHJeN^1OfrO_U{6*&`}KHC=SqR}EhlFL@C)f@_XTqT^# z^Rr%UbIVf>L^qy?=5v=an(&lm(fjb)$=1E^-R8f%>w4lu2_y18KI$}5$V-C zqe-g3`9V$cnaK(7$w8FdHF5X0@qC9diWR)wxBCg*lE8lRP2GzjQ}x$8^^voIlrUrP zS5v+!WJ*iYn{UojIttSd8O%3dp8--9B&u7^?f701o&jr|ol9BCmzACV;k;eSy`SlH zTgsebtH#M?cPqjlh}11l_jfB^!1!tt9vw2xuF#tckqn2RE8Z`hM=+C}5T9ecc>k!= z$oEMekzM5i?snTw0IcfMfn$RZElPL6Tgu3m)xb%uOTzfRv_)|QbM#I<;HW6Mhp>JQ zX!6hh4w$W*YayLxuw@NMzi}x^HE<#y$*W*^wUTb{sUqMk@d6I-$ue+U;{_bv1kBd$ zU5K5D*{*{oGaU?cd}fH-0G-Kj^d^EErXuo41g2R2v_!mfkH(mdBny0-VhDD3)dIA` zq%p2QY&_oxix3&e(=avDU(LlkKh!j2AgMfGFAMahBjy`w9ooSUNe@8VS38V+Ou`%; zr;|C|RRw5ALda)?MprvXKK3MYG)N~`bXUEJR`Wu>1E94;&H5`|Cc)B^L6{Qwt2wyz zLrp<0lAGuoj3FM=lkcKwks)<9^5jCFnMIt{lSOdVa{u^Jocpn6_i8XHDCK#3eg7RB12 z)YA0;u?zRffZs8UsdXk#!a>5kq;npWH>69(1sB3I)2mv7d7cR9V@7P$q%f^%q(K7-4`^hGhHvAamP=$^Zb=^dHQYz?=k6Iz3fp-yH+)rS5num?oNg!VJyHu@5C; z5v(8>x1%y@6Pm_zPaJ~gWZ9Dwu!xwTi%#-nRq;4?PqFQpDPg%JiPfM=beWdHDYFcrPsSoZK2?Egt+f6FIi|Hq;#av_4vCzp-Jl%55!i zLYeKI!zeq*t&dXLsdb4eH&J8&&W2rx<;v^JfGLU>Q+@lkl#unamG)~W`?=Flrb4W8 zn`ZsZ6m)4-$Uwacu?XX=#ZIkgLn*%h5oXaRO;OO#Q1ic(x=-Y4tQ>Y7!8g1)tx#oa zfvw}}_%A!}ymSWal-_(Ik~o1(8e@LWS~8{V5h>^_&AW! oqn6kI&WE=7e{mthYj35m`m!y&qqlDZ_?JSHXXePPE8lwmPYB^bSpWb4 literal 2456 zcmeHJZB$cd5=M6`1VtbeU9iYE9Ek}Pgh(TxNca@0i!p2npv zqGUzUZ4j}fggqL`MM6){1*9#g1Qlv>6F1?YCn!)_HARcvdH-!s_wWAOKa-i~nP=wa z-nsMM`hBVK4)*T$Ha0d6i3zcPhF_(P&8la1YrwlyxM9r3hLV*SyZeCn{Jd`LlwrpP zwl>3~SpM{+n5)rT*~o%Z~1^T&tJ& zah_Z5c4;41Nmo{^51(JuN~=Pvll@H8L_C(tIQ1L%(va!({h2qh32BGpG3DaY@yd^0 ze*b#M)4Ap4<*`!|$sEV@{3o=n>%F-R@~ev&4}7nCz~pKRU9DT z-FV*8D?U2%E5~bc-o(q~{pl)hp6$-=wKvZ;e7*?&m!|03!((nkLp{{s(G=&xGvbKD zZJ1(sZ054PI!Uwh@C_8ay1WhojZlY~=xNe|((+sPOb6>_vJ_7cEN8~z9P{jvZ3vRE zYcl)=Up20U{OZ~af1_ap*><)RY~~2E9&~5MtG@*B6$7$dqKCSe+KM_2q%+8%rG@vt zg?5v3i)>TQE-`?5w-Z?TwhD z)8fwRij(5UUZl$~>jL&Jbupb7+@+bZv-&JGdy{L1E27b(Zb~;)P}JT_#(2D`-nyBX z-=$fhs9ly`_>;}U`V$z-rO1;Q{8+4aSx6byw_-(p#xgV-#__p6Z*tXeMLTBeyckA! zBxoK}L~k!$@FgjA)*YtQ7|p1i$j4lH9t-p}f*WJ5yod$*8`Tt90@42W`<3ljV4zV( zVOEJHfuxgp+|IaX{ikPz(rCESH z^evbVzkr(Gh-;ELvm-SA>)H!jW(2@;r!AJjo%Khxx}K|$lU^@j>fllL;A z-=l>(E?%N#L7Z|2Qn-Uq$M76LQeLVdX2a=FN1gB53s09{IGs~kGv>qvXoz3W#n+XF z3rr#8bXV62iN~=xe4X|2Pd~}-*j{vI>{(g<<(FCX9(LTJ$g*$8W%%>g^izdrFt>l@ zt2l)JX{?{qc)f?pVCK65+MhUGut;Kf7YJ5QVevRvUpVrR<*?Lmrc{YQv!AMn)$ znIwU5L~b1448bxx28nIAAV}hess;r^_rl<9$kM~WQj_p=Ndi5D zTOtv7qz3-Pz!?toTL?ec0N0k0P6vWfG=c~frvr$q2b+ON<{yYNA^Sp>~@X<-o@H%7*B>|+3d<9LgPDT;s$k8zS>(mrc zj2un5uMW+=9L>JB?oc&rm3DI=-v?fgf{JF$mO5Wfc*Lrv?L;pVg~?Woz2(r7MS}Acv*k>7|4H;30=q@eokhA#&Iu zS%6Zk8|AmWNYA=(DcUKLbp2L>t_{#d@wJC_@9?#cbm8FXL%`EB_*!MQ0%H#}3klbG zUY{LT_2hvMf9l#Xe5x!ZSxVED(l;sdru*K<<(UtQO$}v^$u%@x1C)iuzf98MShV8 zMGB*qsg`08Ix}i$ytoJtWuBYm04~o}ImUbbtmuy7aw4N8M~}OUCrl$NBpjC~;ow6P z1Dgk4<^Ob7_H!P_d9H4LIiqJ9J{wi6{_T1D-%sKHqrdww`Cr|VOTVs8xN_r#qrFQP Qd~w+%vQuM~G4FlyZwwWa_5c6? diff --git a/public/static/img/_flap.cfg/076x225H225D-(L).png b/public/static/img/_flap.cfg/076x225H225D-(L).png index e96546b931943ea5999a58174422fa48c06527bc..8d161688515aca5352f976efc82c5f7a34c3d83c 100644 GIT binary patch literal 3139 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 literal 3306 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�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 GqyGV^E~Z%k diff --git a/public/static/img/_flap.cfg/077x140H140WN(G).png b/public/static/img/_flap.cfg/077x140H140WN(G).png new file mode 100644 index 0000000000000000000000000000000000000000..a8eb0e9c3f39676cc38540faed611d910d7cf6a9 GIT binary patch literal 3234 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 literal 0 HcmV?d00001 diff --git a/public/static/img/_flap.cfg/077x140H216WN(G).png b/public/static/img/_flap.cfg/077x140H216WN(G).png index a9220799bdf105776640bdbb9ae07054d5ba22aa..1bbe964e82eaef43816514df1a097842a71be11d 100644 GIT binary patch literal 2263 zcmeH}eM}Q)9LH-k(%J!iab-eXxr4QHL*QVe;0uMLzz}SWdoidHfu<$`1M!V&SKcbU z2DL|+85JxuW^-myHpoO2AsZ*2a)BvEH0Y30L6q5WRcWELd-~TFvwx=hV}If5u1hjo{kKU@UmXTnuJr_x`gC2Gf!uPyVE=>G%8h zj|io~NjGl)lCeh^QZrZ*tlJp8E+w~6xV%QNwIKH{{>|iM_iW^V<}E7o$9rx3{DIS6(^J7O!FeBK2*iiQx?ek zqG6(9cxdz1vB9B+sBX`!efV>K@04R=z?-o4z|J4x#2ignyiJ%*sdQ6DGqr_{)NAI& z>KJ?7m8|hWo2axMF_*r(k_FpRsc>`~@o!8H_USt@P0krS2(hmSqT%uR@RV&t=U0Vf zZNp4mfQIXMn}(wDo(}tp77YWqqu_f0ON)H4WhH>`wH5(*^?3mA?s)-Vi;~PSYT}^s z6lyoiRV=(2TaS15Kx-XLmmjglfS03GEYsyrXtk&=3=uWrEurIMJo*@+%|dm4h{%MG zWKdUOTL|Wg*J}Y$joXu`7Kv>&*HOT79VOhW(5_gdy9O5}Q3Dd2AJ+luR1)qrs4g0j z8Sv&L$|SK#xQ=|5%SgE6QC$ootHE=Us2PbZi0k-*Js%))KY&GSM`w>P_!tzN+P>r$TP-@mw5u`lfHssdwEgKW4wqhJU$}g!QH} zEO*IgP6H<^Vy`?z? zgx?7%$dpo=9^Xon6l6*X&6sbcN$RUp0(+`)KmK&He$AJd_xdupr*rmK^C=!3nl@Ul z-ihe3@+@*8=A6)LOJH3HBx=A$6r|rf)+bC?gcZb8e2uN0miIilZ*gC0@&6 zs&-XjrcAOp+?vm)LolaP@8-jnWKtGtO%T>NmMav;)5-GurIu^AtRb)^6MPfO;-K32 z+&Mh;-Vb|8`01TE6}P=`Su1w%JUg3MzvWPb^;{7u*flJGYA-~ITCo{CAe)#YYa*BgNOnC-R?QF>+;or8vDsF7zYmV7BxQ71dMAfP2vC{%rttDS?xC81&6sHGI zKOYz>S{Gd^_v8>I(S|#z{_VV%dx@{XI7?QY=<1w>9(*S1(%wKE=FPaT&HQce`QLo0 h8UME*NYfGz`+&S}amv00$>4{Dk&&v9pF_7-{Q*zxv7P_` literal 2474 zcmeH}>sM1}7REE`2uBbSLctHK_@`5Mhv3mW^gbRu+%^f zf^xXDlYqss7Emr>Npt~h#=ZD1{g;qL<*r?X20{TGxHD3TJzE7;86%0SmCh112)%SYUDo=bB|EHCfe z`Sqn@`Lk`o!MQzt-Fspu`gIy2U|efF^LEAJ^%gmkp$fC0Bb# zJc?AMehVy)B(#0Lw_5r3g}XjScn@PWH=V?_b+uIm+VD;HGH(^C+^&E6vtvNh@u3o~ zBXf;Ys@)+4~Ar z(ps#2r*1g4o@~(Sa%yeBxbhEC(PE=AX@}Y&ptb5f!v>zTY8;v7SPmF-%OM<0U+e~C zuD(EKsWkzeiR>+i^OEF>&>8d7DKvnD#vM15h?+}?4Q+@QDa5MBh~;C5MYD*fe4(B6 zdNN{56Jq@<#BY4z0i>15h-FQPr(Yp1V=u9c*DwoT9RC+`NncjI8M9!1VvMX1Zc+S$Ar4?~Z3SV3;3OFzRWgt}y`-GkTaVYsgy zE+DPw=4rWrP&RuR^0e9O*!JGWqt>!z;^0WCoNf-ns|n?6AH!Y35{y@q$`a<(x7zGt z(#P94gvpMHJI|2LEaLzsV~BHAq_e)~@+c8fEh-uEm?N}1_ z_m8(p*j9r<61HM+GpHv#P)~e84Xplo|l49|0G%fXi0_SH1pzQ067%_qK4=Ih+|o&ni+nrEZ(X>!t#vi_YQotqp$K3WB`O6R5_+Xr;YLJ5!L=s1?O7kCMOriq`1UoCN$0~!8_eszkwZ) zr(x{FR9$MKZ6{@$5v`5JCFDjAwS)iixOM4YlH-jb5URbn7ga^Xpo8xnMv0`x4^ZMl zJW7OSp@hpAO0+*Fh=%%+UlzCfF9;I(92g?a+pU>=&GijDR6sPyb(ls7)f4aTfd)o9 zO$ZpfN*=1a-H5uaz2}Phbo~RFeT{T5vaSutBsMxC^W70-ZZ)m}W4Tw4jQifR@CAOH z11Dv>68mjo2YR@k8v7Kzxvbc>gTo-_(db_YuFF z0Lo;X#R$rVY1)LxR}f1EyVCCB&J4+3Jf0BE%D!?cqMLf<9W=(R2&$ZEN|pHzeok zKaB-so7hDs?0*2bUjb|?1-zdQh};d>&jX|~*hR`0JDhmYMGCGsH)cx$!+gUF{K;59 zkQFt!6R%I?4YJG&WV0$bfgvrr3K7fb_?30wHEmlH7y;!skPOPk4LhQ9)b(@e;g}@tMCjtM z*fH&aW8I~nxc`0~{_B#I^P{Je->{xH@}G5%E2l*<^xxi@|NSQYfAl|IF8)`3lEvR= Y342%CZnmC=cQ9I5NQ6+0fAYmY0a9ECw*UYD diff --git a/public/static/img/_flap.cfg/077x142H142W-(G).png b/public/static/img/_flap.cfg/077x142H142W-(G).png new file mode 100644 index 0000000000000000000000000000000000000000..6a8a8e3ad191d573a8d60ad05e41ed812df1b41c GIT binary patch literal 3252 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 K>2!jA_kRJCCLo^x literal 0 HcmV?d00001 diff --git a/public/static/img/_flap.cfg/077x142H216W-(G).png b/public/static/img/_flap.cfg/077x142H216W-(G).png index 1f4f4122ab39a16c1c8738377083777e1e962047..5ae35ce3499ac8625a17643495bc5fb4845d6902 100644 GIT binary patch literal 2258 zcmeH}Z%h+s9LG!MXsfg3XsifAdlbJc)v_G&B#UAyb6C5!L&V!qgmC(rZw z=KK3S$&>u@eVX1a$XmQHb|HtuS*+E-@3VUshZFIF7s;L+f$EDK4$q;5b3d$Ud-`zr zVq9Kq{d=`%lVXM}kKQ?9E!?cyyQ;a#yo)?{<*nh~gj0U{mr&t!s%Bs8Lz}Pxsa`U7 z>fX!?X2Ia~9TMlCFUPt&-za`M*eL7>^#}K_6@V?$vS>^GXP7oh&WDn7$t0d*0oc8V z^mwY`pTF!8kIc@lpoTl0L4Re3)ieKM=3c14e`fmy^iJU!o**kvtZ*ogAjwrDkgIH; zv&rE)T9(;jkS3PPbuWp03h2RaUFeBYIMga6xqEJ_tL&=-#~iL&)>O1DywyqZM!Q8Dkkz1-RggT2(By7^`roFduH5e|4BZhL&iTyV;j$Ft^KGW zeH2@o>5;|LiPQ$Ss+f4trzUOqSTElIRE>NDrX%})3!69WV9nQdkFnA)Q}9;nel0Wu0{=FFjS9EN6|Xe5D7Z#al4L8Pohdi^b*4OF*NWc zZr75XQfdmIQ<|7_KqFYd=*Ajq{fp}2q!1XGU zE2a8GbS}zNT8vV}v;mYf<0W|{H;MX#&zvQU@t_39OA1KtO6n9qbC6&bCH#&7I4;|={yTe8bRy*v7N5!reTE)~<(v>#a6;F{Llg~qd~ zEoFzq@(#!aC9}P?L~2=d<{}6DAED}IAoz2s#r5a{z)YPS;yDJ@{hQpM*hTUwS+T`6 zi!KEfIg@I#*VGH310fy=+Ya$HfMiiMJ-{&)*Kcz|5&2vxqmlH>`ipvZZiYv z&^VbD%fi;S!7$v&N?_rtFOmhpdVMqt=X{&OuudPY!F|>+Wa+~-sPASN*6PDGkKh0o z6edqPd4^R$=rqQS_B#277@)2d;{skk-@pSxIL3|g-r+O9!vQ&zlL0u}FyUrm1fV0D zW^19G7{GZP6T(F2O1C-6JH}%;aNtwOBnKv}Si6Sklet#{-by~hhmA)dQwA{6h)Fbr zU*={nILc=tU}GILpa7Is%%dUfGWUAGTgqnyaG(Yn$OM#)m|jENk-6glZxx@3gaby% zBm*R7Y+@rZ1iA~Oy;pe564;o{PAbYyYGIW30H0}qjTMk70+6(0br7N8FYwcTo|sbw@+$ zPPxe{|VmcD%b4!26P$g zd~H@p-sbPPH#0Toef;+3jDv8nj@X}}n@}(AdsU{iJRhDpG#7YctM8k8?AsHsXg~kv q--+|e82VrQM=rl!57M^K#65id*I-qHGLHSLaJ1?I_!6}9v%dhfG_`5~ literal 2488 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 diff --git a/public/static/img/_flap.cfg/077x153H206WN(G).png b/public/static/img/_flap.cfg/077x153H206WN(G).png index f7f3011e7808e915f0ea0e51768ad8f76f9ac766..e47552535891d49470a4d8ad45446a52e989afa6 100644 GIT binary patch literal 2246 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≦G!x zsgt8R2~Rq^3U4|kn%jZ}u?#nWcAQ*^y3og(bzV44hy_|7YAeI{rN58h4o|8a*hFiI zR@CjKS?P&^rgDb5?sZm*7g+tZm11}60ziN3Bfv1L4v=TP2$*7(0ixDSz_;N6k?fD5B3?T#X|nhh4wH9&sY0<>1^T1D%42N*l}a1uo{UB(Bs%O?;xRj z%OW(;&E)%r5r+i`#dNkpK*5#Ne``Q%;_b%~zAQ>!AK&^`T1Avx?6zyIJ{F@HSa2ruBMl#tqww4duplY>90x*- z0hTj_GBx}-2-W32w1v=fwk(Fh6S8uKG#lYa@Ujh>d+m$RngLH5u=g|~U^6u9A#1rStYob6~#9?>SbGc=?Y^%js@76Tcc3gqBwAdhZ^mEn&vJWNqgR2%|DJDZ?r+SV{3ajNR) zb`={6_ctg~TLVy!Uep65^mIGr}A~d+uU)d`gn{N=++^4yIT~Hmxk}b zg!8O6Qg7Us-0bN!KFcaDESehe+fRPElbEY;qD%-%|2%A90#&;<_8QH7L3aJGCM+Go u10OAk`C}N(JE8t3-x%5d?Sf$@)#d8| literal 2431 zcmeH}Yg7|w8pop|mmmTJWHi`)C8W0Is zI8pLBNUrKgHX1VpzkB8g~i1uCw(&--nAcE9&azx?w2|NrNG zXC}!rGxC(AZ4OLNCWFCnh<`8UL-^D(7|Wj7T0<4J?M@woVHX!46Pa4vGB-YQV(dNl zqd&FVwOnz$p1XNpIlJ&)-036Ur}RPM%CxNss_Us!*FQGs9%h#AkLJuK3d?x5zw~O% z_lN4z+E-*fo4xtf(u_I!ijGcLMY%+iG>fThi<1LF_Y+q#P~@h1`@qMJijxBM0-bFPeNCzn=@E;)lhz0gZNHOjiM~}TApZe zwFe{zSED5dUA+-qd=aS_QYgEl4}nb%NCkr#9Frm#9VD&iBM3x4T|hyoU2%XEG3v-B?;9bD81&GZ$#QHfzCiTkC^jtpgCTl&7zxFd7lF!@8 zTED>C{Y}rS=2yyEYjC;0Aq_Vks+zZ!wU*<1*O)Bwd4@hqK-${+rka_tG%3?SDC z$QuIexhNile`Do@L^Rm<50Q**dGmlRM%t(IacX_ew0N-ZjIf+-Ig70Vb9*qDg(@(Q z2%&Q=2Ay8iP;PGW$I*05J~B($yknUjBp&uiBOV+Ub;98$3qI*0rca*G zS1WGDt>j_N?#?7G={VR$sJ?Ck^FaxieGkE$?T~g6oJxFFGu>CMc$@)#WiI$05B78s z+3L5T`Ja#Bj5B{mGv#D+-kH}}y!iX?)4%ES>EV4(e0&E=Vg5dQ7EXnX^(!&C;>c)4 z1_!ea^U71;9%o|JLPFJzp}>z&oo>)V7B2CIZ1&7Hlu=nIt1PL6z;hM_5^)R!(_emo z0@pYcJbpWTERZTX#*5Oq@N7hE=nA_xoT8-@SX9v$+O(boa#CCgdYG4E2ja501BthC z>_J5AyoQ8tjsu8)6AzGZ>OKbB1_r>cg&R1C!Rrut!9bT7_?0qmf#ilFlM{v*z(?G9 z6qfg07Q%^GZeUERF6NtbxQFuHWYX2yJc4eCN#AR} zOCnua<^sB8qjD;VbaOFpgh@z&NmyA?;!8QM9eW{{`YGE243QNjZMY39&x@FQUp-gV z6QJzn7?LW++tAQDl6k&F!Tai$RXzU71&$%EV!R#qVwv3ue!TjA)x4FmmIH$;ji9C? z)kc;jGOE88cVd})=#l_sRx-JnW&Rtz#8i%=p|#kP=1h8Nm2z|&nanb`&`UPTQ2{x? zGEdS=KJk{H!?y%9FF;{@4@xH zfnB<#qB4ZFmx90?<4{b+;Z=1)^<;i788v-;C+O}<*gE5(k2Xc3$|s{#szNXgePEX4 zf;p>_fXUqE&WkeO+&|qZc{@8z)m%rBRP4it|`1HZVW?j9$fbqwt=Kp_|{^kD9 f>&2h>mE7ME)NpnoGQ->rFIJ5B*rb@wD6#B6j^s~r diff --git a/public/static/img/_flap.cfg/082x225H225D-(L).png b/public/static/img/_flap.cfg/082x225H225D-(L).png index 2d0c679341f8bcda2966bec2ffec16240b8aee03..ba99f1fa2a9e315c6b5428dd1b54f5959d8973f9 100644 GIT binary patch literal 3200 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 literal 3452 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 H>D&JaV1+as literal 0 HcmV?d00001 diff --git a/public/static/img/_flap.cfg/087x142H216WN(G).png b/public/static/img/_flap.cfg/087x142H216WN(G).png index 84351d4a240b1de1423b249288d0fcb0a80c2705..f5a607a25e55dc212c9a5ff262f74d662af25b36 100644 GIT binary patch literal 2607 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 diff --git a/public/static/img/_flap.cfg/087x142H218WN(G).png b/public/static/img/_flap.cfg/087x142H218WN(G).png index a4a639de4ff0114dab2241cb9c71594dfd073e3b..b4b0d890f08ef38cf2b52853b1606fe301d4d11c 100644 GIT binary patch literal 2579 zcmeH}`&Uy}7RMn(9tt5L3aMV=1>`XhG-8p9fFuGY2#o~+35X_Qund#RML?t~V4@^~ zA%X;{K~bz&MpPaVL3BX~Tpm^sR0L$iL@GW&L_5}&$DDM{TC>)y{sHsD{Bpi~owN7n zyZ8O!o+JI5!?IYse6fLnfkiMoFdQgmU|{&s)EGokr8jC|U^W~a$c)HPPL7PCOM`L8 z9wfvoU3@yspSD<>OE&VN$G>H-d&0Kp(Mm#u=xdF2NNk?GRcV^ezY(QnC(JMQkv z_MeSh_;vR4hw}@#CBM&%_l*1R%_8@?p$wQ{sxiz#V4?|Lo6UfT5+fYivJ*Yj^l1t2 zMQ_xo?oBVF8!O0a_^c>Dx$oKCxq;c3$hId_vjx0TFDwMM=SOYz>r8?i61Swgvup`7GiZ zV(s_JRn}b?w5BOfcZ`9=HlPu>=b>>}n3=dPbtTJ@c%L2!6+7ltSddwQE-gEt{rx5w z;&&phIeo)7K=OqjF6ge{H@UT8Vcgnp_$Tzt@6I~OY;gQF1ML9g7y1Rjobwby#f*%O zhiHU?M)f?bXR>G{Y)MXX!4KLicy+ZR546@0?EzYA-aDkn4AN|Yr#*KgfIUB;%?N^< zon+5U#Wvau5#x%66kSWimMN~Pq&j09w+Q)mmHZcpj)3FlAycd5X%d~G;;N@a$5dSX zEY$_$N=uM*Sne&2cgB?#AnB{*jgt7iimL}D6^0>?Ai1#;^e4U!-k z+qqv7(d4399;_Wp5Y#XJzZ8NmTpBR_JnicPJ}?nw>osW1bGrvN++T> z&Uy?LIug<&onmS=OtRo8L&IDrme~GE{pSzA8=QOe z^GMEzJI(8;W)*-sO!al&xxae%h7kfkLd$a<;pk=gh)gewNAB|@s4r-D*l`Yo<0?<& zk5qQ7j_!)mm6O?eIXzjfm;A{Vy@)5r=&ni2dN`_gB$Lr$&L0&QLq@s)uG}ZqL@#c! z&U#r9%lZ$Tqe@GUY5qB;J@KZj?TV)LFE{V&<@rrRHINH8nd&RPo!rb*O`D-F8!S@w zsX^OD%JrO5A+SXIH0v`c#mJM<^-R4yS|3a)R-F)34u6t}Duv`S>+6kC?@tT+LF)7k zp;j+);S7-E24N1})iOn~^U^hviPw;|w|+=%+{jS?AFC2R069eAlH4$<$V-@)8+K4$ z_t8G>B=T#?fOh+}$XPhwUuwk1YonEP50n;489XRo(`lc!0;P2%qCSIF$4qq_wb5ew zl(TG+scxgD-#nS(6HR2QwKi0LwCnW3o;qQ0=LW0!?MWhpVrUR70qdP0P3 zaL7L*sc=wFH-*jyRa_ z%#bhaIi)?IO^zYbvZ}3&yZTX6QIg_h0Ht|v7b0$TS7gd#FWtgCP{jS#pw*x&e_HZN zM>H<@eglC&ou3H8-tVWF-=5mNW?TF7dfwK79e)?M{^PPFfKpFC1gXo5FMt$xixs)_ zZ-lp0-4Q)u$4|5+ww^lP7-c4^ups5qk$_LYvo6&Zgxg9iQ}UMjO{^wVF1j=EI>ymF zv;QkV@ru*fnP;YEf^d7KU#ENc$EnkZ(mH=^I;ogWX}&>nsJAdRw9XJp9tFsp==aXvx{6aozS<*B9-EXYuq1<=RREGP|>ZAX@sQ>i# m{{QBGJ!k%BKS)W#oXxtk4ubk?Su^0VXAm633B0z6cl2KcU=SGq literal 2554 zcmeHJZC4Xn5{^uk1Pq}Qju@bYh8R2|Y7muHL4uF~A|Og4ASzLGK#;LjG|q|=2_y(c zWQGi40C$=31rih#6i3GiHZ(5*MN|acRg)F)6{8{}D(-DR&Y2&uANEV#r>dTM>UQ_( zTQ`4YRH&V;vn_=}u?r6iSp`;tLYefAZVgbrb`eIQ*cie?f?{Rbm-jod*mmdKo=O)~ zKCRTKxrivoywZE z1~CraKC7FoIHsK#gEih;dY&99_l`H7c)r2PR&g}*i*LM~U;PS;wNd!ku|i7(oEv;B zHol(Ix$^5mY{#xZ^s9C*AT^vej8;>Z1zsm&c+hyMhuSN`ap<_`*QLx$J=N+lV|6P? z4IE#n_LAScdz)0H2D}NCT?*X|Wcu#$@J{q=Xw_V0D zid+{C(^zfa;}{~>31Qm#WPLDf7gv85QRh+T`C;=ti}vQ5saD5+K%+d0KB&wg8eNmh zoUGC9RaH623!~v_Hp%Ix;T4FPO;D)wJTXRd@d8(jffp}u#28`7CWtsey;X@?dlvnM z`=Ii7T(wPH{WwHS_l_TOAd;y&T(K2l$Ph&QOubcsdU_T$;y#NaBuh+j*}NJ%%sT`j z*u+Na4jA(eLkNiYC-n`Ac^ivIIhc2Mab_Tvz6`nOK!~V2T(EQz(&s?rQFlzk(mRSr zmtyJ0;>=^{_AXmINNn?;*``N zLk(cfOGg0Pqd@Lb{~XfZe+I%z9jroS_o@L5)^SuQYTOEP=?rjq#+DuO<1Vc)v6@zJ`<7dFFk9DJd=> zs-Q2ihO=sfUyU2GMf9rWFk{P)q$3d7R(0fPC%sGjc@B%V?(pt}D}xC_Kdv%{$6V|b zQ0Rr-G%!fvAG+A06565}PMJq9hrsjwdQ&ZBX;UJ*oI$&kltG{s#63?|Imfw!s_o~* z&8O=nSdr7Ifidt|^}9&nmSBk;=PWhIx9MIs{}or=Vq@NKiYw*2Zqg?doq5kO#TE9N&|2|iR%;zz zN0-9U@MK8jVk*`02P{bCkHYEzY(-lt#_X$ZrN`(5^EMituT(w zlNy8J8SK_X9Ait3M9vkTg4LrxObia=q*;)_Y~j{O zlMGPS)r#$*)&U%wA=O30d!SZVa0p4kA>;?OuGfjz@bA0|hex(2yy$FrW+i3)A21e91iA_$t)>+9fZBGT=`n7BT zW8Q+j>B{utlL=e;rh{&?&`+S71WSRNlX%J&cZOtV7=S|ifVSDIbT3|^T1VZh+O!h> zJww+F;-~8I_2SWy5?e{;+jh&^O!i)?OAYc`70dXLb7chbfZm?hswx!5RcX|1ujy!^0 z$T*tU23B92M4u~{Ice{-ybv`1l4G5$@Gm<^i?8-5@8Az3k;}SGA~~F`nQB#-|blpxux50O`F&c9Xe??o8RoS8%r*b@iEJC1XWhb_){oAZI{&RC@MVq4|A zky)QQfyTpCAS=U3cxgQ-^*$Of;9Ar_w-Ej1^Nq9Kq+zdORO~6wNv{tWEt!Zw0lEIY zYs|=oTt$=EGnF(56~wvM8q792%h=MV(1i|+Xx9=Bl>L<t*lv54k8a~)v^^vAso->-ne-TRA{}(jo&<}t4`dX~nhcqO&^u44X zgZMAP++e}2JCVNRMPc&9PI*oWDUOUsc5L9k@ECMoJRUK-jKW17{0pnPb}Zn(Smp+E zcV)KoNR0GvT|VgU2pZdPP|Yz~(c61W4+J9L3k|9 zQ5rOM#@_HHg&O}5he7uh9AkJYDXcx$SdDc@we&T}bC$$F&p_#tC}_{BF3M+Gvzi6( z9ao?Key(g$OzUDd_(N6ZJ%}8r@NW$qbYI3c4&mTO5b?h{bFOB-?{6$PbyS^NWpPdb zjsNRF#y04zS8&ji_8qr4`^JD2?!}fY(uMvy7C|Ubz^jA*qHnIuoo|c?lnO6}@kqgs zuEwQ<$4^&6)oiI2Cc;f~yTZ&qMOv(tn+zq_ng!9&Ws^u!q+4?VluGxAZhvlx+s2pp zqY?>UBGZMQF05{Lpqk%LhPrCaq&G1)(FCndI?lm~Z&Ni#mBq&haR`AC{}6}NTjG|P zedk+jV?605?Ttt-&a7}>dbqmB8VqA(UPj!oL)Tmg*fp@74cBM z`zwyLK3|lmvBa(7OSYgA7rrDz7aH``)98p3{i&Ms-E$8?jS3Ewo=|3f!>1;8w1~H6 z6hC8YR2itzPow&qF7)KACveb3`rmv}cc?D(EuWZ)aD&t8hH_70vu?@IzFTt}p)ni_ zjEBY=EM3U7W@aswTH_C%*jXGz_Y?)1M72Y?jaZ<;6}S-GRplZnY{V9?AO^}T+iT{< zpU9A^JP}%=E8y{g{T&FsU#TEUe#;ejU1zSWgpTq^3El22_I(fm-f%I+q-uoamPTCM z9Uf>JmG7=iKERMV55J7w$eR=Z^Aj^QN>qpi0i*)n!=U6z^^vZB&VI*jBZxN4r4!-o_1N$~2B5^F+Ty1HU*eNH=__6L^){5-c6hiZ7n~UfLp4HuFByav1VkEbId8S=#`}6kikhtCH zu3s|2TW9Cy-u&ze2p(Fn1DESYZ2UXss>A**D(XoTmb#|CNuKu6PG8S@>9>IUa(aUj z*nDq7wj?g^RO_y^$Gg>bTUNi-Eup=Glf&mLVNBBQ_1@SBc(&>Bk2jxY1Dk~t{QrB{F60#{VF^lt7AG(UCMu_M+Qe1342Son#yJy zQ*1A+^fDc$O$wjUW7yJ<&yJ3O9m;bIGP+b&#^|d4E3G8Sqp;^Twa-^;sAf&B?*X45 z#mw|de)S=}Xj$~fmQVrD#3Kg{T!%$yQ8(8CpQT^mW6KV-dFu_4g0({5&Nvg@bzB1vRG8u~Rs4fj0Y5^H6543QsBjS!hQk=;YAq>pNO-b%Lg%Bo&tJhF77z$itQN(DwSeYjtR@3Y{f!gk1o zQmxcOc9d#eQo|#hV9WF9e1LLfd{ElWku`Co=xnwGLM18YfJzhr5(IT|bZ+5(yn=$9 zlNz?+#NHm_C!8RA2o0T$Iu#*mjHoY=ZDdQOY*{fVH3@qyBE+wkdxlP6kiHqFng#l1 zSE~8LY3;Y(BuUFn2H<|StOb;6mFhi5uvU+xhL33%DD#9#L7bon$6CXuwGABUOtulA zaCfDVuBE(c$M->GZn@vB04D#+7NLM|51on~3fohUW8H^46)iGkOrpH(N#RcNr(o;N8xl=5%| zDXd6&2$RB^g8l{^T=*=zjxH-8WnDSe9iuCxr#)6T{uF@idD=X>DA1`&^JYv|(3@;OGRmc7tUyND z*AF={#6znxDHSOVw4#h@vD)gn(oiUdc%CCY?XG++>x+-88X;bXlt;Af3tB0sf4 zjImfpX}}wg$fW_+&JX@zW`$ZtamL9R23YrU zlmTuJIWWK->jEZn&U%Y6A=Y?C64@0^1IWiYjHD<@$@dH(9d_@bfmy5Dndd+Lz8*eQ zs}DbL4eXauuYCGK2kkq?@3ptL2PN$5v^Wc<`j2@9{rS@J=Nrv|;*ye=&z>B%F)y|r ZBz~)SRM-4N0)4x(k%;1BTF~^*{||76<#+%9 literal 0 HcmV?d00001 diff --git a/public/static/img/_flap.cfg/094x142H216W-(L).png b/public/static/img/_flap.cfg/094x142H216W-(L).png index a5d3a105866408eae9d7d9d1d07670d14974d9ac..e8c261e8e0e864198f0baf8e2e0bb64518a04b5a 100644 GIT binary patch delta 2099 zcmW+%e>~IqA3xFb@N<%flhd;#!~D{OCL~o2ewrH7Pk$3E$7|{djy{kH`Dot4-+10N z8XFAkIdH1>&BQ>4{SSna#NCKFcB;`_z3O}i^Q|xzkRIIACsbhYmh*YL2IF2HGo%NCY6j~; zHNQu;vgixVlZA>Ma>g<1vD_Z;^F3eR2Kd8SgcJb zaX8mo-9U#O=gAQYrEld)Ic)oU@h4eaZLLIwRsLl(YMhzjKPS9fno5lqu2%7}n5c#x zHi-4GTqcX|<%&NYp;&~nlB|@!8PO~ILfA#WClcR%Kd+eh?x`eJi_WiA{9 z=!}H8B@djXwcV1n(!g*Eqj|ATov_J8M9&rbJc{cnmYg~R`#F2m|46xeZ{>b8kX@|c zdsXv=CW70!4^Mkp24kuf{9Dtnu1NOA?xb?U`ztdauQ0-749((|j%K#ziX=I)8a4`a z8yR9O;abBS5V~V19k)Kv{aXG*c|e}m_h7txp7%i9Mmup0k;-{|yYbbPWj@B-9$|)? z@4&5>?mfc~WeE;fbs& z=_<)PGV%>+k}JJ&<8uA^ee|TepQP-CDCcY35x6- zsfxxyVk?5z>#d@`0+2Srh^(rRUzNe}CS~|6hiDh?Kt&-~LN9|hV4^3PNe9^dfX+Wz zaJUmTZS<^kA-Snj1c%08(;NcHZl?(6-*hAbh%_mS55pq#rl1H0;xRLjrS}k5(GZWT z#t}h?M?0+$bms=T$@Fa7i|1O7Uk@KY0olxX{}e;j&pFdfa^nW7-s@YHfbKHAY$GHl zdb0<~B71qzpsVPcs)||$=wwA0vQ|29rCvbxmK;J5Z`NSWyWC1?;6H^S()T8-L%@B< zuV+|7yB^j_gMe)7#(7()4la0!RC&S6?NEtH8IEXXO(=o;)G4JchB+z~5D5*Bx{4lg zI~<|y&zZ4&n2>S3H2^F_r=4aKwLcGQ$RcLvh-R~>9I37%3v?O1&rF7|0^0!AAubA2fnEafny$q9y?S8yeswRmI z&|DVU+=-W~hCexr9->=!LE9vCqZeV@N#@ZYkdKKeB(h`A55KlnUQwqkmZm1oweJMZ ze6%A|Ph(=rk-LVzEdaT9>azWyj0?kqBTWMR`v1(Bh?jbYdl6XwZ;?telVHH zCZ#9%dPCv&@4l-eQ*S77;t?S5eER``M#kufw=_#Ph(Hl4dQAl}DJFl*LO2+jp1!FDj_P~r z;f=gr;>SqPi=uBj5pt#O91`@$H@_m1ka6VSB_`$O>xX^5Xc`7u)mIRU-xX}c_e{17 z1E@*;M}H$E^_oPQzd6wrSI*7;5+`zU_`Js_c^Y|ZKdwr4r&Ich9nmdT7urnl)`i`1 xl-(n}=$6@$p$0;+YbNG42JLB3iSEROj6RELuW^dbNN delta 2115 zcmW+%e>jtCA3r&MzNIi(gz*fOld;E2k)2~^Dp^-o5n)XmhfuVRU&Y!yHpXYnuN^6bv4VM#6 zhsXgZGH<_sHJElh()!wPAo`GnN$gJZ=XA2&owr^ESH0c^j1_wQ?%^+6(@mVJas27+ zqmvmJ9|TiBdvXIF(@@`)yEeL_y|OE3^>fpD;#!b=?q;l+J=-rwx}au{f4Y8~TK6m} z7sJ=7RH~v68S53Hf}XQPfB&_6^($GvIn6WQx^5wF94ad+a=%`t%cPIqm=_s`yTX#Q zMe=%O(DD<^l6o`Q_~*~rvZq4c{BFyLTg98wE3b>V{MuTYh&2s8@rCZY3tH~g7&O4> z$RjK3?PMl<_avg$-j*U(r;LD@%@BOwoh9Htlyu`PZI7Q_%P#ju3#msrVOft#4tg%k z?-Agyz5Yk7PrDze;U%xX2Wqw_L`!N{h_MgbNt;my<-@1wVGzR!YaAYjgRcm5q7X7g zP07(GyO@+OuP0OL;>{W#N8e$4*G!x)F5sV2F6yoR*W0MKN=Q~@Etet*@zeTj2T=`% zAe&vpE`7G|n^M^^5WKl%RQt=*XqR(SdbN>RPMDCF*O;wurO*7ma#M;l8-DijwC(WP zB0|}2S;&?RM*rn(aH$d*IYR#fkCv9LYKhP!8%GnZ3VGv4=wk)^GSg%~mcU2a?YIMO z{*?W`FZwTt^L`*ifl>CYarxh}WUw-*{xJOz6iAPq{hsqDI=gJV{ znZIW%rTe@%g#pZ~RwMhA{XLRy1y;<-lqs0F%_RDymF7Fcy?a?L44r6yLE~|nD653$ zU^Nom$#lSPnQ;+QGiB3pxb&asEL0@JpsZ3lQm~rj042$_4{cZ<=>}0n$Yz)OdxSib zRCZG+GnVG5?04cEa}{r6b3XP)j|*3MYH}M^gf1@O`B`pLXFhUdI(~8#_{+8Z9?Jeg zLq!w0jU$&_mu8wQp`!}sC^XMD7=7N!%h6e!Vag8{@=i*+M|cQsKD%WH>*H2Vi;t(q zd*Oz);Fg-#I5kr(KN#f;bJFr$XR23uSP!&N&8zX)gEnGQHa;P{d7TpG;@Z0tQf84( z+9G{ay3;Eg|0*Qj@p;*Qp@r<>n#Ad9`MVd^0yBPvxj*{VX+C`ftmL0Tz)A`n%`{*T z`jkOS=o&i+7NN1)T-?9-!@oEP^-iP% zNu%QTFxtpi?QbuXzeyfJoetxv_thq9P`bl%g=n>=1U!p zbamnk=0`fQmt9@?F_zdHfVqPugr|=L_nH-kIjrDc=?LK$mw$fSp^6B7fZ69v2p?Vy z-eFd_mGCXCO-G1V9}v4|*s-*b7)=6u5ELFqge!Gyr~$?ZLy8453p?+3zGC+(e3uT} zaG?(0<_zgeb1ZbpnLzQ5W`>a%y8|iVQ&fh1-#=wjVDM*B!ea7oNPQlq`!2WfaXF>( z?r-|SzRR1tHuSE)RS+gDT8y1V>XpHxWkg_Ib1M#Nu(C_py*2WdU*RO%1Ff$N4_nQ~ zsv6&~czP8oI|EH%_T#U5x(@C9*&#)MyxBxs|hohRAG zg-}nnVb4$lnI@@qU@A=2ttR4Z;`u4&UzsEq%GJ%SO0BA4fQh?`q0u^{;Z37i)jQ|lhOii0GoQA^F4 zyz~PCkAn#VR+{SZ!~si9FF*_1X+{Zh&%MeOoJvv^OjcmV6IW5TXtR_bp-K0JGz>Hu zIz2f_R)prYl_L`2P@AP~Mq1sgqs;Na@^p-#ML2X03p+xs>?JP$x>WVr4NiYc?VvK} z4kxftwjJJ>Z!R#T9GDiUfV8l-R5;?`_@mj^<5JmwS(Y8_;bRzoBjkBHrkSS;)UqtX+z~) tpXjvRRTq}!1A*zC4L7ft2BGh>H$+XI4|!=e-Sr)K4h2!k%_RD-{|DrO0zd!& diff --git a/public/static/img/_flap.cfg/112x153H153WN(G)(L_).png b/public/static/img/_flap.cfg/112x153H153WN(G)(L_).png new file mode 100644 index 0000000000000000000000000000000000000000..991582a80a5cbdcceebd110b350411da9acd09c7 GIT binary patch literal 3772 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 Qa2xeYPnF9qt=(GrAM7s12><{9 literal 2929 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 Q_>?w@3XA6|KHpdLUuoP+YybcN diff --git a/public/static/img/_flap.cfg/114x140H140WN(G).png b/public/static/img/_flap.cfg/114x140H140WN(G).png new file mode 100644 index 0000000000000000000000000000000000000000..289b6b0a7f3dae3ca7e1239a799684fb06e90c48 GIT binary patch literal 3617 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 B78(Em literal 0 HcmV?d00001 diff --git a/public/static/img/_flap.cfg/114x140H210WN(G).png b/public/static/img/_flap.cfg/114x140H210WN(G).png index bb2895663174f0c2257a983d4b9d77924ce9920d..13605a942f6e124f23b8294e0518ecc1d48aac1c 100644 GIT binary patch literal 2870 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 JXJZB5{tImlvJLn`}bT??rX zuB+Vr>doK3Uy@gT`Nq?atdrWpzy0FX;438;`b&gDr-c9gyWTK(_sClwbnxY~_O}hg z%f5a6yk~dqi+sn($kQLcJ?kkXa^wEd^W(YQuVadsS1*Q3(AW9U4+WRiyIu2--Du_7 zF1soEXBG5?g zzsqh_JDUei-y7o8|8K!_&hDwbf8mh-%ggVFVHrrAPfwpaa0akEaqt1FsxY_8y8S#3 z9qox&H2932Y5utC<-+hqXbwh6Qs2vA;go&DLcGstyD(>HOaTaH%_?wwB-ZD!OX2(PkBaOX zHS^$4;}x1rR=_-J!o?Dk>8G*Xt`SK%tV2SmX)IhMy;mYq*vubE`6>4NBfX7 zrYUYb-_|9G&hqQHImD6m1SCqA;?URKM-!zhfLhD3ud=iYOJPgZS6j6_J2&d*u4ox$ z?{D_0-kwy}&}0L&NGl`(o#C6p0L5t!mI9h1GLaOgZHZQB0CZ7c z8UUow?qQ#_J}s~fPvhO>9G67DGl?}KL};>89OEKw!00;P6agqsdz96bAvBdy995z= zfYr2FWO__-jwEZ(9-aeyjw*5Q{d^7voh-i}ZRgVa-FvIw$ILxCfkJcrGR0{+>TdsB z2A<2C=&X_Mz@f7e+4lcIz+qr_IoI9;FKLzV_>KqvFqeRth1#xZ0#x^}^7}=b>>$W$ z1t$MHB;2P_NcS%X??bm*A^l=G#le+Y*VIYifbnqI?CN(BTfEjaZ8G2@k?E%;Ww1L% z>zY0V@JoRy@DAWa?XyTRyUsVQSz>_emD*=hg8&Z+O~-rtIS&e7-}}-%u;Mc&uo11l zR-llc^P@P~^yQ2a8k%ZM6X&vr|4e9F)lI@}$=ac<6M=Anz;tv~DcqKz9m-~nafwXb z-KDTGRXdc!8na$#LRXc+#w6{_EvzvvzG-bY;CSuJt*kL!LX&xw0ak(aY}S~^BGV&q z9;fnc`x5@Xwf%gN8iRZBaLkrx?!r^>8yAYy6P#2m#VHerw+YPi8_}lyZdyQbW=UnQ z_R`lkjM!qVEgBMT+Uw3kz;v*zHwE8D_l~O+h|yroHr3j4k{sk_AViuLFQXx)Kx_`j zKFAueXFVG?zT0lxDF{?wP7sPT=g(v zzO^ON&V5zkjygzVwxJVTXVyH5^CnonQp0Jeo9{fafYO&MU{W)=p)Sa& z|JEB>Dv{A9dd9|)KfxfB((4uQn^fHIQqho5+?0x|A*a65TM1<-#k{7QgMq~*6<)mF zR+qPZ=ys~M?=w4BTF%23;bSfoJrjuWdyo2u9tBM(#JeeqWApqDZ(L%9YF zypi5yZC`+0bm*a|!fo3@!t!8Q-b_kg%NIA9>9LQSb7wmBvq^XxU+kZR7hfuREE4;t z;C(($Jwr-44H^)ZYShrTMVY6bRU!3m&`faZUyz2Y3b>1JRy3NQ8hMSO*yT{!`7h|O z4I{_Fz)W|Rx#K3-s}4N;BigBtCJoON@Opvy%SQ9xMxG-SI}|SCSJ7dcM~J0b$t>zb zpi}=7DUE3uOtNwrZ)B5^Hz2{@QN>!hHBGGv+2?Lf6t}gwrds=l3O|ama+|%7sfDXb zu9F6>0xl4l7s{|}<-7qY_GPdvy@dAtaL0&|_d_s7N@eL4wC{?oEQVraxGcSj_O0H< zVmL;I%F>U~zF*|CD8TQ`mj3B-L8Y-zB}Hl5nK`4)>asjNsR=aI-pp+D`@vE|S3*Zsdm#Jw zj-e~tr_0BTjrB%Su0QG*1i6#&0ORGIk3{T9l}1=5QB!9<>n=}mfzhL6-T4_g zgEJZZOVW_%fU`wr>zuQuYYvbDQM)jxJ{cc>=f=)QV3dS=DG7@oHTBekQ3X6I*oV;v zkaY*nj4F5q4%qZQxas!i=8}Q~RrGR9TJyuMdUG*_Xa)xHpNApwtPB(W^*laL!=9i<|F-Y(T9aUXw(q#ncJl%X_5MJ4XZD1L5~P@K8xJh|e4lpTDY6NwqC)9zIcYAkc3Zb6BhI0#~biigQMu#za@L!U2rO92~N)Z~JO!UpRi^wZg$2_*zBs|My z3G7Y6$DH3el$XwvOR*@O$JR<}X6Mw+V)Q*EJWd$onNMZ5bw7zG`jYHikr5%JScPiA zYa{Xs{Mkbo4wY%|ev(SK({MG1IWd>2Y44`0J)PCGZJ{dxh*Xp#zj$>h%s+dKp3ZWR zfn00`D!oD+0xHvz3{}8DelVeDViA>sL=jzLmiQXORE}o_w0XZ#9B3}`LaWfaJ zNhazSf(*#88PL(4<;w(v+(bGI?W6|EF-&$C8rk$21kz_k=7RPJ`NmKzUFSJaPOoX} z&I)IO-=*{m9fk?yU`Q8lnGtb%BfepBMFhyzJB@AeF>J1GkBrdY3IBLdvxYlsN($JTrHqMe zttJOWT|7c6UlWh(3`Rub-Jw)1$UElA8?A#upbiF|-`Tg_)iRfaqZ0}I5Z$XDwry}2 zlDv>SZ-!cH=dM{qG#TjY{WU)K1wryq%=W9pP|Ma~anpVeTZhX8L7*;w(kS*%AaEtF zqa227WNWv6YT%*%Y8v`JI{-T>rz=x zA+ooMP|1AebONrM=cp_5qnP$_JE9{GudAS;E8uta3tF`x{jg_Xg&d2^byX>!0PZaD z3@n#naY3%Cq@P)?^bDlGkHslnqII`fKIU;`fUBNMw6YnXZ8}qadJPUe64v5NN?W@@ zR;yJlDTVt&U81BK_5qDUS~dsV0S%tUl_6LckM?3R8x%N%{%Yx!J!#o640RNwZ`=1L z#feTK9xoB2IdIb+PkWUNgH{S_V;+P9A%|4gthFIHI)cp*R1^72ymTM5PJ-OLWH&KRrgMOb1`*c zr_LRCXu2P&o8hR717|0h!X%@pZm&bSm8H2%vOlW(%^_U|$TFTu7NWW(4k^x32;&`y z>drW%YL>qKh*%G<>?Pk65+tnFf0IwxNnmH^y+`xpS$1xx^HG#M*bZDa4c~K#LNMr; z;eEV2Gm*+G+|H+#-e)vKpB!Q`1Hc(r))Ao5u{^gjnSLy4SnPYgp2-xl_z8<)&qJ6R zl*Lb3-1vNesbOXN0&4m?Mvi}u(icovjIqfC z=$5)UM>NX3^!qMOZX6vbh%8UZz^bfFX$od^vi zfqE68l_G>%?J6oMT9C?P$OB6$GV0=5MU0@;79U_yP+Pqx{o&qqd;f%cf0(uA>~p@o zzw_;L_SvOLt7CZ1LT46>#fx1Ty@tiIgTXiH2m#Bb1i^h4i+e6MTDmr`=FzQNIYTK( zaq@xQSl@CdM<{e?g6*Vhasn#%a3=lriS+p9vC=$YMa4S@#>R+J5?<$ zE%SG?KH5^TrSQ!kQ+KDHeo^5Q`4W9^&bC)OL3{!18;C~5V@1^jD}-i| zl%0uf-})}<<6U4+Z1kyp(c)k6@=?p}*MIcgT=(q7Z}%hnr}uui>B80LFMjhmekKh) z{`$lEnA>$3J2L|nnsB9 zF5>1KL#QJJp9^-=+@$V^KYEst(}WR4J867K2v!Z2+ak}}$?X|=4oL6&HrU%1d&zZY z(}*vsG@M>3E@2xtEElEL<6dI8^-_u$F;eO8C*4ZHZ2MdNt-H=V0FZ0Xx&P_vaJD%k zBmzx=+_RTNN(=lGcYo}Wov?huL*x{(BMZ^I4M?QRQjK`L3yl9bC_%2WjlG0>>L?yB zfN^>-0(p-E4BN<%4H%I^PAs8|eE6DD6+i`&A^R}`Aq^{mMsk6sn6jH&YNmifs8o#b zprHiu0!o@sCi|lOu8(~Y8D+O#pdrD0YZ>kaLz|>xXCRa{o=lEFm53qlb7FwPCC(+y z2iL1*%|utTNxuWQ_6|UFD!U54CQIxN2dNI?o3?*NbX``P&mZNMR7$5rrz-CL@<^OG z?{V``chQt-BrOgyZs?YZAGd79qQn+_F`6RZLWcBzL)VE6Xx1-4o_4i4FU~==%tX$h z=t&dl{ey#X!OJzyeN2T;;rGUV(6z&ew!xlri@jR`a_oS^sk znngzd)vXDnp?nQZEF}#`_kcx%e#qF{9`K+qlJ$-!9F(z(G@SW6O{9^A#k6%XY3TTd zRvzt>i8JTTf`9fya*xa?sSK&budNA3wE@VpBQwFU1i!X+89J0G{x#DD4jT2YtxG$8 zvSqJx{eyaQw{;`Q#2f?X?TjDNe$ENHFVGZj1Stxwz$dT0gVwANzs&Ris6`}``W-PI zVTi)iYR*oOu>D$mARN7GqNZ*@#@^{LgEecXimoW-+`bZyrdV3Q&((1B_eg^^hOK(z z!Y%x=0ILaj6M*>NaIiP{iqId|m*C@$v?5-dcZ85^_9W?r>;^xBbpyp{@o{HbvG1sw zbJkTGXrdN6%2kzqNR13D6L9TdHSmU4Landpp10nu*9=NP0HA zp=-k&WJrb~B4j8QL(+ivTkMQvl6IsF)?PkW?xHoTIdh#X%S{x+&N$Q@Ew28E5J!ot zi;4J-1t#iKM~lfs{p4u*B4~xU`VbMnQe0h0#49Efw_5Yr8CTA}*3(*c2C1jB*%?ot z1goKiE?SNnYUXQYg?s#jeNh-PN2m=%H7-24tCrJ$=xiy};AqiDt6bO_hTMr-g>ngv z*C>=C8sE41qDTnXmhpLyeNj$>pVuZpJu;@_gNv63q4h3WfC_Sy*XK?wVyxLzGC&2= z^V;4W7V!G#pb2VdJ6}68HnNnlt^?vJY~rnyVKE(n!iW`^P{8vJKzaW#=j-XY zY+y04c9Xt6H4dA@+b8&tY+@i_}%H38`-M-Qu*e4s`SlTKjEUvnb4?OzVw7`C=#AO zG6UMn*M;{264e^TwWP&pUyNi>gbuBe45lmqR4k@|ko>%E4mv1Xst-BoO4kK4 z)t8^rP48w3bQi=v@UH^hen%*duL~2;hVQSOuMZi%Lf82)Xx2{z?om)`3H@9fzFYMhHME7%<#qYf%;)h23{AU_gregxqd>vbdbJ!Bsjs6)y(sA{Jp-zoOTWL+tg_oK(CGoM)-r{y%Ed~Y!A7k! z^vV9H(u29=1gR}IKngHQAr``@OoDJra%qL$kc1JC9$eQ(?zTC?!w&Y_<_h2VqvHa7 zNIDR|FJ2PJh5B}R=)$P<%}r(P`z2pGLXBH@d+F|gU^p`@5gJu?U*DJ|Ux8UU`OTu9 znY@y{2c4hG6U$pLtAD;q0fR_VS^k6qN0r~SD<$A5X{&2%S4eCxNg5_>0eh@FoXIp{ zRx-a{;Rp>8^IdhRsyklw&FxXPRZK^oWEb#aHx^^;F0y+rYsiTMgipEfxc1Nu4^0Wt zMZ8+hv_=3iP6>c9&@i8`ivx;Bod!{{PYXsAn-F;HtzTsTANxoE$P(nMtxT)G4dDq8 zNK>M#?y3!O3m}?4DNssQ^FYM&4e9A!)N?7rhw*F6tlv+Z8gNcQD=d_r0a!yBy7+;Bx)^JK^CGqfpNf8 zxLi^T?t$G>5F~2hD=w24iu%0%klvmK<9`!&F8hr^LSz4NFZ5@FiE2X3;2qH$2`hu;36hu_^ru}W7?*0S2Kje9G?#<_X zzvtYW$w_hS#t61OW^ZL>#g2SK_NJAUH4I*pwh&mkyn%Pm$_n;~lu6_B%YVIjGj~BG zugEmylk-{-9`?4`n0njT%wJi@Sb3dgPU25~ymr&g(!{)Ozn`O*haMYVVEuB7Y`;U{ zAqNiU;M~jUN7Gcj&$jQMVZFo0eYV{>c>Wf%=Lli7gS7tK4*Jjy4LSMm!4dWNjBcNG zbnfKrOskjA#FHma9+VwRx;8R0($A^v=r8pw*uVe9^PlKr0WJ8enVHatb@Qvi=1BiL zt6vmO1i{z4&QhAD73eJ&m*7OFo}boInmU|VG;I{z(Gv=%o(_#draWUy^fsdYp7Lai-}QMNl%EP!lU|5-TGtq(tR*m`}F0O2sy zX&D!P4-O7K@SO+3S^etiyTtdNVdL75nb=8=RzuS{Wfx~M+Xa^{6((c??rly@||E!+ZDHvggM9tglo0DKbGZvk`u(G5D{4-|vOTr4$tQ=wu3 zld-WeN-S_=wkBTMm~hlm+L=Tzg!3_(mQmNdFrAZ@b}{EGqd=*|Yv6?X-C}_lMl*qh z==nvZw0-RX@_BT{@cez(MGJoLk2K4_Z5J3q@N&`K`gF0tp2=t)@IyG^AX!g4kYCP) z?-SDs*#i5bQfY>AJnT~Jf%IS|#9 zG6Q1WQe@hF35hWC|6}KP}Xx;2L^o6yTvv!*^6M$kpd;X z=LV#1EVl6(2n14B+Q|MaXZY1pq$M1GwvIBdy)myfaYC*5kSf3(Srbg*RH~Db=8)71 z%DkL@wxh9>j|_$4tCk`|QTQq$G8BeaC|-&=tlvcFDMyyvQMWxI84$}!%AX>Z()qN9 zXP6k>fFmNLT#Bcf@-p(t!0i*0Q-^JBwx7olK9VfOhkHgridq5sW3kN^u5MqvMf4i8 z%AF!0`i<%fzHMY8v&xAg+-Q|dd}0Is_smL>Qffn*3Kg-3iN$z&hQ_AUR-UGm`jNRk zn}KBY8@N4}^(9wFX3mwsEpmK*^TRVgsA4}N7Pw*YLUdl&vzw$UwwRE(V)1-5^8DN{ zp_1wl9OJMvdAdxQ`ctMbZ7N`*T!m{1i3sa*MITpR@UGypYu$iN2-sX5pZaxbmwS z?HQRmj+xFg(6;1w+tIN*?k008NjaI!E+oY_nG?wI-iP-t?=jF`%=B~v9Y=Cz&srcM zlVNhro+Tc&Sp4{2aDe7G>|r7LLN3X_(nsg$TcRcTKlah)JOjP{0=p=0JlJIZCR;7l ztDamfqwBo&9Jb|JEMA7mY@vA?=!Q*e!0sic>o?w|%?AwBxwB+iicW~VKj?w#MA+vFjLK66L7#Gi3uonjDFiKgf?$AP_?7#w3IGBwrguJ+9kxs5(5FY z-$0d}R!i9iN}mC?uL`hTidE=UA@4Xb>e`klv78*)xT-Fi8F4}Ww;iJjB`78!Bz{h&Q(bpNSRe|3d!ZRX03g{*@ z?v#jO|IVYPrZu2VL5W@%0+nZ-1}Tz>QdKerRD+WEU@^J+eTg@#D9?J`UVYJFYu?@x zqX=}&9OG=sC%b9jqj=&ORk;fwTF$KpS(h8aBpX2ktUKb50ir!#Z`@%a-rWp{khq0a zd^A?kpepAALbu5sXh>p3SSu*yVt|LN^-`fcGa_9DO#0vIQYp}$o*Ljv;y2Pc-b&tH z{J~htOG{x$&SpswIIF^$S`AQP1q5OH=7Df)x6Tp<$L=C$HeJ|WqBH&o z?o7y%Dg*HDCYOzT0s7g~`<)34Fe|5JBRP2R+H(fN}}$?o9KgH>esMp*^aMR}jD!Tg;E8jB8{I-)JFRPJ24*OHaXgr|5{0c>zr-tj;;5NMIVwDh zCtCx9gJ(m!66a!MqcCvxR)**(k9Y&Z*4QkWqo#&Yfj`qv9kqEijS_hs(n;OQHzX>i zH^h&M?5v)av^&T~j$htaqoR7hGH>K3DYoAQ*?t@qE7#=PEdNJ2#p_2!-9z4{)|TvX zZjlVix-cpp@vY|-4A)cM)0|H@)<7dl?m`9v!N>qFqZNgR8D?7K68v6}OwO=W4{qRC z$AKxs$N(7s;u|C_d_Nh@@vEWPt0=jZVf66!P-Y@C&0b1IgTPNnSzXse*ixQfUMb5> z6Vq*DeJzkrD0O4AyNf1GAWJ4H!%Xp?xBf$;ZIWCKq&s zGM!{XlPkzifN2{rRaLu~-pM8sDJ=eg-nwS&mzEejpX*mWmS81l^Tr~QDP|%~+E(IZ z5G<88&y7eT&BR-&7v+g%M9a)%NRTY~=BdYeKSaVc(_~z$R>62;A5W1I5&{T=%MZKc z+btf7Hiv>?RN;sCey&G9;ULoGc`k^{QgOxfDD^QLSb8kiPsAgpF4BtXmH(i^ixJZm zA}r2?HXJ9%OJp49sh;PzMOYgcC?aQzWDVV??t`UkS7{G0QseN6e&)uF_?OC?lx-}a zS%f8-Q1{NwEr9IJU;`CMZIqdal3u4aU_`M3a;U&X?y_0FWufoGWMls$AP zVeg7uP&!9=FGMyJIoO{LU%jMYL@vZ%1A1@pgxh(3_Uq4Y1G}AEzrK&*tGx=wy^XCc zNqCOY1^vzw21sN>Cq`b(C+<%b(|;CY(Mj6J9r`y`G6U$JafLp7zmJ;Iw)2Hcf@I_Z z7J52<(Wbf%{l!u;n53l=!5;c;HxQO`ll@Pt_l5k zRXFewWJGTTV+Vp{3Qenj72hgpb#_h4ly(+43lk^VJ2E*LLY`= z2f}1FO>3nRPl(Zq0*N4RGoeNdhe0vw7|40L2af&dK_YpKc#Rk?C=AW1;aN=dj0tsw zV*d=2`LAnr2V;jtGEOO(Y;X-t8QdTxYQ~$1NW_q-FzikZA7-JUCiH0-b~sel;?%E- z#it}`@j#*`+I&C0>)J$Nw7`)F%OfTgN?d7hAc&j4_8-mQlA1pLFLF;Ks({P13`7UxB zOb40$+Dei%G5_F$#vFvlULz(=Lxo!?Y7(R2h75)-~S6B4vYQ_=7B5_+=;ThoCl%T5_ zLlBHFz6TgAZLibS%qNKN*0pm4(`)Oydj(Kscx-CjjeM{%Y7Pj$tXNkgB?xg7@OcJo zJnyNl27LL4j)FRb!8x^b08@1S7%IIL zgq6vi00X*_?g;5E5ynaV9boV|kbljSJ`BS+W%fPkZ6G5##rEU^QZDkmm@{1xMi3%L z!4`x8b1Zjl);$Pg4qtGVC%m1Yu2bRo@>EB^uB1J4SMOe0=jRQb1zvQv>6$J@6#&zV zjO<<}IzuFV)TGJe2(2phSwQO-pf{r>mJu5G=tm3#m$;mT;UzQzzR}6Nv&_tyy6J&@B~&Rz9~`two%i?7vA9t zQh_#3jZY?OymeP1dO!_fdtgve`c3QwO`0yQa4}zSJ072+ROgiXHXF#~Lv}J3j*aqs zH_v8$gBX@MygVG?4;(?jhBkL7C}vVn%*syMGY8veY@Sp# z{HsZ>7R_NB4xfutM;`ahnh%O*yr!&(EX%jc=fkl%p6{lWw0D5gDv_31NX}7v!+zha z08oE*RQ=6x6!hAxpp4cS+2B|l2$Cu^ZB(@uNs~e8KVjz_@y#kG8;;oJYv8MMJPR2q z?qS3*)8PdY=O|y$)TlWbjLis@b{+&5g}to8cQ}$*$I=nGh~XE9m!2oAEo8y5~vC7M<9R*LoC=)%M5yE&^PG(r`oo3&xKyTSpA1 zMgTj9mvte241DkhTiTeabPwzf0e3yyy>r`T4N@DVqor`H8`ptPK6odmt>w4NP#0$c z{sFs|rXyPGlm1prjt`TPQh2%5F8A*?Okac-@&x#Y#MA_J9uuh*>Ii%N^^$g^7Q`>+ zTEz~pO#7VG5ujzUQ!PuT2Y#bIZW9uTDs`RzO1;R*7-25qYcwtbd#L4yn=df=f5VpqN$n!BbPkg%)F4*eXD2QZ85(8p@N%?eVr zjA($OJMu5asPpRTuK>RH$kh-?=Vu&&X#dteK*bJ@AnyU_vjGDG6SLcx?r{#UzG!&( zh#jg}LkIDIIHukivq%jMY?>_8(WYHw%$01N1m3LYHsB7gx+fDiwOwEr+d->84fDX+ z8Qx8rI|!KHwS^02eRGkK8qrS=mO{G^`+!*|)_i#0+C+J6UCaQpUY)mQQb@Si3m^}O z+5%tR+vo5Sm8?B$o1mi^ztSul^SxOpS8t}gG@e3%7smpLQUJWWf>weUL^lc(`4kF` zqtL$#S%DOqnoXf+g)Ays*Gw&i-WRecySkti09AJsvM9T{Pz8nV74`&BX!BMI{Z`mB zfkNAq6uR6`1sUMfDybm$&Y(8@a&^S{@bbNvl6ADl{T5$PTcEdJS~nBA5Ju-lPmFM;$-VXS7vPPWxU`+N5s!^nncEJ#Tc*$eJp3#8Qgs$a#Rs&TAt#Pp{o~ zd~bNubDux`_f-tNy)I9xnz#1w(A}qA!=X~>!f^Ugi;7V_hoIqO|Ho7KzNMw*-Oi3! d`p{3e-vb60G+hneyMp?+PmEils9%WZ|3AErbIt$& literal 0 HcmV?d00001 diff --git a/public/static/img/_flap.cfg/116x142H142WN(G)(L_).png b/public/static/img/_flap.cfg/116x142H142WN(G)(L_).png index daf6bf586b404de927974a65049264b752a3022a..7dc147138e2d90359faa5f86f3ebd3198c51bc6f 100644 GIT binary patch literal 4126 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 literal 3168 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 diff --git a/public/static/img/_flap.cfg/116x142H216WN(G)(L_).png b/public/static/img/_flap.cfg/116x142H216WN(G)(L_).png index 87b506a1ba39d9397cd1d65a775daca7a26745c8..5615479db231cbe79eb91bf9d1983977a38df8a9 100644 GIT binary patch literal 3077 zcmeHJ`&ScJ9w(ASAQL5t3}cE2^3()6*g(;Of+iun6snb3usRGCXDMPpT@k^;q|$^W zAOb!qV9-_9U>P6y=!=mA6_qtD1&fx3$62w6Pqb*Q?TtV7oc#-Sb5735=icwvN z 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 KnBd9=RQ6x#87iRw diff --git a/public/static/img/_flap.cfg/117x132H132WN(G).png b/public/static/img/_flap.cfg/117x132H132WN(G).png new file mode 100644 index 0000000000000000000000000000000000000000..bb822a1d903b957cffbf53f11feb6907cc874f33 GIT binary patch literal 3536 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 literal 0 HcmV?d00001 diff --git a/public/static/img/_flap.cfg/117x132H225WN(G).png b/public/static/img/_flap.cfg/117x132H225WN(G).png index b98456bf0b3f9a2af73196cb643d992becb3a4b8..48fee38586a244dd132296673e638ead374476a1 100644 GIT binary patch literal 2584 zcmeHJ{ZkWX9^WjR_$&l?Vx%O9xG^3{?bJlT8bKwSfQr^_DsV8qz(%lxjxSjCj#`jp z^MV$%y}~F*p$)ZDT4^=5RO8D)5>Am(Ax=3j7SN@Z7c11%B1Zx1EjM>__U@Pa1Ny^$ z=6SxK@Avb(?03H3=dgiV6&f5Bj37v8+Uk_`2*Sg-ZxjePOLtAW7(wv6X(?nzQSC@i z@1MGUKihWmO8@*>ZISk`iO^H4EeYUWx!%Y|z1g(Q0zcn%e`xBnOk1O?`q8H4`|qsl zEOzzoy1NTG*FDmC?rHJF=>6{>2D$u$ogeHj-SlJ~@)%+S#segxgQi~%*`JBxo=LuT zWAZg;+wqIa>!nW~x7=&_9jnZ3Ir!x1r=%;~Gx|%iSTNL@PG*Ck(f)T{{qaR?cj+-T zvNLfsS9(kdf`mnJpY2(xy%-km)kz%78%ovf&B%yyEG=~s6&C-K>wQaLlnD(DYZ)gL ze6ltod8DAonwTN7+WJI-71CQ8Ih*)bKIftyZ+Bj4M*1`6T5Tn~e^Hy(Jwvr^PXrv4XZ=Ry{ zaIL6mB@Bjw4So5_tIgUGtPdUIZ|~1{9g1h7aPMWSxke*hV9a$07=v^Y&3Zj9kmCDFVaS}(S*I!b`LMav!qEA(Zx zqGfAgVytkuKVM=hF|WeC+ToC?qm@Q=2RIA74y$=FW%t~UbSc18YqNW{BB-xI3&#(u zE3UP>RktIr$idXH5@R$ai21fcVj-O6>d_nR?)2f1l9^b}mfWH8O7roh@(CG;UMcxT z0ir3%H(T{=g1v1FpbhcM&bGE|MIDD;0%$6(@2wSX@-`b3B)fjhc0nU`)y97q!)O;< z`wmcolX3^JBKXIJ)i&RV^p>Wv!@9jMXTFZF}N; zp_ASRnE3~PS3Cry^?bB04GfyUP}E|q~o=KM{yM#`q_&6{KhEpM-UlBwhc|9Q4Xj`4!u zdm)TdT^N_;;#4>7I8~5a7^meAtmy!x>8%*4aw)-X*lQ*p_rr_0+Acj_)XEDx?Ehp5>&e{N)H6EdvIBh7ml+AeIqqBgPYy zM)Zg=&CRaW(>6tQRES3hX=fc>PPp0A%$p3Ns!0T#jZI5mCCdh=@T_=;2$M`@7QO;m zUi#p)ZAY~L|L?GeADi_~h}jj`T^!ZV-lOo(1H$%3x{grKlKEqSkOVPuu&Of!pfkKr z80N^P6E7mk^A%=ZP!!QcLRS^+N`)>f>`H^m4$7b+9g@?`1dcX{nLluOEn=p#+bM2J zgPN)=vKuq&0XY{l9|vSEW^TBRPsqXWK&DScvPPXRnPksd>1f6so8-yH%$Yg-yqVZ9 zdT=EcOzA<99QbiSN~*JX$uq4yoYyiBSoXwl_b%wmbjz{&y*hUc<9lAlN*SLliPt&P zdbB7auz(yg!NOT&K{YH)APcJMOz}XMcPV(f9O!_OgbNf{)qD`~rPxqIWL#}DH3D6# z)zpaV_*T;f;JrMIb)~?C-)3r$VD)O5<2A-`2>MV`>87+VV0|e$e6C7S1lF_$hRw&C zC>XXy;h4b$=AA|l%mc5?L=VgdNjPu0*g9tz8>L_jo9R|!MhjF&k=Zh=Vhub zNnq~obKS@LRS%6E({@L-T4?%VI1J_f>;H5|u4f(!=Xz@Q-&;`mWMJgI806{eafl3P p0SXz!O8hqb?H>NGByjKiaY^FVgwe((56ZpxkhD}P<&=(Q{sCTnb3_0D literal 2590 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 literal 0 HcmV?d00001 diff --git a/public/static/img/_flap.cfg/120x132H210WN(G)(L_).png b/public/static/img/_flap.cfg/120x132H210WN(G)(L_).png index 8108164fc9837de995aee9910e82e3fd7e2b8781..b609f4ab6b7f4b5d03fd1546dea15dc6959705c2 100644 GIT binary patch literal 3163 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 CPTcnZ diff --git a/public/static/img/_flap.cfg/123x152H152WN(G)(L_).png b/public/static/img/_flap.cfg/123x152H152WN(G)(L_).png new file mode 100644 index 0000000000000000000000000000000000000000..fa6c8a2e5892c8c9454b5e926e8be24c477cd0dd GIT binary patch literal 4074 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 GNBJ+Ng90}I literal 3253 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 diff --git a/public/static/img/_flap.cfg/123x153H153WN(G)(L_).png b/public/static/img/_flap.cfg/123x153H153WN(G)(L_).png new file mode 100644 index 0000000000000000000000000000000000000000..0f063d5ca88b20cb2744806ade3eb53c6c570014 GIT binary patch literal 4046 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 L6VjzaqP6(nFigM; literal 0 HcmV?d00001 diff --git a/public/static/img/_flap.cfg/123x153H206WN(G)(L_).png b/public/static/img/_flap.cfg/123x153H206WN(G)(L_).png index 56bb7e2e4a7cbea37f0ea3d62a130801cc150de0..9fbdb7adefbc51c2a4bc1c2e0eb34a69cd9f7474 100644 GIT binary patch literal 3270 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 P`@|(yyi&9uNvrr5Uh-(u literal 3392 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 NBIFcs2eKD!_%BnPbwL0C literal 0 HcmV?d00001 diff --git a/public/static/img/_flap.cfg/126x138H207WN(G)(L).png b/public/static/img/_flap.cfg/126x138H207WN(G)(L).png index 2d1de74e042c26e53c25102dc4e2932c16e81562..dd0cfbe3c8424b3cc77fda53dbaad374ae4b5dc8 100644 GIT binary patch literal 3254 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 Y0x$TZ?%S^5|A^E2)Qz&!FDdK)39qOkg#Z8m literal 3351 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 TGG>B*9v0ifV%W{0>BoNutPI@= literal 3323 zcmeHK`&Sd!77nEav`P{X0Wk?AKq`+4f?ODeDVhL+UQmGmidCu*5v&0s9WhGLNWw!R zA`cZpMGF)Va?3+#p`{5*t7wP_3aAh$B_foGKn)6d&-`}Rx@+|hxayi+*&6CJl zTy?oq&{OP^;W+7pz;dKsSfC2kLYQ2Xmh!=vUq2GK}y-Xt<3D z`~L7uy_kHvmJl>Nd`{HybLXw}^!%#fnWWj_twnE_-*w!6+qURA5;r;f`daAA7pW(g zo@$6|t7qnx-z^V6xaGCvMb+x%K?}ddYBQQo{WS73ZL#Uzi-sdvL|H_^#;P1*-K1tH z>#*(=Jf@%6KW}Ap+i-vvH^Yv`%I=Nn3x2;yyG){u`V=qM73n%lA4sFf=I<|5>j({P zOI3Zh4gXMmF~hd?S<4c9J@T!OBtY;@3nzg|U)*v)sU=%S?tNowRQ~0yfR~0x;@eW` z5b`EWaA4oQ@-`<#R{1CKq&dxE?@KqwFTTduVq#sK7}FHfohZG_kmDMLJO8Bq zp)3m*m^`N6XtfDVb59qC3t#s37AVqi~vbGfmni@IPpNd_q>DCVTsZlmHpbly-=x$Yk(Fca)`(1kxzmw( z&O}c(Nm|)u*g}@x=@L;LZk8FT+kob8g_HC#R?!ih$)|P*2C3Uhbi8k~@$qgkaVZeJ z2rM1W>Jk;z;KT}o1-|GHB-(?TcCc^N)k&QZ$=F2C{0!SjiFJuASA^(|HMR`mC0w#W zdf4bna`{3}E56fuZH$3D^nz|@8Mej_nY+4xSM;z;R3ohN)L!oE!8fV|`Y_-EQu&D< zTotav7|TrVW~u$|=(%Q78#vU2=Ffx+Ov=+ZQQl;^+h%P{nB2`v8^e}2610{hL0pay zb7BcBvM?vM;7-#JuJnYM$RJ5S%2IlAq5-JUNqdc{j(Uo(eP9+MLC(GrH)61$_VZErQmI7-p}HR}L)(qG+*>_mNu78tcn! zp3A{xS-RefnC!ByHye}X=+=+-yeYtBS9QE1j3?G5a%b9Y;q~^&dONt3j?6Zue$Ir! zW1hBy-EEMKQQpT)saMFf78B|f6Iu(2dc~B+9S9JLwu_0gWa_7lM+9|ck`=__J)4pC z5VZAakoI4xEoAEMx-~S!9=>te2N`&fDreOUjw?LmtRF1L56(<8V7}`?!INNA<1ZMn zgZT^V%kSzX$IUQd{%ih^K6^e(AX77UxdNoCT(Q&Pj%ZmZQio+pno~+Kmm3aRwS_t+ zlF{8gasy^k6ZC+72rlPidJ z3t~xgADAzi2rb5T?%@FPEke;Nr}8vl>+*qp_I?oDgq0%d05( zl$^Dp=2@;P>B|`geB+8MG|j~Igg8o|XZGNA1tM2WaI*9I8_#3B?+Pmvsd7au=X_rO zoU2-GQtK}|Dir;}?w(o{W4)I&vU6B(u0~df^$IoZzdud8it(;!WW^XSThp$bI#Gu4 zN;JGn;6!K=xeMS#Oxr`HcJMSE>W=hDH=%l%QudIk9%RZM6Dnd09re6*noNCe2Ssl| z(E?2qcVWpEZV%$)$MB3M`rZ_o`i>4AB2nKlpc9<^K5`aYY}`go`1)~sFh5oQn2%~~^tPqswZViEk zTxtt}=3HtGvd9aysfW}`lfGprm8YrolJo(_xHS2WF*maMphDm z-QE$Qd;}6$^fdvC?pOA^#iDG(J0AOhZF$+8R=HB5@m<{~4B&s0w?WQ;c+rxSS^-#` z+CTy6Jidc$)b!uom^vKCE*9v08!S;E0=28vvCR{fSc?Hmj{l0C@)^LwWU51&A80X5n_QZ{{yu z?BwwDX{S5IV%=JDk~TeQC8PDN=g6UBXzE7kv6CZ&lIPDq<)=UKmQnxa&KN@0UdOMN zuU>Q$pXnugHUIa$@^7x3|6lsg3;6$v8t)Awe-T*pI_`4^e`*MUe!=Yetq0Eh8)c9I A@&Et; diff --git a/public/static/img/_flap.cfg/128x132H132W-(G)(L).png b/public/static/img/_flap.cfg/128x132H132W-(G)(L).png index 8b1fb8be8de28cc3a2116e4ba4962f406fe7f5ae..d7fad845f247419526d9b20a58c2bcd1fee5cf3b 100644 GIT binary patch literal 4522 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 IYN7sr0DELxUjP6A diff --git a/public/static/img/_flap.cfg/128x132H210W-(G)(L).png b/public/static/img/_flap.cfg/128x132H210W-(G)(L).png index 45a3f65487eab243f9f09c4b40b77baaee4ccac8..56b83113fd2a216e7b9671d0c63e3c415e1539df 100644 GIT binary patch literal 3245 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 A$p8QV diff --git a/public/static/img/_flap.cfg/128x132H225W-(G)(L).png b/public/static/img/_flap.cfg/128x132H225W-(G)(L).png index 9beddd8b6aa403297e9041cb1dd4b918f6fc3738..17a6a2098a28ea317dca526d12e6d831bc2d547f 100644 GIT binary patch literal 3132 zcmeHKZB&wJ8pZ>GmLg!MMDQa?jnNugrdK3W3Y07}x9r=R!jgls_9|FoT$gz^CHiEJbd5dTptSrnU&{#PeZT7Wi_Idp^r`^B%Z+>v@=i|Pv=X&n< zexBz>os}sHm>e=0hrRB~Kg}VnEyRcpiD*(41^!(+Q7a~%q#nn zlU|?C9)I`gU+E9V$A0S_H}nsWjEp>8aQV*eGYw}CH#L=?4`Y6t-g7N)_gPWcl>Y4> z|6RUSk+i3Z#k*^Ny;*iN`KxK6o^7R(5MyUY#gVqk+!21@?S|33^ZQx6tVd@BvK^OB z(n8y%18nH0mLV1S{@EA7h=5#|O3GimLu1{tvqMO7onulE!S(|O$o?0-z zXd3bIb>y6c?*LPL^@!79nFD;UA66}U<1bPi+bMfieO-?)%az~S_=RonQA6U(a~C}P zzdK|X14-@S%vjQ{F2p`v?QXun$oev2nVf_TiJYhMIfQa?K zgv>-zyVT)ao0wHF=pU-B^YC>J|8UIKIWnlgUioBbj^;9KdwX*^t6)fv_g>F4I%Qxh zwbnx>AJ@EXa3|BaAv!0)j!`OlGD47!%5G|?ab2{=`o=V%B5#aq=xY@Mte|A+UdJIn zG)>W-&!!iDW)#ocxs{SA-2cbd?^iCjk%pz7jmt2BU~ZxnWAYl&pMnp+PVz`4IHjA zNErYGA3i0OttSD{$=P+e^5aDG1n4it!Dpz_NJ@8b+`!u*B*z_LIJn2Nj z{m|vY>Psr?8G<`OSS?Xo$NbP(VYNtY9VNH}h1I*&))qgMA*|k@wmu@biF)$}iwjc9 zS+=2hV)=ZNkC@;luO_E-7rtU~chW*nTU_5Ny*S%KSs05ONYh=mxQdisg6+9Tc9g|k zPSYh@T&2oxyscxo?ClIJyI)vtb=)=%)H`1+R{TOm%KT7N*hV%Cv^bf3g)0W?qi8Et z=tYZ*tCUCBn(H0Rr7$^~=cORSe%Jx=S&hEyMEp&DR9%sJnZ`*_qu*Gfm%>+t5~jEz zh8siCdDYfLf_tW39%e|acWM_aURzu_O8K8`H>rqsf&~9Vu|_gjyAUSM;Pp|FB43m* zl$47((@gYQ&kK?4I*W^^>D+4T5rQO3@8ufkO-}y|#j6-7H;5UL1`{PCk5MDN#hJlZ zJc)+n6m7Z+9kt|zDLGWz`$k89Djdz?Jyluv5G0HAEU25NO)t@C9Q{k-=m&FoVom}U zNlCG8wWfrVVqzZ?C@if+6I)*lEZM|9DF$|$iQT#a*f0~jeG#zHCU(Bdqgu8RyB;#P za85HvTOkv>uoaAzDeYJMZB!(T(5C+G1Pdzj&1A9CM6z8}ZC+Z9#_@*54XC4p8lI

    IdX|S{l;QLFHN@zD4^!bqj*39p4I1CqS!^z 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 diff --git a/public/static/img/_flap.cfg/128x134H134W-(G)(L).png b/public/static/img/_flap.cfg/128x134H134W-(G)(L).png index 9e0d805112aee5abe5cbf2dc8c829b43cb11ed22..f02de45b6928235751266432cdecfcda63cff470 100644 GIT binary patch literal 4454 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 xhK$ii72!%Qp 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 PV-U-htV*nn*Y5cTRNr$| literal 0 HcmV?d00001 diff --git a/public/static/img/_flap.cfg/128x134H207W-(G)(L).png b/public/static/img/_flap.cfg/128x134H207W-(G)(L).png index 0ca230a9f16d085cf5b7a6d794390fecd52902fd..4836dde556c7f3e58c85bca0c4dcc67cf24bd4bf 100644 GIT binary patch literal 3280 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 literal 3380 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%0D33NT?&Z<}=uM&^ zv`g+xfG#XBrTN{6xkZ`gi=QeCiVIj2#K1gznzW5t$3ojL2_+k-&F(aY7ab~;W+zIM zqB^#JhWS#KeyTt1Rig`Fw}RYDmAln~a6y!H*6I{T1oS9`Or+d3Mj9Le)t^F5LTird zpJFenKY~DOED2AvWi4N=3q&seC|2v1BFlIY6|X`!K--$FHKy1V zE4=d%P%nHsxd;f{w^Hswq#^Rq%N0_a<>xR1_VBiPb4r9xz)|by8@KlfH>hDiTL+6{8V=@Vm4lcwuh? zY7(Ein9AIS2LM5JjU|%|H-lurW66}mXF>9-HkZ8|mV&gOXD)No#vs3HGnqsi0PPtj z31R8e!(8Gf;PUedRBjD7H-q$jj>;`JV+8nZjkUKOC7m7>Dui)^D!1bqKZEj2>}=c7 zZYO9uLaasQc0OaG#m)89IL2(!3m}J~yP2#`djwk7^1EEG!J1H*4_vsn`i2xN=y5LY zZ~KOnEa-bK9wU82S6I*sU3ky>hOV;c#v7@$_{zChr-F?S1afR|>h`1gz&bu@mu4y& z5w;vv-P>*tREfV?Fk9KWBT%+O3)7M=Mf<{-LVPMI&!7txkos+TDrgo+%9CO7l9Yoz zr*>5hPt^a_A|u#kK>NUo6jWCFt~7h9TV>Y zz5e63@ou2AA>iSOc$kSE+{V|zBlMyExg|X(M4)QBjo+)$X}o)fn=9%zxZ1-c_HHcu zvN$UJ`K^H+bur=+vR30>#{3SZuKyk7KAQ3#ZFD`}zU{*&jPJ&N8{M{X()B&g)Bb1z u{3z_dhr>Tje^%rF{c%8dV}<;~B=0&wok{A{TKGf52o4AlRQ+Xh*1rMOxa+n6 literal 3365 zcmeH~>sQl98pp%BAXEYekOJYRWPzfhAS8ehS_QeNTtpX(0W~5PNP+~Ghy}z;Bx+3* zSBerqxty)18kz_Rc)$xm5?7#T!zB_CTm%(NtK1Y(+~+sH^qhUOyZ=C68ps4b=z{vbp7od2Nj9; z@E2mhQrcdlfy?$g9ujXD_@wYV9wfeKTS)l1n%1;zyv&ts+~G1jm+LjDwjJ&=hJV zdRd4K3HbTV?+qn_+=iJ+^6h7>eDm8u6Q5qZX>V_T{$)_!yXjV&Pcst}6SF5Sv3KRY zEGa4Jx;;2suvW@xD5&C2k6#|Frdv^ebxEsPTSs9G@2d*EUk3ohIablk8V4yreu&_F zwcL%>ys0}pAd{(3iZIXsU?YGe00#infk)m309j0w-~31_K=3;49U>^Z+sh+vA-l;a z3~kw!qH~W+CG5@J;Su{IHB{HMngj@=J$t1nvj^N@v7$Hiq4$gFR&v1!lE-$;i8K8` zqcR0T?C|oP@oMkoi65^Bt{&VBXpaw3kY2}*)NJge`hMHlNWm&aue4kBMftvgQc3Z} z?3AgC2bqevy`z;6lV`*x^plVHp=YciVZ%6El4IPXQi*4Jai#QDF`z~C)Rb#%nb<^I z6=zQx-@!r4ksFG0*2SxTgm7)w*7)|;P4x2EOP8AqWY=y{81%bi!AXup7&P=X6;SF~ zks7zY)xM*B^%REaYxRQ*bS=KHzo#`_?zjq))JkQg_Yb`gW$zBYGOrZsWR>bf%1Rw9 zl|)wMr*tIoVeHRbTT+%LnW^AP6AP8o+>(^#Z7mF!Na7c z^hk|@>qt6CgPI-XI+5a=;LCchGbsR8W>FY=O8jwyCTd?wji$cod`|U?5i{alD6twlHZDfNn@=I0wvht*X>{Vg@>FQ#IP?66^fHt&Qwe~Q*I{0 zGK|+2c4BjyJzLR&De^^#_dQz1!YYx-yecus)wr>c$W2cL@^To%z1RMT+k`aS<}Jf* z*%NA{Fq^@mGMzh&pmfW^B^zV1Yrw6v-%ez&DkM5UB>_{H+(7&Kkd511R_RX2C z$c?mXB9MCd=TtP8aw~fyk{+h;(RwLQGE;C6$VW+04m~@IzIe(>>uVsiJY`{@IsM>Xm_EdIf`~17tPq)*DEzECPQ~YCD zg0Qt8o*rp|y?)%T*KS&fx*eNmRYVea&BnJ<<($j3tUW7S*xL4`yWQ(C(vrpT) zhr*?h?ft$$Q{iIzFy)rYs5`)uwbBE|8=~^}_+UX+mCwf^$9aocT;#OHhu3$osa2Pd zyu9HZuAnXXO=^(6(nPcgjy*m(1Bg4HikO8e!PC4&9T=0ykU8 zy-kG<^l`sPjnd0MlO@(}V=VAjz_v!f;n=A@&Ne+pR`srlw9`BKu=S4Z-FguxHDB+v zLa#<2T+LX}*b|G3$ULp_x%9qF{S=C)UXI>%U5{id9Q9tRiQm1p@rXm4D7eaO4-bzr z8mE^NZBN8gVMi6~XUujN>YZZsYND`w&EbzM3u+1WQ)&HN?>Nr3!lO0y#{G_1HhQG| zUXPmDt<=Jnq9kTKolksGpRY-Xjb(X$Gba%+GM;I66iPmJ!am3*P2gI9y3$JEoYrunE>WpFBNxZVyvsDR=gQoz?j(xC^j-5iVuRS}mY!r*S-%4(U z9lV(}4BAQTC=LR!!vKXryNH2L7IFd>ecpw&6qA9;;hLkcVlFg=yH#mAC@1kl7zQp|(_GH9r7eN_L^9%y3FP_=(5 zUFng<#Cl~_az@8b45mVUwy;H7*aI1S7oVSTEolTYI2z~Vz>Lp^!7G1VsQNYzI=v^W ztws8e9_T=D<{a{#n20{IcV-3uZ~r#I$&(Q zkGXJV9rU%0oooExcj%kD)NYkW`93W)cM&^dsuUJ1KXTD1tRWtPh%O{&Oo_1citLP3 zPPI@o_UKrP^vrTd)ZWrBwia)r?5!33;WzexpErl>dJ}t@G@_Tu()7DEpmW;$E_$~J z3QpR4d;=wWcdD@{a};mnd8(}dp+q^w0F}KwfggB_o(X73yf diff --git a/public/static/img/_flap.cfg/128x138H138W-(G)(L).png b/public/static/img/_flap.cfg/128x138H138W-(G)(L).png index 21b6a0fc17d0830bb935554b2c61401ae0e9ae49..f18495be511fd3aa23a48cffaec0631221e08f1a 100644 GIT binary patch literal 4323 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 Ai~s-t diff --git a/public/static/img/_flap.cfg/128x138H207W-(G)(L).png b/public/static/img/_flap.cfg/128x138H207W-(G)(L).png index 3c224bb84479f008b74741c1e76dcfaa807ac0c6..076daaa90043ef2ca70efb171efe048cd6ee1bc2 100644 GIT binary patch literal 3284 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 literal 3392 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 diff --git a/public/static/img/_flap.cfg/130x140H140W-(G)(L).png b/public/static/img/_flap.cfg/130x140H140W-(G)(L).png index fc9c5ed51b73bc934ade3346552a91372860b29b..fd86f6a53ec2f3c0f397b9d4f64c73dedae68e17 100644 GIT binary patch literal 4335 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 literal 3392 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 diff --git a/public/static/img/_flap.cfg/130x150H150W-(G)(L).png b/public/static/img/_flap.cfg/130x150H150W-(G)(L).png index 7c42706bfac4f84a1d695f0df078e34903846efb..e1e5485ce6a5264be209c537060ca0e310cfcebd 100644 GIT binary patch literal 4171 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 literal 4270 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 dycA%2hiiB{J0j+JgQ!!{!QzH#00gED*s7Zm? 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 diff --git a/public/static/img/_flap.cfg/131x152H152W-(G)(L_).png b/public/static/img/_flap.cfg/131x152H152W-(G)(L_).png index b41e58dca0c8c5b804bc556e995f97d3f90e2a62..892adf0aeae9e89baba0b5f0e417c84fe0b82d6f 100644 GIT binary patch literal 4214 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 Le6ql>G)wV6qi1B8 literal 4319 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 X-5#@E>6d_i9S+IM(1b6SW)%Jt8>>(m literal 3306 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 diff --git a/public/static/img/_flap.cfg/131x152H222W-(G)(L_).png b/public/static/img/_flap.cfg/131x152H222W-(G)(L_).png index 5d2d81665c0b9f9b00a26621145c5fac6906937c..eed3a33448337fbd103a7a1b1d480e54ee35fd6d 100644 GIT binary patch literal 3261 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 XkJ7JrvZWvV`xyAI!F(>R3QztUd1~Cr diff --git a/public/static/img/_flap.cfg/132x153H153W-(G)(L_).png b/public/static/img/_flap.cfg/132x153H153W-(G)(L_).png index 8b3098e39cebad6ddfcc88117f82945db7df5c92..ee7f26e3c2d034c8727823debf42f4198c9c123a 100644 GIT binary patch literal 4193 zcmai2dt4LOww{RzO$cZLg^7q7!pj;=q9{HJ2r3T+5qlIu4MPy2wup_k)PPXO5R@1c zP@YN^J+{@8kfbWd6h}LR0Ja1KTL?W?B|%V$wM2^V+PlYl@4xr{F~7;T_u6ZHYwtB{ ztsPZzQk=W1k1GU0?rY=Md;meP9z1{2UBJj8-kBv3#G1EuP4p&t)XNq^H~*h!yvt$Dy*3^4c{O$Y ziu<$YH=b?S{r70yzCZpF?|$+0_gi!Q-!x_v>7i4`;#W_*25Te2!>H1ajYrB)uXg?? zvi~Wgq9_DvWLP_&P`I0oNgdrUDN=p&tdH9BA0T1Sa2dPb=gCkX82rK*_T?BY>R&Q< zRoxVgu*mX4gwO}2xnf)^gmOxAvkKtK`I6Nm*~PHz1WR}LGZboknuS{mKYrEMbzl&Q zy4#X}N?xKoRRFWzEVPX}FIfD@7H8;NG9QwQe0MVbchPy$ioG@Pt(EPM zYeOVIlWNSn6F6@fy5A1ETh#dGyVFy&zCXrB`d?d^O;uZNb}9YrK+Lj-@1Z+9O6wz< zlZ~~VU~B3}QbHuNx|vOeEp4&|6@aqrt1bQHR$z*qrR`ok6gc|ViHf+%1MV1ar~4VN zoPs<+>9d`OO7+bJG5%8(9RF>|ajYErAI>*_=V17-@U$+A!)+fNt{cCcMTrJ^X4ERAX3Yk?>8cZ`nMwA zxQ5Y|@2+7QUkHj&?!jESOo2J{wzs(2u`UYd+C$ojzrM7WRF^Ri+y5#LHm4~)} z_wf(p0o>zCUUShXS5t?-^JVW#g;A-lFf-}vjn8K~3#G-;A*PN{J53oNDT>7-4cDX* zHaj11$~3;HPfbHtW)`;mFNI~We;7)x-3C6vyz+2=W5DyL{xwxAc_ z6*hZ_^QB^nmc>B)%Mj6F*}_BetHeviq*7f4g2GsRIY&n8cEk)KkM1|ml*Hgzf;{nh zjXC!n2NU&|NY>-nX{CCmIXBqBJn1ROVGE^n+twiG3ZUbeQvIu$xh%#gj>e~7xb|S@ zt2c-s#d*M8y0m}ml5Pjpp+2Hi)6GnIgN$7&|7u%tf2oYElEWDuf-`JAtQF4p6!1KR z!|&O6^PN8CmuGxzyhZnMY|n2+i7vI)s6ph{?_bo1n3>O4Rxo~CgS%Y3c0JyBJr-|T zZsYkoTd}DaZ&OT)owlBVG^ngGS|QIM(V3Y?pVU|OnsZ@?`l3?(7+|)5rO(z1kFW&KkIADwOtgJ$eW_N6 z21+JQ%A;if2czn=jPQ}MEP3y&FfO-WaU%_d#Tnrqg6GHO(OeTv&(?FbLM0OoMp>Aw zEz<5)HZ^ce*7l{H#$+JA{%D&xqnM8P2BQWrz1;3qIkma&at^@(De+jDcX?I;ExUMt zClS@k+d7oYPES3d)xTCUb$+OfZBsbPQe}gwNhX@rL&!-q4j0;Mu&J7ZvNqq|f;MR7 zn_Yeq(ZSIg<&@XHJO*O%M`hqMG#rozZY}QMNeoBiZLo=!t4duoXe~6+94h1ySHdch z2W~5F_LHy<%G;Pq=2o`;tX9ALw<5QN1??{3ejl>xMr-P)@@Lx=LuO_qOHj4}KYH<6 zr-$HrG(P;kO%ZO^Kn_Q^O(8L>pDLM8*m|B;pQU8(-rcLN1!}%eLrcXO`dyO??**fm z>SQHTUMgSWomb32CgwYNR2$_fOFx#P7cQMUEe<4u?lNy#^=QXYQhuhr<8u?OF%V5m z&oI%-xoD!lgqUZKIdOLfb(|&qM#qDv#e%n|XgI{V^~W1$sBX(v>s@u?N+-J+x)<_T0@Me3=Jcq{PoCz-{F94nv>5sa{ zpy?G(P`d&?|t;U4-# z(?j$i0rxrgR^^`o=-FUtUxnN&wIDwN%*5dH+B0(=tj1j(7h2~mx41==A%P6eFF|Nb zz9fAv_!Wp&2T7BUfuqa68Y~4z*RQ~$7uYwK4@@;;(X;I_e2UAGvQ)nmYp!q3f!Ahr zEqMKA*3dN$4qVa*LWSxELWQE$O;X)7J`BMn zEoMGj!}o?u^3BX7mPouBKWb>T@2;OY<|*V5nK|_dxQC(j2}@MJ8kdUT5{D{PmXex8 zaRFbKu?%a=H}gdr{z|wcw+xXa64G#|>rdnViXo&SPQ_Z_%`P*atI-G!He|Xv6*Q__ zFIz9w>LRIbM?8h%cw(62bTyBUuO*}_oeGHR_LR&G0;(IC8-Vs)Gau5Z<0vi}ok9c+rrJ`Z7hED?p* z8d{en5D$`Y?tAb*L!HMh<68p`HauL1bC-ixJRWqR)p!)^SAk?mi3Q0}HP8`4iG9aT zqcJ!GDl0Vw;nO)aWG0n@Op07=6|X1G#p6xz!G`m(Aob?6Rqd8dJhZPI+qhqzZXV|? zg8kojD!!qXTg(nh3X(?Wq^Xd_!P0F3Xh~Z7wgBlif0X!}!D%S7Mx`LXF1I9l+iCcS zD0F6-m79VL&^c8qWTF~l*T~(a`5PNBb`@DkM4*x!(+XNyA|6{foK1;+*PgE!h>4@b zQth-yW1>)v${L-5++J?6th3V^c~UJGeMg)=aS~g2LJqH{b3#?tq!c7PSZd*+L^7q* z&E8Tn0J5=27laal)N;Pcs@4jIZe-@@fWX(jIb*K&DT;>K>nV!$5K4XEtam|$9RL-U zLsrX4_USDwPAep!J=xl;x=+yXdRjZNJQL!%-ngK^y? zuEVDK7NJpjl$4As0QZ%&TUuJwNZ-MBOMc6tx&hD$i6fdpXA~%H0gciCjV>k|B?H^w z^C7TLnZpo&xxh}FsKQ25BGD9Nq8uCD3|hWZyXu#Jd((NL6-!-aY25Ho4nOjf7E~Vw z8hrhvZ`-wv6z>es&!rP-6mPPhE9Xjg)u@3$d4Tk7!?&H{z2Q75u-P}~$k&^2NOw>4 znQyi|J0HGCA1cfSjpQ+`c{2}~H7Ky=fACO9Lm%>a2=)QiFoudAf>v}t)>E?r2(VOG z&#@IK)W6IU9`_%hG-}iI&v)lZn*7%u1ERnhc|D0rAPSqCR&;<{} zHzayQ)n?+*e3l`WMC*KWc6tc0PkeI(bA%e^xkTbnC$nh<%=ZT9!79SFgW2Q>^I0T{ zCysV8oA_{o4~dcpk4`28CwKucEWFcM6@Wtc{XE|`k~Rpy=n)!m|1rgz4_Fhqk9($h z&j$jJ?<|vMlAb@>^Qn(PR9FFqM7>vk%p4m9 z*9&~F6I(#;y6mgHHY^Q=N^h%OcBJ820k-@xZCXwNyjUjmHUt8nps_26YdyH_#MfZ! zNiBxKt02jN%g*V&Puea2Ao-bhZ}1U;k?;4Ku=V6wv8)kk1h@#^r0rNoD)oK5mI9Pk z3Z!*iAUv+$pA#+x_qm5)vq|r{m-qIyTfjiZA#X!B>CZ2_XS@qEVxPlT0)WR+>CYhe zBDnA&1{=w#&?s~RoT6GWchZZ#8^vuTCG7Kq4F@}bf#Jya-s-1>k*lFl(j#E}Tav8k z{r{f&Vm>*=f6ME!Xwn8wAJVR{>?nXmw|~WElTl9mMDER5=FksMza;dZe){R(zrG13 zmh|15=y~Qk@yQn5hv?onGRSyl!JJu?$|G|4|9pB^-nnz<&6SsG2)jJ{%{$whe=fP~ T+c6jXbpWl6Nm`>@B~|7g10(_h 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 T+c6jXbpWl6Nm`>@B~|7g10(_h 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 literal 3344 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 literal 3344 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 literal 0 HcmV?d00001 diff --git a/public/static/img/_flap.cfg/133x140H210WN(G)(L_).png b/public/static/img/_flap.cfg/133x140H210WN(G)(L_).png index 13ad46a0b7f16f55c738e37ab52d64f67d703c84..7df32998f21de04ba24b765f04b09025e286b6cd 100644 GIT binary patch literal 3314 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 Gu>Jv-P3buR literal 3455 zcmeH~{XdlH9>-aeQ7ePll$b%|p*1X%6~;YEt0sAqL-n&gNbM#RQ z{HB+ekA3o4oI`wn&3*T5!U(UOepvN>aOBw1g6~n7QagB~F=7yJgg5<8Q?RNK-D?Wj zmMHW|U@5~J{yg)Ft9QFcg8!JOJ*Jr({QQ7>{rVvFb2KL>KmXI{v%&1w^i37p2M70l zrYuZYo8Uzk{XSY7P1M)>Ns;z+snxhH{_^S;^MdF+X8x!5GcR8JA-wF4b1iTX^v<5y zFg2@)$`-A4jo+0psedkI1-}W+N}ARe=7QkSb&POMr>JQ6@!5MlHpwl}m8-GsH(r;Z zgMUs^H?3YW*l&P;>dOcp*A$%l__hXH=ef8wWm=y~d0&I2X7?C`lAaONSFa%*uM47U z&G^oAShSHaq2eTeIy2mFz_I)on|0a?y29`9>yCYC4iPahDM;N!{sxj5B%at)*|=l~ z84;IpkL2}qytW-Q21D=NdXEO)n!WvD9#B{8dn*f%f;SovdpQSpXqq8e7`t`f+=EJs z+Yh(>ltWSzS}M_tk)%HXSrMoAJXL^QZJej$D$c7CbnbySL&8-$6xJ=Z`JZ&Yj1zmF z1_Iu=eEvO7zZE`x-!Pq=JlVu@F znU1)3^qu#s3r|+YR#u`LXYy;|hhHHEeSzSEA=fCR1cNhp!fg7|F%gVszWA?HJsP z>tRu9?<^w>J=o8hFO!qTHF5s=na}*f+yu@<%s1~Il`V$YK#G+%`)oP_0In(D;(}3Z zrSi-}43;}}Kp%_cbzS(ABC3}oyjqC%$o4&1{EElTr?b^(a&JEij4uBG^aP3q^j!U5o8M@HtDGaTL^_OW&v zRvggBnDdSv;_Afu%=otsSwgG))x#aBAe3p&_ss5L8RRZs9PQepD@p3R)o^4EE34Rgl8+#H{U&(da5Io>nZgGgJgo8fl3dmT)5KuL;64@&=Wbr|Nbd4ZV2t`crgJrw~R>l%g-#dh)KR! zKO{L(Ja0&(o5WLt3dNnh<-@2sT*SDKKq@)u1zlTnM7w`7Pt zsO)$#8O1(ciX)l{49$1d)5-fbb2_aZk2Lppr`RV`xL_1SMy!5US2{6lVY6P7d{e=XTUw#J zKKgevugcF4A(veQ$d+cPouxw2+ssJh#f@Kdmi5YR46`f z?I9~xcy^BQ`1Z`^P>pwhHu9pv^X4KiCqx@rsmNFdr&(5MG+QP;T%-TSWN!#qGDdq7RxOS7)o28K7=cNpiSP~RF42Yan$VEKWcI_&E zO?8PeBHgsqk!ud25Fx;D4~edSnN=U{-CISRs8}uA(sQ@{GOmO zw?nn%HDtgh*sd+VNQOmXYmYQ9@NV|K4JcEuEyt(VDuwiZkZ<}1NzT}L!~joVN<&sc zDwEOlfrTeWz(+4*U_rhUm|Vd~7WZ9Jl;N}vOzaYj(v89lLk;p+8E4s+VJOTh;+yIW zCXn{tzFQlL!KZV6R@SWsLeDGADPLm#)^v*2mkea${P;E=E|3Dl-!gX|7`xxaH6~5! z(??yIJv#K=402*5EIQ8cNi<$we-xb(O<`K#)9?37tSo@q+xD0I`eO8N3HP#ub~?Ge z#La`<2KcURS{@qE7!w0pQ#8FMHwW?uG-oUh9DGjO!UZ-JseMY&iFkEvZVdvEihIG5 z4o$&qqEF(t;H=Ow9zCR8hm9jz#Z|vD1z$5N6J7u)cD=k#e|G z@4xn+|87k`gojTIehSh%rIF6hG12=$;(yh({zXIk|E2$I@Be42v0$@d8ObMg?XjES QkCk5F=FkAnrntg?0dZD8WdHyG diff --git a/public/static/img/_flap.cfg/133x156H156W-(G)(L_).png b/public/static/img/_flap.cfg/133x156H156W-(G)(L_).png index a24a59d6add8ab26380aedb0c9cb97c6eac44538..c6370de423360260af3d7b87617ad138c020d1fc 100644 GIT binary patch literal 4223 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 Wnv=Z*+5-MqfHLJdvUX{S?!N&HFv<}C literal 4322 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 diff --git a/public/static/img/_flap.cfg/133x156H156WN(G)(L_).png b/public/static/img/_flap.cfg/133x156H156WN(G)(L_).png new file mode 100644 index 0000000000000000000000000000000000000000..c6370de423360260af3d7b87617ad138c020d1fc GIT binary patch literal 4223 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 Wnv=Z*+5-MqfHLJdvUX{S?!N&HFv<}C literal 0 HcmV?d00001 diff --git a/public/static/img/_flap.cfg/133x156H235W-(G)(L_).png b/public/static/img/_flap.cfg/133x156H235W-(G)(L_).png index 82d8964653a0e8f6423bc5f47bed4bc5215b08dd..a1f6b2f4c3c6457f634575739a6a7ce85b0636fe 100644 GIT binary patch literal 3178 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 literal 3291 zcmeHK`&Uy}8b#woz+7IbXu{JVVG772xuk$dX&yu{Jmeuz5hO`tgrFcku;POjLLv}X zYM~^-G69VU43dIX9#Xmj0VRP;5s6r=h^AtzQbE8L>zwdoXU+Tpv*w4p?%HR6XMg*A z-&yCLD~^q3LY8<-Gcz+NVmm#~%xo1NJoDygF!Jc_qwQv9nA!;XM+y1W&nLe>;?Qr; z7AQk>DWC1pAdYNO5kC_*dYPXs|9+q-ME$MpXl&1e;-VF zBI=zyh{Q>TbK36#4}HKx@}%WT%E2Z(nZIR`wjqPz1(L5;7LGO9%lyxpM%H_U^U4Uy z!u3r+CM3Zkw>6~jCR4_kUg|AN+oiiL#nr{~_fouEDjs;Q$2SU7M7nd4#b}-@>0P1^ zsN@B)?vLBW=ngwsjTa8^2k1tQI}LR~r2F}{P}`tHN!w%YAz?=dc^@hZA-d835^Z{k z&LGU)_(55iN#`kE0i*Q~2cIu^lkT?@SBGx$`=cTq<|GHCGP#lw0-We= zSl2!Q++=u3gKA1VQ-s4k-O=|MWMQJ_Z2@}W+Q%j67gP0zZ!Q2YOQL~0NGLo@CdBu@ z2XOulZl;U?&&mhxxWOz2H&af8B{3q_p3x%VH8CqYzF6Cka(>{>2Z{XTa|82!d-zTA zBO;cIbHha^YvuxZvKFUlkjYBiPRL2H?$*vLSNDVF>loZm6%<%UTb*A&ub`%MJr}GXBg5F)(!8KlI@#`bF zcUuww9o+rnfnh?c)i^yTxG-fnu2lGoSSPPsS3W&@gwESDSS-vE=_V>cUGjXS8Mlxe zXK6-RF);I3jPb36pcH~8YX?Ys%Le!0<6zh^hMPZZ>W;*Xw5)rjoZ3jxFpGG}0Vl+m zn%`pG6>l(t7w)it-8XB_y!_I!=7k3-B$A&m8fYm-y4Yg{EUqDvf1`Aur3C597+d~o zpyexMc9V3?{%<6JwZm@|xu1VqMU+tfBh*+BdzrM&l=aBFuhj>))B~L!04aRoP(LKCB!JCfUfh>RU4D!bWpFfiCp2 z(4#t<@zSYGDmh51T&+AFdpXgKl&}dtZ-?`=m0O50W9E8v#km*)jX@>bN|m0Sb9HrUA{mS4}$D~`|-sjVMf3Ye=j#7Ys?c0qkOpXg3WAi&lQ1%gj^ z2sW}j6&atL0 zldOaQ7i<>y%R&Y)xH}acjS-Uj&`A z!BemfV3TO%_h^C}B}j`Ri?{^#lA0%(l3Rp+Q@{_bG|YZ|iN?`$MbN=5PWVH;!tqL| zJm9=bXd*aABA*n}=yj3A$H%{IEjU%FA|WTCJmYMWS} zsD56u$|VO5QmRD+@QUmH323v13c>}=zWl5LKQT-!QKo(^9ThP6}VG= z&T_yTXo8_J5{P2jDCXKQkRwAdG~#2zSVh-SW#Jn2txQl2;pSr#kJ~Jvi|wPtI+KT? z&6NI3EIv?SaAfiyqS$$5_R3trqeymZdMVN~*2}9gHKv{__}0q>Ur!f&`@R!UIooT@ zy+lJLiuD|Dpv#rP>h^SSps!`;)qDZMpV9@PNhBC4Hx#h=4_%vOOYMh%YAt!3)pa$M zzZcD(tBV71Rbs<(V*>b+u;;FudQ(+lc+V2j30@n%G%pX(SniTUiIE=9UFG^GfKAq) zRkw%0Ewy88H#kRH!Oq(c+Mhh>saEqJvb}nZ-+;=`UcJZRjD*>e)5*CJV14;NHI1{9 z;aEhV4%!CF@#8*~0YHPdIw%0ZkOM*hk+4OBIRuXcQ7#v2)fNlC;2lcQ@|lf_cq&KV zqweU_))uOQ`-sl?EcBs{UVx0jy+k}fLp!%o>>*a|ApsjWd{~h9vQ5q3OIrW3%@$vk zaLGUieP0uhATDR1&Ntd9G+7u{3#(MdWk_~#dpB$@3 z>zrntAsY`ktQs-PrJ{N*{sI;UH%{Ll`*4ll_4MwOqd3>W5sQDj75?Y@;{TcdcANem ct%tTcSA{@Y7-z!HA|eQ}=%MFMUj@2LJ#7 diff --git a/public/static/img/_flap.cfg/133x156H235WN(G)(L_).png b/public/static/img/_flap.cfg/133x156H235WN(G)(L_).png index 82d8964653a0e8f6423bc5f47bed4bc5215b08dd..a1f6b2f4c3c6457f634575739a6a7ce85b0636fe 100644 GIT binary patch literal 3178 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 literal 3291 zcmeHK`&Uy}8b#woz+7IbXu{JVVG772xuk$dX&yu{Jmeuz5hO`tgrFcku;POjLLv}X zYM~^-G69VU43dIX9#Xmj0VRP;5s6r=h^AtzQbE8L>zwdoXU+Tpv*w4p?%HR6XMg*A z-&yCLD~^q3LY8<-Gcz+NVmm#~%xo1NJoDygF!Jc_qwQv9nA!;XM+y1W&nLe>;?Qr; z7AQk>DWC1pAdYNO5kC_*dYPXs|9+q-ME$MpXl&1e;-VF zBI=zyh{Q>TbK36#4}HKx@}%WT%E2Z(nZIR`wjqPz1(L5;7LGO9%lyxpM%H_U^U4Uy z!u3r+CM3Zkw>6~jCR4_kUg|AN+oiiL#nr{~_fouEDjs;Q$2SU7M7nd4#b}-@>0P1^ zsN@B)?vLBW=ngwsjTa8^2k1tQI}LR~r2F}{P}`tHN!w%YAz?=dc^@hZA-d835^Z{k z&LGU)_(55iN#`kE0i*Q~2cIu^lkT?@SBGx$`=cTq<|GHCGP#lw0-We= zSl2!Q++=u3gKA1VQ-s4k-O=|MWMQJ_Z2@}W+Q%j67gP0zZ!Q2YOQL~0NGLo@CdBu@ z2XOulZl;U?&&mhxxWOz2H&af8B{3q_p3x%VH8CqYzF6Cka(>{>2Z{XTa|82!d-zTA zBO;cIbHha^YvuxZvKFUlkjYBiPRL2H?$*vLSNDVF>loZm6%<%UTb*A&ub`%MJr}GXBg5F)(!8KlI@#`bF zcUuww9o+rnfnh?c)i^yTxG-fnu2lGoSSPPsS3W&@gwESDSS-vE=_V>cUGjXS8Mlxe zXK6-RF);I3jPb36pcH~8YX?Ys%Le!0<6zh^hMPZZ>W;*Xw5)rjoZ3jxFpGG}0Vl+m zn%`pG6>l(t7w)it-8XB_y!_I!=7k3-B$A&m8fYm-y4Yg{EUqDvf1`Aur3C597+d~o zpyexMc9V3?{%<6JwZm@|xu1VqMU+tfBh*+BdzrM&l=aBFuhj>))B~L!04aRoP(LKCB!JCfUfh>RU4D!bWpFfiCp2 z(4#t<@zSYGDmh51T&+AFdpXgKl&}dtZ-?`=m0O50W9E8v#km*)jX@>bN|m0Sb9HrUA{mS4}$D~`|-sjVMf3Ye=j#7Ys?c0qkOpXg3WAi&lQ1%gj^ z2sW}j6&atL0 zldOaQ7i<>y%R&Y)xH}acjS-Uj&`A z!BemfV3TO%_h^C}B}j`Ri?{^#lA0%(l3Rp+Q@{_bG|YZ|iN?`$MbN=5PWVH;!tqL| zJm9=bXd*aABA*n}=yj3A$H%{IEjU%FA|WTCJmYMWS} zsD56u$|VO5QmRD+@QUmH323v13c>}=zWl5LKQT-!QKo(^9ThP6}VG= z&T_yTXo8_J5{P2jDCXKQkRwAdG~#2zSVh-SW#Jn2txQl2;pSr#kJ~Jvi|wPtI+KT? z&6NI3EIv?SaAfiyqS$$5_R3trqeymZdMVN~*2}9gHKv{__}0q>Ur!f&`@R!UIooT@ zy+lJLiuD|Dpv#rP>h^SSps!`;)qDZMpV9@PNhBC4Hx#h=4_%vOOYMh%YAt!3)pa$M zzZcD(tBV71Rbs<(V*>b+u;;FudQ(+lc+V2j30@n%G%pX(SniTUiIE=9UFG^GfKAq) zRkw%0Ewy88H#kRH!Oq(c+Mhh>saEqJvb}nZ-+;=`UcJZRjD*>e)5*CJV14;NHI1{9 z;aEhV4%!CF@#8*~0YHPdIw%0ZkOM*hk+4OBIRuXcQ7#v2)fNlC;2lcQ@|lf_cq&KV zqweU_))uOQ`-sl?EcBs{UVx0jy+k}fLp!%o>>*a|ApsjWd{~h9vQ5q3OIrW3%@$vk zaLGUieP0uhATDR1&Ntd9G+7u{3#(MdWk_~#dpB$@3 z>zrntAsY`ktQs-PrJ{N*{sI;UH%{Ll`*4ll_4MwOqd3>W5sQDj75?Y@;{TcdcANem ct%tTcSA{@Y7-z!HA|eQ}=%MFMUj@2LJ#7 diff --git a/public/static/img/_flap.cfg/137x154H154WN(G)(L_).png b/public/static/img/_flap.cfg/137x154H154WN(G)(L_).png new file mode 100644 index 0000000000000000000000000000000000000000..0f10f0f421eea7379f21c45c4eef250254ed1ae0 GIT binary patch literal 4246 zcmai2ZCDf6ww{pS1fxlS64aUziF}-cAQdbh8El}Dh*gnR`H&hTSc2AyT1kdLHJyki zMF~^_Vi7R5*HfiJqz4pGGc<|~6^XSPu7!>wH7yZG& z*4}#zt5(XUPn|Utf}rUsOQr8Z5Tgq`6YMEqB)Rj@5CrkprAQN3V|DijdkbePt4q^X zH}43%pC5HM`RvikpF?Bv_qvxxok))^6|iwhp6$gM<2iWk;R>7fdXMkrlTUhjdwX}w zp~f@2krz*%PyV9bEqv`^&z#*)p0oD+S@7cv_g{gK!joV&{(n#DaouEd+GM1!{>`9S7sq&CQ}wd;5oSWE8qLW{y{>BK-pKggOu!WIs&ETs;LANviEGo z==i`(uj1c(86U2K8?LbeF5coMEv6A?Ja5yTEaCCApBp1{P{M6`r3W;*3+dw+L@Pcr_WQtzkJ7REOEC@ z0W|cZ>GNOFxJA7>0s;P_HJY3+jLy!gBzi$ z4LEFF+n#6P_<=~pf$Z;`rBe~;(cs}r5%1HS;;pwSig=W zg;E|FZ+VB0LZ`etr8M0>@6L?`lPt=qi3St4=GF;Iu4H*gb|hseZVN%G^}d}+z@D3v z5lP#Pwo~~O^yCYtAFtj72dFZhR0T^sns?v!@0`MUpcr8s$vEO%G!>D=ARFG~0+*e0 zRabOy|EJCaH48z4RkhA5l?yRwjbRYoqyrz^gxw-a#wh4b-;PDsBD!=Ycw>la^h+)x z$;)X^e@bQ*Ns@EgR}ZJv2M-rfA4#c%o>s7Uz57YV;c3eW{ailojZoxMIFL8a&&D2qnkziPtdY{%8 zHAZPC_LR#qu{kZ{0X)la8V-LMq(a}Ob`f@+(^jtZLMqCg+xL>6blY{9t-KX1$)&_C z?iqXcGu#9}E4sxHu@U}Z*`fV`7_Vhq!L#JfBZ@0r#M+#md>q~*QvDEsr2@lZORhla zC1Lk*4_)al{@er)$BF3<)HcpOxQ6wB6~?>77pME63XUar5h4EGu6txF7qWPn%iPW- zR7A@-xxJ^s&ypLW#;iM&WGunZl60hGrCXmwX*b!*m$C|=Fy5|Ul~jaTx8=yBc#Pfz z|6&lP{ZSPhxu;#oKT;Y~VUlGGsU%Zy`29QH!CCAfMLKdsFRW!F+dgwv9w1jJM$(Qr zD=WzrftuAps*NM_8JND6dAgMfK0W@g?g54$8=?MTjQl!@3T_?0yxjdSDW&BZgg>!| zJkpT?z0l7Kp_rCq|0J?)c2URhXu)+sY$Yyji~Dc<-)@O{keK z?(jzQm%3d`sW)53ohfdY{dn|IuL5zSm{Z^zW;Au(hgdxOBew5(->w5qXr8b5$rof| zS`Pe{PuCTo^TkhU$;3Bu;5oisP!pO=wK1R6iP2Dri~LX^=cgk|gAj~*cqh~csi;^& z_oaBKwT z_LC`Yg^T>=MY6(&Z63@EdGo z`8*YW9~tz)$i)y9zl;nD)@(NjZ6Yl4kTY>PUQ=iC-`C32gT^#1U?;z!G(&4@uW=@F zaoArkygL_Ll36rr5Z(>Mw&Bji#dwC^)V|l5xDv4CX`c7)0irQ!JvNCT(xW2*3P@erxNLf^FmB_{NTk>++}bpjv4wW8WEm^K;0lV}4vdG01>1>-3nZSze4l`FCxyL8j#H7Bx+^u9EDJbDT55P+CW^l>or z_-K+(f+Cs_UGFGl$3YSAFuxhfh+QqmErn>M{XFC|EA}i}%3^4agr<*(5>%yV+-l%%kaR z?n+#NXH*rc54aK&aQH%iW>p#Kw{h@*NV94mSW;5nW`0*rQ)gUVxMUX&^8n~sFZtXX zgR{(VoEK6Tps6sDej5hA3DH!Pk%XriE@I0WHwNXv%toe>TNrnIyY4o1#)9}QIIJ@u zwt1K#OT8TkA}qzQuEY#m=t9xZg|cyQBv8ZGk%UK|K=Br+td8E^0S|W&)^f;2Ab5?w zFk_#K(BSYFdZZ}`OUYC(G9XPNtfkgP%))E5g&7U4o`+JY0Jf47Swng%2md3|MD8OK zC1!ZoORl)FuD}fEdLgV}O=LOg`N81BWfO{NgpO4gZY{+9D++sLKw3n%69lvqB2$ef zP0;Nn#ekqP%EK~-RlA5`)&jO=c)ml|!$w{MGdv%RF*4QrfwVXTTeaUs^sow|M$2bP zK^wp~l+{g+0sq1QM!ox{|Xq1baPG?VhLE8HDv$xEz&a zc;29QsmpPIOw2XQLh$yALYdSo^T*-XY;e%cwsnZ&m7LWfn3X3ro?sO)M$5NIji0f2 zPbyq#p!??yR@S=G3?!q$C*cIY%g`h~v8_$wiNmOEz+=E`Xx5>B5We-1hdTIRX){|ob6vI)&*A<&=toZGb) z=qn~Pn_dTctX@7RTnAcWcAr3#KNHnX)`efc8G+ppQZpSVPp+e&^MRU0|DFmmqsu0K z-{gmCm3n#jN4Rp30R-VkIJ~X8wRF~6*3}N?sU2+<>&r;S{yP-ytKx|3n}gt>=@*-wDf)sZ;u=bk+6Bk6(^Ktww#U4T(G zu41->GaH32?P%ji(kW-Fl^hFzcz^PegX0Unm*PP2kFHWL1RDMM_2dOoI`ltdSIqu_ z806kw@Y=ciMC%yzxFaSm+lipi-Xg37NVO;Zm2!h9u1gCc1?ciXr-Wh?{go}5S!12l+~BQ zk}_8~z3NuoO!$5Pr}fs--)Q^OGjRFPb}79r6P0zrX-D7M4Z>Y@vMiEUxl9oNw!R6ip7DO90()e2zkm5J%J*_|uzfd$o#%h>Hov-!>XMWFwZA#Hsgc5uFc9R|91jiPzg5+bo| zg^Ak)#8vVPqhi5A5_LwKPDWPAt+n;xm}{lNk62d1@P^ZtB4O_QfvjdT^T7MPpipk5{Fr^#3j?n?^$GY+FyyJ+dg7rt@{DFB5MKjzQ zB9XVk%W5Zr6XH|#I(c9Gc?rRHM*H^V{lF66m7l%R1z8%cAGNgwCYajv)wZa_R-3*a zMm1f5Cls9>PLQ!(-e=@G^nVq>+nk{vU1E>)7J2bWnP5k6nWD#b3DSE)(PQTb1bhnE z9~?&|p)z*#6%dZ+y-Z=~$FdF+ZdtHDxk3~rpU+$c-zPgEEmFlu0k~+oeC@lD`>`iJ z+*7q1fulq_O_YzA@L2oq)^bo%3w-~XwcO!Q{b7Hi{HC`4C<~pPm1oP6w zIx<)1jGuI3^{>|!->`rV+xgD93tSqynpf~AqOrh3icCD(_E|}D)iU2B|FV`3S~!Mk zuwJPG7AptuYG!k}x|L$x1#R(h{G>Ij|CP4*AzmI`;OI+kT*pp5kaem(szTIIb_`xd z6fIa4tyi2>W(L4Kmbf|Qafv5iABDA?R>14f{0+4L#<~jjhv`+pnDalbcNrB-`8p)g zV@K?cvm#f~d6{FJC3Jx7>rH8tyVoOd4HX^sf>(T|6sg7{D84ZkoNO+`4o$lTn8)ur zaYBL_-b8gD2%WIxtl%=JXxcx!w8hqVwHaJPM2Xu|xeTwH_Z-L8o&$dzI8P$-6L)eM z0b&Oo<)i`cBLEo(EjbpjIa&nY-Wr>XphV8*YQ`S11Ec%@D|67BqAETAA6WQkY5q_%kqW4#2wq1~z|%>URMDk%PPRvlxbcuv`vliR6=dMqFp zJHLzM#)a;eHKla}UkxSLA{UkmX%SdrgF$EK=e%4H71|viiCv0MnI-!@A|n?(gvLnh(<_EiccC!^ zQ&c7RWq1f4u`M%tTBJ&5p=zdT4%HaOZ2i9NS}*8!7hb=RgVk&L>GD#}Liw+Bd74PV zuN>L^sQrt4?Cy8+ZtS96Tv;g>dh8K!3)WdEd?jc~PJmDX=cf z(W&V^As=H;oHKgHibw!M89l-x5=0B`78Y6o>_Asn-Bq@;=;~7~KrKDGd#r#6O`zSv zf<+))Rgt5A&s)$Ckm8hGWC<3I(?y$LR8k}B-|r^oSHgv=P7gQ1niHzd8t`)T<+}<^ zFGqz`CErRFJaW`z*7>u3P_`EvFUq(0n-(Zd!zCmr)>U}N+YuQrj-XEldPoR81^w{7 z1)bCyZ|1=ERwcT#y7_Vp=ug-amMG}FnDCDA;$#Sx!Wq1$A%eOEP$CiwCUT`d4M^D0&LR?xIR za}`jqT0hEChhYZ?TH?xSz@l+;wOZ{c4}^&KLRA)9`14%IzUKfD!C~cl<_35bXvt0V0w>0 zVTj31d?{wa-5%5R!zPV2M6&{J4W=%ku67=IGkfSB~LDKJ{kI|=rEX_eyS0PR-X zsF~YsikElPQyi%LpyMu(D#`mOee${Tlb1hJF1_r) z%@y|#)!J8izF@Wec4ulq$IXgOwNv@48}na};*Pdl4Ok!YpVQyp2E#YQBxBwU*F62h z9h(o#-_Of>>%Yv6e`EgpNcsQJ|5P_>7tfpj^oV%n`qDL6^|2NN52 A3;+NC literal 3435 zcmeHK`&W|L8rC4ZAZa>z@+-?5F_UHo1vR_{5+-$QEJKB|f`U&BOHJz7WF@0QBRVxf zWLhN08C0koL~T4>JUQfyh**kAfqpjNm@_c?BL)?0KaKx6d2KE^#z0Rup}xu^-%THgPxPAx4ldH z`q68S`-UMR_a_9}zFZJZp$Bxu^!_Q3xuw64v3r5#Pz-HW6lmc%zHb; z%s%>l?vKfMr^xF?bH6>Ezu?uIm)WyFO~xbFt}aG(dJz0dm5z8MM(hu-bt5C#&X7lf z`PgDG6}7Z^b>O>?94<#$&&BtCcCzFMdIpS<4dW_+M4r*-)3somyxb8la-4#xaCZVydlTdY6ynjH!Y z3A=lfkj7-7t%P`Awm>tbrMj*;=j8b1yp9 z^qk1ZMu0H#_Hd4+>S^9Q-?>Mkf+OXv5{MSB~+ zw`+*n^}RwL5e3M8$slsI8SqWV;M*EK+D=wF0LY>VBZx+u;=$-CyN1Keal_=YxCBI| z{+8DZ%O2on=kjQSovE!U+sJIUGid~mKgf!oTBfrgF|ZF1LNUig@A6HXdy$uxn~q+G zEtwoTZ70mfg5V1m$!qGtBDPsWXv@sAmqJ-S4RqN}Zc|Z=%op2}#VvO$-;M8jV|RoX z&i2K}ZghvtJ7l;qE!M6!ek&+%02%Q{y;NuMcCC`3D(gXhZ&zsldBxn7RKOjTY%Izx zL!E07a)gz2-pp(UWK%tq4#mpR(6hKr#@1CnU^6mt+^4KC_~uc`&}}&e@Z1m&9g$<8 zXClReedEfEtW+HLc3XmI{#AT5Z@k1(C8NdW7)`7=_)`gPjML%_2IjM8+Ex{##yd5Y z0wC@r-S}o`1^nfDv#hk{Hv7w}SJfG3MiwO5>aAWEB!LD%9*b&1*vdC95 zL~L=Zk{OaaCrK<6M(EESv_^npG|FaAy}}FZP4B!b9S%|**^je_bV08<-e0TtJ#LbNNq+|^fT4b zwz6n~9JkxnO_}|H&iYD``?<0y1V8#Q`EUoFRi?--RW>cfkA{%jch&V^xiJ)Tda2?$ zm@SbBS4DECA1;vAe_nn*q&YG@YgFQM%>~*b_6c;hMr)e!o#iP==>~~Upo`T>(_GY9 z-Up!AC(WZdIz8+0Rs1OZiFq-ttF5ZU;K4Sy6$^2_rdf%P&KcS+@d34)id;A-gR@sP zZU)fT8CvccF7$`p>6uwM#(UCeLMC?iWEW+^Pf#cEY4;=)1#%}hnn_9NS!}}-q|{QS zI7v2>tOa296Qni@A1F~4v~<(+IkbR-@O&4a`jBQvMrIb97Df)H8rS1sk){PCaz$z# z@G4jG61YURf}8rVz53$$gq7S>_C-ttr!Mw#7+wXD(W8>2J;lP~jf^TqN{zC_Biy5T zaqwq}i@09R=xzG*ROxTXRpsiGvr0_Fs80J>?XqORnW=spO-NCB+Nqz$oPcD`OvhT< zqT+}y*NI7NifSIv(GPSWG%cn~PvR*TCfP(*uz4liAH*+khOlj08!v7&$3*5f$}ev; zkDOIMTDg!gQO>HB*Hg_S#9BEH2=IBjP#^M~EUFYUD}GgG@N66U!>CS}iv5i(H|_yk z{WC+buZb*56kE>+h`2RCHoydMEyL8P=>-@)cwuucUJwfX&s7lh+$eTHx4UuK2EH;>pF<_0$dr6W-(vwP~5j*rDw_ikhlNpxFmrH~QJ(qj1= z?67EMqClc_JhD}4odyJdrG3xRkCPFGdSPP(5tM41irybW__&tR|26O>ny5?cp@`V0 zR1sJ(X_P_W>wkhCGtm|UpeAribBlstpH~*6nk`|q!Yr`yy9DhZ1W}~R?+*pdf||WY z-_Idp9>V)REB({k=_{3f=E%(QdCIc*>qiH}{X{t2e=e?na;N?O)PLXb e|L3YP`hMDiZrZk^8VCMFIV7!1re31#EdDpqtIWax diff --git a/public/static/img/_flap.cfg/146x140H140W-(G)(L_).png b/public/static/img/_flap.cfg/146x140H140W-(G)(L_).png index 80022ba02d3ed8f322c89a525598fb3a739056b5..b7731e5cf5b1cdd77443e1b564b8eedca1b20de6 100644 GIT binary patch literal 4752 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 GH~k;mKL-l{ literal 4844 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 diff --git a/public/static/img/_flap.cfg/146x140H216W-(G)(L_).png b/public/static/img/_flap.cfg/146x140H216W-(G)(L_).png index e64066e4bfa89386cbbfc67d737b0c937f4afb3d..bcfb3b494ad6087f20a304a565a49769d717ab9d 100644 GIT binary patch literal 3418 zcmeHK>sJ%^7UdzLQNTb@i2@P`i3k)CC7}t#IL0Uzh^4kjDbg0H&{~Bc3=kelAW z7Yao~0ugyAJ`mAfj1j@AJWL>16cDK|jozS^Kxo*?XV0 zX3ZI4RKzwr3?5@)VPUtO4ehe9u;hSideK6F6gIlK1KeXfv^hFc^5VCV(%4TO`GXHS zw+ECh?%q$fqp!7VtPAkAFY=i9@_y9uwkfjv? zvkV-0dd^UdBNht{@VyK~_DU_%KAkaW=Xq~sldx9FGijIKP-*8BVO> zGQ_IjT7Dl3G5s!jagI|vWX$aguFTi?uafDnLHF@CthS*2`h5TQJ8@(rl|c&*LjWt5 z5jz2 z0{DGv5K~>e=`yPz86esk+oHoR&vU|Pa$s#}!kA>NCI?9R7QCWOORlmCj#<*DljKZH zG)4P86)6~s^DaTw%2ctZ7^n07eK}*es?9)PJ_0!Pw+@ra##^t8nekOUe;ONGRz*Ne z0cNo}QFt9XTd7xBU+chqs4YI$v=NgY=gp&qjW{~*YC?9s%W?OYGyJL+K1=&au;*03 zjqq~7Cq*!xYXYQO{08|OF=-t^_PQ=do88SbnYoXN9T!;%_BEkAnU8#l2fsBv>`#Zq z6fG%6z9a>Adpt+xEAOO8^yRGkcz#+sj~4H3W~NcJ#~~a=`X@3Ni!fH_xD%tjSV6| zp1NxcEpo*2545NcRS26l?yyxEUS*CiC|{;t|ARS6#hC@%&nwAG`zMUAe%NCMd~#+& zi&L?2i`KTKDb?Ln2kS#hb>maVxX(`Y-!_IeUc&OLDO%){5RmT_nwgt>+OuQXF4knu zg}NLl0eX<+>PJW}4a6YXbSdTL=38wI%fq<|rK#SQ=gxivtzh;JO7w52NCIhmc*|My zoT*3h-zEsVigFCsWrxkwOSU2;JK2Tv=mdKG!WC>gYxqc{cK@nDzWCnZ>02iS(u|VbMt#ZTVc(Z%aBCBSFp zj}}yH5a`MaxinRV>Zv3tdAw)XchI?IaQz~(=S8TxOt0MF7|tc8Os{rRZ@^;{@v01# zm)tUCdSxgt>1zVsQNyEZU1|h@zR${C1iFPSgWplL)k0Fl(yg@WQep=-C5Tkp&xV4% z>Yq`x)zxXzkA=J(Y6@c%? z$n9X7!>_H-$#Xy?dYV4p>>1C!ib+mf|s<>8&3-y+hT+;cY000i%!Hs8* zuv_Qn!Pg3PH}~1;)*Xz#`Xnjw~{C@FT0oengj|g>}&zu{$Dlu@q<+e?$ zflfskRPhm2Kg9xrOynyk6^%~V#9-zQTSCXFvUSsysPqpoX{x??CzSCee=dUE%!V@7 z)EWT7f~XQyx&z{VwOcn)Sb>2mKBnrcYXk@GV&d+=>VAmpX?4PB*FG=#(w|}Vw-DEQ zx9*C>&<{Z_mEu5atX)ic+h2gVlHf=6i}Bt`sN}_^)@c;R->Qt18>gLmu{7odV?C21PUA zd~vEs&~;Q|P&D$Ob5YVK3S_rQ(1mCAo_&CAXKttH_q%c|6PKv6AG2^*yy|)FB~8w~ zZW05%y@dSyXIL9~O|YkK^=7u|n-v_&F;rQ+8YX_?EgCu2ri@t62R6E>5`zuFr}m&fGW!&3b9+s_6YD;P-%8Pwj*|o2kXbKt zqi>lZ2O%5W?_&!0AbBTEVmP`Lkf?Ddi@84vtk8~4q55J0kVmg=qJt-L)SdPicBBX( zZ$4jDV`yYWGwRN#l%sRgM9lreer}o}AkB1t*o9mtVpfmunO1}m<-5t#>3+*K-5_aa z`v9z$*hU=kOC5E`bJpR0+L+DuRH36(hn-U)ci|f_nEDty zsrbI5O+yC#l|mZ?ybQchXno~Yn36G_I0Pw3J#Q;DoP^mLck5$kBdFH*d|)v!+^E-X#O(#U*I%~Fzgay0 nIr{4w{?9c2|1>^$HoGJtswk{k&BnJl(%jeyQG_a6BlwNuK> literal 3495 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 literal 4831 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 literal 0 HcmV?d00001 diff --git a/public/static/img/_flap.cfg/147x142H210W-(G)(L_).png b/public/static/img/_flap.cfg/147x142H210W-(G)(L_).png index bf2ad90c522dca46701461c3dc8fcf1ab93863bd..a2df8227a9292946e83125e0c0ac80301753f855 100644 GIT binary patch literal 3555 zcmeHK{Xf%dAD_unqtU~LgF>OizTx{bv540&ktkkZ|$j4V+v zAJJ0M$H*w@%jS? zE$j_PsODT7qY+ zo%uNXs;z#1Sl8D-I`#ycewNF=(lXW|M)h&N#R??d;J*(%nfS}=cPohEv8q!(wPKTu zv=y7l_^vNshrbrhaMM10m^JHq75~R)QN#Pzu4}2-(j082;OF5lDVaVVd1dX&#i(B^ zRfx*_E2|2yA_#ZsqpW6WuF9NEE|yMyp&ID^_70*knrJ z__|EZZVb9oMRcK`v)JToRz z&(kR&%Ipa(i(IFD2lJ0lY+Z`ycsGPnDoCBYd0c?^i>p{7|3bECU$7AYH#BnLo@`${ zM}j(xcY2$62Js;2j?2@?vNH{|toh-o2o7&&-6gK^j?d>cswYq;VH!T)N+I8=N|!<$ z4}?%X9M`i;$Z!bNnnuueVZA?I#i-!NEg>B_#yh4YAekj0pDNaQiXpc3FvjN@x9h;7 zR&Pi*DZ$C~Z3RaDa-Olfj&Z-E3C=1GkIE}fRxYy1#3Pkem+ zMS@yRAemkY(_U}=bcT5RPuE>pVV{J-_{3)HaB6~62)NG!D3ck|HV$tO3)BDP7}(cs zA7Aq=iclc;nrE@mRzW$~hmDD|kI!mcR8sMcf#;OaY_IwlO-?c4_q$=b zEa!|0Y*`pMN5Q`Vh9U*GdtPcw&J#I^({t4yFjYD)H*u);j?5-~xgMLG453&*&74$d zbyw;XEZeiE+XI*c`tlmd(E=gzk*6EaF*_)`FV(&_CH-E|<-VXFeB!cp7A$KK5IOxZ;+1VN$+PZ1`JUNGjG0jqh=G+oE(3cMo6#*UrcF@czPTY@~{p5P(9 z)moWeC`8r*5{K*{9ZdWQg8WMWbK7=u`^N~>;S)+-VyFD0->MA;@pl!*eri+p?SG4=Jn$-TEm9orS|;)Rn^^=>EL z0L$FtmWclYd$t8_ddxUE!(WckB-uJiLteydo5t4y?kGwYSaa&Uj`k)#SEv1N!H(D)vOjMBcP zR^SU#LhyuonO{y{0oG>Ipu~ww>onH-f$!DO`}Oy(-t?RHTg#DRsa*Zr#UGK|Os4lP zsrNF~emRN{mQ{MEgJHebD~-DF@Ysrgt zT^wxohA3AUVr{%H{mMcLrQIl)}k27P&cz^_VEQOmR0dpMHz3x@{-yWC63t&p$C0o^yB1#85K`PUq%dD zma1L1iDP0R^p*Ya-IEJ1L7-uMTudJBzVWm@vEySRjk1crvT69vU7>cT0WKyV*Qqbp zW=}17;D;_LLd%5OvHVo~xRi8B&}9YR5kha)ms_%@NGz+*0e26<|s8l@`?#dZ+zE7o9*PMi-H$&*9o2dF0L3M9yVW@aR zYa7`#$B+7Jl4X!A4hLeb?78WOHj+i4 zO}-qoB*$S36KJv%^WefU{+S&MX!va`tHcL};F088(LNCRMlQCPsfJ7e=-sSJbLYBw;18|^=9n#4I~RZ=A@rpjEU{GBLjh|m z3Ln8~xdylp0YR;D2>`XLj&-EbOl>&6=Z-e2lhHuYVK01=QN0YgAs9V{#ql1E&P+N1 z>^R z-ay`X4>tro7#++QpU~Mhxu$=4{Ct;Xruh?XWx5CFt}|1xaiz;pQBveBFW9rkNA?%fk-D0iZLQk21F7{5AYl gg8#1znCvbDw{7#LM^77?z{eZnKp+%Q=SRu@H-mY7P5=M^ literal 3610 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 literal 3610 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 ScY$9g4S(+t=qJ|Rlm7;ZKHU@m literal 3496 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 literal 0 HcmV?d00001 diff --git a/public/static/img/_flap.cfg/149x113H153W-(G)(L).png b/public/static/img/_flap.cfg/149x113H153W-(G)(L).png deleted file mode 100644 index b77fcf0aa08fb0f2caf1330096135927b51acd91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4417 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 diff --git a/public/static/img/_flap.cfg/149x113H225W-(G)(L).png b/public/static/img/_flap.cfg/149x113H225W-(G)(L).png index 48208d9e4288dd460e93f22aadc405a615c2fc12..36082e7fbba94a33327b73642e6b0fb6e7d4f444 100644 GIT binary patch delta 2457 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 diff --git a/public/static/img/_flap.cfg/151x152H152WN(G)(L_).png b/public/static/img/_flap.cfg/151x152H152WN(G)(L_).png new file mode 100644 index 0000000000000000000000000000000000000000..463fee47beae87ce58a8eccbfa64f090e9409906 GIT binary patch literal 4540 zcmZu#Z(I}C(%#L6gn+CG5fKv+0vHtvidWeH7lNb$qQOR`ph6K-wQ9{qR6+&a6fmLC zg2sPH6s`7J1r-wNBWI~wbTE3aI+GG>IK z(<2+-AMD!s{>$Mm=E(1FyLP?3A50dH#s77G#~2e5FQTCki-keK!4yVdDr_fIy;ntlGK?P*Y`dmI4PB3aJ$ouC;@M8E7c{Zu{r;v~7Gk9ZYPkRS-W=

    UulN>tQV)7c?t?*kKEYtjP=}udF;$D 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 literal 0 HcmV?d00001 diff --git a/public/static/img/_flap.cfg/151x152H215WN(G)(L_).png b/public/static/img/_flap.cfg/151x152H215WN(G)(L_).png index 898c6dc09d2e05ae7cad78b6dd374039726933f7..2d277cc0519d7b8a197cc7c4fb4f3b477aff1620 100644 GIT binary patch literal 3600 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 h;7?u<Gmoc-^lu8{84`GyAnjxt{S=p3Y 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

    ciE!bPh){G&3e@)bqb? z`?E+qx%8e-l_Ou&JQ)>Re@1-ERSJg*4r?q-T=3MQ;bO^qu{y9vsp0aL%8~FhbE}HO zQ236IKv^H?sc2=QV^Iz$eAnkNmnRad{jjqHQndro+U&Sj$8~I*I;uyR))=@<(Rzf- z3lb;kjH|t8b~q=hqntXfJGUhnjqf7-(mpxNOpgxKD^ilJ-joZ%JF{7aJ*$Q27}E~r z`x3_dk+mW0v{?(2{hFsa>pHG`w5jd7d&(J|rL4rujMJtC(Sz8lhYl9pmg6PFIKvwggi2$ z1}hDN^b}rOTR>XQ&SI8(AsyM1tJDcqoNg8lBt^3wPV1G>KK=V$jP_ z<&d1x8jMiw`0KGjp`h8=Ab$lLTcKu82&3##*CwmN?O-@Ul^R^(QZdgFa;m_C;VC^_ zmvzrw6%{)n6a^t!BFRx;Fs62XI!||0m>)`(44F%v#cG>DS{BE>g!NMq$DPMoc__KE z#i}q|%$t%^iYbV7RB|PiT=x@e=Q&Q|GF2+4yEu>NwAY9ll&E)PgKGYCcX0{F{T!>` zmcLQo$vy{mdzh8z34T8n)hkm%Bo63(dm*2KkRp?NU?H*%iEXngq~|F0Lg{NKgnqd& zs~K;DCWMtfVK*mnS&iSJDkKP5h)kX=;!G}6nFgo(lIsGHLBo`g^s+SMc5uDI@Fo3i z3x1`e@G*D}gu(%kQ&mI@-cC-5wW3z==nu0xJyFIY%!i62z+K`X^nQ?6&Tv0Xj3Iqc zK-V5-eeQGyVS9~aDctW&BZ&&RyCg-%4{Gju?_iHdCAVx_K^^3_=)VgaQ$UEsipk#%#0(NrWb1c6$LHW>W!fzpRT&IH{3eh3A3zvE z!12t1*PY=k2f83IG|RyY3?;_g1!ZBlVcd)Wq8Dxh8_8tLDLf#NtC3Ui&G@jhoK?9X zV%%7UQ{j4s4IhC6N^n>S@!eGwF7aPDW+?!;*w!;|-T>s`6W>~phW?QQU+n8yC+q?x z^)=X6%?U1mLt1*?8E)PPO7XgSV_jAR`qXHjiW8g%pr_-qzxg{G`+eM&kHTFF5VCgP zGvdt=h!*W)Dr?hXB<%Z9w3>Hae1Vnvp^H>me0`H=er1*)grSH=?RnU*wm?`121yY*;^nQWJKzh8@cvEOsh@MHwQJyheOWqjk<3f-wfpr2ez zeAflWL^x#i8l1%9zB84TYw7G4sES}&3{H2c#kPK^TMQfX$-;N{06W z$%JfJWxviu)})&MGBPq!^<}{I6UqPO;d%{Sx1cueb@i7Q1C};<*W%Qf#$*l)i_3xk ze0jPSTm$wQwq$xk>Oy6yP5`^+o4@q_Z%F^Q{dtA|m+SJ_a)u;+_GF7(hp`O&%hCzl M66{y$d+79k0NN2UIRF3v literal 3554 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 vaU~kX84zp#&Va5ZXA diff --git a/public/static/img/_flap.cfg/156x153H153WN(G)(L_).png b/public/static/img/_flap.cfg/156x153H153WN(G)(L_).png index 66a5a9d21f45c05ff46eae6363a9eebaef6d0fb9..1dbffe98640b6ff1604ff27e9b25881fdd9748ec 100644 GIT binary patch literal 4578 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 literal 4678 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 diff --git a/public/static/img/_flap.cfg/156x153H225WN(G)(L_).png b/public/static/img/_flap.cfg/156x153H225WN(G)(L_).png index d3fe4e7dbd3a1eaa64ab3053d70676c383fa4c9f..7d964f92aa5de51db3c6c08c58389d902f92f61d 100644 GIT binary patch literal 3552 zcmeHK>t9mo7Dkj&!7GkriI+?oZ)iDrORdCPVuK!UDOg@IhY+thXrq)Uco`eZ$;c8l z@)V<{0d6oe3ooT*8fG#GT3VSgN3u!Bnk+lpIbUbaA8>x>!`^GZ@B6H^*Ym9P{`R{o z!U@6p@J( z^ilYx?;|!5N|NlV;Ql3j<;aO=VV@tj-+0FnS?b-6{nGk<|H^FohjCTzhis_z%f{bb z5^f(Kp~GlPYNf{s_O_YZ=RSLV@X!damqMAk*gds>V@{$JF6W=viK0D+=XtzEQUGl(2$7Z4D#^&%$)_+VqvpZ1Gv;k_ zs42(8$22}?Cq&_02JKe0YPO2bkfR(CLGPlC7_3YGziHS`f#8#A9@3Eqxb|>OR&Qeuarvd%D#0jWH zLx#oL%}^?%idP&;(3UKZmej*(pC!f7h+J>e__z1AB@*ZT!eC`gSqsd84w;R~03=bP zCNSE&aR!Jvx$xS9D1hzcz@5D;ApYKAXnFrZi&)Vf-cY;GBD6Hu89CXHOPhd3FAA<@ zH^EA?ol)}sFzpzubhEJRDfte{bHjg_8XR@DlqaqGO2@lGQud>;{MMzJ-QMCCmkz{< zr2WT=8!brgz#jU15U)7NKWzf{&HNYF;8%3jcq*6O&MW5nBOZ^@?-*EsR9}82Jn{A> zLcVX1M~ZY-oQ*~-WuK~d0wnPq_*VV4XvFiS+_bmS_5sx0xu|ekKvH{Eo(#&DgeJh= z{dN;^{Rau^AmG@Fs=^5MaotFgyfL!Zonuh6Uzge+*e#?aS=n@BD^c(7JaibUrHr*- zB@VsOU~*JA1odIFb=rNf#(azFkvdnvQNS9^zag@Es#j8~MN1g}Gn-D6$xm^Bl*uCv zp8tN``+Y6=cwrYHS>?d1_S*n4*pDNv#o0AFAiG%)Ua_D?7yIT!%tAh%C2P6-HLp1P z*b^8`XF-m~g6u*)Y`kyfa9M-^ngIrsCZfJzAs$~!!-%8iRIns@_f`zFl@A^ z>4T9aXETmu^xE>evJdv9q}f?1&dOcQdBsGILE<(jDXemx<9WuAEM=?@@-Z`&lGZ`q zAA{ZUR)hJ0$U+4@kCOU#gB(vvT8j@VSm2A$_nI#@vbn6LSb?tyRCxGFfY{|>xAlW@ ztYV#V=!F6&-fJ$)mIrMR8G`FFpXp~2t6&M(ZJwrYHgQ=$#tLo*l1~UJUFRY-tiU2z zTJz)kFVTBj=1?}nA}8YYYD4QR$I6xB=;4B!4l|axRk&czjR2bpCC|cbhPNi4@NsGFF92>!0fhUt1BQ-(@+Q7>wiKUam zF;4Wmrzw8}_cDeDU9kl`_>}p1O&zo!In!3Wl;bdChYLl-I0YjW-m#*kEQds`hP;2U zC9d$w6+(A{F!OoRCH5n_kV?~FuPaTfJty&8#N_eD``^e`TOov}FX__(W?HqV5 zYyQB#ki_#9f!)TfwB0ttR43w<*>4A39V==6G3izNVGs6^J+_LKM;#Jr1Z}HSpTe3mt8B}hgy273Y;c%(`)6o9yS*la11<| zks9@}fH$A=`9;(o58QA&2mWd=IqwmD;=`mM_hnEhNAjpXu)C?MH73Q6oc9YxOn|+q z8`r2aiG6=2u%PHZI6s?-!q&af(8{k1EI5sCm1!Hz&~XJ9;eziRicaZb^GxEdS4l0Y zcccHMLQUQE=)Ybe=~Fu?G#&^kfvDGq#@=oY>zvt+Qd!Fw zNdgC+NJ6O-s}70?FupH$ZUYZGWTeng_fY5%4dE0SOk}8oY<`Vc&7$k5FRql&j6KaS zab}9U=H+nb7dq;qm9?-B^Yih^h>f^mm-V}MZPRVPxf+Plgt+z$G)M&l-IMB4fu;JB zwYL*f8oe-*=S;RCXbv%Hkf!#@&}76rV`2sf?le)9j0jT`a_~h;9grGnof`SBTR{kQ z_7JY%G`yPrG6S(_LUfxPM zMDw&#w*ve6?HO^p>Y%HWpUSZv#>6WxY9#x>){`x4=OAlYQdeKW;aspa(`b4GU9dH+ ztc8cN@rhBmP_N`+GINC>TaXW|H}l~xr7N7j%(|6Li7-aU_H~c}9Bh-i5Y7dq$5Aw#^H}*XH&VyOA2@KiL9SMw7cZ$i2qI{9b#8 z7MEV;raUJXVz?|1PYmCbOD}O7zHiUK>R{vjsK=PnTYVSi+>(cTm@CCYZ!PmkuQvl( zTk=R57{DdAV+u#@VoUopImqj!(zTS492cI}E*pSvESSUM(nf@vd0Gd@cL6rTG7#~2 z7jW7}?2~3eOk?lhX%VLV5e1;8>EyP!m91jBNFR&#qZUv$g3DXFlq=)Tpr6iEdclzm zM6(L{iqrv+Ic>?o|9mZ)oD@aS6^V4)+=lfA#8=$8tT<21<8d1h(2A96GWlNp^#AB=VYiX!{U?=xi=SWh{~yAd{k4dTR6yjgIC6q;$G zeEy9UF%7lrWlh#ql|LeW(0NJSP1ca}Z+ryoTRs@9!w&TL{*_ zMiTLWd)f^!ztgiBbzdJKGtha;lg*%ZeY*z4*<{8iPs|RzHaEoTQ9SueaNixONH38> z2an?I&|tK?vo+y607?FUI2=^b>|7*{A^pMWUyZbe|XeZ^yj ztjGO0Kzk#Fx|ORhaz&|JRGzXI=O_#xf0p4*ATt!~y8?@K9hdn#d@*{)#EYjc&)Uzv z0TYytKe7{-m7!jx9m&Ca?f^0T9iA98idYRh*n%eUG!xB2$0GYSgHag-o>nEw>`{cB zxEoXfcH@rh60B7G<#pxjO<>lq@;j%opng6SnS7@OBr_X9nCY z*N4Z~hbnAIBN9AHr80bf+@y>p2ckUtTxaZiRS>&xH!jo|fn9(&nYhtbjKYR1TqX8N zOJK4RGP@*9w+<{XqZ+GyN2Y?14|`dQ>%jWLQUwczogy-W&9+z+*MSva0f zbWDhUZTMllaaHh#N=WXCYS6GAwii5h{w?^w1^WNmUkm)dtc&O2Plo^WF^)~f0@L81 O8zdx<5YUcGEdDnth7Y0u literal 3613 zcmeHK{Ueim8{c-U*h)-RltO2fmz`8ck++(+6B;$d#=$b~lPP%($;;XFBAm`an$cM= zmN9L!O`>y#3L%rnnu(~S7o&uV%JW@6pXd1pp67@A<@$WS*L8ia>-)X$?|q-~BYG}J z8KYn@*z&zUxgCJP;AC*jXfFZC3D2>Y0Dr#MZIAzPwt8sj*xGt5bN|PZKm69Be*ML6 zxr@beZnMqGQ!Q^Z1Rj??K3|-?H|Y#hq}6v>24qMwmbfnVk{9aXdherS_+P$!cye%Y zZQ|Rp&Q+Ng{JJh|2~#cBel>$dZ4$#G2xz^H|LIcZx^VC*7q+@xq5HLAHtcQBhs=(8 zF1LrW7+jEg^5j?5v!2xHl%l?qlh?{D)$x3-_p8mW?X+o~XmJV>o$8R{953<(aWk=JHb1&qt zWISY4pM!{>bhGy?-saZ|ZcaLJsciZ{_U%{GuL0>%TtJV(;sw{k{>su*s7?3*=yOkB zuF{iEGm+sI(QMRY(sF?LC%Z>d(AH!jlDF4+D2=hAHLEJrNLkjNuizmquj>sctjXbo zXh6A5^k)a4Lq;dKl)}@_Qy9vKPXH15fvuZ08sK2~I4?7znTPz{vH~^vDQdM%4G#$7 zGC+{DTk~jbN<%Ng)yP7ylUuG^Lms)VzhO|-u@hvSTdnqw>v;v+9Q#~0%>JrTzRuP) zlJdR@z4>rSyEJ(}#3zs7uRJ*v_RIraw3QNm^alr%Ac@So&O<86J1VB4yN+Al98ZLW zM9s;DLo^YXwtS36_ef-aW(vJ!EKh1%jSbw|GF7l|vpzZeq*Xa;vRDTcpFkcBX!g9% zklG5F12t)uHxF8hWsZSi!Y##UKtD4W2umGCCe}Ue<9ilS#Qb21jrj*a&w7w`9nVdK6}aEFT=@UVf%VJ}wolTBI#yw&V(;-}v6vYZ%mhSbg&HcIIYjl#`4^$810s!J4(Lzh>q z&uw0#Rr0g7DkVtr1{0hnf<}?P^*;$9m+=1D);|0J#vGjL;KD`x&ejcLk>Jq+Xnkb= zgSM)yI&Hjnyyb`wp)ota!8vUA2#U~nURlstl~oNG0kz?G`DA#1L2FeO%5jQHMtB=y z)x^NqSaWY2p)=8~zuu89@vXn^0~u8qdM6PEvjftXa}ge+sjFNu zK_1lJWNLqfXQWZSd#BCk$si9}Z*pY+i{k;Zc7}AjP~B6N)oX9!S3-i<383$4RL|I` z(lhb{1;Ex<=~XAMKTq>GA}$(P*V$#QGOeE5Iw|ZTLale^GKk0;*{dvXJ3|2`Z%!*v zeS?h(%9qDmauI>wi#G*l^v@3oYr67F?6PS|SoN8}5Q#aOkbWzG`oN z^Rhz**-W*y3gHn9VlD)UPqg>p?e1O1Uw+M-O+*(Ms0h5fiYnNA+^&(GM5O$JJEg0? zS_2r6PsUkhE#u%{P6WI`YyURp(P)>=bj*`p-yXnD?#)bpfRp}aCjM-yIo}QW0xu>ZW;TgG-?ME^BD)nMMZ0N)^sIKp)1uu0 zVCCKcD>r#ljC6JxF)|ji6Xy!$c?Dm)|+Jf5I z{g5Mx+MD3@r{u0HIvTWkKu)e>@1sAG(4kQjwXqWC8q*z*OBtL6Z?p5)5GjKaaC6;_ z{z%{t@q;bny-J@P;4pb?%nPXx06a{k3FM7p8x)uE$y%QrQ_^dP>!Que&suLV7_|3U zPhMS4YWY~H%eU>cW@GN{NP;4EP#r3N0a>0tvKalgb(|x$B;|s%=)p7UPr15yK_RK7A$K_d+U#)b=ysrRW`h)LO4yg)^txO$ zAdDuZ_N`28`?31&)s`R@+m*gx4EEJjHfG*vqXy`);1rq>tVD5mp;OdpIpR@*m-5C5 z(1z=+77>@GImp-ggRx$x6fEW~HfG(y9b$9ztUb=Lk`84bJFQ;u$_30jJ6sb#63X6c zk87$80lup*DZlbUpltioYTs*wnC_O4$FYl~jlee{z8=4l9Dc;AP3i^)2DS3I3=9XU z5I(gSod)wJs4S+Yr$X6D{CKaMKLUY*7K>34sO;^-E@9Fx*!|MkqPV@la|FM=0%J}7 z^Xf%vdYZ=GUw21w8R=CvdL;cYu)_;`r=(nFU}W|ck9>X~+@?t1R|k9pv5;xT>Z0&o zM5{4Q`VM5={ZN~$m4{vZ^DK#=Nf=kj6Xt9Dto$8ub|$dCs${Rz8b8bH7)ldg}gmuzT*gbiMdfqF`*r($Zdq?!3)1Qy&Q4!odFXWuj1_`upIb y9&G!%wwXqCpUFqf}ICL{VSxMHHdU#Whzdn`nq4 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 literal 0 HcmV?d00001 diff --git a/public/static/img/_flap.cfg/167x132H225WN(G)(L)(L).png b/public/static/img/_flap.cfg/167x132H225WN(G)(L)(L).png index 9b469e21ba1a6fe452ac27b2f4446571beaa063e..7cf1ecdb89f048d5083bdfc44f47de08a5116b2e 100644 GIT binary patch literal 3673 zcmeHK`%}|b77s$3SZxBbEn*`9(NZ6cO;Irj37~>3HteWCWddlhQWshtfd&b$U~9rq z0i~2slwf_(E*emv5JG@XqH*DCK&%E9Ot9iNP#yuINdtlGy`k+d+kaqZ$_z7Sa?bsH zKIe08?!77e2P5S5*Ves;!C+nwJ+SW(24lwt|1WT_f=_x0_vbJeynE=rz$2L#r-rA_ zuYctF#e*OBukpe2FYoy3)y@NZPaRyVNR^k?y&liI_F%YVnx>nSJtny9Kl)z8kZv|? z?`#kFQ@dckHcl8xor}hyG0_=k%hH1W2Qo`9zG>Y#&&Q0MX5k$J5W5uuY5<0U#kr#x zI|b1_Uuf^($j-;G@O^6yy-EwQ3)?Oui%4cp5%9B3DRi_k2_<<18Q>#%AEM z!PI0eP(8Vht)}{^A~er$8#K~5v;c2%o+DS-8)>87MK$s%uO)b6KQruzGYHAQlRdzvScA!^f9cW-i zBd3E_3xnxN^F}u}_5p9X{Ccu}Gi%xxixZfG`$FIADG%0a9xAdu$8IED=YOEp9KJ)0 z+&Kix#{Vcg`tL8J*5z=+T@B}I8Vin+c7gaUw(to;sOpf_7E30G?(XPYfeFElai?BP z`R5=$1*(IQnFBATWc!fgZ`Sz%`q;NoF*`qBnCx)rd}Ley*bw)77&}FBVHp#7nzWS$ z%ijN^%=<>xwFfPx+Z6tlo0f+0A?`Tnj@tbTB&{e0>g`srI-JstU!{OD4j|gT8K&Za zY~9h&hRXt;}2UnC%|}`pfAN=0w~_ww{o$ zTU0{3pFt;n1xnW+h;jn$KTL;YA0U^_2XwNyDCMA|OKPcVys%zCZKY zPU%aCfa0V#m}un_(d zf;9M2tVJ~mDc3S?nS5A`)dXpg%o>VV?`Cw6VchA3T0{DHZxosdxcO-2shG*dc$TW) zZ<1`x6$v}#88kX9%VQvUL4CXkff?(N!w@%-jY~pdBN3*OJyD;OOTBXWG)q5JXg=q# zURWvA2KFh_AZL!^;-<`jn8_SErL%0plI`}H3zr^@kle?*k`x!em-M#{ETpoQ+|}k; z8)vbQ9@tm%>^SF^$)K==7T}Qpq_TMH%_5n}1KpEyNw0)FivlylVevEs(}y9PjbmN! zuvCA8>Sc6_wsOLf3sa=M2*G`<#Q@#d&B}EQ#Hu!;tDpUSf~AiyH1n7`y)Bi=%6%`; zTFrlQN27BzIOBX%c2IOjV2`vCp-7Q2eZ1wCNusdqyB}zRP}!{9+h~ow(us}NK`e?Q zJOBE`Fw~W*$Syrw!v+2Ne+`cz1MfmTJ1W|RTjGVD+4SlYSVI+<9WE41!w&sy$5r@- zr@kEM6;qMDVJp^FWEPlDM6Pawn%HaLVMe=LF18`{h9O?fL4E#UK-E>k@FaAZj&3^u z%c^FVq1Gv~?Yv*HL1hTc8&2YEP>D_us-yJ0S^^zad!j|IPU&!n>W%0sU+*#KT74Ki zQqAA0T2(R7&|Q?cpIiyaXY+^`36lX@%uj(2_sI@AW`eKZOXh z3QK@EZDbqReI8a}A~3yV6N+`58#+A#z7s@B!fsez0=720+}=}QF8fLNtPIK}LJW}?dawt2p%a+TFrRlFR9NhS za^2Km^U)bdWi|A(#L2Kn(yg2UPA%lJa9(^T2KOR55 zB_X)Z5A;#(3-FQ1%#jz9{+}RU!0WT2V6Yz0RfGF4E%JQ>gc=7>H$Hw0p$^|!hT2*+ z3!zSdro4Vkf=$&5B&B61uG@+f#QZye#OuK}Xb<5W$RwSG896}01d5Kj4~{`k_+W+% z=Rkeh`XtcrX_$`lPRJO$$59Z3RIZizK;qbg= zeqNcU)u<-@Ypu=3?|Li(E5(jvFt%k&44r!KRe$~{{r$z79~T=N+flsafyq>DkL&y= zwd&^i`88M;z8T-UR#|r)n D)l|Ck literal 3757 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 diff --git a/public/static/img/_flap.cfg/170x142H142WN(G_)(G_)(L).png b/public/static/img/_flap.cfg/170x142H142WN(G_)(G_)(L).png new file mode 100644 index 0000000000000000000000000000000000000000..59b5f4039420a419e22ca05dd711145c3895c86f GIT binary patch literal 5419 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 Dgey#~ literal 0 HcmV?d00001 diff --git a/public/static/img/_flap.cfg/170x142H210W-(G)(L_)(L).png b/public/static/img/_flap.cfg/170x142H210W-(G)(L_)(L).png index 1b5d19846cfae46675cf9ffd8d4a7328c6e2ad8e..55789fd61f30f9fab5320778b42905d2ee37ed37 100644 GIT binary patch literal 4015 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 literal 4135 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 literal 4038 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 V=W8=d&EXsvEcaQxtkR30{{Kp?q%;5k literal 0 HcmV?d00001 diff --git a/public/static/img/_flap.cfg/176x142H216W-(G)(L_)(L).png b/public/static/img/_flap.cfg/176x142H216W-(G)(L_)(L).png index d8acf6b2ecb1f6c008c205942173931598e8f9dd..fd7a5ad7f671db2822fd4b54ebaf6ebd0a68fcd8 100644 GIT binary patch literal 4025 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 M5B&bSZltV#13`}xasU7T literal 4116 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 diff --git a/public/static/img/_flap.cfg/186x132H132W-(G)(L_)(L).png b/public/static/img/_flap.cfg/186x132H132W-(G)(L_)(L).png index b73195cf1bdd1c1e188402e73a94c32ef1f0a376..f2e1e15f6fedaecf64b81ea5a4473f766a709f8b 100644 GIT binary patch literal 6091 zcma)Ad0Z1$*S<3uLSh0W(2}TZ0Sp!;nF5tXgs>GUDNwB&jb^MHw4y;&Kv^aML|$!0 zQ3(|gZC%>B(AQXTgCVG_FJf(75rQnCQXz^$Fo53;@AvQb`+fh-o!^<~ob%l0oVoWD z#>Ylk&6qU<0ALlpIARF^C zzZ|lra$3hz0hoQY>+d%cQ#*&>*VVqC3JG{WWqRLb>dN1pWg2}M;x?6*J$3`leDP*1 zV0Xu0?fW;!7v?m*VLOj+{|0(^fm!C;J1){7!E25_jN1<+!CG&xKZ*H3b&BTn-xymIlQ?OEQck zqX;Nu)>K_Zf)kYpVbxt?9cx!H(v28hFd7vkwAr5W!<({W5+HF^iLqqTCV>F_sKFS& zGlh4r)A>MUmnn#*WwxU8x)hcTaw%3trR^qm+ARNTz97yh;~gtFM+ zVN%xLLz;ncxh-iEh67oxF<*Wy&}+hQWj>&RH*KEIA_ROgR_dg?S?)}qjN}9S-nWn4jA0I6 z`I+rJA*z07oHCPX4Q8w{NOa(w1-;T%zCE|a^@j6Pnjw@yuSAP2_c~|SLq#--nr~aX z&oF=K4Lv-K*cGS6%t=XvLYpG-gwupI4mz5)n!>i6n5E0L=aY?^nxgBIRx_tl;zr(R z6#RQ>d)ghC`UO0LObA;*S$g4ss}7Q!ANAV~=;Sk3xlVG=90p-o`;v9HaB3>gnzDph z9FaOz?ldkk+ByK^$=Mp)n(3WUM-Q^Ho^<(6?@Rl*cF#a;VdoskMgk15<`3U#d^d>S zHR`t-1T*Tu_G@Pa*OqG2nlY5LmpYM}Y5J)}QYYg3rP|T4N`ziH|GYT<^fZ2T#2_oR z{Lt^UKmV7EC%4%%%MR796LP@ewXeb9tvq4+x*Gc{H{MAl(ZCS&}B(v2;yv~;bk%?KzmLHMqB76Q`sJzL<9A^&@0;|wf z!3+!OH0jk6;J)ECFz~Gm#Ttr&!fP)X9m_xsAPlcM)ME4Q_0)m2C{mQyM5Fk#bfM5j zDzqU-(;Sd=7XhFD(toLJ7nw@Tw_}i%vUHG|NLs>9>c*(0=IQIwXAz_XQbGh<8L$LG z$E_KlXZ|!<9u6uZ81$j;L$u&+qSkdNQgsmG@0z76g!prWHq;7DZ7P#0X4X+r*-v@Z zx5n|~OpFQ>Eg&a-DHhBz*T9nXl&uU0Ya$qXYGB!YR`=;;D4{Eh1b zdS%<1bEgnGzjdn#y>%K{BW1BKk0;A@Yo2ty#dKDA#MuVkGcwBGZxmO8^g}GR3(v|R zOd!sN8ZDgqCLTqB&c%#9Hz58d|Bz8{C8#dm$8zzrGHgsB8Y7Js6@3nmpu&EH6ofzF88I7B;{Ji^J2VsWR4K=pDW-$SS=NK5cF<85yDSwx{bA$00*@_ z|Bg=vSgvThB?OipSiL`_ZH9JhCW^PKSWI#Ssz4Kn^s**e)u9ogCF0K%@P{_N2It%- z`n#d5nlmP=23%2{&n#VphEkM2;5`a89oq-khr3Z!XOAkp6A0rG@ik;&K+bC}X=khI z{tjXl8;%tN_D_A!5giv*EJ+{&VGyng>%KX_Lx|mn+sIKGjvebl=t~SwYry`KNNg-i zYMCH+v3rrLEhje#YwKB{r)P_5A19Qyq_$DwDaO3<>(b5Qax9oZj{ZH z(A$2wCUqeUAAbrCvO#5-lLq-}Bxu_H607(?~F$bfcLLzIxyUep4}HeYHYj3ql}U~PZi z+T(-b$8A-EA7_ATDgCcLv|}Vva{$=tOJzp0%8oza4KzP)n1kXxX5F|=4iB_{XK48Z z#XsmZSdtf+lsAl|&UpZz{r1M4LK`raveEkxXpIju>@csm*)u-} zd-5HggR0}8Rgs{RLs16ZdECTC@uiG9*!F>w+l2SNS_Vy+F$r`AI=Rx9lHR{+@!%aA z6lH3WLc1O8I_qRo?;lnA9}J~K21o~J^YDbl0&{MrmKn2%bkzeMczq9CinwjRa*%}| z9W7ag5l4UiK;`%cSQoHjRTG8|K@EcOByyE!Dr@s=fESFG`~_`V_$tRXkm@ggT!*0| zC?#^2FSYsLG`c#*)FMLhrx8|l4ab{Ku$a5j$Cy8K`Q(aj^Q^j_DK z$fUcxXP}a2g`fY5kZ-50j4{PvD4rZ%70xHT^rA1+lJ@VRuHT$SPA@YDPz3{6j1dWr z-(M6gY!=6X?cBdto-z1BG?7r7JfS)~H(+{9eO#S&5f9H^;v zX4ZkbDc^e^1FgP}^~3XESb9cXt2?N7hd7*K(E367)2;)WI&k0%S9~9oiFWv+d6lx$ z8y+QC0gVU|f~ZeuY9GSrI-)YDL=>-Q)LwyXR3GpuK8O*I8kN>ykV&ymOlFluV^s2C z`hHh1;@drz0bN{4S?&#EQo@*sU_^Z;F{j}^ohIww-@6LMu|Cq048RDd)05?Q-BDfY zXJ~~0jBvWs9ATh$17>F&2JC460fb<~;!4UH`?wIK#|2Ps7%}8JF|^4RF;w^*+|8tl z4ntO*+(4?&%dJ6A2-3MMzXKMYP`h=rbvD=}xMD}1U=%Yz^>?6k*^{mysVg~DrtAm< zdsH$244)wCeVW<~nBnS=km^rCe~fl(wva1X(H1P?k|&U49NgfNX{6;D5W1?|NHAvI)h96LU;(@2)8xygCS4L-M*RWNe9LTVOUkH$gTukeKpO zUNNIGaFfGDjL# zW_R@Loze%#K*wQ2i<_oSGAB$SM{xxYVmxM2R!KQC;rYi?arCV_@PmbYC>o1baykwG zcF=8zvKiBTs;O;-YAOw=-^C@5ak5v{xucCz#!xt*@9{1KE`dlj@>0AoF;}@ilN=5O z^wam~G|oXFD;q6gB5;A%FBR#pftq^<6Xu7BZ;Yi8)P+XR{;vb9XI56#}ieG$~ivSQdAgK}qI{W`d1& zf(l2vCS(zcm5@NfDDY8+#NCmNfWKe}k zIe(k6b+n8v@b3+;#1NZN7M{VRBncvC0Nb(0Pm}q6LM{~>yjSlIJlrO<7oiNw%Rh`&@5sniD*IXvIOX=GBcRNKt~~ zBgF6-u#PpcdLS$FjFjVXc!)8udZ3)<`EUB#j#M6%#eys*6`GW@Hn^BU2%R-Owj|9q zdo7eXA=JmfMoTW>!`Xp9|E2h!AFb#c6&G%~0ZZ43Ft%tO;j8~_K8jNwu-sqRlDX|u zVL>pD#cjp@7(vd1)e0Fz5_1H>$vCb`b*CfgKHa=+DH+J!ZQuXn0cagf?x>3&lJ53W z+`GXR3929etpwaCG_XFYzC}g_gp9)RMFkXa(LQiPIm&whvv%t4cm$82Qe*xTO&xVJ zPxltOs)Me6V^XZ7oD)0&zxv3?*Io#paD}Csj_D#bwe2O*n1ZFh6^I%jM+(JNL+y0hegUwloU~YOt2!Ybe$Ph@#d&hVvY0Ut!^o}x?4rZ4b*;m69*H?h zDD{Dc-R~U`W2jclfqH!7hK0le`dlsSQ43H5O;amb|AZK*FX(K5QCYy&TO$Nr(I(b< zS1dfMbHv1?(qQEKrLL910%I_WOU%W;71Pa5%2CeH)Ww(BT!k%ZD?BY9Nz6SV8XirC zd7PFVmaISxA3l*+dKWX!HWWM^#B?n4A;`R1m{kg|c4;DMB?~dKpp6@RTVL=5o?nhb zUv1Er_3&#w96kh}vZDWDONO*hp*QZ)!?QcPVj_N-L%uo{5(?KJPHDPM%F7>IQdo@3{@&!4%pG+w`mQV>Lf|(Qq)h z{U)KTeqv#Eu}jG1JiOXn@aJ-5rP1OM{Nj0_-)_IJEC?_P{}I<=cX=Ww{WW!*yI1cm zeC!HXwcz6&*A#->)Z(;%!}4?y!ScEM8d+&#agIl0w^Ftk%-49WSR!&1t!dQBCRWdP zB#}mltUkZl9E(~0rgBzo?gkjkIBXF!KcmA?B#uvrM|#vYC`hKX|M0=Vd(n z!xGw%xzX6U6cI;t-;x07(D`8-m=g$g!|G-F-rL6Cb#D7dd6F&}1_-i84-`%t^+BJnAi*+RfY(mgdzvlU*P*ioGXJ zsa$Dx#Zg9Mf11F|1%M{`K*)`cX*7T8;ws>ObHk?_tunAA>xJB+5UhYj0Zus-mAxnU zHV0{pn9aUYII8?u3hc9yM%b6H6uzm*gCZ^^aLlO2{M!=Dc6t<05n^|V^0`Jl5cP|X#Z(*9hbWFk@MX8Rq<{Nlo4M9cv67ab|&opeV-aA4husJCF1!B;BWhVAF5^ zPsa0+3kaQzfLir6GeE#|!s;@QMf!T08U0&E-F8KVVR{PswUApCFm1D_nDNU(n`}5x zg-QXVwyK~12{Mc?Py#Xx#{Y#m0*Ql=`{fR&H?j~%C`_<7dbTuDj|d*YTxQ&-*TX5~ zqy_1aM|cK=j0b&7B9+WyM!L5d-NhNAr}qbB&o!4#(J_uxuQz}8gLh%&uU$iv;)z#q z&^_GKmA-0m?=k&{x|1O_S*E*VrYu}9o;Oh(x9JngXN@%=#A6G~E97ua`2U=8!(spl n;}2U}T5{6NV{+YwgYS{Y8<)%sAF_*pLwXP$85?mSj8Od#uGOX9 literal 6168 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 diff --git a/public/static/img/_flap.cfg/186x132H210W-(G)(L_)(L).png b/public/static/img/_flap.cfg/186x132H210W-(G)(L_)(L).png index 104f2ac48693b05a7d17d5a16b2d4eec19924e79..9af790ef1bdb8f059c2dcf5225810920ae65ed21 100644 GIT binary patch literal 4171 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 diff --git a/public/static/img/_flap.cfg/188x153H153W-(G_)(G_)(L).png b/public/static/img/_flap.cfg/188x153H153W-(G_)(G_)(L).png index 766585926a14e3fcc67126a09a002910a3411ce3..1284b29565b4e9b19e1a5b581d6d08d38605456d 100644 GIT binary patch literal 5500 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 literal 5596 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 Ogx8n8^VRbd-~1m1UE%Kl diff --git a/public/static/img/_flap.cfg/188x153H225W-(G_)(G_)(L).png b/public/static/img/_flap.cfg/188x153H225W-(G_)(G_)(L).png index 133e4b3304055ae409944f3993a029d87635745c..bd769435f5e8e4942c2172ebc0078cbcfd242f21 100644 GIT binary patch literal 3990 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 diff --git a/public/static/img/_flap.cfg/190x140H140W-(G)(L_)(L).png b/public/static/img/_flap.cfg/190x140H140W-(G)(L_)(L).png index 10b13304d3fd4f11f720bda1c2ff92855886ac6a..a185b83997a9d564b80302ddc8177d3b16504c56 100644 GIT binary patch literal 5967 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 HnBac^eBoIj literal 6032 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 diff --git a/public/static/img/_flap.cfg/190x140H210W-(G)(L_)(L).png b/public/static/img/_flap.cfg/190x140H210W-(G)(L_)(L).png index 83ea59de4dc1219dc6e57c9289906ef501f0b356..652ac8883360f8ccdec8f85d419dd961b45c15f2 100644 GIT binary patch literal 4199 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 literal 4387 zcmeHL{Xdg^`ybb^Nt_#tm4|JBiS^*2;R+$l)#HkoRPr#JaVbTtWH(Cn zZI!qxMOj96vAE^CnzR|@3=!SWdSqIvbZ4 zx^JYN`u35WV5IoR!Pn<$V-gB9e)3p=#BSK7*Hs9UDT~4MrjiE@(8$3qK_X9Z@& z`$F&HvKQPYoYjVik_&2%`KRACI9zkpoCWs;Yu3lDG=FG*oY#|kwd7QMV5C0dTIr`* za_j+LXhf`68|sP{xgL@o=he2y0bXH`n6pbu#_kI{Vc0;0W?N_V$!j#(*jZ-N5AdCm z>z@HH#2f-2(EsEcF+`yK$k@}HH7|5>vC-aVOns)vPl)n_9+7ju=8at%z+Og19X%7@ znW}uhdM=8@vd0H_pV$lR$f>q+9APSn){l0A8l|c(>RTRDqo+WD13!E}pSkVBk|C(@ z1d?j$(iG~5)#lDz)Q?MC$O@^Vh2#i>RQ}dcf1|X2KSr?D1xC zp6df~GAX~1`P(LoH<1+RnA7{8Rz^66fmI14^6!d0)@4?ofpjDE6h(KN*%6I(}w>Rj}wBoJd88j<{V)#s`*^pzO_=IU1MAR(>HunG=T(HcF60cu=LcZv(P$!qbN_KSx<6jTn| zqGa(m#;Z540IBu#ekyNTokV=ZsA3`U0VVB88m-)fD0}DLWA36InK0)2FHzdHy_>y2BNbejD7sgJ(VS`!+M;BpOn_~hCgKAaL+kenngWT$NRQrKV0%XP zH=lp)+MNc_<{(CfA;p-bKMJL(4I5+jbbLum;ljxBbgfhZ_DoBmbZ@k@t@QIz_|TdP zpU{FDl42n(RM51>(xlqfcqq99skX_U6uT{xjBz8M9iVg`ImWk-+gN}8YKdVQ9T>p! zCuUfYwjB!#BKo@vD0|f<_>?U@XW~9Cc3YK1XiR%JR1R6>VMyXaS2Fo`CbMH{e*-lp z#Zp&nP3IXo*>r3-cz1QH%9XMR@h{EQ)2dI59c z9M`UbKq9cbT?Cu_mR;)x_bMd`V6p=aB$kQs&_#NV+L$`GPuVg9ozkgb8{q@yNa`UM zMisqg68kB)XqeS-hk0j~^bXigg%(E!FZ@l86<*2(5fJKrQ?zdNxQa~y7pHoJ-` zJEXSnGWsMpQ+CZaP)9a75D3P`Lpn*N$QB@fm=sP0HrDu=-0_izD7#OH=x%wrD`c`P zc6reanq$`RWJ+>^p}0tKsc<& z$)bN3phx({B%EG%Y3mkUeBe^Fm;R(I%avDugN6^Nn&Kq5+oW&SomFQLWe@q&>GqLlNX#{%~`RIY%l^eE=i*Z9JXNH6wpTN529BLN_YN@Vjz@G8ktz1U^-36>OMx*6$3%a5S}Xh&i>`gxv!QJnjt zD?Vt>HF=DkAti*d26tw#G2QYB(Qf&%XEaMc0G*Fo$I_z^dE+W}1?(T=YlO*G9D65M z^j+K!!%1c$5Oo=tXVOIW%FihIX=UpKwBT0VtT+_BD^-$I5U6^-X>K(o#upT^3p%yE zO5(`Fooc_zF2j&02Cbm_1IQKy4ChzvsS{ztvx;#yzhc*9)yFw!OuIBpfe@(xS)Ax< z^cnTMSaJ?YyEOU~r$S`RfjApz1y|jc&lxxC@#Kr5-R}f;ByZqdHfo*9lClWzmY<{* zSh%Ulw!A}s=%d(vz(ACH*cH^e`eXeA;8`bC+m5n`?UqM?p`49p$!mE7*zD9A&sfur zc{Lo@Adk{YMK*7ta|`WiNX*4FIBxN*nqO^7S>%tOf7B2h6Wj6i5fouL_*`qkxS1?4 zoJZq>7$fcdY4GT1>9A;bXo2&0JxZ1>`>gonL!*lE^UTol8sxrdC?W!+J@M9^S4GXo z@kNp9goYD<+^3#Qk4);-?MjrQ!R$#})9&{=@uH;yjZt4Vuptu`{Ps(^cI|ryFz{{+ zr%jZ!==mrdkRM>&ByjI!#Ji8|tdJf`+FH9;2ceAP=nubN3wnA-aoXrf?zi_s{SDAv zJB?P4J!}vCfa4L?;e*Utrzx8(oZRt2an%xZIEhEdwXk$0)LhSucaPazA(b-7!ggJM z13{6RpLb}~&S4F$M4;xgp4w;}P!&=h!=uc^C9xT>t-p*%L6i65z`&%n{Jz6Q&UG{(DjB>` z6IGyMz|!DTT=FmS$sJa-!M%85$)I7NURNS)fXQjIh+B5rd>Ci}`hOUtgl=5~TP8EI zt9w-la%yS~DL;Nav@vT3nl=bFLw>qj2aLRj@VZMFcDv%h6HmmQ3VHsnN*^qfKl~KO zyz(ixXA{MQ>RP7emmaQ~aoGW+&&X!~%&4U!Xx-S-PW_@<*)#`SYP5T*J!6>?4U!&X zul&st!D;cZv%Re=xpNe+7z4|-z*S8?qy#2F!=oz#5^()uVBG)r+ijGJzmkp!n zjGN|Be>rc80n+dP_U-4)U;|UIhKyp8(!x_P>oD3gs)&Lj1C-{lHPx%k<^5yyT3$3P zVa+G`3v+MxEfOfAM2K4Fyhfv42p6@^%B3v@jpK<=dZ$RAS02%*_a>IpR_Q&beIgY| ze-K*kl)D$~TGnYEj+~%IKi&YQTX?*X-Z}@aqTq&p9h|eEM^KPd>P$p|y6?nhI!}C< zR!|UT38GMe?--X;r7*kBZjS_IYKSLIqSKbS5ah7FvkZe zS=+(Bi=Al&Pn6~*Kzex&F4)Zj#5%aAAAh{Xv@$T$E?ey15Ii#3InZWO!nZqqsT&+& zXh$^X$vx*rKmerMhn64z9bECZ*dt!QhvIALC}jmqd-jq-b}~Oq=3YFv^zy*F~_$+PCj}hPT%4 zW6^n#v>MM3z2FC!(PHhlJ8kKL4yF)IoD>Sl%S*lR<)=#diKUOPGf6~j*|DD?-ov3= z8qb}{W>i7WW3+#^;X!u8agd-47^LW*%{|}meCzzMjD)ZrHGWr+Pr@MoG2~w|{MY<9 j^8Qzx{~*quWh39}tLVVrrOs^E>ZA~-$fa#aM5sSz@%{WhpYLDa`DM zK*`z3VJiS63;^Uig9e{m3_i;RKwa0_!ERef=0JPfSs!ufT z>{UqbgWsorzW@2N$JV@@78W|uG1gi0>C>mld&xRo_j$;Ew(!v}OKC8^mo+jbupMnC z5p$Y*|CV_c?`up~;sPJt)7=LL%Khsys7R0SH^6Q^ezq&W6-QiSW&DKS5nn}`U~YH9 z#@-h+CjPxzy){!Abw|O`;cNP<5?2PXe%a*%m8cGT(B?B>{j+#O%$wQ3m=^L$JoPyo-PDHr^{tsZbqn1DOG_uTA6V8+6?Ck z9G%S;23x0L_E13uGwa7=b!mh z?HbFA1Kjl?c1@k4f2rgf&f#ZY_`J>-(?&t8iZJ5+=)ps+s=pCamEb?Uvf948!|x$V zz-gJtTaJ>FwnF<^|J{lH<8Z=YmRarLNq@U{BIF~#taeaU%JgSRmau6l_AzwzZ7Zwv zNK9OoYh6+sq-^Y_N=X+Q;3d`S^Y)Okyo8l>>D~g}#60VN#ivnC$r5)I4{0L}ucf95 z+6n>?nt=IIXNRjx2`HkHTQ-Dmd0{BcP*%r4zuK@Jb>2xP6d%7g<)(M*A!T*59+`>% z72bL|W2x88bH>D!2>ITwEEpTrwje;?WPs?)8o8{5R(HY|(~8EBKJZA@1C;7)Z0bs! z+~NRSWQA)~*2$DwF2F&S9l=);Hi!mxUIb+E3_1Q`Z!O<25TB?ahh)lf&u_>by$loJ z#w02_yp<|Pji^>{-*YZ2)ZdOYx7%f1t==12|8ovgYTWyLR_!1u&mmd&H*40_k zC*a;bGFbg<5#;=yrTa6>yzV?7=}}kh>$my^q4uhFA`r^p{6r4fpcCKQDni=h%x(m# zZ>6_fV2~fy&Ja;sOsRuwegblzxROj?$ia#+fls&Mm-bVt2+j5E3hj98qsG7JA}$uW zC2BnsNw)ne%fN@k6rWzt(h%F>5VJMjtS@lIdMa1o`$h*9)@iGMA6EkloRDf-qS$duJ6Z0z_UF$ z@AE5ryfp7?6#l$gJ^xcf>1G@;2~h!O84?!6jBH+IT!yXwG3YhJog+480p4Ow$!7S+ zrf$XYz+W~C2>b~11kVaNN_R(V?ZYen7?eg(xUM3&E0(LiHNFgZsYeX{Hyj|~MCPkh zOYNJcDcqEcQ7mr*LI+c%6~>vxRYim+g0K`uG?y7B|B(sEua@>l^;25Z{3dfMAZ}52yY)rmrIZ$fy~--#)t8b|E={gVzR!zV#5|1uXvJN; z6&-hWD~<#u_o`xqYpey)OKI^g#)A1}V%o7#8-&L6z{u}6<0hD*qfbY0%S= zZ`Jv7)mQY%Z-mo|mKHMh4 za&W?i#FU-PVWMfEt(KFxA0|vh$=9$@MO9gX2UC)y)Z$x=Iq=HFy2m2T5Dw1pS};s4 z4e6-n5#pu8)YU!@eyr=Fo&<`yBYOHq!_?`JhU%^jvZi2=V1`Hd5u`$@*PFK+!tHE} zI|>=-{>mY0oIOtUQhdVfRy=M_?q*}InH7pE$v_cK&xT1NeXbSfjN93j`LVXe7v}YC zU4v7%j}c3SPY}g=51nd5Lab87;n5KeEThRPLc-m5jUUN)CHu*0=5DEpxt@*fX@=^k z*GX{XF0z5(B)ZFsfam0eXb>I4bQ8aRzjBT#pW>!EkEJ^uyAVyANI3$LLHFfg~*0_PCjjzYF*V|>w+6Ds61jW zh}xH~J)wZMR0C??27Df-n3^mjUG|Cmk4Ip7{#K;h+b>$K%Q+bhmgK(5$$y?akJNB$ z?(gjis2kBlk(wYo;!NB&!g^C-d~+>c;XpG2_ZbpTzlv@s%)%b$)sb`A%<=g|tReVT zh%Bk)_~}B>yw=D!1_Y*JuNrr)dymy=V-1SimhH;>IrC0wNwQnFrhz3JWB&0Fkj&Ff z?!nf@`dQil5|XOq7Fdi0$?mR3&kyX3ATf2kQBpuEI7o2(w1%nmz75}bgmhCZKgIb| z#$R*Yj2RN6#aeH(7PFS|l#8yh{Ou~~P*8$tft_g)t$uPTiCAAOEM=f26+8-NguG2O zY3Z$2mt1`CIvGT-VA_ElDwtBMsNJXxUtDy(%6io~+d7Kd@2#vsr{)tZ?bvxL$*r%` zY-2@lnYQ4l1UZ;L$=Mi=tje$}RX}$ylYtgze0g)AB7DESUN4-UXaU0uOhZnygGxF`2CbjKa0jz$(~lpG~cx33iYYgWV-xZO_X{x#rhpaghEt=5JuJ1kryXXTK|bXSgGNR^&kw7?Ki) z+|gmGx2JC)3vqOV84*z4Fgn8c{#Qnr0=h=$Fg!+TZv;_>xrpOR8W+5Q4-Y}ADHkSc z^eNn&*bPrQpVCW~m50OteJy(?{)NKT+xfMCZB&hK497qIK}wYT(JA_^9@z9u?i0SM zDFFIYH4R5^;vMzIgL;Hhg@7zpMI8GEn%()#+RDe>=A^`J;g-7i913?)vCx0wh)qhA zWz9MY_khM>;B81a-JAZI!65U^^Foq={%W#vpK%?%XI_#+BN=gwugm=W3MoyWRY_M^ z@K{g5!LU-60rKYhJ3&oBUiJ9beSBuzlRe!gQ2f|g@t+?m?@;v+82G9dP`IBoLIm5l z+gcw>pCBc2)LS&q3Fhu1MLnQ!4~5vP;tMHmLE6PaTQv{jaE}TpF;yNIs@R#o-ba=i zR^nOp;tmS;AIKW4Vo0t%^e^ui`4o<+7hN|)-loVNzTi=oz0fJL{$Z_-rS!idrDTJH zPZnHjj7PEMLDzK=+6rzgs5c5@gfRLC1DVxoc@en`jf)7ex`X2Si=I~ zJ9#gbLH0%6|5U@)#uwaUuE%IaS4|OGH1}^}jt$nFUPsF3r3L8<8|YSRDUE6vnr_xh z9@0Q|Bo6G<;xoB5);HI|N)S6+3D)?Pd#ZX63}0v1LUGWQNC=$6V{%?LWM5Q2VMXB@ ze^hdoGK)S0ZrOJSEFs31WZxhoag9?q?C=Vs*o6Wi$=I^3;JpKPh*_j>i=?K@ZdLH8 zmpzVtG$MEa?%Q`haqjN)t*4sjh`jp5#}qEbOH8^ilkPouXO1LhPvuX(vLerDl)nI> z*=gJYen=Vs#Ao&x;rTnQ(Y8rxW^P3|DRoa69VwJM^-<|? z^gbD>TAvUVPJ6<>sx$)`mY-aJCO^46Cu{u5GFcH5Dx3rm?F*9uvqd!pHSiZ|nz zn&+BMJt|8BsXbK=YvkA4cjQ4{fpJ&xFO-+>=$*!kATm+_3~`R_kXP`K#d6-q;v zh{f3f^}X?EZR6_88*t=z7{1a7lAmgu*-)&3ckfJtzPv9AEXigKt@b?+E)k!igmCn; z_ACfn$NdOw8IlUWa;X=eITGmqR1G7JK*=AfVdU1xifKsyK}ms^g2b*`-TJBPDeL#m zffTMJD@WN@hIa0oVMvfY+?AVS?34$;a7j!?RoZBjDW%1^Scs;Y_1cHS77#vthSL|T zVGCL!EB5f2-A8O2*_dE|thMV|5O!`rJzu|)XLM{74s@!}Jh!bkI-($DF19(q8MdNM z|GyPYf*tGvLdScOx-<^`pQbeomxh%MN(uON7frpOn5!m5^74m{~6W&}R;mySZ?dbYL0mU0b+(6zvWwgyq z`Uju+#Oh+_&9@MQ0qHv)(8P*`ggK=D#BzS;)l>u?wMAC8E4fug3kUb^9&Y?^83AtD zti-k6QPVeT5l(z&!>aimc}Ec%y8G!VdcdaJplF)pI~;3}8T8vE@AYB=_`+ob6j&g> zlhk~ErPOj=-lNy>>b&F2cV1UuDrxvdSrxnl+R=}ycnp=~Ju5xH#=xWC&~%WzNLSA0 za7RkaQ!OQ%lD}Cf&VW(%uL9)Go6n~GxETp=oayl3y)}bHZAq#;cGV9@9Cl1pR6aFk zjHHKd-at#QQu3D8O*H+eTK^1?Yb(=6bFLqebMb~**F3!tdI`I>ht~onQvJAM?WP#J zBTq3#mF3b`hdDC)H7%N)cIxbPJL#D!Pi3L+TQeF`UXlmS!tV5rMM$vAtd}} zduSh6E63SA+$r^>Yd+$H}aG{GR< zbp?kWs;xG->p2LDLuT|U`}&=Z&-@OL|K&Psnzlcb3tI9bZS?aOCmCV@@47=a!iG~? z&~+G4Cn6lU?cS?KZ$gXZA#jrXH*R?HR!Vxb zVnEUggU{VgBT@Qmp`mkmg@InukX#Nlm67*Qze0nhjdd%EzmexG&K_=p{5t7#w{a{8 zzjDx{=CSQ4#ir8(Iu^?x>sh9qT%-Mz5G!h6%1emd9Vu6C>GwTQ)_~p&d(4CSCPoo1 z6)$z*zR^M&gG&GzE01Ft-!RxFXIR};H?i#qWzv-mwT`QSn-Vhn*s$`3lo6a%14b&-mlVdd|L2 zdx{Q{X@W0w4ex(VLz708_7W=0$GK9WP>6rz)mwC~)B?`X#ySdkYQ1 z9JoOU8SbFi#^34Ov%;?YS>ucm4dnVXB{TG+y@oCCA!G~|@=Nlq7T@0_Z1_=s`zyJBX32Iu_F4{!yE|~R8m~dmvMmmMcyT_AYY^@j^Ky6( zoI|qrI!xI=!ZRmf7{2 zvw3zPJ04w@xg6S)&s&FMuhcjQpEei#nl9!OTFXH0Xsp4fU%VY4ZhZ{gs-!UlyM4X&#%{pE@>nXq@Kvq>GBT`r4LT>xNB^R{RPprz-s4 thV%dOrCUyvg-?u>zd7+cz|GD~+cwkBJj-0Z)EU5!^V&@gch+E{{|DEy7%%_; literal 6120 zcma)AcR*8D+dnsp0D&YR5N1LMLuQ1QA;VC%14q^3ZxD^>O*5uR3G(e<~F`9d^x6?u%kA_xgEu#m~-a zDZe`#_`ar}wectUgIJ^aB?FOJy?gJ(Hs3gA^XqIuzw?&_0AzA@!+wLK3m;#O1uOX+ z`TFJ69ATY(Ro>hAnGX$LN5A+05MzP^psfjyPgmvxte(UIcqoAe&?N{3$npRY1g*pn zU~Q&Ymf(z6KAGJB@bL4&(Xn4=<_EuiU1qevo}GXFHRouhcwy@4(bI>wZ{IG?nEfy} z?1pF_iI1O~XnA?_sQAHbi~MFaoQhdEH1YQB+lJTlFAiU*8ra|6eYr{KDfXLz8*7O(Sae^=V!U+o*@yc6x_BuCS1yl9P6!0)dF0`_Hf5HS)4u9 zASgg|tEs4Dz!e1-xs{>ipBH4=<*#L6%FYn$sMB%%#qFq<6UwDwx}uKruY3!Z1=lEX zzU%ezsjVU^a4q`MsS){Jic#K#&yF7na%~#sP^Yt2zBJtt1%KKO^s) z0Ol9>EN5rLdB1(01le!n7tUQhO8ObXMAqprpLpa}5-GT2U;2&9N_jRc@G{lz!sh*s zdvFjGD0=$p1SlaBdz>qV{6&8@4-~8AQHg`2qt#}WyJjuc7kf!F*{S=d0Doqf=eK!}j%E2@rdB0}j3J%UTkPZ~x(&*BnLi(Ya;=cHeDDGI(%vn%e1 zjX0u2!;I^GV$XcuzNJ(o+=9*hf)sg)a-KFv?}pMX?o&0o`#mnK29uMQP0oyZ-0zl< zdP45Aw`aeaUM9IsCN}zra<(NqRJh}rUdc!}v$vWY>FrW$OrT-27u?F)-{(Z5)d#lZ zfvIyOM(*qdiT^-*?l@95G@7*kSE=@TW(4t|0hA}FVvlN_j+Xa7VnaU}AaYW6(yfZj zwqhL;WW=Q^1nh7eUsRJxPlkY(reduI(O>xUg8;2F7CVVoZG z37^PKEk_>%V$X&bQhIrYbL46Bs^yS^Nn&$lMa5@Ea7^x;dYq~T=Zu_g*t6juwf6n( z5@aFOF7DKV?L~E2KO;oI?qECfmmj;I?SX@(MdLUkwq!za1Uvdv#n%q7my=impY9l* zBqy@9=FJs*=$TqYby-@H8OtM_#gM{=^@kh5%TtPQ;Z7}sENmdnZs(@-W8k%uh!7d*< zn6Q3MoS=Q^!3rDVh_g3qJinPv%lrNPw#k=kKvzH<^2hC0->{>WO_0N4kA5jt=VJ+} zcIfSC1%k+1R2?^V>H~&secPadINW*tZSlC(vW?Vtw-yeY;=ne}x%Jg!*VcH1i+_1O z#{f6$bmVU{7kD^Or&CZHoc;-4|w>nS5nrD$uClVONq=gk>X zyB3$WYl@G>cHMnXVznNZB3-5Z;+SoRsWSb0M%1E}qUz0KU3&<$oz+Po)f+p4Ytts@ zCnqPpMAe7KUNwCFevx345fH3*Lx&?UFrr?HW=m%!54x)7 zsr*7xaH%x`cj%vM@lAs0C)v0=$gD>=3^Qw9hnIlPQ`N?CSNSdCi4m=cW*#vdK|LIxE}+7fMr zI0e#}s?&MXb0gCj$3|%}?dE?kyuaPbK$BvYe#c*Tv6n8AA2Ia9)Oa;L;z}XCyzFM! zoQ8)i-%~v%lIRFMOtezu=`l7MN1z2gWGKa%;${$Y24cP$YlfIZw5Zg@eXmA}>lo#{Z8A1wJ6IT39ARaMV@M7lOh6* zRfAK?3cwazJL56bz@4&|-Bg*6H%se*+OAr?$#U(@Yy1AJb@&lOR;Sq)A@&-mYOKZK z!;IiHSqTqL1ENu=KQZ4N*DfKOSV61Y>l*#|*@D~iV~PVF zC#z}S?Yg+PQ4z$ytfmEwXRi zRJ8Nm9*}N_9TDP$Tja3PyMN`vDdB@KCfb_ZtICi9)rZ;{x)3#jQfGn}Iw$FHj1cW? z8XOt)A)_P~>v8_niC)I)orRdiFRen8soi`0gEM7QH$a?JN zWNFJK1!-u}*)5OUyc5giQa3mkT1IH&;2O8c?^lTs_7al=6WTn|z$!oNun<21N9)gJ z;_kw#NhZqpHBn_vE?Cj1ecfY%+|^Xk7=U^5Qx@|#A1hzCXO4rPxOR{cZ!jom5 z$;rLTF$P|X3U%~lb;9ahj9}bBp4mkTI>5DdA})$c>BuPnNvmjUuu4)8Qi{%{+VyOD z=ch)XX~P#*w)xVTAAj!U;Kz$%EdHDfJBF25)~`PVC;8tYWjtKv7CAjYgqY-+-l6jI z8gWvO9$ixTS_eLd}pD88+<$bvm-M<4i;Z_}RzeD8Ene{`#X($q8h8Jv4T8x*@SUwRHsT4 ztvI=)hUUbvoJ!kGVh!o;1vi&A*Ji9p>Sv%`*>44h3>*bU5sU6p`G4EDgU039{vX?H z+H-Sr*?p?1&G~&MU-VSgEolWsI3$2iG*wu08eID@DkrGr?{@VEgZC z)tdGf^b-xFbM;{)Rxc|QtT)HYnuec$+LEligrmvkl;;AI>v!*R)Euy^xi6b4XSGn# zu9^DggIBR`x%HSa?q4k+7HS|5r3d#_*{1P1|CMm!tq52`nu~s(kA0Lol}M8>_Tb|F zO;JRS74mSy+PlG3njwPl|FC!H!J3Oj=yv00Qvz%v@L^N_(BH^|ywzJx@L8XSvxocD z0yvh;haX6+OL1Nr7>&gGdNO|gqbrl*9cH^f09$)HL`krokkRkFYtJ_!G#t{L2pN+! zx58`J*ymds?Wf2r8(WzZFVUiyM2J@A|1+M#18b?!8H810^BU}x+?d3&(G`Oc9zbw7uSuWV^FWMH#Ah^1@Cdel{?d8!3MaO>Y zW-zIVKAEli*M&*B9x?W>3Erbp%fQZ%f=o(-vnF8hpP-AOgU@14JS5K(`#xkoHj_%+ z$lv{mfkv4pF;i=#!!14q9fa$MPHg_5j$UI+{*WhDoka5k%^GNZhxkdaS^#Rs{&!dt z9p~-yCyZMo8}mkA>Tzj#)xxW*FfG%{7xos3y7JTaNGw|D8iLgn7O>8$Q$hb6kNg5v|m0Z+DD5|V{ zuvG)~X&2WIs0H*`M^~!D!FVqX=h~6Dt!-zla246YWAkAF=yO=Mi-F40j8$6UW!OAz z<;0}8)s8f-#!O*N!uL;%%rh)k=2LO~6W{?=c2QV043#o&;b3BiP^wu)`1c-h%k28L zYN5*I$sc_Tv;`~Q`2-SZ68rVYum<|5UHq{RGH@56O@5eXRAoMWO%_;DH~l9(M^u;5 z=!1E3Db@ltg0*s|U3V(KM|;Ycj!=|!i(Av_y#qey&JnB;ovhsz#>!hYZN4iD#5_a0 zvq|u>CP&WKyL+>u9<5AWjgieNGv^vE=R&oA+eT=*72 zgxFbuN8m+{7K)S$GkTz6oI`z-mMQZsn#akhei%7yzMjUV9d;o0DV{lmrg-M+rqeq_ zF6>W}#@0}=Pi7Bz;9`O`wbO2+W=LyR0$U1_9@4^6pGc=BF38;xZA|rH;Mx?XEX9?b z1UgrWn2CwB2W3<9%KRQ@b!h$TJorv8aP{{2e|x71w73S8lD7ie6FTn`!=(*Jx6Ck6 zd{v6WNPp5NH)g~+(1~B-o}?zJx+urWI33Dtds|^e& z%Z>@FihfA;bRYY;86qDKQ5$zdN>fL5v|t#>Z@oYBbSUZh*w>o`Ap+}MXpCI= z>Gy~ULi&59Q;STQMcya7?{Q~RT*~i9Q~9WFl0nZYpf8_R^)Rd9uxAdsArx!qk%g{^ zWA>;{SBw6M?DYAir-44qw4-UUjkSuL4(Ze#9)B#I`*`pP8*#)`i34f;#_DZ`kbDT# zf9o;e`e<79;pAIUYKx)!Y78;f9T)5%jF39*@>V2!ZXFwNA<(E#vXv|~(AC8Yl319( zzS-*m7cP$TIx#Ggy^i$rSCN^Q@nljbp0UxPNx0s>0aq&4MCoun3$E|=@Cd}*1tL%D z6c5FRFNR#z{Uq=uj0BbjGjicJ3OiMiFl$s82Sj+h`Ed8Jm@0EEV`WRJN&ii>4d{Tg z6q$yO-58Ku?J@RxfW%sJ+HQcjR#`@G7ki4K0TRj%u{BYFsu4xNBaBcw?TY-8|Cj97 z6BBoeda}aaiWulmWwbTts7c={g!X+f?}F|dB?3Qb~99&%o%${=Mg&469Y**%ERuDtp=79^V zu&h)*tL1?P3JNA=z<0MHS{jT$@MdK^UkJPdt0O;X0sit%P_jTc-`h0D4;;APW{=nD zL~R^UQVNUHesDZ4cjM=?n<*@u%48b|)JF+&b9I!*r2MZ$yPZj=_vCLxBIe2RKD7Yn zE1gPbHX;=MNqE;M+)?It+M!xZilPGi2iA38_HLv4Tb{s16!CVG$buP{5<=gJt zR6e%tp4&>S;a9q1i_<>;ny{s!sKsm)FyWI^wtlIC%}#Gt*OgC-Iu$<9*FGhYeXojs zdJHSt@KbDSkzB&bIx}-S9CPUsP@pvm{`?ejDI7z>A+y#W%M~Q;HA14c)X%TA#X<44 z*=*#773>KF3l4H=H~u{6w4BTmke?fUhbQbHKrb(<(?2o3{Sw`L2Z2@yL;OY9rtFsM zu0dSfU}vE{ld^0>Io%Xa-Lq6w{ht*0_ZT7L*J`%;8$tmGFV`d~`8JAm)+w5reUz*Iqe>Z37f+a*<~ z4D7wgrQn9W7zDuPO4qxlxood%inGeHsDGRjMtW?(kf{G#x4`750hg!F z!`5J2;AQE$4X3Gdzf}4yCdjMF&JFq}VshRR{f@(Ch8v7|gI*#eidr*$V|AP327zWU zhz^evRO>!%fnP-Q{2<+;$Xcktm7CWTSx?TX>!aX$uiB$>>qWyX-56t{JcJz7q<><) z*2k?t0bT+gcRa=1ygz>J|cZZpO%k{N7Q-tP&hZn*>RbKF+nB zL>eZ7u09}CQ|zx$#P0o;8)__YWkj6q>D#F=VxcFF5LzDhuB9UEBA4*Y_#& zr5c51Okcjqs63{R!-&Wt$!>4<`rCN(|xE-5^_HH&JJ^n9QVHZ_O5 zS)X@pQYhr#7eh^R=i^=6Cp~*dq{mH>cN{{LL1q4G*bBU}OhQ6kn7)UeDfEl&_GYd9 z%lRC{6q?iw?%Ji;KCa93^)6|-1ds2GJ?y2C85a6&n7YqjlsiiycJe#5082eR=+Hn8FO-A&N4}(x z^JWRCBlBUPNlO8giF2xv83B!3GO*ttbBO}i7rE3F?P=>Mfsm%b&E_SrH9JqnZ7cIz z)J>Z6p=?8G{9+eHkN|JvnxLVPc(}BX#`M)*tprUBm}&ftF3~R(&EQDrT-usP7N$PF zFL-VAIr6*;UrNIUD~unhZ28LF2vV0PGoP}vz7St$_Rr2cXV!*96zU8p=Z$nWHDy(q zf1as)a&w<_(~FLOmr3&X$02BGM~hucL$}ew!VGMp{(m~*-x}r%1J0RW$G&yZC%?W_ W`sLBl#dV7T`~~;~df)f~mHZ!BqF(#} diff --git a/public/static/img/_flap.cfg/190x156H235W-(G)(L_)(LV).png b/public/static/img/_flap.cfg/190x156H235W-(G)(L_)(LV).png index 81c770a60bff8db6ab36766e7042e1f977fbecd3..98045c6e384da13a1cee22bf4e8873ee6c89bee6 100644 GIT binary patch delta 3547 zcmX9>dpwiv8{cMgcpNiBsgP_#3cXQYVMD#GVMBf$Mz(0Y4k1Fy!2xjv-V;Mma9LQVvl${vN;I^VjpapZmJ5@AbXE*L7ddx-LgIW4F)gWA+5M$efwM zj*#s~Rb#2Xc219X_)C8jXj!%@*1-4s9?gE4uG^$<8w)#+{l^IW^n1V;2PDGd#Mz1R zWSgBkcfPQOiE`I#SG&%FYvJGW?F4lj>jV4aB0k`L<+XtBAR6{vhZCZt3zo>WP4LU) zXJ7YJN*3($zs(GMn}619vk`N1t-EN$b7g4$a*sqsBK zoRz-hp z(Dg(|Wm~OuwWG3JVv8ERKQGKj;BE1ySt~9()wz3ZRE94xT)r_ezpnBrvFiQYN>;Le!GTe`r81 zdi1bs0XQpH$i+2&h9zF8R!ksY7CT)o#j1&_hIcQG?i(sX6)r0S&z85SnjUJo6k6T2 zdKn9Y>HJjq4V_M)qAsdw6=D#jCj_i!d)KHikb8sU2E^cPf zDZ%#b8MtfEGgM%E(R%cu&%V|A=X>xx(3isIzmDEHP|pk^#t9n}s07nOk!hp1FmUc- zM7#X95KbEJHaPA>iqi}V?RcWkCuPcjsL2q%Z7LKWVzB;69T%Ws4S z%Tfs^8t>np5lry>c2rAHP1UUq?tWOVyem-K;kdWL2{*+;^c=F%xeDQ(y~U@{9q-En z85_f~W}Cqy7{tQxn`U^Ej}p)O|8Vz%fjc znx1L$6t*J^#mefQdf0^kcvo%P9Rsvlu@iZ+)D42>rjH%GD~_7Dt+D-;<6f-6fdU%e zrMTX4FDP`ZlCTgMH!B4%Z)l@87HeNxK$`Gq71+8n>b-s9T^@*E>tO9mQrf0p8Sks+ zWYZ{Dh&3jK<#)1a_F}*pCy7TGofukGd2|J`FM+lWY%6&%Pl&4w|L`+7VKakZbyIrN zGjUo@h%pPnR6%R1at%>MdF{_s(O_xS)!>e>(`VLq01EwIf*+fs+t>!|KN$6IpPctE zIYH4OJxy0)`fh6Mhbp?W`~ZzP!$SO+tZp6IV+mHPO2~4_#sD+MGRsf!evtp^z|)jipRfHJ;NQY9Gu^^LpSaY8Q+>_lg_84 zA6VfCG7{5|`D8B|;hnQwdjH<~;MKFMPLz|K!i1e5QUbw*8ij*T@7Lo&QGX|N$gc4z zo^;Zo+kA>g;(=P6RS}XMqP68g1B%M!rd}_vJ5fG)k!td@X<-cG zx(?%gO6L|{?!j^+_%1d_`qQ2}!7CN|&Bqz09gV z5n%Sp$NBp$BYczga8_f2LCNAkwWR5vn8t2tsZR`I&0DU4q$T?f--JCieu-6oq5tHp zdGz=pLXF*oLDLcXuIY7aR=vDA1`L)b)VMx1a3J&B#C7?C+4Qrsvf(qwJOfaLZyRcP z*);Nmk71%ffvE?lB7J7LyRcr`_Nv^1fL+x$4u8KTP{?r!K>qCXOqN7MDUL>j!jGC2 zC}g<|jE#PdbRmzqqGg{Ilk2RVY@a$Ueiq$l&j_7>x^ z^N`6{%DZVYK3%A0Q8OG!4BkWVt3LvFM{}iJQ~9EmFPt$slGI=OV6a0a*7C^0)-!Ma zWh49h^;*!}M6G5a++BrxKEHpxTB2__d+T`!WZu>sckXBV+7O!CoaW>ohhoC1JWOy})(l*IBluf(e(o*LZG-L0;rm{*I%0a&oK^om!2H#Pv*pex35iq0DY9pOEt#8^11u^> zVvCRxK*-6oXLpu-o0bJ4EbGPPM(*I7rat7K><`TI5V813OO8 zy1|v!Xe#AkLb1q-HLuj&I%CgvDw+5p2PB0`DSTGpTJW71)$k)4y>kOdcK3&CZsSe! zV@Qd`p1bFgf%m5x>Tvj+&cuW~qy!`6jHLj)6Q}D|QilE#l#>e`3+lSHT$m?Fp)?xl|l0*hw(W zy$_Lk!W)E(otM{bN~qdP@XX`Dd0Q(y9Hx5kW|+7mQWy^ z%2uz~rlr<>EbuO|cRxeB*1ScUy-YJoq(S{B>|K(7llNmBjl;a+tOv#uZMIsNkoWJ! z3pp?B+2p0T=@6(}1&(49_Z&erg_%K-nydqiuLHovYPj@-7Fw;l)ha0V=1A=anMW^8 z3G~uqTHD;WZBgr%yIW6+zO@+f{fFr;e1@N^-G64{8I~gkR66gfNbIkz_LHaO6@0B1 zN^AD_pxD3bKV9hntDu{1XgFB-WOJ2zw?2#6@+tB;)U#>#7O+W`j}=m<63!$8=w5Nm za9_|?wQ63mXhsYHtA9>2`m7M$kePXj5GM;sb{1kG8Ed%R@4}N8r%|ZuZvwj;sA43v z^QOH|B4*;%C*Qy-Ibi#v?&c)D$Fh*$%4#@xBq@`(CMfIMg%8GBhy;EVGOlEop}knE zqzJmhc$V7{DurRtqPLEreScb6;X6Xyo`>2<6KKRiS8U;lD{>5?N5b9A@fkP$o5=2F z_*0*D4<9JSTrAt)+qLEFJ#UHtL8adbh0>#>6r1?XaOD9v*Ez4)rOg!{SZqT7$OQnm z&(fM7d2$dar9oJ`!NRW!jnn&lScqIV%iWXy%AQI3tXsck;6eI^VP}l=S^E(PlUh7Qpb$;i3|u?-_2n>Foop2a;)op z0>Vnq@V+AC@!u`Hm?d=H136SAuQ$;g11qpWym#-Y5 zaCcTiZ79lkEh!!LRF!AFUb|#dea+T*gSLJHRX%u+X{(p7tzCEJ_cKajTxMl^UQOqS zcGQkJ5&XLKnH-Onjn`MkQJexL9rgeJUp22%VdSNjzOu^*(HiurvOwu5f-|d3&`gru ZkaAdxHctuo`V_602W!@*)0%AeAvbuOT1k6Y3@~=d{=ww(;q$#xQm9ub&JP$ zYL1tUWKE{-0Z+Kb99V zzs&b1BBQP)-5y*2GT-&9bXO7d9!mfTDxyFc;s_8<5C&4@<4+YQK}-d)V1*1SNE`*i=a-zF)wQ+1{x%tN?3(>#HI%YEdW@PK*)^M& zQc>~qa>BR%BljI6x(**Oc>|39HGlF~?%{Z_i}7E9Krp>#*v(}wH!l(!DMl~pdlg|a zq*8yEHJkzQ{=7+-%&&adOFb+~R_8Zl5P5bZUxtfWfjIEd{BI!DiF;IvbE;LgO>#)( zEhxW?1D+j)LDeA^jzvU2m-tq8>DQoTs+Hhq0xtP&kS*9(GT*bh;!eLA7?(Yo?BmNE zBuy>JLFCntd1Jgs&xmpR=#xz_jJlL z{nwkDClP)Ix{JzYBw$|OP)(l`Ycd03gvXC?zbc*5LLKZoL3fOZ9xmB@B){45iU;Xa zQ8BvkKCc(APAH|Up||3-tqjfyAW z)phPr8vRFNe*D?%C&AK=4q%{M_9#dT?HTPT@^GQ`o29+m$!aKKYR^rRoHt7aT(fMB zx*6pav*t1&_SsOkQdxuxELRa3TCzL$ibt}XdmB*4HQ}LaO@$45*!qc>nNB_|cw#Jy zVoC-AUNF>E9Fw({KrB$S_CeeJ=nJfe+CGm|7*|4e4a%E$}!kycNK zG;Ck`bN6w=xv1-8ZT9(e=WnG@iMh8Q)Obq@t2vf0sdO^>@ct;r4?slj*_0^9A9}Yj zs8;gFef&mBNdPUeYDlAM2Id<;i)4R(PQ;WWYBt!m>aao2i@S{2_HYXlq?~v{p3?Gi zEVh_R+#X?A4FwuYuzHy#>Tm?j0sp?42)H4tBITVv^#almh|bR`EGQv#J}JN*jEKHy zIef3vn?NOzuYt>4(SQ`uaQH+*&sB}`-&NBg9@$V$O}PTw=fNTXPAj(gQrz1j>9V&- z=^f&we|TB#8MUZkPLFm`vW5;szPtW$=eB%5MkcX1+c8`npN2L*49v9!>EbRnJabG7m^vx zkknc!c#V|q4aQ`vp@dp5Qu~Fq?~~A`SNCn>@e9V=0m9hx<8|O>6;%3oh4T>Kso==m zH$`s1bue(bdQBJ3G<9=S2R=9%ep=Y`3`=k@ykMZ20?hn;-*E(9AP{^81d664?H6SF zxjmA4;%j}g+!$R!Ji3b*}c${VJmh-}ZmH zXFZdvjCwL-M0e#2N)?_SwX24-%)rkIGL^y<+y}=W9Yqba+pB5!oEGlCJW5tWr% zk+C2^f+`&TmXvB0tA;WeVaONtQ+98JNs=`maB!*9A!0)kh%gjz4fD}3<-KnOWHeWu z0rECdB2uwp_kXle%bxjT;_Zlg{8v!FDwYbpup>CUH!SZ}(P$hgF|i_S+!hfqiAzb# zRY2`)deA)wI;-kieFKg-^jbhBDvv7PIu*++qP0R+c4V;r2Bjjr(l$r_p!&l4{5$5E zpBumJ@?{Q&87`<|X9i+<6|~9X?~n4RQ6-_nvCBa`T@p`0=tF3;)O2CeFGH+i0ge8U zZwXwNpJbkSL!+77uwG5o$)M2__?AQg*;M1y*sDn-1|cGK0K>N=RF^Lkk@_?QKL@CNhU}Zh*2Cy;8Ge550YDU8cB@fh5D*dmDFB; zOixkhFmWjp5RE^EL$2C~jUR|b-=Pt%>jB&GCRxN5>5E>MDEQ@W7@q|zbZ_YwgsIQe z5b~&Db@`2Rpu6Oc+NN$vr?85826XC;rSt&IJuLC@gsc<-*5jL?-cbdnatAvC(9CXR%Ld*~ATt>q;phG& z8mn8rrm7Lx{yM??C~B?qHS(%f5sb_Y6sgATZ)h5>B{48_p!Ag^aK!Xz!W`%g?eS_r ztzI{t;Lfp?lMVJ%Le;^|GmG0B`=3^x&8E^jmu8+#x^7b`4wr3+l%UKG&MDN_A~`=D zOW-ti*vOUh8=p*i(jf|)n@&m}EPN?29Lu>86I18IJD{*!_W3u1f=5UJm_?0jsY@G#G` zKFD_2q|)&RMZsClK)nV>i%V4#&)C%hHzd(SPysgsV0dgvyf7ABNA$G{N{1ZiIX%v_ z6;K^3<-0P}5is#EU^jO|7PwKRvS1DB(uiqjVHV8F)%)ZU3G$q1B(sp^41`7~q(zx` z#JOmo2*q-Kv2I9UDNNLFTJ_`0cD3J~k*GY=Ghg7~CXVat&#@xZnf<#>w^e)rypj&oyyk-JfB8taPD1V z2l~pL2MU$3D^ZhHZ!vZU3NAzn>yT+*Z#Awc1rbuuv>!V3_4Gpk;DRxS9IyE%#}X)Z z4#zZ6K05Oc$3oV#VXXG1Od=M1DF2f}TDTno0QXT@V>!<7cXU(waV+@9SS*F$_6%by zQ6L%#)ya|b3yg2utGwh5=#TvpfHa9)5!r={Gmc^~am~R2MoArzeaP7?W=XKg?{L_0 zz3nJ}<7psAY2VD3VtiQCe~P{*0L98mxZ|oQpLt;gO%9oZUhya;_$gL1tncgt9K>WZ zWrK}EfV$I~D6=>PAW#r<;(qxM5{665>;YTWjP1EBJKYQJoQjWKy02FS0*-wNnPm=L z73;wb2Wh|yE1DCUk%$E;r$yQ#K%}X0^%P5r^(+H&#hUmc^c)a7p)_>(QEsx0P8H~k z=QmH?zl4RzT)qUZWZ`pG-7VHrpv-QxBW}zUhZw1#8v4PeA=S?Fw2*T+@Flp^Dak_s zTa5!EtuHNm5fnn|Ah4BcCxKA??5mw!)?$uTffUU%TLDArN2iMpkEA!p@hDT;N2kTU zyDS|Q)E{EN>FR#ONgIqr_z4=&*)e>s* zYfD1)ic%v=t%=!K(Z*`?aRwC?CCcwPz5l#_z5kiVdG71FKc4HkpF73R*F$UG!g&w` zX>Hu#z8Qj42nd2dsH=gM8@5%aAZWhEMt6K`?8Vo;qtQ!R&Wrr_yZPSWgsb(EMziZ2 z1|CZBHP1CIFSunGYKq>B{LvDB@%`SzdrfZyH~$ox5bwYJ^Rw30*5kV&Xv63~wR7+O zK6vl-*J1MPKgZ{KS0P!Ug?lI8PaXG~7j zv;Ry#Sf$2{nx1-{{&()j*1Wm=__Ut(7guY`)Ho2q+j?-W7n0PxRrDIad4_PH%f5rn z?ArwmC39HLVn`r6F>j3%hbSYUt)@edKF{VVV3E|cZVMjfiSYkZEA*CE|J@U&Sg{Ry zu6Jl_^yf{L;M09ehRQ!!p+}N@JK>BJY02~J)TT=4#>>5pTkXcOuUK-Rv(o`K=Pe#M z?^NL*`P%Fm<0fg#LPh(V*_;9|eGK|TPe|CVrM#6;_mdWJO2otKybxE55vcpYAhI}b z(ygg55MJ7}HLbEtH6K`8p2EXiO3Vr9lEn}ec|ei-6t>B1)!rAKJA3hS`d1aM*&;+^ zZs33?BHJIF=54J}uG((IxvsF zzwD5X70txaRetubkcsQzt_XiaFsg#k$h)JbPmEa`73?;dug29}grt1^h7uQ?HqSb* zU@t(a%9lzm(I}#igXIG?6WjZ+BK;UBo(@2u{hZB&1qdA{!SBfwxvG>wt&{sdF_W!o zaH1f}^nN4q-LLA{7EJU!FoC@6l`;H0=~sAvbUz-l$eeHhk)BNEExXM;dbbHw$xU}` zjI8&gu`&uj4pRMkV+*vuBOHoR?hhs!WfHF{sm1~V8Zem1kXXB_0s4IF;52J%yl^rD zNBGA6+K$wc2s(JpL+=>9fhsO-A>Y4%BIf>Dv~96tL` zZ9D4oizICf3Vsw-j&HLRgDeV6a!jbPa|1nxEmcGxk`@p-!LEn*dLmWX(vsU=#daCy z6ck|5fvYXipgpU*^8@lv$WElMh`}9%)t2NddZka{GZsVKk4HCrPqQaKzEr&)c&;)j z3$T3Kq_I?wF2{D^G@Ouq#OIa)tneOk(^zW%jiTdvIsWA4Sqy|vD1d*Z%c?)TFGq6i z#{d%mv9#houDV+K4P(|@ju*ykUi{6M2Df>k^#(gELd2-(Xp(`#2Bcin7MLJv`EloR z>vfQU-|Hxqg`22IupHUUW^ajplBI!(e3uz}%c9L_7>X}%jLs<@eYl2z9^d&YxEi|@ zZnxxpW3_D4_h8RqODummhjyv_(z`v(>p`ck6+Xogzjc#M>W;r1qa&XS%HrbTpQ}y= zo`TdbH!WhG@lW^`y?v%bf-_#3H#-+o&`RYY2!3^g1;WQ=*dnh27he6%9zSe4A}R-j ztF51OWqRpCc`<8ZMH4%GzER%L%szAY=UbJ}RXKbEjy6Y-mQB~m*g!l_I{cLQP@xeR9%ot>a0_r1^i7i0)BswGvv=OIwIdSv*m|>zT36~=}j$Xgho%p zUAF?lKz!u=BKW5RF5kReuP3ZZo1Drg8HSHus*G`|ufd+k#h3BCfc6VBNrx%O_fR=> zJ6F-L#}i?j4GFZv-+GAA{*9;scOL#R&5|>&Zi~zW9Cy(tOmt#oVZf<|ihJpG2Jko+ zVd(%e9h#^Xls96=?WO8mRRod^dsF5%rIPAqcIO_a_C=IP5%CrJ$g1Dy zt?XZGi`)$8cpsaDs<*U=;WXQ#yhmAR+IwK(F%fBvJLHy2T6)Hd%){fHaU@aDgv1t* zJ7rnuUGpK*dNfWeXR+v)zy!#!DKS!a3-;-3tF~XE@&zVF1KP~BZL-Ooz+5w%*mL#T zAO{n$-nPQ>y{@%VOAhDAZuF>a{?1K`U$`Sw^Fy>D;C-ArCRk{+Mz&BKslNrgtS?lg z$J|Tz(v|sHyFe9TuC-?^Ie*=nh2nGDUYk*(MG-^LjC%bOZ)G`Ojvt&7ePISc#c36h z?N?LTN3SEz{hOKN26>KrwmE@IpPo&TG9t%Rqt&r~9V18nTCugx7OYrbC|f>*TLEc! z15zXE_NK(PrKSr(Qu|irpY~9|g*87j2Dp^U%2HDmTjW@CpH3#J;n`VzI$f1fSnbd} z2tXY2?D)Rs#EIOe)#s#)yTR$nJ_^|W0Jyt@qRI%l`H(1XOn(BLu?sW?=1u9@liwYJoxzU z9txaqzY|K+Ayjjp4uSyWj@jA)3>>6ScHNsgwX(Do+~oq*j=Fj#Cn8j$+HZw#lUfEH z3q}JTBy7neB|Z_A(3!>5sa2(?ho|PWZIOz7?Z0nQ*l|bxjhco7eB_f{N}!v!47#pf zZ|<#}(i6(isRHL?0fy!v%Fs_XMd8g^kt+bvHMwn*iz$JMktMX8RUhiD90FO7oGMCS zay0kps|pbOS%zhAEI4HDdwv+%sIW5|c?gs(*;PJiM)foEEFfL=`iI`iHeDfq$<(Dj z0D;mF#kNJ^ZCP&&0fcUD+ajtTxA%sM^$6)xC%zo^?KHwuvrrBXlp5RKY#|w#=6@YN`)TEWkZl%dcCi^mNyLI_0H%10)XmE?4nqsORuI zM#gz1`=dIxqiTVQUoKfPo8>Eqb9}lE{LoQF8z+Bc>mHX^OL31BXGE){19>4 z(~i2@z-*}IT}f6PlXLZ!70h2JPMhCR_tBk`ks5#cnmYFU!Hea2ru2_?5c2Ch6~7Z? z$sj<;F%x;u>I|BSQD6ad@gAef7jebtBiXJ8abmQu+FvCjm3(!u_c!6eBiGR6w)9PX zdc^ET`4@Ry44;@Qpe1Sd&9f`r_;)P5|*O`Y)Vo}|yZgw2U32BP!KAk#8oc%2nIHjotZgBUeGv|UB?9WzM3Oc>sgQ2Xr=$ojh6w!wdEm{nqvj2ITCem{f-6_`=;R_3?*bi%88_8!n9bTYKQ z7nw4HY|Df($(UgNjF*$RQpa{%daItysu+k5(g--pz@mCb-Dh`>&4u_<6h~6JkHMdk z$>lPl@_Rtcbh;=2=xySiZHR2A*qYZ-*9SfoH!N|%bEMK&57%p+5&ZDjM}fok!J_Y|{Ucq*W^z^! z)-d@Tv9)6dFH}E9<}{V^iOCUMR|8Kz)ljU(vl#t!%4xAZj?6v*TrM(${K|x5Aavsk z;@kqo)?8Z;rhR0;>C{OnlQV8<cSrT>a*wE+JcOe^_M4 z>{Tlh5{pO3@52+c@mi_0#5Bi@{NBH|fMjGxZC4Q(kMYZyY&c0WT&t9fwVM<^p%{`57Bg=;6_R-y zKud1z#rG)&y$q80s)i}E6-VlI@EkXF;w!p7tQDi`Phcntd?_Q)hk7x7Nt0`nNXBNs zrC%tHwCUhUTS8cLHwC;^I%?7iq_#3&5(C=1P_1+`N=;W-Rq%0y>)`K@2KK$*#SxK4 z_X%`LKPDsd<{H53k0=``h*h8IJT!hTFk=1U!i7qN3@x^u)Ke z)FxlD!=2L{5^rouiMoIeEYl&h0oVG#Y>~90wS`rWB=e}om+(YDPP#4u9dukPI>YSc zlz}!2crf4P#v3qnFd5&)$w(n*#7Z`IgsT=l5e_QHJ)T`I`BKr;&cZ|p zs9JY3${A$g*uxN3ckAaFDH-P>hts3VWzJpyv@OOFvK>FZ71^gbb$ZdnKgFm}& z?Feg-fIDotV}#&t`1_bH@XY&3na~XhZ)#y3Jb|4*A`CLRR{cLXQY8Vxpt(ZQMxfn~ zLs-(`=fp2JH8GKTz42OE>}xStPj>HYjD2=;^m32_b_YV$U-1(jh9T~Q4VdBR^9ZM# zEX)?!r+BR+&aF)C0xb#SQE>-&k^Q-t@*WmNxO2`#|5B5^gUR8q2l|`7%mk35uy1$xO`;BRf;JKLg`>oJFz{|}8)bhbnnmZ*AVZ{dCyt#Q91(hH6 zgH!3nev@MK=+#U;++qkiVDghq>&-`)CCKzK@G-UMTNsZ4+4!{M*U7Wa^aFW6tV#!{ z-_Reid$xXrWb`|NT66mO+v1VFE0V&HUHU&uP*ERZm;uHy!_Y(Bn2h62mo$JAHoLmq zG(&Hh2Wl(9o0$iy?9OJ@d?i~J2tshUrwhMKG6bm+^Z>w|-rA)XLmc+Gq4pGvDn`N0 zb7+Gua1WY^y_VKixv}7j0glKLwxjmcQt%RPgPRwPP}GI~I&BUSjB*P!lZ=SCH*R1+ zWeduuI+4z|s5>y5%nR=yc8UPg9Jc{Cv|fDyZL=;JtG}fd-{l4-T+{AO6e)?KGn)a< z8WE-S>6O`5MG8+e3wBGwtHRc9Rlt58HyGN>H1z4+lgZe!+iL$iQ?Ua?FED{u{9pR6 zlw1za7{=Tcu)-~?N&9jSogSzm8M|Dk7F$*esC{vFgo@5xrLhzMYwMxjS<{f601E<8 z=SClf^?P<`gpUd`e_dq8=gqj8|!K&pF!9M;|gO4S{&8|FgC2~Y&=P0 z2v+-hm_Ji(zXC8UfiLsv3_+`oTuZa6%q-jjMr}{^V+e;8bbheA@Ydc%dZ|L&$E)Og?p5W<4;lKMTg@BDq% zUVhU_CjsU!x2*6V-M*RfcIW(6@SuaX^k_q;zjFHrdh+#d7w5-|-`uGI;;DNvUd@Ms zWQBr_ZKqT>t<8 literal 5793 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 E0IVEhM*si- diff --git a/public/static/img/_flap.cfg/191x153H153W-(G)(L_)(L).png b/public/static/img/_flap.cfg/191x153H153W-(G)(L_)(L).png index b4b389b50a7a92a89bf3cf196bf4aa2cef58d83d..89858c9a28d2e8f91d2e546a707bdb6dea9b9da8 100644 GIT binary patch literal 5683 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 diff --git a/public/static/img/_flap.cfg/191x153H206W-(G)(L_)(L).png b/public/static/img/_flap.cfg/191x153H206W-(G)(L_)(L).png index 82870260c0a3e48d107fa88805ef869509a86ff0..edd203afe302928bc6b1888101d37b282d4ab0bf 100644 GIT binary patch literal 4460 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 literal 4503 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 diff --git a/public/static/img/_flap.cfg/191x153H225W-(G)(L_)(L).png b/public/static/img/_flap.cfg/191x153H225W-(G)(L_)(L).png index 255f34e2c5bc5a1e01a530ed185ce24120deee41..1b21d3c758ad76c7fa652b6f3496b7d5bc50151a 100644 GIT binary patch literal 4152 zcmeHL{Xf&||KDb_O&PPdgjh|nbxI^Gx!E#@G~3*qb4rv735jrM$To$o6HRGT4m)y~ zzV(SDHd2FX>&6^z5O?u z#YVUd7%k8_xV}xhJKpg@_+_#310FYy3jb=?@Br3JVGf>Yd;; zY2l95kNu~g{JJteyynU3*N5Xs0OG~T4D`S$?p~d%~YRAXNT^=mF z`SL9GsC4Yhm+Y3avn~IV8tM|_T)N*SYQ)T0mYm=AHMTtaAtL^uuH-_+3K2aVA(?T{ zpRD(#8$$PAEP2>YoW58dkaMl`DTIu;`ZNy=n!P+Y*DInCq&M z>;2obf3^>~}H3;PWnUaD(>)458~S`bm^DyKg%Q_!dl&v&>+FS;j}kcYQF zS=-)yuY)nYha8mP{Fm8Q4lwS`=N|ewx!#-{WUpjI%9!3(66##_^ztu*N)5ZQ64MZ8 zKtr)1YO=LrgVm-boL0~I>{+rQz&C5os@#Tldf#YH77GfRPF@>p7=M?8j5d&L>goUO z4Lz?&hL&s!^~V)l3(SEh-zwj15T>`9D=I+ZI)$pl>H@J^-%S{KA zX(M_#Qf9u)lIb0diy@s2WFWPqNf>%EpcK6!rs!$k2NP(m@_lqsjuboj6hbY1OrUz7 zL_$-Tu?*JcfY(Y2C@yCJgSus|IQ)wdsDq6!MPDCI;lh2<7t(t?z+;&(_2g2|^|uz)Cdx5`y`|{)}4l)-lN@ zd9a~_(xe0}W$3C) zh3bl2sVQ?0DJgw|f!_5D{Fz2uX@y>=QN4e)UEaaxx)q04R+P0FeJ$9pcXfOxayD4N zZG?Wf*rFSEl*?ty$SvvVL&!;u5_z(cVbL|yj1--T43*Ml&PPQrW6zo@8TMVX;{(c@ z$Q$e5TGLl}l&xvh_S~wK;|RB1#_Qke$#+PL+RRvSp(&|evdrKa1R@^g+Zi*^c^nb3 z>=5-4-&le=Y(o!x0afjYIi?k{!bLn&MIIP7L&R(NcFs2m_uc;7zkn0@F6_zY-IdCs zf<@f?CyhcOlU+?9<3g?=y7lCHq(%QWV=+VCy>XXO&ueQ9c*_1AEUL>ok{;wRwR$e< zV}-FXA@MwR5?&&IB_#Bqv-RX?VP}%vmLBvWU9w$>FX9kht}QJJNauA=UpQ5>S?=L zNV04vKit7hNQi7c=a50O4V*r4rjCvX66$khYL*$twbl_{OpqT1CQEih%Jhxn z7|6~TY=P-4_GuwB@Vub6koHl>80SIa?76km>G9i7$beV-2kVidgn$B=9;TDE^_ypM zt8;HQ?W3z5F?t=pkDj4Y*@^|kO85CqoPcLz*x@ilRYlbQMj4;J^bQNzSK|3*n9g(u zwmQ(G6GtNV1GQSeskQSYm+MtLoHXC`Gg6dMJA$63%j~S;x!hK5mj%h=a&7)GUpw=1 zeLnZHO64R*ECsDW%)w$7^INg=iknE$V2vZ(aWAMRZe3Ojfq7!(4I9*$*S8uA;?`w* zSm#!y68TDw-PY*s{5r8p6=TV^5=$!ku~2FBS;T^fHrOzG-${H-Z)(L(UEKca;@;BH zQO^)jZqH3&A#1??FhTyEv>Q(*^)~QmDT>)RQ*n{a)KUakPGE)U$%$4@ zA-a^hdk<2XGO|M3Md}WgBKPHJI??1{MW;^x4c8>$+pEfCtu3L_4 zgmAC7XuE7Zh<@UCNgJvJN&f=c+icSsagiW?!okFloOo*TZARQEB800nBe~VZe`|yb zzqAl8hxo~u>|`Kw&Yi}tw{n`Is>B3&IgAOc1D?em_i_G`;|SDeY213+bv(fM5hJni zsKlL(F~XA*ueK0ChX&S)En?C$hoJ2bbfCynPeF_KM}zo>86srFOni?6r`$qf5p?7f zK&r%8vZEhVeO!z%CR2UJ)f>r9PKia^MxXqUQ*~e?@yw_CcBcuFO}Y<1q$zqGOrhxX zA3+H5Q*D>Fa=WD6;re6`WjfKZ#0y|7)}v(IxAQ-J3W0jzU}6+~bscc^=6l3kt$N`f zfhWtKj$zkBc~XajY+RSf@DUu7Q}!Psl5| zT31y(=*Eoaq1Q0qCs_X)*96kq52t@EdnO!U`Kj(?mN_?g5Qg>13 zstW5oo=*IHt2|1nftsa8%6+2hd0`Q|qWWgq<3hrNMXW;kIOA0K`w35G6u^L^YW( zqr(Bd%U;FQBonEO$F3b|&SPPL%Vcz8_FVD!X#wINB%k|gUXyxdwOxdQ$5^czp+~zK z_k?0hnAeqdgvI1E1O^ny)FS?Q#iR9}>B1u&EFgQDWZT01b7me-EXRtA0>ERdj21%d zZS z61$5Iw`Pc1K~fM8NIr9SjGbHwkgj`i&t@=Jkd7t0^TD(I>EMt$_NggS2L;l(fnFTy zY)^nV0*}_%1OUIGoe|z;V?&4kUgK!p9H@qR;>_8iYe|K97+g&3+oiXn`3LY>2h*-KWD0)R~+xd%l<6QW{ouW<=kvU zOT|9aLit8c+F-s3e6H)!Uwn>wn%QT)%qZT}@tx}rquvMQ<5mpZhoY|K{DG0Xzk0;Q zDEaH+$a`Bw)x^*9-LY(!nTkaJ_C%v^nqSY!rDU#y<+31LiW3?`F=V0jE>Tc;XMtS0 zAtFarC&}q!!Dki4De=Z+T*`W$YplfzFUfYrc6sGZ^8BZF;$*F_r*Ho;F)?vCR=7lw#YnxICg@Tk|5oc$i0s#J^Ua{De^x*g$ z>fr548o6IaveV|p&~sWQcJwqt*>#$AoJjdY~ro};c)ba_O1OKuPUnR*wSSuybvA39;AK=!+U&qvcIs(OUk5+(@7W4{5g7q7-34U%8R*5 zfNbqtFJ3FF)f=F7m+9<__WBJv$Th+Z;E5Mpj+oW6b~u!crT>5u5MHX7KT<~t6)#~3!WHO7-Q|WiS)Gdmvh*m zeL+BzYC2CCIcz>*Nm@6zGHCwB4o#+iXLmV}8%Vwp)gq-vHZYji=vpM7?moqJjeAc5 zmp%sXSm@HC`AI=QaD%SSqh||XjZHQ0DcPy+tTt_47L;yKQGOq^@+W94o|xbpR6|xH zIW_mNP}XDuAXq8l@VyU3wWqQjSNA}E4Sh0YxLQeD*lON|d>7wc$i;vrd$gmkOk78G zqN8uj2l6JN2bF8;ZKaprRTUofcZyxqbsfCP;7tJjIJKA@*m!xQIQ(t&V2`4_q0cGV zayeK^sq7~s{pgQgOfd@6iU|xF{&W=WU|6&XFC^xdti*U`YWutq$DGgH zypJ5+3oROYdL5REjH?&lVd1XPx(*sNCFkjNRw`mte>$3|*o|LPA&#jLhV06P)1c30 z9xj~VQ667*!&$is7$y!^3>Y&#&unRe_xBYr7u1E>baydmtC@inTQS+Du-=rlla6f4 zFZrE7tW&L37oMk1Sr@6#q-sFist6asMpjh^Jh2CQadXpDv@^Rm!cl-Bcx}7GaF;^1 z4a6xm5~D$ll?zpsTq!5Tus_Y5Z-uyB5#I|GSyd4eMm=uUE#g-~fW!~{h-xbkX!t~O z)rrgIXUddW(!2<(0GJi_*Po4Ccw?qt%CukG%?*V6L>>q*BzW1IG2CxNrAnd90{$~~ z(ppdh${DJv_m#mMohev?aGJ{C@X;<~xF>Bv57bAkM4ylH+_(AS0QAIp5Z=a!=6{uB zQX(I`MF($1v@`f6B5ZB_xs`eCAqCJfCI$qrkhTiaJtfr1eEteS`12^z(FcX4=y>K> z*jX=0HlxicncX%k-z!v$k~HiE8-qPjW(46tLbBJahS61a_}$q>BBB}B)*TXyGE);? za7=!@!y`JwdMFQoD#!!SE5Gph$2l-BO8vSY>DpP zJ(}1-LOft6{`6j<~*LJ4>w*PG9OrEU}_ zZWp==Ec%0?L+V18Q-v~yt9^VSP0-S(Y%9R9ssctPCv!EEW_8b8RbiFv&?E>Q1jc(n z*?R=&4(TDA(j{m25uYmlfQ9>8tWbVi5n=(K|7IS#)37EckXq}US*6evB$0fl-(6e% zH5TI5MtF_+qEB9&oIH?6e43Tl@CM>;_2bLws0roi%ta1tS^p|ijg;09%F0|fluc(w za^O34!^K2I6djLl*@iGptQP@*W!-~f1B7~$g<>UiEbP7DRKI8Xiz!RL&`s%!y3pUm zItXv%9TfSkkYbA2zZzhRK6!4^C{r`3`e9)^Q;>f_S@{fJsG858=fFGb`L^3Z8<)%4 zShKw1c8gW#j=Rya))r4-eX=PpO|1Lf%JQ$6ubQz|?0CZgsb-ep%eLt5pCY1tQYjlG z60RRVAo$45wXMi5Aa(w8u+>=CFw4MJvlEH9AAIg}gf>YcIYQ-*&a?+NtH57I&vtdu zZz<xeIv=@(Bq7|Oa<|O1GMbg(7tc<9v~T@@4oZ+3=sUD( zkGwy{VxIv;v+FRXXF+6O%)A)U+;sb(V9fW9Hgxe=5v71{;Zo+*C~1AM9f^LxIEN}5 z)kn&SwbAkHy?5?fM5>WmdM2>%qdo&mp>vs2eb*sB8w7c-BHQT?0Lw#aM(Wk=DtRh! z<8Sj&V^f5H&RiIqhe~ViuH`Dj3yt$zQKh?NG!4?>((2Zw-1RvYrh`?An9tsRXL>O> z$HQ}i6t!Gj&Ljs0+1(G@O>@QIF13s+j_e`;w@NBkc3|~FxJxxBj!|~ILLd_*D))%D zZ@4Rj3m%_`tfE!`z5I+`!b07BjUpSw1^nxL{kV;Bu&Z zP(t7~W9FltzTFgw0?r%M$7)0mF!d>La(`YO9@azYoC>x^1m%-J$iPkd4sK?(6_aR; zWlTK#irWUj$?~Uow(OMm#NbZtdp?f-!A-_A9Ukd#Oe@F2vzY}dn_B|8Am&(ze)ook z>S7}_=I*;R-RtL7b0)FB$982l1pDltW1)45#_L$6C4dwA9S5deyHW6z!XaqoC5>Gq z#`lX9a2BA0z13v;`2nJ|vf9fJDX5cWI##p4w1D^m<1FbG&a|O1LOIJhr)s4xqt^&5 zGt1f@QZcw=pu&RHW$YFVJYHls?h8a?7A~K_chdAha%@v7H?yqzd^!d7rp3yxY8+Hz zXPhx}*86_KW*w3q?fzBhMw&v;0u)c>{!lu?#^T~a7CND8N=hJ&n;iJsFMm}*`Yk~m0x)(0Q0?D z+1uEOf&xKGWs6mPrl-u+;I@@%UW2#?!q8pIhL^rPP97I~^o)48)RXkv;*2BSi}UiL z{54lkf2e3(`|xYF3KJo3M0IQ!xb~gaS%!^N{y$Dr|2Aw5%7(PkZ+N-c;i%X5rU`QK xU`+b2W7xkr{--JJ|DXSt-2YeYUo-uhYUHKyv|4W^9q@O9oU;RiTKjzf`ya}_>c;>8 diff --git a/public/static/img/_flap.cfg/194x132H132W-(G)(L)(L).png b/public/static/img/_flap.cfg/194x132H132W-(G)(L)(L).png index 545d659ad620fe7609545a8cb9eea0d6dd74ed22..a5c6c315ad6633617c2d41b393dd74640809f448 100644 GIT binary patch literal 6298 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 KcyaNDeg6e}@ZACc diff --git a/public/static/img/_flap.cfg/194x132H225W-(G)(L)(L).png b/public/static/img/_flap.cfg/194x132H225W-(G)(L)(L).png index 20a1e01ba47cc6a3b555597048d408c368b96d31..1db61e10c76c8ef86d6c66a3c7bb25d4fd45558d 100644 GIT binary patch literal 4121 zcmeHKYgAKL8chQ7@IeA8MiIkHVXTsXj1C|W5ELAg)JH2745?U91Ob71Q4A5mB!Z-B zEhuWNT@|fLsJwz+H4xsQsl^%;R1!q65#$;mLX6Hi7uWon&itOW`h&H;ob&Cyzx|!V zx#x&JiwK=H-EKO8K$x{AEMxNQ42FLa>V(-(tnK|WNQg55_o&H18Tk8++b*$^gce*U(Zlgbwc*tNuYc*iuZRO{0lF5(gv&Pf*qv!!5 zg(f}AuiL`D`}~jVlG)f}%Q;umke1OMm6GN7k5r^Zx1(C}1^m&$^4p&I_a635WXN=8 zoCAH2-|6AfuhDNvW@%*dT>4Rc=W@;p;-OOl!F&2$eWx!+-k}Ii7W0jj;-VU6@m^$5 zYkgfZ4yg#KIALbO#nRAUdD}EqRFC3RWN^T`T5<`pzaf)v`H}QgSY6P#`Ui37AkVoE zWVQJFjgDA6WhVmJrnci`vVMQ=Yd2p``Ol*Y#VxwYIMsof9CJ0UUabxgI~hb`RfIgU z@jHdWpMGfE%Nf*X64_h~Bnnzx{gEGzr02t5An(ZM zR^$O>Nu^{Vw8!`PUIcUo6Mrg=E7V6Ovcem8xpC7gfo!CBn!X|$LfjV9>4mz;bXIs1 zoGkxCt)3&!(^ueb&wdf$_rQPlGv#ks&dsYlg@>hc97gVM-iN7 z%ql?+2>9#O5cbTClR^>*rW+49CJ!}2F{w=pmiiIm%t4BaMWr6Hw^-nSc8^JGD``-d=K*PYA&CeZtxKxXG7$1 zDafUAiB3q%Is_qS!qJH5LyK{NGi)@%m78f#|Mb;>ohE}wY{y-ytfl!Dk=d}WG1P1j@_s;RC|WRMIyAu#qoUp?22gI!M80X?`!@&sRdf`)s6#O=tER8m=rN zt~gv82k=a6+Y%hH4z<&bkNM&;8$C@e7pFmoGc~q>@~1d@k8raE(clR)TAevTrmwnT z1#V&_&$^t6ci9!2zJQyZ3USdI+keXWCq=Yh{FZI}iuI^raaUV%3^ad&jn-eA;{j<- z1)*k6l&IwyDq+v)i#@Dr8`G2^-{u_Yvrh_KjWu zT!PH{{@pmwhUm+%LvXajw%; zosXEpWr$Q4d_N|;!V_Pb_he$cA1;0nI(u&@4iKD0Qg=>8ZkXmeA2xt2p)wgOX3h^# zhcOK5G)?1A>`E(&?YQCu;yzsH(C8fqa#mnly3S@F?j@}MiiLk>cCDWuP}~0!uzy*C zxL*pEowIiYUD&FrDvnU^+rtOlTqaVj^gXO?C0+payKwRc?aSQEg#eI`xH~#Uv!O_Z z6=ug+^f5NWE-Zuzr`V`jc$SugkU`5<%KZGnT2zQsfz!5$Jk4xa-=Gz z#&tp!<;2IhLZ~7v&Yco}L6N2`&YOzkC`@M`;D{Z7O|RBO(c}^6O3R|s_=Hz(CCD_J zvOCZ&n}JPtiH^Zttku|t$Zp?-Cf zHNn(LsdKjAsY-fR#h?a#{TIRx`jXXTr2wBUVIBwLkwQyn5 zz~ON$g?J_yjc|^hz?WdaMoP6%+2gZx%(pn@ZXa|oK#`hQs-p2>KP+c2-nCefDhSQE zRtH%NUBH1=Rs|cY^lZ2iCVPmlVut2($7q6{BBfcmYKXYy;?)mcz16zeCf)mUzPK_6{Y#{?8izQz;OI( zI^X+gbqlWvD1=qE5jFPRB*WbKOf{)^XCj)LpT5}7KkZ!7Ti)uXa9Q!TNunmYyVqDy zKwGdu&ikfVBe7XZ75mTj$WTOvX%BgBIL+vsk z9{9Y3RzBS6Ra;%6Pm6*T8;1h|w|DREQM!Zn3BYfv zaGO>1fu@N0_mfxx*g*#I$4;IVG?YbJU1YSkfu&l^nLoY}bfa#cX~9i>pB`M_Hy#08 zk>Gwf+@ov)_C+?;;_6?tds literal 4174 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 J`+5A){{Z%Yav}f# diff --git a/public/static/img/_flap.cfg/194x138H138W-(G)(L)(L).png b/public/static/img/_flap.cfg/194x138H138W-(G)(L)(L).png index de2b137830ebe8c8511c1fb4d7daa2ce5d63cf6a..386ab651535f1340e7ae58bf8b3e3f8b8f66402e 100644 GIT binary patch literal 6100 zcma)Ad0Z3M_8)0cAXP~s<|(o-7JNFcC`8!|Mg^l5d_Fg#AF7tRKoJQ`z@>?TRkSXR zq7lIgxU^VAQ6v+LC|0aWahDPYML>Zh7-5vC@7^=<_xJD5xo7#F^F8O>x%cMGlZXd8 z40j+1V&JTqqHhSoh9Zc5X1o4q<>{F*%>*GhJWCW7lX|4{pQpRNUCC3{=W!*!y2SNg z|E&Mqi{sXp4}0|Us#{;j@1^dICR;75#Wjlu+j&e{MqYm2Fn2+BsY<2#q#=mV4cet2 zyZa1Uw+|Z$H|F{7kd7g`$9^vo%zE)AE!WbK3EGQ~2U+t~Pqy`b$%}rri^~WSbf>E#CwC_!+_G4?4lvCANry@74 zHyPgDAG3mAOiDjiHC~cx`&OqoqzN_2?Opm;iSMpH>pncKdriM%;bvD9)l-9+Hkh2W zM6y?UL9ZnLJsn`;gbE4;?+y2gg9u`*u7Q4iU$FUARgZ3`dVP2EsH}b^v(36A>h(Rp z4Qdu_{$51hdeUB`e~ty=W?hwf{l}~8kRZ8Gu&OIrHFu+~-rv)aE<(5)V7NPbrwlr1HCeA7Mj?VHuE-9M~C_!?{(^j-1x%-mAOcKI5tJE-yG zr!BUK;}OHD*vx*9b|7F`P-^jZEwe*PoN|jkc3m=fu%3e`Xo+*U_b6V(#3Ik9T(KZd z*BfrJnP)m^Gbv@b6D7dO*A6N9qv4`agK~@sDhl1Dp0N#;aHqYrlp3`@ zYe>Q=*Kb~2aXp>kk=1WzNKtiUj{5p`gOag5cv?43*)EAlS?q}wtEVo=^@~dJFK-wR zx-UzTqgI@X{zLtX0}ku1^n9EHU+vIUz7$8cneumyKKL>wx!C8bfFQ0bN*78uXPu%v zuXq>hgrl8tkjHl4tQ}G`#YrFE4spI+5K=Vu%E>E|I>0YEeRZ6&OEM?r3E+oLTbApW zobr8nLjd5vYD~b9odl-;MhwC;Q64N&m#x0YF-% zYjoR-d#T0iu42Mow8^6ieu{phzAy-9kXY4KJ0xhzz(?_Ypj~??F{+@lVUIf34vWt= z?T>Rfpzhz990dt(^mU0Yc{Oou@o`|kBjL$7AvZbB=VmC)jr?3@$a~ z*qk^AdmPr(V~ zd&%>?v$hNZ;5&TE*-;z162R8k>33yIkFj7W>;|JBnD*Az--MG%UZRu5H493r$0_A0 zmDA|UUzj-FKttDbrb}e8$pM#rTuR8(hVmd}N@2KNL+)WsLg>qz8Qa_!IKE}mnK7PO zTf88ohg^0G6Li1goO$77kGNW_lZ`WR&O8I%xr}S5#U=xCah=Y%BCL!=oS3Vaah++g zS;9&p8P_QE!Aj;b{Sk{3Af#c|TpVLFw}^qOyy;ATuC{s_h!-gm{$=7cqT!OKf_EXx(Y@79y-c47*HF3@ZPzIO!D_dFuKu>lX*CC() zP@1c&@H24^fxk?9{q-91+aEBIJ-+h8eC;0AAfN4H;pTg0REP+v*Y@QmDCtswJx+9(*_CP>Q(ZlHIpZ#06mCfx0$xtr zNq^yL&p?B&^r7p%X;v*@wS47^B$l$tpe42*BLWo*r9I7f2K~fbYQzjn*(6rZqejfO zlsT~mN%HG)wFVfOI0mOeQ$od*`A@KdTy|g(;3gO1M%l*PEw_EU*aKeF(9M&vz1^okd z(%D??1|aj~4E79kVniwR0ZKkQLZ{kWlOP3mr+CzUpR7LU`EL#xPfRpD-44z6NV)Y{wHxW`l9E~_2ILtS3P zrFME{^|GzxN!QJ6mW6=xA|AEVC#!-LjHm0qYnBOF0iW7AGAkbhwlrrGSGyZFYu!Sf z;G=Jr0R+kfYbluAh5Dz!mqQ4TGV)D*fxvB*ubdv(+?xq5Qx6-JvTXfBV96LvbKD%Y zdWfEm(+Pq-vd|B>T0(Eo3D%DdL?3A9NOZOyS=UcA-G2zFTvQvC!l)fm@ZTtAbZXz4 zQq0GYu90%OpZfVj%z?vhE@eEHYkG~#t*o_|riK?Y8}VMH+n^w)o}6w8!hbV5O()n^ z%bH*CU=P8%XA7mJGm&tG5DBkag+B5X%UPQh8EE+$yWHa;Uop?R9Dt4MR2ErdJg*=p?qst%Gg4ka{}IV}+dqp-ad>Sn{qDW) zc?nJgD}B6^m+Oye`d={<{>IRlGc8NSNw)O6?J91vG460Kt3@H5g;FF75iF6_NIABw=I zjGJ@oGg=_{T07~*=+-t(5=8t#K{l=k|Lg;uN7hgDOD`R<09Rf3x$0w0=X-Ci!5w^Y zmr*%4Dz|Br*a__|atWgwATmq_BAA1?ubLi$E$*uXM~#7{<*91gY_^oZzaxu_;KLy#D)ASrlb10Pg zJFo388iSq?(veFFC+`NO+X`}YPSa8Vs^n4SUg>YZpnaxwyK*YkY)qYl{!p_g>r?@v zglV7}#HGsJ(_aJMe=ChArq(aX2Y-VUiIzn=)%Kj&N(ia@D{C&>Q#((Lf?U$}8(Y>Fs=5GdYB-Z5 zsIMCWU|l})ONZK4vS7WARHMi|o&{TCFAerdKg5EKR*-Hyjgghyu{Lg1-5Szz112OG zAC}tCVF_;}_^{+u&v65qyNA+sgGFQ`%flT7`N>g}=mxpz`IIHXtc!!FmfA~2{XjS zbg11XBEN-{dc5U_xte)D;)yADqn~ECDHns1#!l}mBJaJxW7;{L32;v@2mnum*?ltM zhuDmQ0Z@_Gd`g)U%TB}M!^Y9G&Eaz)@JdBOSfL;tfF5|uf8uJ!vOuo%5(KmefX>_L zJ<+2F0R1+d9re-GYtU_B5;|bT57bRQ(q=mbRNpBQ#@2J>cQCPebC_*BP4yBGTv8;s zBS8%aW-;5in(EOYNK+&@)^i%Kf*^v~=BTOm0zn|##Cjq&W6NrwD=!RPjm+q3gs00D zU8iQE51`f+U7AE@be#eTx=w|n4_1P1Xuj!NoWSL4d%aRbp52S7Odielt&Cf$speMs zqKn8fF*C+JeTx^g)k8;0$k&A0Kp8(O47nn54@6%{(wF)59B**nC1$!1)}P?M&yjLQ zCbqzAr@ek)PV6xr*k7>bvMaUI)*pUd$wHm%i$X!kEu44dK)TPno|F6xmooFHF>`C1 zZ4gXXu$T!(S-L<-ZX@MxD8AbOh7J}o#O{{>)@Qv`$&61pQO&q2?U@S0E)hBQXPm1! zMc3QEP;d~y(w*r(`+5$-vQ2p(NcZ)t=NNZ^7JBb-DHJ@L1R?h+49+65x(~n-_*4j2 zL*zrBP`>OhE30-5S=|ZDp+|!chudr~!nSU9rbngsJKBts`S87**%77 zLbJ`sCR-dJk03)s?(g=GN*q(wP=-2?=)C%H4H+suAlGU2>~YeI4g_?8$uF*h1NG=l{!Yo@tW(ji&ge2m!tK zEpX2$26{{6FBNHVGY;eco}7lmr3k32y=F~ z6MJp1H4Vo;@jOsSlTA|*1=&DR2ciJA~lu~y$ z6%WR~jyan+8rl1Kn5asg_O7g0+t|m+%1BFlXJ|>V6c9g9k9^j?tU%Atme)<|ZlMGF zr{wlnlFG1n5JY^Vu&p9G{}u87d-7)A#y_Pa=lXi-mjqGO(edfp(3_L~Z2C_*daWmB MMMy-yhcDmyKVs>cH2?qr literal 6185 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 diff --git a/public/static/img/_flap.cfg/194x138H207W-(G)(L)(L).png b/public/static/img/_flap.cfg/194x138H207W-(G)(L)(L).png index f6e1a3ee961fc3ea644cc81c929bde369d474c21..36e70e6db6e52881fd026c150b09aef67f01a0b1 100644 GIT binary patch literal 4408 zcmeHKX;f3!7QSLYKv4$4Dx)A!W7Psh3d#@-P%)Jt7gVB9acBi&41#44hwvz%0_ABW zs6Ye>msmkj2qICdG8mjqKmtYtMH2*vnjj$f&N<=zdTYJ+@BJ!kvDUde`+WQRzJ2b# z_h!*o2O1g9F~l&;Xyp&oH5fKY3jROp>w(BW4tGUhnDLjDR0^JWYM`q#&rxRb+rxml z&XVZ`2QBOVG~3yd?J{|(WZFzeHs|4k{N1-Dk~`wI$rNK3w`HI6Y_E)d=PMSA$KLB< z4KIqDqxOxd+uQfes(Z}3Hnxp*=7NW-NRxZX*9g-y!!dn30yFlbPqI6}*YU$Bx(6_h zAvTF*j_K%=F_JNk)!7r*sGlpa;9dKP2GN)CYkO_qzxDm{``D}EFY4D-Td%U7T^+M| zKl*t`)aRc@H3LJvgP%V?^}XnEudDOnmB-g!q#POfbhBu<2D{(%QMG?Y+j;NHqVj7Q zWTBs)OIfR8@7D&HPQy&R3h$;xmdDFGTNmRYy7%k^@tus8{Js9>neznkU5qC~bg%@` zr;OJb|D>8Hrt=;pv7Q%yFc0gV9UU|z9=KsFALm7_R{{U?dM;bJ;*BGx=Y^zq+&ae9>=`Zx8Qbbd>Mk5VcU`e)1{tH# z?TN^WZ&#(a>-0Z4^yVCuKBL6Y4fovn$EF3BM6ML?O!CKYWu42j@Exo&PO@>>>k2u0 zbM3iqg+y0vCw#D~vA1ah^X9%0K3uRJ%W64D)TM<}u1$UA)b))glX6NBZDpoy*O(Usz07r!Ks_H()>GqPWHo zAU~h;G{;iRG#YAKL}2ugR(^8X^2(el-4XeT!E;+7vS+=GN3wj*+jC5K^-8t3>-EpE zS4C|Q`BdpByELD9T_K+WI2*^_V3+1HTND8#c(qx=F3n&*P&9!vRrwtmxbg19$|_w| z=Whc{9Ae!s*waNYE$c*Vh_!5654*II`C1X62X>#=uuBEZcZw!-F~}}0Vt!Htz$)ka z*rmsr2gTXI$ZZ2fb?jHMPj&SZj}%Cl>NfWbs*svW_igUJx%dm!=WbLRpSw zdjy-+3N8L)8?ZQ`)_=#;t10`S#*Z5s!z85dF2D@El zs^;tsC&dQ9wt^NH@@^}}i}~YzxKe`Rh3NK5%~(r* znz-=y+X{s|e%M6hXC z_4g3>m4Rw1m3tA@XxCRA25S^=H-NXf6pO5&{uN<&RNQDRwJQml3F}w{(kEw;tKuNV z3nX_Q@!=a34yFg&36~*Rg)8X6_QI}KD6udQO_8FO1>7nm@tz~$Y!>Fz1F76|CJd-t zTU6ePbApOrW<%H{l6xM365i|zNoxC&`sql!HAVb8 zaS!=h=}62nlU+tusYx|hNMSSNA+sa=GgVg5wR6*vQxTbKWA;Z*1ujI8YQ72?Ky+me zgl<-hFG_QwEDXX&Q7;k;qGgCKlJnT^6WoS-Wc;j8wt3w(7BEl^)Py3$!$U zY{~pfc7(>Yu5Mf&@CfNC}go zM}9>JMjWqGynS~d$Ggr%T9&dMrR?B%9pfqPqp;(|0rW~ewRW=h00z*CUqLc`CQ{0+ zj|m9Lf?~a#)(gE7d6E(^mu!@=%~;xZ>*F$*aZWqWDR&ZxlX^CM)ws|E1~BU4|`3et_48JV`c|_T0L(2&RP> z^DUeNYEMW*POACZW#A^nmpOtdu-zBYaMBKoBkkLxV8cbpq#9$F0i;!C4`zze3Z+e_ zEcBzjLNvfl)Oaf%;qUPVgNb(!X#;}^zEdskNvKDZIul50o#=WS$YYNYTfKpQ>;58Kjwei4;+ zIUlWa`9*%Tq+@8E!PhejEqV!Id$hydFS5Kra`qsY=&R^yne#&swiU(5PC!K`-G!v~ zkCv=Q4elqYb)zL6XdO#ZuZ#||fV4Hsw9gz;RcLjRJGiaDvt@>9XeDBA<4nvj4z28i zC2bstUrj@WyP&=yGwIUI`7+e{QGL~{TgQY5w;jzum2<=DihGcj#*;F3fcGdJ(jVpV zudbjekrm=#`hM`nhop?J1`k$2Jn|PjSmC?s*wOa+p^1>pxIGaq@q^tN*nfP6kmt&E z2oyY3v`q)gLaA11D_{cSeG9uV6}&Z=;V$X!xmNA+S@KR(ih1a|p%%6{H4nUe2zfW;fjM(D zx|$_kM6_Ws<9SO+v(H{uX__InzDZBkKXcG+Oy;+6v|F4#4J2=Nvh`GTWDGJl&>LqK zxv5)19{cQKm2${}cPFv}bLuslQY>M$uO8=E)eNL*mH=gj7o4m;Rh=1cm{j_t?wElz zRf6Fw-iH`|M(TA%#FQ}F^9^P>R;h394z(=-*`D>bp2;1SZ^3(8ikhEq$bHdH77R zh4nIxETD(xJ2X#ANfUE{r^}hvIaa&hG!BKsdfvEi+@0!K3PuO$inAkRC&u@=e|tYN zp7jz4dk`vfXr`t7Ddrl2tt|6gtK9>Qns8Xp4PP2}r*@W{kp=4AS)*)mc^0{al@BCs z5|9IP+~4SG_9W3K{lr-XQ7?uix}VP(>k)6Xfc@Bz`eI${zUPWX2Ef+{D%V_d+y=(8 z$d8AP&jG8NEb`Hz;~-aedWl4eJ`i4;0?pkikrlMAP9-sndY4XnP zFlbXEIVLVN1wos+LfVs)!NWR!jr`<7o%`>C%0?B-fgjfwP`UR~rcM>|bWEt+%9N>q zgiaono0F2_351=Z;L2K2K2U$XfXZE+^4DfJ%(z<#F=jWcQC5q}!B2ipA!RoepYM}7FuPrLv5?e}+r_8a(bAO5dCywlWw!G@0QZMpfN R-VFnPEB#kfE0_Po`4^6SVIKeh literal 4464 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 diff --git a/public/static/img/_flap.cfg/206x142H142W-(G)(G)(L).png b/public/static/img/_flap.cfg/206x142H142W-(G)(G)(L).png index c306310abb5af90a43e50a5a36eb3ead3d42811a..79081f36d5fd7fa49af60e96a7fedf12c5e8ed05 100644 GIT binary patch literal 6220 zcma)Bdq5M{(qDuNi4x?YHU`CzN@6VGtGxM9@%$YN1Bjd(L z)5bH#BM3r^jo~auka2nhv3f_b1;4yKdv6nh&|P9VY%JsWi_TjI*ELRFeD8=j{;>Pp z{B2FN;-}J%+^IjGY%W#V%T9_6)z1(;{CM=cOlt-}?=9r}qpszMwxG{b}>)Oid-ty1qXk zAuJ?xgrzT@`)v&$#H}m1irzz|TY-nh{H&&gkEw^fj?t{|c5bR4WDFh50#NUk;(!0~ zulB9<+;ai>yQdp8azXUepW0_5o$G8z3)@d@814Bya=xpra{sOFhwZcf5fbj3nvxq3 zZ0CX=xw7KzfqiCYMD6i+U++!$@XW)q{_XfA-RX}pp=N6<*Tvf#XM~@A0MSI$-nz*S zeIdUZ^m}QG)G9`F)KRx$&q>uudlJZ3@>q80NbBK+W?|YOT$8c>T73{o<^lR?Mv5c6}3{oAPE1XRV!S3Yybvjwzj+ z;-U{U1Fp3-t@QkIAy;+<6Yk$4$nveO`ams%$^%Eru8E-h1Tn+zE$?fv6({LjS~^6iJ7(>LysC$l>PfPKJNln{^$8LPh% zK-+NU&nSzrjp6cYc4zPyiVwejW>gS1Igd6 zLgPe=kgV~>%u}NvZTV(9nd0Fv)o?tlmfS|F@q^50XRhCuOx(kp@OT7^>V3I#_i=o; z*sS!OczA(oIM%GRfogmr6DYsr(_SA?hDBi>-JX$Q3vC^B-i5||w{M#^H%4q0XW65n zxe(OT7;cF-VV72Fg$z6Et*IoY2&=kjsu$G42zF@ zP#IQ&haH3DOS}CxxqZ~J4}LUZUi@NOl~Shw}X}uo8oAc~Mh+|5pUzF81zBbtV~H$g#NGQOF&8Mt2OLovq!DLxTbYE_e5Ts#nDQkX3p6`g zCa#@`c1j=#KT(Y9IU;X}tjQDq;G}PX$>XPpYnf;#pbeRQ1mCuV2b#AuH1pKUrC4Ae zS)kI(6k``hlnx!W|%TB-s0%3H` zUii>ayw47L4U#MSSSrN^=(fjAthiVxSPyBF{%FH`<)p8>2{V*L5rj=AGUWi#>p5sk z0puj;hCgf2QQvVLvVX@(*Rd2!4}=VbL~#cwXiFqaQmO~L=PiWTs5#4_=tKp`0VI%C7CDHK$vl8DNpxbw>JWCj$>00Nny`g>APvyj~~UZr>j zOX~R&Zp}VCnF?AE&cSMm$PV7Tt!{bEAv}2o1aZkxr}iV(+$Je&7Kjz@g#yIE#h{*! zx9`Q1CqQ13U3AZZHVyi!p$K+(6YcxRf+??|3U>Gq?ZxH=koXeqhv4F#4Qru`e(NnV zTg{(~6`eA{FMT9QeV?=A#-S~L1CloGR4FKsq­#EnPe>>;EQXPu9e9$DtC{!Om* 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 UVb%rkCkP}iI+1(&vz5~S0T$dG3IG5A diff --git a/public/static/img/_flap.cfg/206x142H216W-(G)(G)(L).png b/public/static/img/_flap.cfg/206x142H216W-(G)(G)(L).png index f22a2e0f503358ca72b5901450dea015473e6c46..cdf5bfebc84aa64ad415b9438a6e2413f2eef584 100644 GIT binary patch literal 4386 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 KYQySW#s2^#MyEIc literal 4487 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 X$+pJqzP%Li4;Dg1STwI;a}xS5PSXg3 diff --git a/public/static/img/_flap.cfg/208x142H142W-(G)(L_)(L).png b/public/static/img/_flap.cfg/208x142H142W-(G)(L_)(L).png index a0d93790e2f42841d9b2cf30df72b479bc914bae..22ddfb1e30d335c524c6d1a87ec2a8df5104ab8e 100644 GIT binary patch literal 6221 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 diff --git a/public/static/img/_flap.cfg/208x142H218W-(G)(L_)(L).png b/public/static/img/_flap.cfg/208x142H218W-(G)(L_)(L).png index cf7365135af66be30c38afb94f1b179bf796c8fd..621f63dcc332ef10e6bbe868e5cf307083bee1f3 100644 GIT binary patch literal 4388 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 diff --git a/public/static/img/_flap.cfg/208x150H150W-(G)(L)(L).png b/public/static/img/_flap.cfg/208x150H150W-(G)(L)(L).png index 9703833dfb6ca17d88e4de310daa59f27b216233..39e0c6dbb6e82c11372a31a40809792d662a3392 100644 GIT binary patch literal 6046 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 S>wVC7$HM0?=AGfL&i-HU*QyNw literal 6127 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 wj_~dBIsec5_y74&Zo4t@q5U=e_m7|b( diff --git a/public/static/img/_flap.cfg/208x150H207W-(G)(L)(L).png b/public/static/img/_flap.cfg/208x150H207W-(G)(L)(L).png index 7d755ef1f90d221f917410e5e1064c18ec1edcf8..9dcaed329f6cbcbdab8710755cf9c3f54e3cb818 100644 GIT binary patch literal 4608 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 literal 4683 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

    |X#|ZL?OQf1Tjk2fa5Ldps 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 literal 7109 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 diff --git a/public/static/img/_flap.cfg/222x152H152W-(G)(L)(L).png b/public/static/img/_flap.cfg/222x152H152W-(G)(L)(L).png index 7863c1a89d33d3181b3ccfbc836f3db89b7a6024..22acc3c34f10a8b4050aa8b2ddf53b60a62aabcf 100644 GIT binary patch literal 6272 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%0DhDFx4EKBKqu@&x%B>IUbOOJ1#S#gVh1Y17sg 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 E0sAXi?f?J) diff --git a/public/static/img/_flap.cfg/230x142H142W-(G)(L_)(L).png b/public/static/img/_flap.cfg/230x142H142W-(G)(L_)(L).png new file mode 100644 index 0000000000000000000000000000000000000000..91458629d32c9314d70a60fcc1d0d73b3b57608c GIT binary patch literal 6711 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 Su@C%~g0}gGuq%D}qJIKaPlibV literal 4815 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 X+XB|*vQL2@RgjOjpI6D|Q2ze{x59~$ diff --git a/public/static/img/_flap.cfg/232x153H153W-(G)(L_)(L).png b/public/static/img/_flap.cfg/232x153H153W-(G)(L_)(L).png index 38dcdbc49a2d069dfe1fab4784c4aeb101c29247..934554dd9fb9a7564db20c0efedd1e5e1954d729 100644 GIT binary patch literal 6284 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%0A6C{U&=2~0(ktYotG%myQ zk~?6azOP0-mk*of9<0xdDfA@JxH3Ynd zrmHZSE)Z+tpj&xo`AI$nSQk+9q4m0vrCKC_sXlS0I_6W8=>uX-JLs49il4Ny0DA|8 z$V!xrSZERITbA+e=XmjEg(a&*P?|f4m}d~K^v(ub|9GBh^}z&VE-ziIqyGfk3@b0U z0y_ZapB!r#r)ksDIKq1zRN^A_atcD(5T>~Lo7*N_oDjuEaCbbZb_y@`M#wG(g%<5dprPexP1EihB1tfY>W>^Q%=dKZRp> ziJ%Ki{@7Dw%TJ0cz~msQK2sKIF4SPc2Two9Bhc0`R0&C0q)jXMNr43zSd8Nn=+;h( z8sgfzXbBtQnh!=k>iPW&Kgmtb>9dAH!O`J_5N-qD>cr8HF&3J6NrPS4)qT%ib&8Nv zqJTg0L~A^aFyIgmVrQX&&;eJPp3+VcdEoRG)aj79Zo*_bje)nPYp`%!3dd+A?smb4 zwT|VTR)JYHanQ3bYI43*1lWz7u!e4flGQVCw~HFgs{RXi0YPPEYOq(ky3aeRsAY1> z&(Ijr7TQxnj@=q17=05C^PC5WyH7tkN34*9p%Fj;$6N>3mNo{SNzPM87Aog|aS2ftT_qiR}gqqO_XGyhDKTZ1|AtxVbeSZN#B`f9JzBTM#0TBzCh+!6+ zpC@90vSJW)lr^=BrbYHbJGPDgbZeE$rc_QThF*vgPXEMDq7=Y^4zdNx=<#62_!Qkn zI%^*TmniZ}-IO4mofm|TeF_uKN{aDD#X1SrlLl9~ZE_B80KUF%)E|@1&JRLK>5|v9 z%p&TyFhq{u&7O;g*RF@ay)4n@98F7QDvjPjLC*`P5AyZ?1z5f-Sp5{N1~$Td(Uav3 zx5o-N)m+~w;r1u5V9hNEf@|eNTi!vi^BdGZ!}Z;Mnl=FJkm|KjOW;yUE5Pi?`8x!d zKbdOQ4_uNJB|8-(pg8qfHuS}QF9KgxpPI-=KCBJ9^pQga!}=)oH<9< zoM#M9Uo7V`)2rru6zLq^5lHO}n2ZcnvliDj*M)hhN;Ghgg0G`_6BP~nIw@kva(CsA z3JS4IiFf|Ae`ccQd&M55kvy_SaA(x)p8f*Mb;Jk)edJ=TMaE!?Xu2)+9kqK&&{U2F z8@cT|m9uY+YBP?=nCjmyPaj~{?F8qD78ZrBg|fwgNTaJL>5j}o~bql=e3LARDPUCvrd(iZ4Bv!y1yJKKzlTmhxG?p{MC%m}X$*p4>U3bReP zK`8wru>5=8;EiqXwpdBX<(%j8_4a-ZF3umJqq!HJ`N#|Zcr zi*@EQ{B8E=Ez-Z;7fQS_K42zir#0z+JN#n{{$2O=MX;*^RW6oVIR{x&-s87O$KQV| z_%xUbUjT-mi&XJf)~JlaS3#RZkW?~%)?kBo9N*0p8bged5wXrqhHvW@pzwv<1dhNt zG7A+Sct$(^=aT=Bh7()K&r>ObQj#McIh)7eJyvzFM!>dDk^83BRA9(C5KtF;#X2(A z+^8DCdi&%y>1jBJLQl$R27cPlX$+5erZh+b0d+SlXRk1jGYKkq=L_VxrB(^<{_08fsEPNaNDZNE6jg;xN{ zQ6N7ik<8f6ONsAwA21tlCoDBcCTs{dto3i_(+dKxx5czgOuL93*; zg*Lipq;BajoQ3x@AdfQ|Ol$KdvMPo&n*W&+S3RCC?^sLbONx79pa-6L$fLp_>_WgA zGh2g+l$r%q$4HgJpdp`h;Rc4>DeY<4u!}4{G6T$>ubAEIVMfxw2?(uatKlus3W}=t zFyY34U$B_`ttL`;gf!E)NQuw1_m{^xk$%bP+|^hEZ&2Z%Ly|{7Csjx)I^<~G*aF>d zas?^r;=l7|CP=%+P}qAjN5=NgjX!N^X~}zlqK#Ia2M z>{(2y`ps|iki;!1M1eOttAvNV|K|(+zmNIv{}Vu!VvHbtFE7kdPR`e3w=^Y=@aB(f N+w9M{;TwMP{{S_%0)GGi literal 6306 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 diff --git a/public/static/img/_flap.cfg/232x153H225W-(G)(L_)(L).png b/public/static/img/_flap.cfg/232x153H225W-(G)(L_)(L).png index 332ef5080f117fbb9db022f00539422ac81a7aa1..b6914762058cee5bafdb9620a8cde2c461b1b725 100644 GIT binary patch literal 4654 zcmeHLTUZlW*4>qqMZiQt5GPy>YCs7nK~b;~5*h_jl)i{T!*m1@ohXJz1eHq#P(cM$ z8t@WW{VFqlR`6iW@z3KHy5P+KKx11j1CZ-8PmC;b28d|yAz>*Og_S+(|FYp+vv zD!Jjyf>{=J768Cn91`?30F4fSy<-sQO!zXvY+ z$J5wtiZps`9bC9hS$WsHwUGERbe(Ssc_0Z?h&X?cepeg18sfY%+mWu(yl>naVKb}Z# zrZ)GE%m=Qncg~dsZ}cv;&1D&*Wzvk#?*j(^sA(PSZYdefAL<&u+duDzTv0 z13PiZ>tabh%hy;gPpfI451u97Y5N3*%XyIuOx>+AkD?6Yx z;e$5uZ%hXq+uv4?`Nb>>y66HvxtlH88(*|gSLeftYQpoHx{}`ll&Aw19UjiV@k6XZ z<_KHkSml))O!QQK>Nn)=bpgv!m!&+~y(fo{Tx2?^>C^-@_G;~R6M6gLWV%nw8EQ)y zD5iEzG%OXAoZ^r1Z;58f;##5&JO=sll0C(&EE6K%76z2xP|Pr@JfesR9ay=Y95xg; zQ(`u(NSQ|-J`;3WPJ^zAJRkg~yGe;=k2kp`c8ugOB5^B;)*qA8cwg68#(Xce@ZWK= zSecasK84<3r!%p{8RMZcYR|6qH@FZo%ywx$X`C&YOQ4n+RpZJNOdT7U$jgKoPA3|| zU}Li-`^SSz2H4ZDjOkjS#x!fjK(_rv`0bN7X1_QB>(92B&5WFxSK2aZOjxSk4%Up> zBS4`0CnHZFXIG&io~fTRUb%G)Q>Vrh`CCn({f+h5mV^x-RR|Q?_wh++>5^x0HQinc z%>?SP8uMKKE7ylXyH}V@f8O(ppESxEVuwzFW7Lt|qEDuAkP9Sq*|85Ms`e5DdUfuG zw(kf?)|FU(?G-h5d-?^5$;s!}?Vv_NkpBpRFKRb_aM-Lh2?|HKjFQex&A+fmnZ+Zw zr+x!}OAG^5lb$7;SHfDU^e8d;*P$geM_W!gYc`p*tDiiA=gr=j=RSsPWy!6w*PF&b zJ@-FfKPW9B<976!I`%1%W6$;8n9!Q4gDN!+Qn@D!GtlQ$y#FnOU}r{ z;3gBM0AUUzOv4P(r6oo;_GObg8H-$!!nkz8l%M@K>oH2uiL*m+YGvECl>;Uck%b(L zPD0~6G4(ql7@fB7Np#5)rWQyKS^$#g?ZTT_A5np&6I zezjRuFc?WZUgKCk712x=8ZoiR^)ZXo=XMv=xsXlB%=oEzdYhNgx&w355^y|6xtu|B zdvn^M_SoAuzMXh`jvT8kVAtlw8VCeYcz|jl^I-^Ev*#@HT8!%GuZZSa>Y=MKs$-ud z#P2dk*(5o57IJF~d4`RsQZM7hCj^;-DwVq8PBFGAWDjZvY+nB-?WcqSR=6la^V zKZ%Tsq{|$fjSfO1E~cg;d_|Ktwsaaz=GXgjTd~qL(yVr;H?%#G<~b7t8z0%1OebF= zor@8)E!KwH?B$u0L|#Cto$2gZ%;ko#4UeFFYA5cQ!ytWCH3RPStVpvrD2h&TuN|Td zcqVT*qHwHrAD0_wjHgL!OBlm9l^zlFM? zre8(~kKWA_gq}*?^BeV;$U+GH#?w|3y{{^mxis4G`PCY@V{mBW6D}OQrfw2^Jv^pIt6&7Bot;>&;@4D<g|#)QJ*u#fGCajiqyY zmYjCem`H~X4Rg+Z%>?9gK!nm?C$g?5P%351+mdEgnM;~>j}x(qm5a8nGRuZnEyKSD zGw1wk0Yf^TdaUX%m0Ek|S(=ka-07^O)n;mJ|5e}qCCoW@`Ha+9wiiSBSZb}X2oN#K zEn7q}D>^YbtgW_q=Sm!@oQR{a`L&HWA&P8EoNREX+e_+D7rYYf6-%Ke*G7!u@G~F( z@bm~-KYR+PzaqrpYJ`AFDqTk{TIbN-X{dO^B6y!xFWu)%)c)G%Ww;J9%V?RkVBHr2 z?6)^&nU`~vEcK-;T8?ODT*l;R(pil|TCTFk?ebkYf2_Vv6jKyv@DN~Yt?X1G&Wa?Pq0%Do${BsE6MY#KXedGlKD}wV*r{p`+?hrkd2!w%RUZmF5*v1K=y_W# zl^0TFRD-HNT?Z|-bD=`aoKyWTH)FA!ey=d`(O&L)StmQCB@{kc;b}S8O$`T7nD#7@ zjBAMFlWB|*C!J_buCwtbLMV#+tm!|jlQu}(fF?vh*6e_F#QALHVv=yF~q z)r`bE%T-2aQ=8Oyd*Pw8i<#}kMX>$*_&zK8PP9;C_>hv%ogT>WYYv6WK4)uku=CM; z(jON)MwcTSB@s08Q;xDRo7$$v!^;$B#Y~O20K3z>ugaB}bk3p`5eyyTN`e@zsK<+{ zTQxdJK*&O#B$(+gvymYE#ysw!rHng>c2&?vyJ#{cf>zPEO|_i4bgfOrtx!0@p%*fg zPUxzvM4u8anLNbHe6PB`O-JDo%2KI4%+OIcvPGM#SpT;~VV;IV&CfKXMjL`6l$Ryu zWK^yaF{DMBqg9?hQwWv_klOYTF_^1qzG|GBprd4gyn-U=N$6;ECS+^@*6Pe?vZm7` z$03^?bCu$3*c@qYkp8&CT?nq#9I8%rHbF;01eV?u3g5aCrPJ`*okjnDw~|c}VEbGd zrRcQG#$XjeE4LFGdCrtpjeF)(>G@o8r|FyaosZB6m2f=LoGjA8L^PUS-!BWS=*j0S z6mtcbUoiXOa^^!Z!*g#D99qm2t%;ze>^sy@z^y&7f?T1-jojXztsxEEhfTi2zUa|V3CASnhQv%mOtir< zkjzIM$91p~37Tx(+HXzos+^(s^m67xtoN z@5J!Q2j}--&X5#oey=gfz^7g(Pp{7v+0ag@sbe#AomrbJv z)i`?+9VSfKsE|zZZq?4Rs|V3Yq0R6B9WBf%m!g>)mR7OK#Y||G@nuEwt6UEo zBv|Gmz$&GC7bM3Wxu(YFxFUTU#>?X%)pq(6)}xd|~?CQDS~C zS56~cCFa~s3)e0)B}+3^fE~Y;UV5sLWTV#uemUA`0X@>38{3mOhi@XV6JWg_k1$vKgIfpFVV3M9vRzwD?hFet}lxRa@1nms2 zM1|3E{?^kEk;0%gu1<~E)r5+ssO0pBai*UGQPQqyxEc%C7sEHqo_ahX1UW|zsPWWw zciuiZ0_8peEN;hq6G5+*V?1D`Z~O)cgPwC7#UeJ^jIM7ArPf+bGu{j;tV!;h&0pIDnlK6JNajP@sP_bj8Qjf{3x z>Q@nMDHL#vY@I!S?0e1d8*Uh literal 4677 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 SmWsX(0ff(A99kJ7&Hg|9PYE3W diff --git a/public/static/img/_flap.cfg/258x132H132W-(G)(L)(G)(L).png b/public/static/img/_flap.cfg/258x132H132W-(G)(L)(G)(L).png index 92788f6af8d92e73f6f9de08a27b567c85b35476..4ab9e5059d10b1e8b8b568af3e022c3574007ef0 100644 GIT binary patch literal 7721 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 literal 5037 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 z Date: Thu, 14 May 2026 21:12:14 +0300 Subject: [PATCH 088/102] =?UTF-8?q?del:=20=D1=81=D0=BB=D1=83=D0=B6=D0=B5?= =?UTF-8?q?=D0=B1=D0=BD=D1=8B=D0=B9=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D1=84?= =?UTF-8?q?=D0=B5=D0=B9=D1=81=20=D1=83=D0=B4=D0=B0=D0=BB=D1=91=D0=BD=20?= =?UTF-8?q?=D0=B8=D0=B7=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oknardia/oknardia/urls.py | 14 +- oknardia/templates/service/index.html | 22 ---- oknardia/templates/service/not_denice.html | 141 --------------------- oknardia/web/service.py | 33 +---- public/static/img/cubex.png | Bin 305807 -> 0 bytes 5 files changed, 7 insertions(+), 203 deletions(-) delete mode 100755 oknardia/templates/service/index.html delete mode 100755 oknardia/templates/service/not_denice.html delete mode 100755 public/static/img/cubex.png diff --git a/oknardia/oknardia/urls.py b/oknardia/oknardia/urls.py index f4ffade..08b6318 100644 --- a/oknardia/oknardia/urls.py +++ b/oknardia/oknardia/urls.py @@ -101,23 +101,19 @@ urlpatterns = [ re_path(r'^specification_set/\d$', views.main_init), # заглушка (позже будет спецификация оконного набора) # отображение всех составлющих рейтинга re_path( r'^show_rating_components/(?P\d+)$', report1.show_rating_components), - # СЛУЖЕБНЫЕ СТРАНИЦЫ (для администратора) - # --- страничка "главная сервис-утилит" - re_path(r'^service[/*]$', service.service), - # --- страничка для тестирования верстки текста в блоге - re_path(r'^service/tmp[/*]$', service.tmp), - # --- страничка "нет доступа" - re_path(r'^service/not-denice[/*]$', service.not_denice), ] if DEBUG: + # Медиа-файлы + urlpatterns += static(MEDIA_URL, document_root=MEDIA_ROOT) + # --- страничка для тестирования верстки текста в блоге + urlpatterns += [re_path(r'^blog/tmp[/*]$', service.tmp),] # ___ ____ _ _____ _ _ _____ _ # | | | | \ ___| |_ _ _ ___ |_ _|___ ___| | |_ ___ ___ | _ |___ ___ ___| | # |_ | | | | -_| . | | | . | | | | . | . | | . | .'| _| | __| .'| | -_| | # |_| |____/|___|___|___|_ | |_| |___|___|_|___|__,|_| |__| |__,|_|_|___|_| # |___| urlpatterns = [path('__debug__/', include('debug_toolbar.urls')), *urlpatterns] - # Медиа-файлы - urlpatterns += static(MEDIA_URL, document_root=MEDIA_ROOT) + diff --git a/oknardia/templates/service/index.html b/oknardia/templates/service/index.html deleted file mode 100755 index 668b10c..0000000 --- a/oknardia/templates/service/index.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - ОКНАРДИЯ :: Служебное - - - -

    Служебные ссылки

    - -
    - - - \ No newline at end of file diff --git a/oknardia/templates/service/not_denice.html b/oknardia/templates/service/not_denice.html deleted file mode 100755 index 65ecc2f..0000000 --- a/oknardia/templates/service/not_denice.html +++ /dev/null @@ -1,141 +0,0 @@ -{% load static %} - - - - - - - - - - - - - - - - - - ОКНАРДИЯ: Нет доступа в служебный интерфейс - {# #} - {# #} - {# #}{% block Top_JS1 %}{% endblock %}{% block Top_JS2 %}{% endblock %}{% block Top_JS3 %}{% endblock %}{% block Top_JS4 %}{% endblock %}{% block Top_JS5 %}{% endblock %}{% block Top_Meta1 %}{% endblock %} - - - - -
    -
    -

     
     

    - -

    Служебный интерфейс закрыт

    - -

    Доступ только для админов! Поисковикам и - пользователям лезть сюда не за чем…

    -
    -
    - -
    -
    - - - {##}Рейтинг@Mail.ru{##} - {# #}Яндекс.Метрика{# #} - {# #}{# #} - - {# #} -
    -
    - © oknardia.ru, 2015-{% now "Y" %}. -
    -
    - - - \ No newline at end of file diff --git a/oknardia/web/service.py b/oknardia/web/service.py index a6b67a9..cd94e9f 100644 --- a/oknardia/web/service.py +++ b/oknardia/web/service.py @@ -1,34 +1,6 @@ # -*- coding: utf-8 -*- -from django.shortcuts import render, redirect +from django.shortcuts import render from django.http import HttpRequest, HttpResponse -from oknardia.models import PVCprofiles, Seria_Info, Win_MountDim, Building_Info, SetKit -from datetime import datetime, timezone -import django.utils.dateformat -import django.utils.timezone -from oknardia.settings import * -import time - - -# Главная страница для вызова служебных процедур. -def service(request: HttpRequest) -> HttpResponse: - """ Страница для вызова служебных процедур - - :param request: HttpRequest - :return: HttpResponse - """ - time_start = time.perf_counter() - # проверка на аутентификацию - # print(request.user.is_authenticated) - if not request.user.is_authenticated: - return redirect("/service/not-denice") - return render(request, "service/index.html", {'ticks': float(time.perf_counter()-time_start)}) - - -# страничка, на которую переадресует служебный интерфейс, если нет аутентификации. -def not_denice(request): - time_start = time.perf_counter() - return render(request, "service/not_denice.html", {'ticks': float(time.perf_counter()-time_start)}) - def tmp(request: HttpRequest) -> HttpResponse: """ Страница для тестирования верстки текста в блоге @@ -36,5 +8,4 @@ def tmp(request: HttpRequest) -> HttpResponse: :param request: :return: """ - t_start = time.perf_counter() - return render(request, "service/tmp.html", {'TAU': float(time.perf_counter()-t_start)}) \ No newline at end of file + return render(request, "service/tmp.html") \ No newline at end of file diff --git a/public/static/img/cubex.png b/public/static/img/cubex.png deleted file mode 100755 index 22b0afa32d0c69d2ecbdcf0309f69e748c6f1525..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 305807 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%0Dem-iy5C~QIvGaJW# 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

    r*ixLGii5DNuy$#I3D$L+}stACeaQG00jkH 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 z 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 From 98b0b79c87eb0fd4f370c24b13a19b133c945b4b Mon Sep 17 00:00:00 2001 From: erjemin Date: Thu, 14 May 2026 21:15:34 +0300 Subject: [PATCH 089/102] =?UTF-8?q?mod:=20=D0=BA=D0=B0=D1=80=D1=82=D0=B8?= =?UTF-8?q?=D0=BD=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/static/img/in_progress_grey1.gif | Bin 0 -> 920 bytes public/static/img/oknardia_logo.svgz | Bin 1711 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100755 public/static/img/in_progress_grey1.gif delete mode 100755 public/static/img/oknardia_logo.svgz diff --git a/public/static/img/in_progress_grey1.gif b/public/static/img/in_progress_grey1.gif new file mode 100755 index 0000000000000000000000000000000000000000..4a9273661bbf56f5109c56ac33369a1ca651f9ca GIT binary patch literal 920 zcmZ?wbhEHblwgox_{_lY;lqcIA3uKj^y%~G&tJZL`TF(i_wV0-{`~pt*RS8dfB*UO z=kMRY|Ni~^|NsBDZ{L3W_@Vfp+s`#5*x50_)kx2PnUR5kLGhoiZ(>TSLQ(1Jn7|V9ltm15`RMU})OldpahA+Er{hRdYmFCTCK946=IlfZt>~$5z zv3a~4?G2vQ&SJgwl@pp$Wv6sBmiVU6?zgYzVl!JfZSf2hzU6%@W7LJ#&RX9os<379 zwz+D|JJ(GuHZs|KaL)7~?)^e+>Ff$jN!CXNL7rgcVh}*~#O4ny3`|)wEV;N2`zjUm zx^Qxy5SjBi@dQVLTEi-xr%fMy{I`XuvEMkzvOwsASJYz}L?H<&W=@^78Fe732?o~8TN9S~MH zJpbtSXiv5^6I%*I_&wQS{@_FQ$GQz$T^me;7A3fz@?lIlmB1QNR?x5@#e3rfwT85_ zxAqD-f9SoWsd{m1Ljz+#hVrury-rt8=|??*-bInSS1#aW?$%1I>b}rcacXOw?xe5V zZtW>DDk|FWI_BZ0+)_ynj{4-rbY4dGww#i5v!06feoggBg;P>%c$ud67SDF(oHubn zm5(yl((dJrscU9r&8k-3Fn@AiDhrRw#&rfp`*zIS#mm6DS7?cPYef``F)z#uC{eNT z!KTLxdk802w3uni3fN5XHd9+=_U5bKub6mEuXC*2Uo`9;3a)ZV2s9Z*y|F~wnS^~+RiYq&w7Qjr)F4hU##!;tb6N@aTO*N+ofrVHx#9K zI?8o4b+xkgHbyp=O7QSa?#xM*Gnv&srMg92bsO(uB+fU5!_7#L!5RSB4tLl9 literal 0 HcmV?d00001 diff --git a/public/static/img/oknardia_logo.svgz b/public/static/img/oknardia_logo.svgz deleted file mode 100755 index 50d30495f13fd957f8e4814281172403afc754e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1711 zcmV;g22lAQiwFP!000003)NRyZyPrdeh-lUz-(WaUJlQtW4B1{Bq-1$ZPN=y5eU*& zUUYRpQhccBfA2R#$+CkuZGk?tFwEgGBxk<)X1F@}vjN$VtRykfTN8|3aTCTcvx4P^qb=6Nc z7pIlYW_ewyi>{wuY)&iZd348ps?>UOGhplbVzlh^s+&)`6~H*2c8giJS@q*rt8U!0 z{!_K-t~Y<7($7ZIyT>e+n|{`ByRYAlhJJJNRQ=iygI>KIy5sJ$n=dAlr)oU(%X?GR z<42c$clGJw`m{32sF+%-QVy6efE-^B{rtE0!9qFbMphYObu#IGU2{jBh@Wb6vxKwk zNHboqMF(q7em*;Y_WIe+GEzsdk<{;O>G4ONe9q~Q!;0CjoX7L<{Osw$q4{FI?N*CB zx^}Po;yM3)P}luE-Cuqw?lj_$_}J{7JejI~a$0>py6IMLu8pzg4HXwp5U9~)v>Azl za1G7!v-3Ab23q!1O;KJhhMVbPj=+r8ARjwjspX=dZ!qFu)Ch(|r8df2GJC<(4h;?7=MDH#3*wcaZ4!;qO5+6Sd6I_W@eXB3>W&JEfTRtPE-JZn0q%Fq*r zl&~>GQq(#bwu(oZQc`C7um|?w0Y#f?qNJn)EEM@bhmH?Xk+bg5ktOo&p(ERQ>9*r+ zD%)>6y!5a^?v6ney&RoWk!?z~k4d$Z>ky1co{u5iN_`@~CMyI) zhrp4+GMkx2%IV}?EgpdS;EJgO766ka7S@0^H7KbqAY~%qCQCs~zzv$uY?)u#L2e%a z(%b^sg2aB%5!4-PC+@-LC>Z&SyU<`7__P7-08AtwfYEkll(lxyOl8FgW5j8Yndpp< z^%j`HS;spF@QZ2Op}!j+WV7#-6vR@y?|{7i!Md`;+$Msv zJ`YSUjvto{19md7OeSa2b_Pm=9|HrTJt~SdK|pniN682nR*DkIMwrCF;w&rCAWr-w zabl#HFwo}c{RJm1Cno*}p#-uEkD}051W0ZqFq(tNlrOV|L2P2-1@6Z4Wu*>Ev`ndj zmW$#zavdfUYpz8J{6!FI1Sdq41*SO)Eofm|PQz%pl^QMt&voX^MY1xhupNMC)D6$v z^I$C)$!vMZPbz)}18mvM9iy{{gJ3bN5V*kNHmb-JL~uk&%M}bLczf}e|{8KrZV1JlFZmT;ZE4K;wU4~ijTU?4RY9ahF1GHCi!|m26MygWe#($pyq&Z zT4n?8N(4wa=csLm_jzAzLt)216a0Ss_hwS*3Rid~zZXfl2>e0>P~$Vql{#r#8o+$y z9-^)YEozJ5me^^2OG05wi?YaN8<~=MUoB5s5sv92?-B`pYdFbe#d3wo3Dw7n6|9>} z>VoIH!s4UUB`V$hGFOw`u7ZO@$v4BjGpJ4X5s@8GjS%-P-36Z7C>y90t;2%Y8w}E8 z;24iB=Z=eYmOx6rw8|5wJ=(}m6<&Oe0)P)K%{9Gs98vR5@G$UcC{&W~2Ui*SmFQx From a00c526c872602540f68e22e99a598101974f95c Mon Sep 17 00:00:00 2001 From: erjemin Date: Thu, 14 May 2026 21:15:50 +0300 Subject: [PATCH 090/102] =?UTF-8?q?mod:=20=D0=BA=D0=B0=D1=80=D1=82=D0=B8?= =?UTF-8?q?=D0=BD=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/static/img/preloader.gif | Bin 0 -> 29519 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100755 public/static/img/preloader.gif diff --git a/public/static/img/preloader.gif b/public/static/img/preloader.gif new file mode 100755 index 0000000000000000000000000000000000000000..82fe34f566c02ee5fb25c0e6ceb4fa6c3c01738f GIT binary patch literal 29519 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 P+7DxnzwQ1XIrP5(C^Q?} literal 0 HcmV?d00001 From 09f9e7ec6aa6451acf1a001d9e5546c59efc0f3f Mon Sep 17 00:00:00 2001 From: erjemin Date: Thu, 14 May 2026 21:52:14 +0300 Subject: [PATCH 091/102] =?UTF-8?q?mod:=20SEO=20=D0=B8=20JSON-LD=20+=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D1=85?= =?UTF-8?q?=D0=BB=D0=B5=D0=B1=D0=BD=D1=8B=D0=B5=20=D0=BA=D1=80=D0=BE=D1=88?= =?UTF-8?q?=D0=BA=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oknardia/templates/seria_info/all_stat.html | 107 +++++++++++++++++--- 1 file changed, 93 insertions(+), 14 deletions(-) diff --git a/oknardia/templates/seria_info/all_stat.html b/oknardia/templates/seria_info/all_stat.html index 417cdb1..3e1969d 100755 --- a/oknardia/templates/seria_info/all_stat.html +++ b/oknardia/templates/seria_info/all_stat.html @@ -3,17 +3,17 @@ {% load filters %} {% load humanize %} -{% block Title %} Статистика типового строительства СССР и России.{% endblock %} +{% block Title %} Статистика типовых серий домов в России | Панельное строительство{% endblock %} {% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %} -{# block Date4Meta %}{{ META_DATA_PUBLISH|date:"Y-m-d" }}{% endblock #} +{% block Description %}Статистика типового строительства в России: анализ распределения панельных домов по сериям и регионам. Данные о 18228 зданиях, общей площади жилого фонда, графиках ввода в эксплуатацию. Здания серий: {% for CountSeria in SERIA_NAV_DIM %}{{ CountSeria.SERIA_R }}{% if not forloop.last %}, {% endif %}{% endfor %}.{% endblock %} -{# block Last4Meta %}{{ META_DATA_PUBLISH|date:"Y-m-d" }}{% endblock #} +{% block Keywords %}типовые серии домов, панельное строительство, статистика жилого фонда, каталог типовых зданий, распределение серий по регионам, статистика типовых домов, кирпичные дома, износ жилого фонда, площадь жилого фонда, количество зданий, годы возведения, анализ панельной застройки{% endblock %} -{% block Description %}Статистика типового строительства СССР и России. Географи, график ввода в эксплуатацтяю, метраж. Здания проектов серии: {% for CountSeria in SERIA_NAV_DIM %}{{ CountSeria.SERIA_R }}{% if not forloop.last %}, {% endif %}{% endfor %}.{% endblock %} +{% block Author4Meta %}: Статистика типовых серий домов «Окнардия»{% endblock %} -{% block Keywords %}типовые проекты зданий, панельное строительство, {% for CountSeria in SERIA_NAV_DIM %}серия {{ CountSeria.SERIA_R }}, {{ CountSeria.SERIA_R }}, {% endfor %}, года простойки, регионы построки, распространенность{% endblock %} +{% block CopyrightAuthor4Meta %}: Статистика типовых серий домов «Окнардия»{% endblock %} {% block Top_JS1%} {% endblock %} +{% block Top_Meta1 %}{# #} + {# Удалить: itemprop microdata, rel=standout, twitter:domain — устаревшие теги #} + + + + + + + + + + + + + + + + + + + + + + + +{# #}{% endblock %} + +{% block ADD_TO_HEAD %} + {# JSON-LD: страница статистики типовых серий — CollectionPage + BreadcrumbList + DataCatalog #} + + +{% endblock %} + {% block Main_Content %}
    +{# Хлебные крошки: НАЧАЛО #} +
    +
    + +
    +
    +{# Хлебные крошки: КОНЕЦ #} +

    Типовые серии домов в базе «Окнардия»

    @@ -38,15 +126,6 @@ DimColor = []; for (i1=0; i1<=step; i1++ ) for (i2=step; i2>=0; i2-- ) for (i3=0; i3<=step; i3++ ) { - //document.write("  -- "); - //document.write( "#" - // + ("00"+(i1*step_tone).toString(16)).substr(-2) - // + ("00"+(i2*step_tone).toString(16)).substr(-2) - // + ("00"+(i3*step_tone).toString(16)).substr(-2) + "
    "); DimColor.push("#" + ("00"+(i1*step_tone).toString(16)).substr(-2) + ("00"+(i2*step_tone).toString(16)).substr(-2) From b1a9b2649f8f992ccdcf875d32c2c8045ae15f8c Mon Sep 17 00:00:00 2001 From: erjemin Date: Fri, 15 May 2026 07:42:10 +0300 Subject: [PATCH 092/102] =?UTF-8?q?add:=20FAQ=20+=20SEO=20=D0=B8=20JSON-LD?= =?UTF-8?q?=20+=20=20=D1=85=D0=BB=D0=B5=D0=B1=D0=BD=D1=8B=D0=B5=20=D0=BA?= =?UTF-8?q?=D1=80=D0=BE=D1=88=D0=BA=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oknardia/templates/tariff.html | 600 ++++++++++++++++++++++++++++++++- 1 file changed, 592 insertions(+), 8 deletions(-) diff --git a/oknardia/templates/tariff.html b/oknardia/templates/tariff.html index 5969fa3..b8c6bd4 100755 --- a/oknardia/templates/tariff.html +++ b/oknardia/templates/tariff.html @@ -1,6 +1,6 @@ {% extends "base.html" %}{% load static %} -{% block Title %}Тарифы и услуги{% endblock %} +{% block Title %}Тарифы и услуги маркетплейса Окнардия | Цены на размещение предложений окон{% endblock %} {% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %} @@ -8,9 +8,13 @@ {% block Last4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"Y-m-d" }}{% else %}{% now "c" %}{% endif %}{% endblock %} -{% block Description %}Тарифы и услуги маркетплейс-агрегатора Окнардия. Размещение предложений пластиковых и деревянных окон, обновление цен на окна, рекламные баннеры и виджеты на сайт оконной компании.{% endblock %} +{% block Description %}Тарифы размещения предложений по установке пластиковых и деревянных окон на маркетплейсе Окнардия. Пять тарифных планов: альфа (бесплатно), бета, дельта, мю (медийный), омега (виджет). Обновление цен, баннеры, публикации в блог, электронные заявки.{% endblock %} -{% block Keywords %}типовые проекты зданий, панельное строительство, {% for CountSeria in SERIA_NAV_DIM %}серия {{ CountSeria.SERIA_R }}, {{ CountSeria.SERIA_R }}, {% endfor %}, года простойки, регионы построки, распространенность{% endblock %} +{% block Keywords %}тарифы окнардия, размещение предложений окон, цены на окна, маркетплейс окон, услуги для оконных компаний, виджет окон, баннеры на сайт, каталог окон, установка окон, продажа пластиковых окон, медийное продвижение окон{% endblock %} + +{% block Author4Meta %}: Тарифы и услуги маркетплейса «Окнардия»{% endblock %} + +{% block CopyrightAuthor4Meta %}: Тарифы маркетплейса «Окнардия»{% endblock %} {% block Top_JS1%} {% endblock %} +{% block Top_Meta1 %}{# #} + {# Удалить: itemprop microdata, rel=standout, twitter:domain — устаревшие теги #} + + + + + + + + + + + + + + + + + + + + + + + +{# #}{% endblock %} + +{% block ADD_TO_HEAD %} + {# JSON-LD: страница тарифов — CollectionPage + BreadcrumbList + PriceSpecification #} + + + +{% endblock %} + {% block Main_Content %}
    +{# Хлебные крошки: НАЧАЛО #} +
    +
    + +
    +
    +{# Хлебные крошки: КОНЕЦ #} +

    Направления сотрудничества с «Окнардия» и тарифы

    - {% if SENDER %}{% if SENDER == "Ok!" %}

    Спасибо за ваше обращение. Мы обязательно свяжемся с вами.

    {% elif SENDER == "Error!" %}

    Что-то пошло не так. Не удалось отправить e-mail. Попробуйте еще раз или используте для связи info@oknardia.ru

    {% endif %}{% endif %} + {% if SENDER %}{% if SENDER == "Ok!" %}

    Спасибо за ваше обращение. Мы обязательно свяжемся с вами.

    {% elif SENDER == "Error!" %}

    Что-то пошло не так. Не удалось отправить e-mail. Попробуйте еще раз или используете для связи info@oknardia.ru

    {% endif %}{% endif %} @@ -216,12 +494,318 @@ $(window).load(function(){let images = $('.half');images.each(function(i){$(this
    -

     

    -

    Мы открыты к сотрудничеству. Много идей в наших планах (в том числе универсальный калькулятор окон, виджет калькулятора, генератор смет и прейскурантов и еще много чего) и если у вас есть потребность в дополнительных разработках для рынка окон, будем рады обсудить возможные формы сотрудничества.

    -
    +

     

    +

    Мы открыты к сотрудничеству. Много идей в наших планах (в том числе универсальный калькулятор окон, виджет калькулятора, генератор смет и прейскурантов и еще много чего) и если у вас есть потребность в дополнительных разработках для рынка окон, будем рады обсудить возможные формы сотрудничества.

    +
    - +{# FAQ секция для SEO: НАЧАЛО #} +
    +
    +

    Часто задаваемые вопросы о тарифах и услугах

    + +
    + + {# Вопрос 1: Что такое Окнардия #} +
    + +
    +
    + Окнардия — это агрегатор (маркетплейс) для сравнения цен на установку пластиковых и деревянных + окон в зданиях типового строи­тельства России. Пользователи указывают адрес дома, система + распознаёт серию здания и выдаёт типовые размеры оконных проёмов, а затем показывает предложения + от поставщиков на установку и замену окон. +
    +
    +
    + + {# Вопрос 2: Выбор тарифа #} +
    + +
    +
    + Выбор тарифа зависит от ваших целей: +
      +
    • Альфа (бесплатно) — для тестирования и ознакомления с платформой; +
    • +
    • Бета (300₽/мес) — для базового размещения с логотипом и двумя + предло­жениями; +
    • +
    • Дельта (1500₽/мес) — для расширенного каталога с 12 наборами, + публикациями и всплытиями; +
    • +
    • Мю (500₽/мес) — для медийного продвижения с баннерами и публикациями + в блог; +
    • +
    • Омега (9000₽/мес) — полный пакет с виджетом на ваш сайт и максимум + возможностей. +
    • +
    +
    +
    +
    + + {# Вопрос 3: SEO эффект #} +
    + +
    +
    + Логотип вашей компании в ценовой выдаче содержит ссылку на ваш сайт — это мощный + источник качественных внешних ссылок (backlinks), что положительно влияет на ранжирование вашего сайта + в поисковых системах. Публикации в блог «Окнардии» также способствуют SEO за счёт + релевантного контента и внутренних ссылок. SEO-эффект сохраняется пока ваша подписка активна, плюс ещё + примерно шесть месяцев после завершения (кеширование и остаточная ценность ссылок). +
    +
    +
    + + {# Вопрос 4: Всплытия #} +
    + +
    +
    + «Всплытие» гарантирует присутствие ваших предложений в приоритетном блоке выдачи и в Rich + Snippet'ах (виджеты, острова) поисковиков. Позиция может варьи­роваться из-за сортировки по удалённости + офиса от адреса клиента, но видимость в блоке гаранти­рована. Важный бонус: поисковики + интенсивнее переинде­ксируют предложения с частыми обновлениями, что повышает вероятность появления + в поисковых сниппетах и медийных виджетах (Google и Яндекс). На плане Дельта доступно + восемь всплытий в месяц, на Омега — тоже восемь. +
    +
    +
    + + {# Вопрос 5: Обновления цен #} +
    + +
    +
    + Да, каждый тариф предусма­тривает определённое количество обновлений в месяц. Обновления + применяются ко всем проёмам и ценам выбранного набора: +
      +
    • Альфа — ⅓ обновления (в среднем один раз в три месяца);
    • +
    • Бета — одно обновление в месяц;
    • +
    • Дельта — шесть обновлений в месяц;
    • +
    • Мю — нет обновлений (фокус на медийном продвижении и баннерах); +
    • +
    • Омега — восемь обновлений в месяц.
    • +
    +
    +
    +
    + + {# Вопрос 7: Стартовая установка #} +
    + +
    +
    + Стартовая установка — это единовре­менный платёж за подготовку и размещение вашей первой + ценовой информации, настройку профиля компании, загрузку логотипа, описания компании и ваших + наборов. Стоимость варьируется от 0₽ (Альфа) до 45 000₽ (Омега) в зависимости от сложности + и объёма работ. После включения тариф переходит на ежемесячное взимание по устано­вленной + цене. +
    +
    +
    + + {# Вопрос 8: Скидки за год #} +
    + +
    +
    + Да, при оплате годовым авансом преду­смотрены щедрые скидки: +
      +
    • Бета — 30% скидка (2 520₽ вместо 3 600₽);
    • +
    • Дельта — 40% скидка (13 800₽ вместо 23 000₽);
    • +
    • Мю — 20% скидка (5 200₽ вместо 6 500₽);
    • +
    • Омега — 35% скидка (70 200₽ вместо 108 000₽).
    • +
    + Авансовый платёж включает стартовую установку и полный год взимания ежемесячного тарифа. +
    +
    +
    + + {# Вопрос 9: Длительность эффекта #} +
    + +
    +
    + Логотип с ссылкой на ваш сайт работает пока ваша подписка активна. После завершения подписки + SEO-эффект продолжает сохраняться примерно 6 месяцев благодаря кешированию поисковыми системами и остаточной + ценности внешних ссылок. Это означает, что даже если вы временно прекратили размещение, ваш сайт + получает положи­тельный эффект от ссылок ещё полгода. +
    +
    +
    + + {# Вопрос 10: Публикации в блоге #} +
    + +
    +
    + Логотип с ссылкой на ваш сайт работает пока ваша подписка активна. После завершения подписки + SEO-эффект продолжает сохраняться примерно шесть месяцев благодаря кешированию поисковыми системами + и остаточной ценности внешних ссылок. Это означает, что даже если вы временно прекратили + размещение, ваш сайт получает положи­тельный эффект от ссылок ещё полгода. +
    +
    +
    + + {# Вопрос 11: Баннеры и SEO #} +
    + +
    +
    + Баннеры имеют мощный престижный эффект: ваша компания отображается между блоками ценовых предложений и на страницах + каталога, украшая платформу и позиционируя вас как ведущего поставщика. Благодаря баннерам можно + практически «забренди­ровать» весь сайт так, что он будет воспри­ниматься почти как собственный + проект вашей компании. Баннеры размером 100% × 175px могут быть графическими, видео или HTML с CSS/JS + анимацией. Доступны на плане Мю (медийный). Кроме того, баннеры на Окнардии содержат прямые + HTML-ссылки (без редиректов и JavaScript), что позволяет поисковикам их полностью индекси­ровать. + Каждый баннер — это полноценный backlink на ваш сайт, дающий SEO-эффект. +
    +
    +
    + + {# Вопрос 12: Виджет #} +
    + +
    +
    + «Виджет. ОКНАРДИЯ» — это встраиваемый фрейм-блок (iframe), который устана­вливается на сайт + поставщика окон. Виджет позволяет посетителям указать адрес дома и выбрать квартиру, после чего видят + типовые размеры проёмов, схемы открывания и ваши предложения (наборы окон) с ценами — всё + прямо на вашем сайте. Это повышает конверсию и удержание клиента. Пример и инструкции по установке + доступны на widget.oknardia.ru (примечание: + сайт может быть временно недоступен). +
    +
    +
    + + {# Вопрос 13: Специальные пожелания и гибкость #} +
    + +
    +
    + «Окнардия» — гибкий и открытый к сотрудни­честву проект. Если вас интересуют специальные условия, + кастомные решения, расширенные возможности или неста­ндартные формы партнёрства, свяжитесь + с командой проекта. Мы обсуждаем любые предложения: униве­рсальные калькуляторы окон, + специали­зированные виджеты, интеграция ваших систем, генераторы смет и прейску­рантов, анали­тические + отчёты и многое другое. Ваши идеи и пожелания — важная часть развития платформы. +
    +
    +
    + + {# Вопрос 14: Типовые размеры #} +
    + +
    +
    + Размеры окон в каталоге зависят от серии типового строи­тельства. Система распознаёт серию по адресу + и выдаёт все типовые раскладки проёмов и схемы открывания для данной серии (например, П-44, + 5-этажка, кирпичный и т. п.). На каждый набор наборов окон вы можете разместить + предложения под разные комплектации: разные профили, стеклопакеты, фурнитуру, варианты монтажа и отделки. +
    +
    +
    + +
    + +
    +
    +{# FAQ секция для SEO: КОНЕЦ #} + +

  • - + {% endblock %} @@ -99,25 +90,10 @@ {% block Bottom_Nav_Bar %} {% endblock %} + +{% endblock %} {# ######################################## Нижнее меню-футер КОНЕЦ ######################################## #} {# Модальное окно SOCIAL LOGIN НАЧАЛО #} diff --git a/public/static/js/analytics.js b/public/static/js/analytics.js new file mode 100644 index 0000000..b04609d --- /dev/null +++ b/public/static/js/analytics.js @@ -0,0 +1,98 @@ +// analytics.js — Аналитика и счетчики посещений +// Версия: 1.0 | Дата: 2026-05-15 +// Содержит: Google Analytics 4, Yandex.Metrika, Top.Mail.Ru + +(function() { + 'use strict'; + + // ============================================================================ + // Google Analytics 4 (GA4) + // ID: GT-PBKH27H3 + // ============================================================================ + (function() { + var script = document.createElement('script'); + script.async = true; + script.src = 'https://www.googletagmanager.com/gtag/js?id=GT-PBKH27H3'; + document.head.appendChild(script); + + window.dataLayer = window.dataLayer || []; + function gtag(){dataLayer.push(arguments);} + window.gtag = gtag; + gtag('js', new Date()); + gtag('config', 'GT-PBKH27H3'); + })(); + + // ============================================================================ + // Yandex.Metrika (Яндекс.Метрика) + // ID: 32997984 + // ============================================================================ + (function() { + window.ym = window.ym || function(){ + (window.ym.a = window.ym.a || []).push(arguments); + }; + window.ym.l = 1 * new Date(); + + // Загружаем скрипт Метрики + var script = document.createElement('script'); + script.type = 'text/javascript'; + script.src = 'https://mc.yandex.ru/metrika/tag.js'; + document.head.appendChild(script); + + // Инициализируем Метрику + window.ym(32997984, 'init', { + trackHash: true, + clickmap: true, + referrer: document.referrer, + url: location.href, + accurateTrackBounce: true, + trackLinks: true + }); + })(); + + // ============================================================================ + // Top.Mail.Ru counter (Рейтинг@Mail.ru) + // ID: 2018432 + // ============================================================================ + (function() { + var _tmr = window._tmr || (window._tmr = []); + _tmr.push({ + id: "2018432", + type: "pageView", + start: (new Date()).getTime() + }); + + (function(d, w, id) { + if (d.getElementById(id)) return; + var ts = d.createElement("script"); + ts.type = "text/javascript"; + ts.async = true; + ts.id = id; + ts.src = "https://top-fwz1.mail.ru/js/code.js"; + + var f = function() { + var s = d.getElementsByTagName("script")[0]; + s.parentNode.insertBefore(ts, s); + }; + + if (w.opera == "[object Opera]") { + d.addEventListener("DOMContentLoaded", f, false); + } else { + f(); + } + })(document, window, "tmr-code"); + + // Добавляем изображение для noscript + if (!window.noScriptAdded) { + window.noScriptAdded = true; + var noscriptDiv = document.createElement('div'); + noscriptDiv.style.display = 'none'; + noscriptDiv.innerHTML = 'Top.Mail.Ru'; + document.body.appendChild(noscriptDiv); + } + })(); + +})(); + +// Экспортируем gtag в глобальный контекст для возможности использования в коде +// window.gtag доступна через глобальную переменную + From 468d8e8fc48d1c2851a8a0bfb899708d61559c86 Mon Sep 17 00:00:00 2001 From: erjemin Date: Fri, 15 May 2026 13:20:48 +0300 Subject: [PATCH 100/102] =?UTF-8?q?mod:=20=D0=B4=D1=80=D0=BE=D0=BF-=D0=B4?= =?UTF-8?q?=D0=B0=D1=83=D0=BD=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BD/=D0=BB?= =?UTF-8?q?=D0=BE=D0=B3=D0=B0=D1=83=D1=82=20=D0=B2=D1=8B=D0=BD=D0=B5=D1=81?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=B2=D0=BE=20=D0=B2=D0=BD=D0=B5=D1=88=D0=BD?= =?UTF-8?q?=D0=B8=D0=B9=20`auth.js`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oknardia/templates/base.html | 25 ++------------------ public/static/js/auth.js | 45 ++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 23 deletions(-) create mode 100644 public/static/js/auth.js diff --git a/oknardia/templates/base.html b/oknardia/templates/base.html index bc1b022..f58823b 100755 --- a/oknardia/templates/base.html +++ b/oknardia/templates/base.html @@ -25,29 +25,8 @@ {% block Top_CSS1 %}{% endblock %}{% block Top_CSS2 %}{% endblock %}{% block Top_CSS3 %}{% endblock %} {# #} {# #}{% block Top_JS1 %}{% endblock %}{% block Top_JS2 %}{% endblock %}{% block Top_JS3 %}{% endblock %}{% block Top_JS4 %}{% endblock %}{% block Top_JS5 %}{% endblock %}{% block Top_Meta1 %}{% endblock %} - {# Аналитика: Google Analytics 4, Yandex.Metrika, Top.Mail.Ru #} - - {% block ADD_TO_HEAD %}{% endblock %} + {# Аналитика: Google Analytics 4, Yandex.Metrika, Top.Mail.Ru #} + {# Модуль авторизации: управление dropdown меню логина/логаута #}{% block ADD_TO_HEAD %}{% endblock %} diff --git a/public/static/js/auth.js b/public/static/js/auth.js new file mode 100644 index 0000000..b2f34f3 --- /dev/null +++ b/public/static/js/auth.js @@ -0,0 +1,45 @@ +/** + * Модуль авторизации: управление dropdown меню логина/логаута + * Открывает/закрывает меню авторизации с загрузкой контента по AJAX + * + * + * Открывает или закрывает dropdown меню логина/логаута + * При первом открытии загружает содержимое меню по AJAX + * + * @param {Event} event - объект события клика (опционально) + * @returns {boolean} false - для предотвращения перезагрузки страницы + */ +function openLoginLogout(event) { + // Предотвращаем переход по ссылке + if (event) event.preventDefault(); + + // Получаем контейнер меню авторизации + var $box = $('#login-logout'); + + /** + * Переключает видимость dropdown'а + * Сначала ищет Bootstrap toggle, если нет — вызывает click + */ + function openDropdown() { + var $toggle = $box.find('.dropdown-toggle').first(); + if (!$toggle.length) return; + if (typeof $toggle.dropdown === 'function') + $toggle.dropdown('toggle'); + else + $toggle.trigger('click'); + } + + // Если контент ещё не загружен, загружаем его по AJAX + if (!$box.data('loginLoaded')) { + $box.load('/login-logout', function () { + $box.data('loginLoaded', true); + openDropdown(); + }); + } else { + // Если уже загружен, просто переключаем видимость + openDropdown(); + } + + return false; +} + From ec82d4d36f96d24561ad81b7c904b2a1cf19b44c Mon Sep 17 00:00:00 2001 From: erjemin Date: Fri, 15 May 2026 13:59:07 +0300 Subject: [PATCH 101/102] =?UTF-8?q?mod:=20=D0=BF=D1=80=D0=BE=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B5=D0=BA=D1=82=20=D0=B8=20=D0=BF=D0=BB=D0=B0?= =?UTF-8?q?=D0=BD=D1=8B...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 112 +++++++++++++++++++++-------------------------------- ROADMAP.md | 23 ----------- 2 files changed, 44 insertions(+), 91 deletions(-) delete mode 100644 ROADMAP.md diff --git a/README.md b/README.md index de34ebb..31aae4d 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,47 @@ # Оконный агрегатор «Окнардия» -### Переделка под Python 3.12 и Django 5.2 +**Окнардия** — веб-сервис для сравнения цен на установку оконных конструкций в типовых многоквартирных домах России. -#### Планы, задачи, маркеры и идеи на будущее: +* **Пользователь, желающий заменить окна**, вводит адрес дома → система распознаёт серию строения → выдаёт типовые размеры оконных проёмов → показывает предложения от поставщиков на установку (замену) окон, с ценами, характеристиками компонентов и условиями. + Алгоритмические рейтинги защищают потенциального покупателя от возможных накруток отзывов и позволяют сравнивать предложения по объективным характеристикам. +Для **производителей и поставщиков окон** платформа — это канал прямого доступа к целевой аудитории в конкретном районе города. +Они размещают свои предложения (компоненты, наборы, цены) и конкурируют на равных условиях. Масштабируемый каталог позволяет охватить +множество адресов типовой застройки, а система алгоритмического рейтинга (нет отзывов клиентов, а значит накрутка отзывов невозможна) ранжирует предложения исключительно по характеристикам и условиям предложений. + +**Стек**: Python 3.12+ · Django 5.2+ · SQLite/MariaDB · Bootstrap 3.3 · jQuery · Yandex Maps API + +--- + +### Переделка под Python 3.12 и Django 5.2.13 (апрель-май 2026) + +Сделано: +* Переход проекта под Python 3.12 и Django 5.2.13, удаление устаревших зависимостей, унификация функций и хелперов. * Перехода на SQLite (возможно, после нагрузочного тестирования переход обратно на mariaDB или PostgreSQL). -* Переделать все raw SQL-запросы на ORM для лучшей поддержки разных СУБД в будущем. -* Актуальная SEO- и LLM-оптимизация: добавить разметку schema.org, улучшить мета-теги, оптимизировать URL-структуру и канонические ссылки. -* Длялегаси-страниц (шаблоны и вьюхи) поэтапно проверять (если нужно убирать) старые SEO-хвосты вроде `last_update` / `PUB_DAT` / `Date4Meta` / `Last4Meta`: если дата не несёт смысловой нагрузки, лучше оставлять базовые `{% now %}` из `base.html`, а не тащить лишний контекст во вьюху. -* Шаблоны `report/report_last_user_visit.html` и `report/report_log_user_visit.html` сделать подгружаемыми через AJAX или (использовать HTMX, напрмемер) и убрать вызовы `get_last_user_visit_list` (переделать чтобьы формировалось на стороне клиента из куки. -* Все действия из сервисной `/service/` вынести в management-команды. -* Перейти на `poetry` для управления зависимостями и виртуальным окружением. -* Перейти на Django 6.* -* Улучшение в блогах (добавить SEO-поля, Codemirror 6, Типограф etpgrfо, слаги через BS4 и pytils). +* Переделаны все raw SQL-запросы на ORM для лучшей поддержки разных СУБД в будущем. +* Все сервисные функции из `service/` вынесены в management-команды. +* Переработаны все шаблоны с целью SEO- и LLM-оптимизацим: более корректные meta-теги, разметка schema.org + через `JSON-LD`, оптимизирована структура "хлебных крошек" и изменение роутинга. +* Облегчение шаблона `base.html`: блок логин-логаут подгружается через AJAX только по клику, модуль авторизации + вынесен в отдельный JS-файл (`/static/js/auth.js`), счетчики посещений перенесены в подгружаемый JS. +* Шаблоны `report/report_last_user_visit.html` больше не требуют серверного рендеринга, а формируются + на стороне клиента из кук. +* Добавлены SEO-поля блогов. + +### Планы, задачи, маркеры на будущее: + +* Оптимизация кеширования pre-render шаблонов: настроить cronjob для ежедневной/еженедельной очистки `seria_info/prepared/`. +* Улучшение администрирования в блогах (Codemirror 6, Типографф). * Упаковать всё в контейнеры: бакенд Django + Gunicorn + WhiteNoise... * CI/CD через gitea + Watchtower для автоматического деплоя при пуше тега `v*.*.*` в репозиторий. -* Фронтенд: перейти на новый Bootstrap 5, добавить интерактивные элементы через HTMX + Alpine, сделать адаптивность для мобильных устройств.Убрать jQuery и старые плагины, заменить на современные аналоги. +* Фронтенд: перейти на новый Bootstrap 5, добавить интерактивные элементы через HTMX + Alpine, сделать адаптивность для мобильных устройств. Убрать jQuery и старые плагины, заменить на современные аналоги. +* Оптимизация для мобильных устройств: адаптивный дизайн, оптимизация изображений, улучшение производительности. +* Переход проекта под Python 3.14 и Django 6.x. +* Нагрузочное тестирование (рпи необходимости переход с SQLite на PostgreSQL в продакшене). # См. также: * [`MANAGEMENT_RUNBOOK.md`](MANAGEMENT_RUNBOOK.md) – единый runbook по management-командам и batch-операциям, сниппеты. -* [`ROADMAP.md`](ROADMAP.md) – дорожная карта переделки (весна 2026) с описанием выполненных шагов (ключевые коммиты). * [`AGENTS.md`](AGENTS.md) – контекст проекта для AI-ассистентов (архитектура, конвенции, рабочие сценарии). * [`SETUP.md`](SETUP.md) – пошаговая настройка окружения, запуск проекта и базовые команды разработки. @@ -40,63 +61,18 @@ Эти картинки создаются автоматически. Можно не удалять. Даже если какая-то схема открывания или размер проёма станет неактуальным, лишняя картинка просто будет лежать в папке (вдруг такой проём появится снова). -#### Кеширование шаблонов +#### Кеширование pre-render шаблонов серий домов -В папке `oknardia/oknardia/templates/seria_info/prepared` создаются пре-рендер шаблоны с информацией о сериях домов. +В папке `oknardia/templates/seria_info/prepared/` создаются пре-рендер HTML-шаблоны с информацией о сериях домов. -Эти шаблоны надо периодически удалять. Они нужны для скорости. Но если меняются данные по серии, размерам окон, появляются -новые коммерческие предложения -- их надо удалять и тогда построятся новые. Вообще на быстрых серверах скорость может -не быть проблемой, так что возможно стоит просто настроить через crone ежедневное или еженедельное удаление этих -пре-рендер шаблонов. При обращении к соответсвующий страницам эти шаблоны будут пересозданы автоматически. +Эти шаблоны создаются при первом обращении к странице серии и хранятся для ускорения последующих запросов. +**Важно**: их надо периодически удалять, особенно если меняются: +* данные по сериям и размерам окон +* коммерческие предложения и цены +* рейтинги компонентов + +**Рекомендация**: настроить cronjob на ежедневное или еженедельное удаление этих файлов. При обращении к соответствующим +страницам эти шаблоны будут пересозданы автоматически. На быстрых серверах можно вообще отключить кеширование, если оно +не критично для производительности. -### Некоторые заметки относительно разработки (DEV) на macOS: - -Т.к. MariaDB "сидит" в контейнере Dockers могут возникнуть трудности при установке коннектора к базам данных MySQL/MariaDB. Примерно такие: -```txt -Collecting mysqlclient - Using cached mysqlclient-2.1.1.tar.gz (88 kB) - Preparing metadata (setup.py) ... error - error: subprocess-exited-with-error - - × python setup.py egg_info did not run successfully. - │ exit code: 1 - ╰─> [16 lines of output] - /bin/sh: mysql_config: command not found - /bin/sh: mariadb_config: command not found - /bin/sh: mysql_config: command not found - Traceback (most recent call last): - File "", line 2, in - File "", line 34, in - File "/private/var/folders/jh/gbhf3vk11svg9w4mvhntlb7c0000gn/T/pip-install-nu5ar2g2/mysqlclient_a07e3d9dbe514c7793dc71f1183dda19/setup.py", line 15, in - metadata, options = get_config() - File "/private/var/folders/jh/gbhf3vk11svg9w4mvhntlb7c0000gn/T/pip-install-nu5ar2g2/mysqlclient_a07e3d9dbe514c7793dc71f1183dda19/setup_posix.py", line 70, in get_config - libs = mysql_config("libs") - File "/private/var/folders/jh/gbhf3vk11svg9w4mvhntlb7c0000gn/T/pip-install-nu5ar2g2/mysqlclient_a07e3d9dbe514c7793dc71f1183dda19/setup_posix.py", line 31, in mysql_config - raise OSError("{} not found".format(_mysql_config_path)) - OSError: mysql_config not found - mysql_config --version - mariadb_config --version - mysql_config --libs - [end of output] - - note: This error originates from a subprocess, and is likely not a problem with pip. -error: metadata-generation-failed - -× Encountered error while generating package metadata. -╰─> See above for output. - -note: This is an issue with the package mentioned above, not pip. -hint: See above for details. -``` - -Починить проблему можно воспользовавшись ([рецептом со StackOverflow](https://stackoverflow.com/a/44268445/1504067)): -```shell -brew install mariadb-connector-c -# sudo ln -s /usr/local/opt/mariadb-connector-c/bin/mariadb_config /usr/local/bin/mysql_config - -pip install mysqlclient - -# rm /usr/local/bin/mysql_config -brew unlink mariadb-connector-c -``` \ No newline at end of file diff --git a/ROADMAP.md b/ROADMAP.md deleted file mode 100644 index 5e275b0..0000000 --- a/ROADMAP.md +++ /dev/null @@ -1,23 +0,0 @@ -# Дорожная карта переделки 2026 для проекта Oknardia - -# Готово: - -* Изменена база данных используемая в проекте (SQLite вместо MariaDB). -* Окружение проекта теперь настраивается через `poetry` вместо `pip` и `requirements.txt`. -* Проект получает настройки и секреты через переменные окружения (`.env`) вместо `my_secret*.py`. -* Рефакторинг создания `sitemap.xml`: raw ⟶ ORM, создание через Django-команду `generate_sitemaps` в медиа-файлы. -* Рефакторинг URL `/catalog/profil/`: raw SQL ⟶ ORM, убран `last_update`, измененs SEO `description` и `keywords`. -* Распилен `oknardia/web/catalog.py` на тематические модули (`catalog_companies.py`, `catalog_profiles.py`, `catalog_series.py`, `catalog_openings.py`) с вынесением общей логики в `catalog_utils.py`; маршруты обновлены без изменения внешних URL. Улучшены SEO-атрибуты, и добавлена разметка shema.org. -* Рефакторинг `catalog_profile_model` (`/catalog/profile/...`): raw SQL ⟶ ORM, упрощена логика, вынесены helper-функции, сокращено дублирование расчёта цветов рейтинга, нормализована подготовка `LIST_OTHER`/`MERCHANTS`/`PROFILES`/`PROFILE_DETAIL`, сохранена совместимость шаблонов. Улучшены SEO-атрибуты, и добавлена разметка shema.org. -* Рефакторинг `catalog_profile_manufacture` (`/catalog/profile/-`): упрощена валидация URL, убран дублирующий код маппинга для `PROFILES` и `MERCHANTS` через общие хелперы, стандартизирован хвост контекста (`LAST_VISIT`, `LOG_VISIT`, `ticks`) через `_append_visit_context`. Улучшены SEO-атрибуты, и добавлена разметка shema.org. -* Рефакторинг `catalog_seria` (`/catalog/seria/`): raw SQL ⟶ ORM для списка корневых серий, подготовка данных упрощена, хвост контекста с визитами и `ticks` вынесен в общий helper внутри `catalog_series.py`. Улучшены SEO-атрибуты, и добавлена разметка shema.org. -* Рефакторинг `catalog_seria_info` и связанных функций в `catalog_series.py`: raw SQL ⟶ ORM (`catalog_seria_info`, `seria_nav`, `seria_info_year`, `seria_info_geo_code`), снижена нагрузка на БД за счёт предвыборки и переиспользования агрегатов (`quantities_by_pair`, `offers_by_window`), добавлены безопасные fallback-значения для пустых выборок, включена потоковая обработка `iterator(chunk_size=500)` для гео-данных, обновлены комментарии и docstring под фактическую логику (таблица окон, pre-render light/heavy шаблонов, гео+статистика серии). Улучшены SEO-атрибуты, и добавлена разметка shema.org. -* Добавлена management-команда `regenerate_seria_prerender` для оффлайн-пересборки pre-render шаблонов `catalog_seria_info` (все или выбранные root-серии), с режимами `--dry-run` и `--force`; серверный reload (Gunicon? uWSGI или что там еще будет) должен быть вынесен из кода приложения в оркестрацию (cron/systemd/deploy step). -* Рефакторинг `standard_opening`: raw SQL -> ORM, упрощена дедублекация, убраны лишние запросы и переменные контекста, добавлены комментарии, SEO-описание и keywords, стандартизирован хвост контекста с визитами и `ticks` через общий helper внутри `catalog_openings.py`. Улучшены SEO-атрибуты и добавлена разметка shema.org. -* Рефакторинг `catalog_company` и `catalog_company_detail` (`/catalog/company`): raw SQL → ORM для получения списка компаний и их наборов, вынесены вспомогательные функции (`_get_company_statistics`, `_get_company_sets_detail`, `_format_company_for_template`, `_format_set_for_template`, `_clean_text_field`, `_lowercase_first_char`), упрощена логика форматирования данных, добавлены подробные комментарии и docstring для каждой функции, использованы `select_related` и `annotate` для оптимизации запросов, добавлена защита от `Http404` при неправильных slugs. Улучшены SEO-атрибуты, и добавлена разметка shema.org. -* Рефакторирнг главной страницы каталога (`/catalog/`): Улучшены SEO-атрибуты, и добавлена разметка shema.org. -* Рефакторинг страницы цен одного окна: введён новый канонический SEO-роут внутри `/catalog/standard_opening/`, старый URL сохранён как legacy и переведён на постоянный 301-редирект; в `prices.py` для ветки одного окна raw SQL заменён на ORM; в шаблонах `price_offers_for_one_window.html` и `price_offers_for_one_window_frame.html` улучшены SEO-атрибуты и добавлена JSON-LD разметка `schema.org` (`BreadcrumbList`, `Product`, `ItemList`, `Offer`) с размером окна, ценами и ключевыми характеристиками предложений; добавлены тесты `web.test_prices`. -* Рефакторинг страницы ценовых предложений: в `prices.py` для ветки ценовых предложений raw SQL заменён на ORM, добавлены комментарии и docstring, оптимизированы запросы с помощью `select_related` и `annotate`, добавлена обработка случая с отсутствующими предложениями; в шаблоне `price_offers.html` улучшены SEO-атрибуты и добавлена JSON-LD разметка `schema.org` (`BreadcrumbList`, `Product`, `ItemList`, `Offer`) с размером окна, ценами и ключевыми характеристиками предложений; добавлены тесты `web.test_prices`. Добавлены хлебные крошки в шаблон. -* Замена рутинга для ценовых предложений: старый URL `(?P/)/` заменен на `/price/seriaID--/appartID/addressID--` что, прредположительно поможет SEO т.к. соответвует новым хлебным крошкам. Сделал редирект со старого URL на новый внутри `prices.py` и обновил ссылки в шаблонах, где были прямые ссылки на старый URL. -* -* From 7f81a79862ffb8fc4f88a74744beda76da343e7b Mon Sep 17 00:00:00 2001 From: erjemin Date: Fri, 15 May 2026 13:59:46 +0300 Subject: [PATCH 102/102] minor: + --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 31aae4d..f078496 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ * **Пользователь, желающий заменить окна**, вводит адрес дома → система распознаёт серию строения → выдаёт типовые размеры оконных проёмов → показывает предложения от поставщиков на установку (замену) окон, с ценами, характеристиками компонентов и условиями. Алгоритмические рейтинги защищают потенциального покупателя от возможных накруток отзывов и позволяют сравнивать предложения по объективным характеристикам. -Для **производителей и поставщиков окон** платформа — это канал прямого доступа к целевой аудитории в конкретном районе города. +* Для **производителей и поставщиков окон** платформа — это канал прямого доступа к целевой аудитории в конкретном районе города. Они размещают свои предложения (компоненты, наборы, цены) и конкурируют на равных условиях. Масштабируемый каталог позволяет охватить множество адресов типовой застройки, а система алгоритмического рейтинга (нет отзывов клиентов, а значит накрутка отзывов невозможна) ранжирует предложения исключительно по характеристикам и условиям предложений.