Files
2022_oknardia/oknardia/web/report2.py
T

88 lines
4.2 KiB
Python

# -*- coding: utf-8 -*-
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, sanitize_slug
from time import time
import json
def ratings(request: HttpRequest) -> HttpResponse:
""" Страница "Рейтинги" в главном меню
Т.к. пока есть данные и рейтинги только профилей, то делаем редирект на неё
:param request: HttpRequest -- входящий http-запрос
:return: HttpResponse -- исходящий http-ответ
"""
return redirect('/stat/rating/profiles_rank/')
def profiles_rating(request: HttpRequest) -> HttpResponse:
""" Формирует таблицу с рейтингами оконных профилей
:param request: HttpRequest -- входящий http-запрос
:return: HttpResponse -- исходящий http-ответ
"""
time_start = time()
template = "rating/profiles_rating.html"
q_pvc_profiles = PVCprofiles.objects.order_by("fProfileRating", "fProfileSeals", "fProfileHeatTransf",
"fProfileSoundproofing", "iProfileHeight", "iProfileRabbet",
"iProfileGlazingThickness", "iProfileThickness", "iProfileCameras")
table = []
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: dict[str, object] = {'KEYS': keys}
for profile in q_pvc_profiles:
try:
received_json = json.loads(profile.sProfileDescription)
except json.decoder.JSONDecodeError:
continue
if KEY_RATING in received_json:
rating_real = True
rating = received_json[KEY_RATING]
color = int(255 - normalize(profile.fProfileRating) * 255)
rating_color = f"{color},255,{color}"
rating_color2 = False
elif KEY_RATING_VIRTUAL in received_json:
rating_real = False
rating = received_json[KEY_RATING_VIRTUAL]
color = int(255 - normalize(profile.fProfileRating) * 64)
color2 = int(220 - normalize(profile.fProfileRating) * 127)
rating_color = f"{color},{color},{color}"
rating_color2 = f"{color2},{color2},{color2}"
else:
continue
# if keys == []:
# keys = sorted(r.keys())
# to_template.update({'KEYS': keys})
k_arr = []
for key in keys:
if rating_real:
# Это рейтинг на профили, по которым есть ценник (зелененький)
color = int(255 - rating[key] * 255)
k_arr.append({"COLOR": f"{color},255,{color}", "VAL": rating[key], "KEY": key})
else:
# Это "виртуальный" рейтинг, без реальных ценовых предложений (серенький)
color = int(255 - rating[key] * 64)
k_arr.append({"COLOR": f"{color},{color},{color}", "VAL": rating[key], "KEY": key})
table.append({
"ID": profile.id,
"R_REAL": rating_real,
"BRAND": profile.sProfileManufacturer,
"BRAND_URL": sanitize_slug(profile.sProfileManufacturer),
"NAME": 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,
"RATING_COLOR": rating_color,
"RATING_COLOR2": rating_color2
})
# получаем данные для фрейма ценовых предложений
to_template.update({'TABLE': table,
'ticks': float(time() - time_start)})
return render(request, template, to_template)