Выпадающее окно после ввода адреса -- готово
This commit is contained in:
@@ -265,3 +265,5 @@ CATALOG_RECORD_FOR_PROFILE_MODEL = 1
|
|||||||
CATALOG_RECORD_FOR_PROFILE_MANUFACTURER = 100
|
CATALOG_RECORD_FOR_PROFILE_MANUFACTURER = 100
|
||||||
CATALOG_SORTER_MAGIC_NUMBER_ADV = 5
|
CATALOG_SORTER_MAGIC_NUMBER_ADV = 5
|
||||||
CATALOG_SORTER_MAGIC_NUMBER_TIZER = 1
|
CATALOG_SORTER_MAGIC_NUMBER_TIZER = 1
|
||||||
|
|
||||||
|
YANDEX_MAPS_API_KEY = MY_YANDEX_MAPS_API_KEY
|
||||||
|
|||||||
@@ -28,6 +28,9 @@ urlpatterns = [
|
|||||||
re_path(r'^$', views.main_init),
|
re_path(r'^$', views.main_init),
|
||||||
# обработчик автокомлита (подсказки во время ввода адреса на главной странице)
|
# обработчик автокомлита (подсказки во время ввода адреса на главной странице)
|
||||||
re_path(r'^autocomplete_addr$', autocomplete_addr.autocomplete_addr),
|
re_path(r'^autocomplete_addr$', autocomplete_addr.autocomplete_addr),
|
||||||
|
# обработка адреса введеного в форме поиска
|
||||||
|
re_path(r'^get_address$', views.get_address),
|
||||||
|
|
||||||
# ОБРАБОТЧИКИ АВТОРИЗАЦИИ
|
# ОБРАБОТЧИКИ АВТОРИЗАЦИИ
|
||||||
# Вызов шаблона подгружаем captcha
|
# Вызов шаблона подгружаем captcha
|
||||||
re_path(r'^captcha', user_manager.captcha),
|
re_path(r'^captcha', user_manager.captcha),
|
||||||
|
|||||||
71
oknardia/templates/popup_1.html
Executable file
71
oknardia/templates/popup_1.html
Executable file
@@ -0,0 +1,71 @@
|
|||||||
|
{% load static %}{% load filters %}
|
||||||
|
<script type="text/javascript">
|
||||||
|
if (document.getElementById("box") == null) window.location.replace("/"); // проверяем, а не вызвали-ли этот popup отдельно
|
||||||
|
myMap.setCenter([{{ LONGITUDE|default:"37.77" }}, {{ LATITUDE|default:"55.68" }}], 15);
|
||||||
|
$(document).ready(function () {
|
||||||
|
$(".collapse").on("shown.bs.collapse", function () {
|
||||||
|
$("#box").css({
|
||||||
|
"top": "15%"
|
||||||
|
});
|
||||||
|
});
|
||||||
|
$(".collapse").on("hidden.bs.collapse", function () {
|
||||||
|
$("#box").css({
|
||||||
|
"top": "20%"
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<div class="panel-heading">
|
||||||
|
<button type="button" class="close" data-dismiss="modal" onmouseout="window.location.href='/';"><span aria-hidden="true">×</span><span class="sr-only">Неверный адрес</span></button>
|
||||||
|
Здание по адресу: {{ addr }} <span class="text-muted" style="font-size:x-small;">(id:{{ ADDRESS_ID }})</span>
|
||||||
|
</div>
|
||||||
|
{% if LIST_APART %}<h1>Укажите типовую планировку вашей квартиры:</h1>
|
||||||
|
<div class="btn-toolbar" style="width:80%">{% for I_APART in LIST_APART %}
|
||||||
|
<button type="button" class="btn btn-default" style="margin:1ex"
|
||||||
|
accesskey="{{ I_APART.id }}"
|
||||||
|
onclick="window.location.href='/{{ ADDRESS_ID }}/{{ I_APART.id }}/{{ addr_T }}';try{yaCounter32997984.reachGoal('CHOICE_APP');}catch(e){}">
|
||||||
|
{{ I_APART.sNameApartment|safe }}
|
||||||
|
</button>{% endfor %}
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
<script type="text/javascript">
|
||||||
|
function uClick( i ) {
|
||||||
|
try {
|
||||||
|
yaCounter32997984.reachGoal('FIND');
|
||||||
|
ga('send', 'event', 'CLICK', 'ClickSearch', 'SearchAddress');
|
||||||
|
_tmr.push({id: '2018432', type: 'reachGoal', goal: 'ClcSrh'});
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
}
|
||||||
|
$.ajax({
|
||||||
|
url: "/get_address", //Адрес подгружаемой страницы
|
||||||
|
type: "POST", //Тип запроса
|
||||||
|
dataType: "html", //Тип данных
|
||||||
|
data: "csrfmiddlewaretoken={{ csrf_token }}&address="+$('#a'+i).html(),
|
||||||
|
success: function (html) {
|
||||||
|
$("#box").html(html)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<h1>Нет данных по этому дому</h1>
|
||||||
|
<div style="width:80%">
|
||||||
|
<p>К сожалению база «Окнардии» только формируется. Пока у нас нет данных по типовым квартирам для дома по этому адресу. Ближащие адреса, по которым есть информация:</p>
|
||||||
|
<ul style="list-style:none;">{% for i in NEAR_KNOWN_ADDRESS %}
|
||||||
|
<li>
|
||||||
|
<!-- Расстояние до дома -->
|
||||||
|
<nobr class="badge badge4price" title="Удалённость — {{ i.R2|stringformat:"0.2f" }} км."><b class="glyphicon glyphicon-map-marker"></b> {{ i.R2|stringformat:"0.2f"|price_format }} км.</nobr> <a href="#" onclick="uClick({{ forloop.counter0 }})" id="a{{ forloop.counter0 }}">{{ i.sAddress }}</a>
|
||||||
|
</li>
|
||||||
|
{% endfor %}</ul>
|
||||||
|
<p>С небольшой погрешностью (±6%) мы можем дать ценовые предложения под ваши требования, но потребуется самостоятельный замер проёмов.</p>
|
||||||
|
<button type="button" class="btn btn-default" style="margin:1ex"
|
||||||
|
accesskey="1" onclick="window.location.href='/order_by_dim'">
|
||||||
|
Подобрать предложения по предварительным замерам <span class="glyphicon glyphicon-search"></span>
|
||||||
|
</button>
|
||||||
|
<p style="font-size:xx-small;width:80%"><small>Сделав замер, и сообщив его нам, вы поможете наполнению базы «Окнардии», вашим соседям и сотням людей проживающих в домах таких же серий или проектов. В благодарность за содействие мы подготовим и вышлем самые актуальные предложения по email, а также предоставим купон, предоставляющий скидку на сумму <b>500 рублей</b> при установке окон любым из наших партнёров. Если согласны <a href="/send_order_and_info">перейдите по ссылке</small>:<br /></a>.</p>
|
||||||
|
</div>{% endif %}
|
||||||
|
|
||||||
|
<a class="text-muted" data-toggle="collapse" href="#collapse_it" onclick="yaCounter32997984.reachGoal('ClickBuildingDetails');" style="float:right;margin-bottom:1ex;">Подробная информация по зданию <small class="glyphicon-chevron-down glyphicon"></small></a>
|
||||||
|
{% include "report/build_info_in_table.html" %}
|
||||||
26
oknardia/templates/popup_incorrect_address.html
Executable file
26
oknardia/templates/popup_incorrect_address.html
Executable file
@@ -0,0 +1,26 @@
|
|||||||
|
{% load static %}
|
||||||
|
<script type="text/javascript">
|
||||||
|
if ( document.getElementById("box") == null ) window.location.replace("/"); // проверяем, а не вызвали-ли этот popup отдельно
|
||||||
|
myMap.setCenter([{{ LONGITUDE|default:"37.77" }},{{ LATITUDE|default:"55.68" }}]);
|
||||||
|
$(document).ready(function(){
|
||||||
|
setTimeout("window.location.href='/'", 50000);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<h1>Ошибка адреса</h1>
|
||||||
|
<div>
|
||||||
|
<p>Это могло произойти по следующим причинам:</p>
|
||||||
|
<ul>
|
||||||
|
<li><b>Ошибка при вводе адреса <i>«{{ addr }}»</i>.</b><br />
|
||||||
|
Если вы ошиблись при указании адреса <a href="/">попробуйте ввести адрес ещё раз</a> или
|
||||||
|
<a href="/stat_all/#s_map">найдите его на карте типовых серий</a> жилого строительства.<br> </li>
|
||||||
|
<li><b>Адрес <i>«{{ addr }}»</i> отсутствует в нашей базе.</b><br />
|
||||||
|
Приносим извинения, но пока нами обработаны только типовые серии Москвы и Подмосковья, Санкт-Петербурга
|
||||||
|
и Ленинградской области.<br />
|
||||||
|
Свяжитесь с нами чтобы мы ускорили оцифровку и поиск партнеров в вашем регионе.</li>
|
||||||
|
</ul>
|
||||||
|
<div style="float:right;font-size:xx-small">TICKs: {{ ticks|floatformat:4 }}</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
83
oknardia/templates/report/build_info_in_table.html
Executable file
83
oknardia/templates/report/build_info_in_table.html
Executable file
@@ -0,0 +1,83 @@
|
|||||||
|
<!--- Информация о строении --->{% load filters %}
|
||||||
|
<table id="collapse_it" class="table table-condensed collapse">
|
||||||
|
<tbody>{% if ADDRESS %}
|
||||||
|
<tr>
|
||||||
|
<td colspan="8" style="background:whitesmoke;border-top:double;">Дом по адресу: <strong>{{ ADDRESS }}</strong></td>
|
||||||
|
</tr>{% endif %}<tr>
|
||||||
|
<td>Проект:</td>
|
||||||
|
<td>{{ SERIA|safe }}</td>
|
||||||
|
<td> </td>
|
||||||
|
<td>Площадь участка, м²:</td>
|
||||||
|
<td><nobr>{{ LAND|capfirst|default:"Нет данных"|price_format }}</nobr></td>
|
||||||
|
<td> </td>
|
||||||
|
<td>Кадастровый номер участка:</td>
|
||||||
|
<td><nobr>{{ CADASTRE_NUM|capfirst }}</nobr></td>
|
||||||
|
</tr><tr>
|
||||||
|
<td>Типовая серия:</td>
|
||||||
|
<td><nobr>{{ SERIA_BASE|safe|default:"Нет данных" }}</nobr></td>
|
||||||
|
<td></td>
|
||||||
|
<td>Общаяя площадь помещений, м²:</td>
|
||||||
|
<td><nobr>{{ TOTAL_AREA|capfirst|default:"Нет данных"|price_format }}</nobr></td>
|
||||||
|
<td></td>
|
||||||
|
<td>Инвентарный номер:</td>
|
||||||
|
<td><nobr>{{ INVENTORY_NUM|capfirst|default:"Нет данных" }}</nobr></td>
|
||||||
|
</tr><tr>
|
||||||
|
<td>Число квартир:</td>
|
||||||
|
<td><nobr>{{ NUM_APARTMENTS|capfirst|default:"Нет данных" }}</nobr></td>
|
||||||
|
<td></td>
|
||||||
|
<td colspan="2">из них:</td>
|
||||||
|
<td></td>
|
||||||
|
<td>Тип здания:</td>
|
||||||
|
<td><nobr>{{ TYPE_BUILDING|capfirst|default:"Нет данных" }}</nobr></td>
|
||||||
|
</tr><tr>
|
||||||
|
<td>Этажей:</td>
|
||||||
|
<td>{{ STOREYS|capfirst|default:"Нет данных" }}</td>
|
||||||
|
<td></td>
|
||||||
|
<td><nobr>• помещений общего пользования, м²:</nobr></td>
|
||||||
|
<td><nobr>{{ COMMON_AREA|default:"Нет данных"|price_format }}</nobr></td>
|
||||||
|
<td></td>
|
||||||
|
<td>Класс энергоэффективности:</td>
|
||||||
|
<td><nobr>{{ ENERGY_EFFICIENCY|capfirst|default:"Нет данных" }}</nobr></td>
|
||||||
|
</tr><tr>
|
||||||
|
<td>Подъездов:</td>
|
||||||
|
<td>{{ NUM_ENTERANCES|capfirst|default:"Нет данных" }}</td>
|
||||||
|
<td></td>
|
||||||
|
<td>• нежилых помещений, м²:</td>
|
||||||
|
<td><nobr>{{ UNINHABITED_AREA|capfirst|default:"Нет данных"|price_format }}</nobr></td>
|
||||||
|
<td></td>
|
||||||
|
<td>Число счетов:</td>
|
||||||
|
<td>{{ NUM_ACCOUNTS|capfirst|default:"Нет данных"|price_format }}</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td>Лифтов:</td>
|
||||||
|
<td>{{ NUM_ELEVATORS|capfirst|default:"Нет данных" }}</td>
|
||||||
|
<td></td>
|
||||||
|
<td>• жилых помещений, м²:</td>
|
||||||
|
<td>{{ RESIDENTIAL_AREA|capfirst|default:"Нет данных"|price_format }}</td>
|
||||||
|
<td></td>
|
||||||
|
<td>Число жителей:</td>
|
||||||
|
<td>{{ NUM_RESIDENTS|capfirst|default:"Нет данных"|price_format }}</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><nobr>Грузовых лифтов:</nobr></td>
|
||||||
|
<td><nobr>Нет данных</nobr></td>
|
||||||
|
<td></td>
|
||||||
|
<td>• приватизированных помещений, м²:</td>
|
||||||
|
<td><nobr>{{ PRIVATE_AREA|capfirst|default:"Нет данных"|price_format }}</nobr></td>
|
||||||
|
<td></td>
|
||||||
|
<td rowspan="3">Управляющая компания:</td>
|
||||||
|
<td rowspan="3">{{ MANAGEMENT_CO|safe|default:"Нет данных" }}</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td>Год постройки:</td>
|
||||||
|
<td>{{ COMMISSIONING_YEAR|capfirst|default:"Нет данных" }}</td>
|
||||||
|
<td></td>
|
||||||
|
<td>• государственных помещений, м²:</td>
|
||||||
|
<td><nobr>{{ GOVERNMENT_AREA|capfirst|default:"Нет данных"|price_format }}</nobr></td>
|
||||||
|
<td rowspan="2" style="border-top:none;"></td>
|
||||||
|
</tr><tr>
|
||||||
|
<td>Cтепень износа:</td>
|
||||||
|
<td title="Износ фундамента: {{ CONDITION_FOUNDATION|capfirst|default:"—" }} // Износ несущих конструкций: {{ CONDITION_WALL|capfirst|default:"—" }} // Износ перекрытий: {{ CONDITION_OVERLAP|capfirst|default:"—" }}">{{ CONDITION_HOUSE|capfirst|default:"Нет данных" }}</td>
|
||||||
|
<td></td>
|
||||||
|
<td>• мунициальных помещений, м²:</td>
|
||||||
|
<td><nobr>{{ MUNICIPAL_AREA|capfirst|default:"Нет данных"|price_format }}</nobr></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
__author__ = 'Sergei Erjemin'
|
__author__ = 'Sergei Erjemin'
|
||||||
# from transliterate import translit
|
|
||||||
from PIL import Image, ImageDraw
|
from PIL import Image, ImageDraw
|
||||||
from oknardia.settings import *
|
from oknardia.settings import *
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import re
|
|
||||||
import math
|
import math
|
||||||
|
import urllib3
|
||||||
|
import xml.dom.minidom
|
||||||
|
|
||||||
|
|
||||||
def safe_html_spec_symbols(s: str) -> str:
|
def safe_html_spec_symbols(s: str) -> str:
|
||||||
@@ -37,6 +37,7 @@ def safe_html_spec_symbols(s: str) -> str:
|
|||||||
result = result.replace('<br>', ' ')
|
result = result.replace('<br>', ' ')
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
# def Rus2Lat(RusString):
|
# def Rus2Lat(RusString):
|
||||||
# return translit(re.sub(
|
# return translit(re.sub(
|
||||||
# r'<[\s\S]*?>', '', re.sub(r'&[\S]*?;', '-', RusString)
|
# r'<[\s\S]*?>', '', re.sub(r'&[\S]*?;', '-', RusString)
|
||||||
@@ -81,6 +82,8 @@ def get_rating_set_for_stars(rating: float = 0.) -> list:
|
|||||||
else:
|
else:
|
||||||
rating_set.append(0)
|
rating_set.append(0)
|
||||||
return rating_set
|
return rating_set
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
# # рассчитывает дистанцию в км. между двумя геокоординатами
|
# # рассчитывает дистанцию в км. между двумя геокоординатами
|
||||||
@@ -525,3 +528,30 @@ def get_geo_distance(lon1: float, lat1: float, lat2: float, lon2: float) -> floa
|
|||||||
distance = 2 * math.asin(math.sqrt(math.sin((lat_b - lat_a) / 2) ** 2 + math.cos(lat_a) * math.cos(lat_b)
|
distance = 2 * math.asin(math.sqrt(math.sin((lat_b - lat_a) / 2) ** 2 + math.cos(lat_a) * math.cos(lat_b)
|
||||||
* math.sin((lon_b - lon_a) / 2) ** 2)) * 6371.032 # РАДИУС ЗЕМЛИ 6371.032 КМ.
|
* math.sin((lon_b - lon_a) / 2) ** 2)) * 6371.032 # РАДИУС ЗЕМЛИ 6371.032 КМ.
|
||||||
return distance
|
return distance
|
||||||
|
|
||||||
|
|
||||||
|
def get_yandex_geocode_by_address(address_string: str) -> list:
|
||||||
|
""" Функция получает от Яндекс-Карт геокоординаты соответсвующее адресу.
|
||||||
|
|
||||||
|
:param address_string: str -- строка с адресом (utf-8)
|
||||||
|
:return: geocode: list -- [Долгота (longitude), Широта (latitude)]
|
||||||
|
"""
|
||||||
|
geocode = [0, 0]
|
||||||
|
http = urllib3.PoolManager()
|
||||||
|
response_api = http.request('GET', f"http://geocode-maps.yandex.ru/1.x/?apikey={YANDEX_MAPS_API_KEY}"
|
||||||
|
f"&geocode={address_string}")
|
||||||
|
# print(response_api.data.decode('utf-8'))
|
||||||
|
try:
|
||||||
|
data = xml.dom.minidom.parseString(response_api.data.decode('utf-8'))
|
||||||
|
data = data.getElementsByTagName('pos')[0]
|
||||||
|
data = data.childNodes[0].data
|
||||||
|
data = tuple(data.split())
|
||||||
|
geocode[0] = float(data[0]) # Долгота (longitude): Восточная + (E) // Западная - (W)
|
||||||
|
geocode[1] = float(data[1]) # Широта (latitude): Северная + (N) // Южная - (S)
|
||||||
|
# print(geocode)
|
||||||
|
return geocode
|
||||||
|
except:
|
||||||
|
# Тут может быть много разных типов ошибок urllub3 связанных с получением данных от Яндекс-Карт
|
||||||
|
# Перечень исключений: https://urllib3.readthedocs.io/en/stable/reference/urllib3.exceptions.html
|
||||||
|
# Возвращаем нулевые координаты, как признак, что данные не получены.
|
||||||
|
return [0, 0]
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render, redirect
|
||||||
from django.http import HttpRequest, HttpResponse
|
from django.http import HttpRequest, HttpResponse
|
||||||
from django.core.mail import send_mail
|
from django.core.mail import send_mail
|
||||||
from smtplib import SMTPException
|
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 json
|
||||||
import datetime
|
import datetime
|
||||||
|
import time
|
||||||
|
import pytils
|
||||||
|
|
||||||
# from django.core.context_processors import csrf
|
# from django.core.context_processors import csrf
|
||||||
|
|
||||||
@@ -17,7 +21,6 @@ def main_init(request: HttpRequest) -> HttpResponse:
|
|||||||
"""
|
"""
|
||||||
to_template = {} # словарь, для передачи шаблону
|
to_template = {} # словарь, для передачи шаблону
|
||||||
num_viz = 0 # как будто первый визит
|
num_viz = 0 # как будто первый визит
|
||||||
template = "index.html" # шаблон
|
|
||||||
# проверяем куки числа визита
|
# проверяем куки числа визита
|
||||||
if "NumVisit" in request.COOKIES:
|
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({'META_DOCUMENT_STATE': u"Static"}) # Эта страничка статичная (в шаблон)
|
||||||
to_template.update({'NV': num_viz})
|
to_template.update({'NV': num_viz})
|
||||||
# to_template.update(csrf(request)) # токен, для метода POST и GET
|
# 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) # ставим или перезаписываем куки (неделя)
|
response.set_cookie("NumVisit", num_viz, max_age=604800) # ставим или перезаписываем куки (неделя)
|
||||||
return response
|
return response
|
||||||
|
|
||||||
@@ -53,7 +56,6 @@ def tariff(request: HttpRequest) -> HttpResponse:
|
|||||||
:return response: исходящий http-ответ
|
:return response: исходящий http-ответ
|
||||||
"""
|
"""
|
||||||
to_template = {} # для передачи в шаблон
|
to_template = {} # для передачи в шаблон
|
||||||
template = "tariff.html" # шаблон
|
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
# print request.POST
|
# print request.POST
|
||||||
if 'tariff' in request.POST and 'email_' in 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!"})
|
to_template.update({'SENDER': "Error!"})
|
||||||
pass
|
pass
|
||||||
return render(request, template, to_template)
|
return render(request, "tariff.html", to_template)
|
||||||
|
|
||||||
|
|
||||||
def contact(request: HttpRequest) -> HttpResponse:
|
def contact(request: HttpRequest) -> HttpResponse:
|
||||||
@@ -101,3 +103,194 @@ def contact(request: HttpRequest) -> HttpResponse:
|
|||||||
:return response: исходящий http-ответ
|
:return response: исходящий http-ответ
|
||||||
"""
|
"""
|
||||||
return render(request, "contact.html", {})
|
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