|
|
from rest_framework.response import Response
|
|
|
from rest_framework import permissions
|
|
|
from django.core.cache import cache
|
|
|
import json
|
|
|
from service.utils import raschet as raschet_alg
|
|
|
import pandas as pd
|
|
|
from io import BytesIO
|
|
|
from django.http import HttpResponse
|
|
|
from rest_framework.generics import GenericAPIView
|
|
|
|
|
|
def rename_result_dataset(dataframe, rename_dict, reverse=False):
|
|
|
if reverse:
|
|
|
return dataframe.rename(columns={v: k for k, v in rename_dict.items()})
|
|
|
return dataframe.rename(columns=rename_dict)
|
|
|
|
|
|
class ao_and_rayons(GenericAPIView):
|
|
|
permission_classes = [permissions.AllowAny]
|
|
|
|
|
|
def get(self, request, format=None):
|
|
|
d = cache.get('ao_and_rayons')
|
|
|
if d is None:
|
|
|
data = json.loads(open('ao_and_rayons.json', 'r').read())
|
|
|
cache.set('ao_and_rayons', data, 60 * 60 * 24)
|
|
|
d = data
|
|
|
return Response(d)
|
|
|
|
|
|
|
|
|
class raschet(GenericAPIView):
|
|
|
permission_classes = [permissions.AllowAny]
|
|
|
|
|
|
def post(self, request, format=None):
|
|
|
POINTS_RENAME_DICT = {
|
|
|
"point_id": "ID точки (для всех наборов одинаковые)",
|
|
|
"category": "тип объекта",
|
|
|
"msk_ao": "Адм. округ",
|
|
|
"msk_rayon": "Адм. район",
|
|
|
"people": "Численность населения в 2021 г.",
|
|
|
"people2025": "Численность населения в 2025 г. (прогноз)",
|
|
|
"stops_ot": "Остановки общественного транспорта",
|
|
|
"routes_ot": "Маршруты общетвенного транспорта",
|
|
|
"in_metro": "Входы в ближайшее метро в месяц",
|
|
|
"out_metro": "Выходы из ближайшего метро в месяц",
|
|
|
"tc": "Тогровые центры",
|
|
|
"empls": "Рабочие места",
|
|
|
"walkers": "Трафик населения",
|
|
|
"schools": "Школы и детские сады",
|
|
|
"parking": "Парковочные места",
|
|
|
"pvz": "Пункты выдачи заказов",
|
|
|
"gov_place": "Рекомендованные пункты размещения постаматов",
|
|
|
"bike_park": "Городская аренда велосипедов, шт.",
|
|
|
"products": "Продовольственные магазины",
|
|
|
"nonprod": "Непродовольственные магазины",
|
|
|
"service": "Пункты оказания бытовых услуг",
|
|
|
"vuz": "ВУЗы и техникумы"
|
|
|
}
|
|
|
NET_RENAME_DICT = {
|
|
|
"cell_id": "ID ячейки (для всех трёх сеток - разные, нумерация сквозная)",
|
|
|
"msk_ao": "Адм. округ",
|
|
|
"msk_rayon": "Адм. район",
|
|
|
"people": "Численность населения в 2021 г.",
|
|
|
"people2025": "Численность населения в 2025 г. (прогноз)",
|
|
|
"stops_ot": "Остановки общественного транспорта",
|
|
|
"routes_ot": "Маршруты общетвенного транспорта",
|
|
|
"in_metro": "Входы в ближайшее метро в месяц",
|
|
|
"out_metro": "Выходы из ближайшего метро в месяц",
|
|
|
"tc": "Тогровые центры",
|
|
|
"empls": "Рабочие места",
|
|
|
"walkers": "Трафик населения",
|
|
|
"schools": "Школы и детские сады",
|
|
|
"parking": "Парковочные места",
|
|
|
"pvz": "Пункты выдачи заказов",
|
|
|
"gov_place": "Рекомендованные пункты размещения постаматов",
|
|
|
"bike_park": "Городская аренда велосипедов, шт.",
|
|
|
"products": "Продовольственные магазины",
|
|
|
"nonprod": "Непродовольственные магазины",
|
|
|
"service": "Пункты оказания бытовых услуг",
|
|
|
"vuz": "ВУЗы и техникумы"
|
|
|
}
|
|
|
df_points_, df_nets_ = raschet_alg(**request.data)
|
|
|
df_points = rename_result_dataset(df_points_, POINTS_RENAME_DICT)
|
|
|
df_nets = rename_result_dataset(df_nets_, NET_RENAME_DICT)
|
|
|
with BytesIO() as b:
|
|
|
# Use the StringIO object as the filehandle.
|
|
|
writer = pd.ExcelWriter(b, engine='xlsxwriter')
|
|
|
if df_points is not None:
|
|
|
df_points.to_excel(writer, sheet_name='Точки', index=False)
|
|
|
if df_nets is not None:
|
|
|
df_nets.to_excel(writer, sheet_name='Полигоны', index=False)
|
|
|
writer.save()
|
|
|
# Set up the Http response.
|
|
|
filename = f'Выгрузка.xlsx'
|
|
|
response = HttpResponse(
|
|
|
b.getvalue(),
|
|
|
content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
|
|
|
)
|
|
|
response['Content-Disposition'] = 'attachment; filename=%s' % filename
|
|
|
return response
|