diff --git a/.env.like b/.env.like index b75a0e8..226d07b 100644 --- a/.env.like +++ b/.env.like @@ -19,3 +19,4 @@ MARTIN_PORT=3000 # Host domain name (maps in docker-compose to REACT_APP_DOMAIN_URL) DOMAIN=postnet-dev.selftech.ru +GEOCODER_API_KEY = api_key_here \ No newline at end of file diff --git a/postamates/settings.py b/postamates/settings.py index 2745668..9ee9acb 100644 --- a/postamates/settings.py +++ b/postamates/settings.py @@ -195,3 +195,4 @@ AGE_DAY_BORDER = 30 EXCEL_EXPORT_FILENAME = 'placement_points.xlsx' JSON_EXPORT_FILENAME = 'placement_points.json' DATA_UPLOAD_MAX_NUMBER_FIELDS = None +GEOCODER_API_KEY = os.getenv('GEOCODER_API_KEY','TzgdKWgyI2nfaz1WHRD-aYJK4e400MiOJQP7Enf1e1M') diff --git a/service/tasks.py b/service/tasks.py index 87fc8f8..43c9616 100644 --- a/service/tasks.py +++ b/service/tasks.py @@ -24,7 +24,8 @@ import base64 from io import StringIO from django.core.cache import cache from service.layer_service import LayerService - +import requests +from postamates.settings import GEOCODER_API_KEY @shared_task() def raschet(): @@ -245,6 +246,7 @@ def raschet(): except: conn2 = None log_to_telegram('Не удалось подключиться к базе данных') + # prediction_current if conn2 is not None: update_records1 = [] @@ -442,6 +444,28 @@ def load_data(obj_id: int): models.TempFiles.objects.all().delete() +@shared_task() +def start_matching(obj_id: int): + file = models.TempFiles.objects.get(id=obj_id) + status, _ = models.TaskStatus.objects.get_or_create(task_name='Мэтчинг точек') + excel_file = base64.b64decode(file.data) + df = pd.read_excel(excel_file) + total = df.shape[0] + matched = 0 + for _i, row in df.iterrows(): + status.status = f'Мэтчинг: {_i} из {total}' + status.save() + addr = row['Адрес'] + cat = row['Категория объекта'] + req_url = f"https://geocode.search.hereapi.com/v1/geocode?q={addr}&apiKey={GEOCODER_API_KEY}" + response = requests.get(req_url).json()['items'][0]['address'] + obj = models.PlacementPoint.objects.filter(street=response['street'], house_number=response['houseNumber'], category=cat).first() + if obj: + matched += 1 + status.status = f"Мэтчинг завершен. Смэтчилось {matched}, несмэтчилось {total-matched}" + status.save() + models.TempFiles.objects.all().delete() + @shared_task() def start_pvz_group_count(instance_id: int): instance = models.Post_and_pvzGroup.objects.filter(id=instance_id).first() diff --git a/service/views.py b/service/views.py index dea358c..23d1571 100644 --- a/service/views.py +++ b/service/views.py @@ -22,7 +22,7 @@ from service import utils from service.enums import PointStatus from service.permissions import UserPermission from service.service import PointService -from service.tasks import raschet, load_post_and_pvz, load_other_objects, load_data +from service.tasks import raschet, load_post_and_pvz, load_other_objects, load_data, start_matching from rest_framework.permissions import AllowAny from django.shortcuts import redirect from django.contrib import messages @@ -334,6 +334,18 @@ class PlacementPointViewSet(ReadOnlyModelViewSet): def last_time_ml_run(self, request): return Response({'last_time': models.LastMLCall.objects.first().dt}, status=HTTPStatus.OK) + @action(detail=False, methods=['post']) + def start_matching(self, request): + file = request.FILES['file'].file + file_bytes = file.read() + excel_base64 = base64.b64encode(file_bytes).decode() + obj = models.TempFiles.objects.create(data=excel_base64) + start_matching.delay(obj.id) + return Response( + {'message': 'OK'}, + status=HTTPStatus.OK, + ) + class refresh_placement_points(APIView): @staticmethod