From e159fb24e5b5fa0d61d18e084598a79da8e29ab8 Mon Sep 17 00:00:00 2001 From: AlexP077 Date: Fri, 11 Aug 2023 16:10:53 +0300 Subject: [PATCH] count_pvz_for_placementpoint --- docker-compose.yml | 1 + fixtures/post_and_pvz.json | 22 ++++++++++++++++++++++ service/admin.py | 10 +++++++--- service/layer_service.py | 25 +++++++++++++++++++++++++ service/service.py | 6 ------ service/tasks.py | 9 +++++++++ 6 files changed, 64 insertions(+), 9 deletions(-) create mode 100644 fixtures/post_and_pvz.json create mode 100644 service/layer_service.py diff --git a/docker-compose.yml b/docker-compose.yml index b1b42b3..be1008b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -30,6 +30,7 @@ services: sh -c "python manage.py migrate && python manage.py collectstatic --noinput && python manage.py loaddata fixtures/groups.json && + python3 manage.py loaddata fixtures/post_and_pvz.json && python manage.py runserver 0.0.0.0:${DJANGO_PORT}" environment: <<: *postgres-variables diff --git a/fixtures/post_and_pvz.json b/fixtures/post_and_pvz.json new file mode 100644 index 0000000..f5dc538 --- /dev/null +++ b/fixtures/post_and_pvz.json @@ -0,0 +1,22 @@ +[ +{ + "model": "service.post_and_pvzcategory", + "pk": 1, + "fields": { + "name": "ПВЗ", + "image": "", + "visible": true, + "inlude_in_ml": true + } +}, +{ + "model": "service.post_and_pvzcategory", + "pk": 2, + "fields": { + "name": "Постамат", + "image": "", + "visible": true, + "inlude_in_ml": true + } +} +] diff --git a/service/admin.py b/service/admin.py index bf33323..01a5a7e 100644 --- a/service/admin.py +++ b/service/admin.py @@ -12,7 +12,7 @@ from service.models import Post_and_pvz, Post_and_pvzCategory, Post_and_pvzGroup from service.models import PlacementPointPVZDistance, TaskStatus from postamates.settings import DEBUG from django.core.cache import cache - +from service.layer_service import LayerService class MyAdminSite(AdminSite): @@ -30,7 +30,12 @@ if DEBUG: my_admin_site.register(PlacementPointPVZDistance) -my_admin_site.register(Post_and_pvz) +class Post_and_PVZAdmin(admin.ModelAdmin): + def save_model(self, request, obj, form, change): + LayerService().count_post_pvz_for_placementpoint(obj) + + +my_admin_site.register(Post_and_pvz, Post_and_PVZAdmin) my_admin_site.register(OtherObjects) @@ -58,7 +63,6 @@ class PlacementPointAdmin(admin.ModelAdmin): pass - my_admin_site.register(TaskStatus, TaskStatusAdmin) my_admin_site.register(Post_and_pvzGroup, GroupAdmin) my_admin_site.register(OtherObjectsGroup, GroupAdmin) diff --git a/service/layer_service.py b/service/layer_service.py new file mode 100644 index 0000000..690d32a --- /dev/null +++ b/service/layer_service.py @@ -0,0 +1,25 @@ +from django.contrib.gis.measure import Distance +from service import models +from postamates.settings import DEFAULT_PLACEMENT_POINT_UPDATE_RADIUS + + +class LayerService: + def count_post_pvz_for_placementpoint(self, obj): + points = models.PlacementPoint.objects.filter(geometry__distance_lt=(obj.wkt, Distance( + m=DEFAULT_PLACEMENT_POINT_UPDATE_RADIUS))).all() + for point in points: + LayerService.count_post_pvz(point) + + @staticmethod + def get_post_and_pvz_categroies(): + return models.Post_and_pvzCategory.objects.all(), models.Post_and_pvzGroup.objects.all() + + @staticmethod + def count_post_pvz(point): + point.rivals_post_cnt = models.Post_and_pvz.objects.filter( + category__name="Постамат", inlude_in_ml=True, + wkt__distance_lt=(point.geometry, Distance(m=DEFAULT_PLACEMENT_POINT_UPDATE_RADIUS))).count() + point.rivals_pvz_cnt = models.Post_and_pvz.objects.filter( + category__name="ПВЗ", inlude_in_ml=True, + wkt__distance_lt=(point.geometry, Distance(m=DEFAULT_PLACEMENT_POINT_UPDATE_RADIUS))).count() + point.save() diff --git a/service/service.py b/service/service.py index 001a537..990e580 100644 --- a/service/service.py +++ b/service/service.py @@ -12,12 +12,6 @@ from service.tasks import raschet from service.utils import create_columns_dist -class LayerService: - @staticmethod - def get_post_and_pvz_categroies(): - return models.Post_and_pvzCategory.objects.all(), models.Post_and_pvzGroup.objects.all() - - class PointService: def update_fact(self, postamat_id: str, fact: int): diff --git a/service/tasks.py b/service/tasks.py index ef7177a..e6ca9d7 100644 --- a/service/tasks.py +++ b/service/tasks.py @@ -23,6 +23,7 @@ from service.utils import log_to_telegram import base64 from io import StringIO from django.core.cache import cache +from service.layer_service import LayerService @shared_task() @@ -359,6 +360,14 @@ def load_post_and_pvz(obj_id: int): models.PlacementPointPVZDistance.objects.create(placement_point=point, pvz_postamates_group=group, dist=post_object.distance.m) status.status = "Подсчет расстояний завершен" + status.save() + point_qs = models.PlacementPoint.objects.all() + data_len = models.PlacementPoint.objects.count() + for _ind, point in enumerate(point_qs): + status.status = "Пересчет параметров точек: " + str(int(_ind / data_len * 100)) + "%" + status.save() + LayerService.count_post_pvz(point) + status.status = "Завершено" cache.clear() status.save()