You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

98 lines
5.2 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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