Выпадающее окно после ввода адреса -- готово
This commit is contained in:
@@ -1,10 +1,14 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from django.shortcuts import render
|
||||
from django.shortcuts import render, redirect
|
||||
from django.http import HttpRequest, HttpResponse
|
||||
from django.core.mail import send_mail
|
||||
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
|
||||
import time
|
||||
import pytils
|
||||
|
||||
# from django.core.context_processors import csrf
|
||||
|
||||
@@ -17,7 +21,6 @@ def main_init(request: HttpRequest) -> HttpResponse:
|
||||
"""
|
||||
to_template = {} # словарь, для передачи шаблону
|
||||
num_viz = 0 # как будто первый визит
|
||||
template = "index.html" # шаблон
|
||||
# проверяем куки числа визита
|
||||
if "NumVisit" in request.COOKIES:
|
||||
# стоят куки, и это не первый визит
|
||||
@@ -41,7 +44,7 @@ def main_init(request: HttpRequest) -> HttpResponse:
|
||||
to_template.update({'META_DOCUMENT_STATE': u"Static"}) # Эта страничка статичная (в шаблон)
|
||||
to_template.update({'NV': num_viz})
|
||||
# to_template.update(csrf(request)) # токен, для метода POST и GET
|
||||
response = render(request, template, to_template)
|
||||
response = render(request, "index.html", to_template)
|
||||
response.set_cookie("NumVisit", num_viz, max_age=604800) # ставим или перезаписываем куки (неделя)
|
||||
return response
|
||||
|
||||
@@ -53,7 +56,6 @@ def tariff(request: HttpRequest) -> HttpResponse:
|
||||
:return response: исходящий http-ответ
|
||||
"""
|
||||
to_template = {} # для передачи в шаблон
|
||||
template = "tariff.html" # шаблон
|
||||
if request.method == 'POST':
|
||||
# print request.POST
|
||||
if 'tariff' in request.POST and 'email_' in request.POST \
|
||||
@@ -91,7 +93,7 @@ def tariff(request: HttpRequest) -> HttpResponse:
|
||||
# Что-то пошло не так и почта не отправилась. Надо подумать что в этим делать
|
||||
to_template.update({'SENDER': "Error!"})
|
||||
pass
|
||||
return render(request, template, to_template)
|
||||
return render(request, "tariff.html", to_template)
|
||||
|
||||
|
||||
def contact(request: HttpRequest) -> HttpResponse:
|
||||
@@ -101,3 +103,194 @@ def contact(request: HttpRequest) -> HttpResponse:
|
||||
:return response: исходящий http-ответ
|
||||
"""
|
||||
return render(request, "contact.html", {})
|
||||
|
||||
|
||||
def get_address(request: HttpRequest) -> HttpResponse:
|
||||
""" Вызывается после ввода пользователем адреса. Получает строку с адресом методом POST
|
||||
|
||||
ВНИМАНИЕ ТЕХНИЧЕСКИЙ ДОЛГ: Заменить GET на POST
|
||||
|
||||
:param request: request
|
||||
:return: response
|
||||
░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░"""
|
||||
time_start = time.time()
|
||||
if request.method != 'POST':
|
||||
return redirect("/")
|
||||
if 'address' not in request.POST:
|
||||
return redirect("/")
|
||||
addr = request.POST['address']
|
||||
to_template = {}
|
||||
try:
|
||||
q = Building_Info.objects.get(sAddress=addr)
|
||||
# Если QuerySet не содержит GeoCode (такое бывает, что в Яндекс-Картах не было каких-то данных),
|
||||
# то пробуем получить GeoCode повторно (вдруг, у Яндекс-Карт расширилась база адресов)
|
||||
if int(q.fGeoCode_Longitude) != 0 and int(q.fGeoCode_Latitude != 0):
|
||||
# print("координаты не ноль")
|
||||
to_template.update({'LATITUDE': str(q.fGeoCode_Latitude).replace(",", "."),
|
||||
'LONGITUDE': str(q.fGeoCode_Longitude).replace(",", ".")})
|
||||
geocode = [q.fGeoCode_Latitude, q.fGeoCode_Longitude]
|
||||
else:
|
||||
# print("координаты ноль")
|
||||
geocode = get_yandex_geocode_by_address(addr)
|
||||
# print("получен геокод", geocode)
|
||||
to_template.update({'LATITUDE': str(geocode[0]).replace(",", "."),
|
||||
'LONGITUDE': str(geocode[1]).replace(",", ".")})
|
||||
except:
|
||||
# print("тут")
|
||||
geocode = get_yandex_geocode_by_address(addr)
|
||||
# print(geocode)
|
||||
to_template.update({'LATITUDE': str(geocode[0]).replace(",", ".")})
|
||||
to_template.update({'LONGITUDE': str(geocode[1]).replace(",", ".")})
|
||||
q = Building_Info.objects.raw(
|
||||
f"SELECT oknardia_building_info.*, "
|
||||
f"ABS({geocode[0]} - oknardia_building_info.fGeoCode_Latitude) + "
|
||||
f"ABS({geocode[1]} - oknardia_building_info.fGeoCode_Longitude) AS R2 "
|
||||
f"FROM oknardia_building_info "
|
||||
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({'addr': addr})
|
||||
return render(request, "popup_incorrect_address.html", to_template)
|
||||
addr = q.sAddress
|
||||
print("addr", addr)
|
||||
to_template.update({'ADDRESS_ID': q.id,
|
||||
'SERIA': q.sSerias_Project})
|
||||
if q.fTotal_Area < 0:
|
||||
to_template.update({'TOTAL_AREA': "Нет данных"})
|
||||
else:
|
||||
to_template.update({'TOTAL_AREA': f"{q.fTotal_Area: .1f}"})
|
||||
to_template.update({'CADASTRE_NUM': q.sCadastre_Num_Area})
|
||||
if q.fLand_Area < 0:
|
||||
to_template.update({'LAND': "Нет данных"})
|
||||
else:
|
||||
to_template.update({'LAND': f"{q.fLand_Area: .1f}"})
|
||||
to_template.update({'INVENTORY_NUM': q.sInventory_Num})
|
||||
if q.iNum_Apartments < 0:
|
||||
to_template.update({'NUM_APARTMENTS': "Нет данных"})
|
||||
else:
|
||||
to_template.update({'NUM_APARTMENTS': q.iNum_Apartments})
|
||||
to_template.update({'TYPE_BUILDING': q.sType})
|
||||
if q.iNum_Apartments < 0:
|
||||
to_template.update({'STOREYS': "Нет данных"})
|
||||
else:
|
||||
to_template.update({'STOREYS': q.iStoreys})
|
||||
if q.fCommon_Area < 0:
|
||||
to_template.update({'COMMON_AREA': "Нет данных"})
|
||||
else:
|
||||
to_template.update({'COMMON_AREA': f"{q.fCommon_Area: .1f}"})
|
||||
to_template.update({'ENERGY_EFFICIENCY': q.sEnergy_Efficiency})
|
||||
if q.iEntrances_Porchs < 0:
|
||||
to_template.update({'NUM_ENTERANCES': "Нет"})
|
||||
else:
|
||||
to_template.update({'NUM_ENTERANCES': q.iEntrances_Porchs})
|
||||
if q.fUninhabited_Area < 0:
|
||||
to_template.update({'UNINHABITED_AREA': "Нет данных"})
|
||||
else:
|
||||
to_template.update({'UNINHABITED_AREA': f"{q.fUninhabited_Area: .1f}"})
|
||||
if q.sManagement_Co == u"N/A":
|
||||
to_template.update({'MANAGEMENT_CO': "Нет данных"})
|
||||
else:
|
||||
to_template.update({'MANAGEMENT_CO': q.sManagement_Co})
|
||||
if q.iElevators < 0:
|
||||
to_template.update({'NUM_ELEVATORS': "Нет данных"})
|
||||
else:
|
||||
to_template.update({'NUM_ELEVATORS': q.iElevators})
|
||||
if q.fResidential_Area < 0:
|
||||
to_template.update({'RESIDENTIAL_AREA': "Нет данных"})
|
||||
else:
|
||||
to_template.update({'RESIDENTIAL_AREA': f"{q.fResidential_Area: .1f}"})
|
||||
if q.iNum_Residents < 0:
|
||||
to_template.update({'NUM_RESIDENTS': "Нет данных"})
|
||||
else:
|
||||
to_template.update({'NUM_RESIDENTS': q.iNum_Residents})
|
||||
if q.fPrivate_Area < 0:
|
||||
to_template.update({'PRIVATE_AREA': "Нет данных"})
|
||||
else:
|
||||
to_template.update({'PRIVATE_AREA': f"{q.fPrivate_Area:.1f}"})
|
||||
if q.iNum_Accounts < 0:
|
||||
to_template.update({'NUM_ACCOUNTS': "Нет данных"})
|
||||
else:
|
||||
to_template.update({'NUM_ACCOUNTS': q.iNum_Accounts})
|
||||
if q.iCommissioning_year == "N/A":
|
||||
to_template.update({'COMMISSIONING_YEAR': "Нет данных"})
|
||||
else:
|
||||
to_template.update({'COMMISSIONING_YEAR': q.iCommissioning_year})
|
||||
if q.fGovernment_Area < 0:
|
||||
to_template.update({'GOVERNMENT_AREA': "Нет данных"})
|
||||
else:
|
||||
to_template.update({'GOVERNMENT_AREA': f"{q.fGovernment_Area: .1f}"})
|
||||
if q.fCondition_House < 0:
|
||||
to_template.update({'CONDITION_HOUSE': "Нет данных"})
|
||||
else:
|
||||
to_template.update({'CONDITION_HOUSE': f"{q.fCondition_House: .0f}%"})
|
||||
if q.fCondition_Foundation < 0:
|
||||
to_template.update({'CONDITION_FOUNDATION': "Нет данных"})
|
||||
else:
|
||||
to_template.update({'CONDITION_FOUNDATION': f"{q.fCondition_Foundation: .0f}%"})
|
||||
if q.fCondition_Walls < 0:
|
||||
to_template.update({'CONDITION_WALL': u"Нет данных"})
|
||||
else:
|
||||
to_template.update({'CONDITION_WALL': f"{q.fCondition_Walls: .0f}%"})
|
||||
if q.fCondition_Overlap < 0:
|
||||
to_template.update({'CONDITION_OVERLAP': "Нет данных"})
|
||||
else:
|
||||
to_template.update({'CONDITION_OVERLAP': f"{q.fCondition_Overlap: .0f}%"})
|
||||
if q.fMunicipal_Area < 0:
|
||||
to_template.update({'MUNICIPAL_AREA': "Нет данных"})
|
||||
else:
|
||||
to_template.update({'MUNICIPAL_AREA': f"{q.fMunicipal_Area: .1f}"})
|
||||
to_template.update({'URL2REFOEMAGKH': q.sURL})
|
||||
# Пробуем получить базовую серию дома. Для этого рекурсивно раскручиваем записи в таблице Seria_Info
|
||||
idd = q.kSeria_Link_id
|
||||
all_apartment_in_seria = False
|
||||
while idd is not None:
|
||||
# рекурсивно движемся по дерву потомок→предок серий домов.
|
||||
q1 = Seria_Info.objects.get(id=idd)
|
||||
# получаем список типовых квартир для серии дома с id == idd
|
||||
all_apartment_in_seria = Apartment_Type.objects.filter(kSeria_id=idd).order_by("iSort")
|
||||
# проверяем есть-ли что-то в списке типовых квартир.
|
||||
if bool(all_apartment_in_seria):
|
||||
# список типовых квартир не нулевой
|
||||
to_template.update({'LIST_APART': all_apartment_in_seria})
|
||||
break
|
||||
idd = q1.kParent_id
|
||||
# проверяем, был ли получен список квартир
|
||||
if not bool(all_apartment_in_seria):
|
||||
# Если списка квартир нет, нужно получить список ближайших адресов, для которых есть цены.
|
||||
q = Building_Info.objects.raw(
|
||||
f"SELECT"
|
||||
f" oknardia_building_info.sAddress, oknardia_building_info.id,"
|
||||
f" oknardia_building_info.fGeoCode_Longitude, oknardia_building_info.fGeoCode_Latitude,"
|
||||
f" oknardia_seria_info.kRoot_id, oknardia_seria_info.sName,"
|
||||
f" COUNT(oknardia_apartment_type.sNameApartment) AS NumApart,"
|
||||
f" ABS({geocode[0]} - oknardia_building_info.fGeoCode_Latitude)"
|
||||
f" + ABS({geocode[1]} - oknardia_building_info.fGeoCode_Longitude) AS R2 "
|
||||
f"FROM oknardia_building_info"
|
||||
f" INNER JOIN oknardia_seria_info"
|
||||
f" ON oknardia_building_info.kSeria_Link_id = oknardia_seria_info.id"
|
||||
f" INNER JOIN oknardia_apartment_type"
|
||||
f" ON oknardia_seria_info.kRoot_id = oknardia_apartment_type.kSeria_id "
|
||||
f"WHERE oknardia_building_info.fGeoCode_Longitude <> 0.0"
|
||||
f" AND oknardia_building_info.fGeoCode_Latitude <> 0.0 "
|
||||
f"GROUP BY oknardia_seria_info.sName,"
|
||||
f" oknardia_seria_info.kRoot_id,"
|
||||
f" oknardia_building_info.id,"
|
||||
f" oknardia_building_info.sAddress,"
|
||||
f" oknardia_building_info.fGeoCode_Longitude,"
|
||||
f" oknardia_building_info.fGeoCode_Latitude "
|
||||
f"ORDER BY R2 "
|
||||
f"LIMIT 5;")
|
||||
q = list(q)
|
||||
for i in q:
|
||||
i.R2 = get_geo_distance(i.fGeoCode_Longitude, i.fGeoCode_Latitude, geocode[0], geocode[1])
|
||||
# print i.id, i.sAddress, i.sName, i.R2
|
||||
# сортируем список по R2 (дистанция от текущего адреса, до домов по которым данные известны)
|
||||
sorted(q, key=lambda item: item.R2)
|
||||
to_template.update({'NEAR_KNOWN_ADDRESS': q})
|
||||
# print q
|
||||
to_template.update({'SERIA_BASE': q1.sName,
|
||||
'addr': addr,
|
||||
'addr_T': pytils.translit.slugify(addr),
|
||||
'ticks': float(time.time()-time_start)})
|
||||
return render(request, "popup_1.html", to_template)
|
||||
|
||||
Reference in New Issue
Block a user