Files
2022_oknardia/oknardia/web/report2.py

89 lines
4.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- 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
from time import time
import json
import pytils
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 = {'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": pytils.translit.slugify(profile.sProfileManufacturer),
"NAME": profile.sProfileName,
"NAME_URL": pytils.translit.slugify(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)