From 211ee423008a91943c9cb036239bc624824ebc9c Mon Sep 17 00:00:00 2001 From: AlexP077 Date: Tue, 29 Aug 2023 21:15:51 +0300 Subject: [PATCH] start_matching_func --- .env.like | 1 + postamates/settings.py | 1 + service/tasks.py | 26 +++++++++++++++++++++++++- service/views.py | 14 +++++++++++++- 4 files changed, 40 insertions(+), 2 deletions(-) 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 2b2176c..01d6486 100644 --- a/postamates/settings.py +++ b/postamates/settings.py @@ -192,3 +192,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 e6ca9d7..98c7788 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(): @@ -437,3 +438,26 @@ def load_data(obj_id: int): status.status = "Загрузка данных завершена" status.save() 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() \ No newline at end of file diff --git a/service/views.py b/service/views.py index ade4ca6..5d08abf 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