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