From c767e63f98b5abe9475847d942c3a793daaa3cc9 Mon Sep 17 00:00:00 2001 From: AlexP077 Date: Thu, 31 Aug 2023 16:16:56 +0400 Subject: [PATCH] count_pvz_fix --- service/admin.py | 15 ++++++- service/layer_service.py | 5 ++- .../migrations/0028_delete_postmlchecker.py | 16 +++++++ service/models.py | 6 --- service/signals.py | 42 +------------------ service/tasks.py | 21 ++++++++++ 6 files changed, 56 insertions(+), 49 deletions(-) create mode 100644 service/migrations/0028_delete_postmlchecker.py diff --git a/service/admin.py b/service/admin.py index 50e4bc5..2b9cddd 100644 --- a/service/admin.py +++ b/service/admin.py @@ -6,6 +6,7 @@ from django.contrib.admin.sites import NotRegistered from django.contrib.auth.admin import UserAdmin from django.contrib.auth.models import User +from service.layer_service import LayerService from service.models import AO from service.models import PlacementPoint from service.models import Rayon @@ -15,6 +16,7 @@ from service.models import PlacementPointPVZDistance, TaskStatus from postamates.settings import DEBUG from django.core.cache import cache from service.utils import run_psql_command +from service.tasks import start_pvz_group_count, start_pvz_category_count, raschet class MyAdminSite(AdminSite): @@ -35,6 +37,8 @@ if DEBUG: class Post_and_PVZAdmin(admin.ModelAdmin): def save_model(self, request, obj, form, change): obj.save() + LayerService().count_post_pvz_for_placementpoint(obj) + raschet.delay() my_admin_site.register(Post_and_pvz, Post_and_PVZAdmin) @@ -58,6 +62,12 @@ class CategoryAdmin(admin.ModelAdmin): class PostPvzCategoryAdmin(CategoryAdmin): + def save_model(self, request, obj, form, change): + obj.save() + start_pvz_category_count.delay(obj.id) + raschet.delay() + cache.clear() + def delete_model(self, request, obj): if obj.id in (1, 2): pass @@ -81,7 +91,10 @@ class PostPvzGroupAdmin(GroupAdmin): def save_model(self, request, obj, form, change): if not obj.pk: run_psql_command() - super().save_model(request, obj, form, change) + obj.save() + start_pvz_group_count.delay(obj.id) + raschet.delay() + cache.clear() class PlacementPointAdmin(admin.ModelAdmin): diff --git a/service/layer_service.py b/service/layer_service.py index bafda6d..344c9f7 100644 --- a/service/layer_service.py +++ b/service/layer_service.py @@ -4,6 +4,7 @@ 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() @@ -16,10 +17,10 @@ class LayerService: @staticmethod def count_post_pvz(point): - point.rivals_post_cnt = models.Post_and_pvz.objects.filter( + point.rival_post_cnt = models.Post_and_pvz.objects.filter( category__name="Постамат", include_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( + point.rival_pvz_cnt = models.Post_and_pvz.objects.filter( category__name="ПВЗ", include_in_ml=True, wkt__distance_lt=(point.geometry, Distance(m=DEFAULT_PLACEMENT_POINT_UPDATE_RADIUS))).count() point.save() diff --git a/service/migrations/0028_delete_postmlchecker.py b/service/migrations/0028_delete_postmlchecker.py new file mode 100644 index 0000000..95d3625 --- /dev/null +++ b/service/migrations/0028_delete_postmlchecker.py @@ -0,0 +1,16 @@ +# Generated by Django 3.2 on 2023-08-31 12:07 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('service', '0027_postmlchecker'), + ] + + operations = [ + migrations.DeleteModel( + name='PostMLChecker', + ), + ] diff --git a/service/models.py b/service/models.py index d256575..ceb045f 100644 --- a/service/models.py +++ b/service/models.py @@ -3,7 +3,6 @@ from django.contrib.gis.db import models as gis_models from django.db import models from postamates.settings import SRID from service.enums import PointStatus -from service.layer_service import LayerService User._meta.get_field('email')._unique = True @@ -215,8 +214,3 @@ class LastMLCall(models.Model): class TempFiles(models.Model): data = models.TextField(blank=False, null=False) - - -class PostMLChecker(models.Model): - current = models.IntegerField(default=0,blank=False, null=False) - target = models.IntegerField(blank=False, null=False) \ No newline at end of file diff --git a/service/signals.py b/service/signals.py index 5c67b42..acab55f 100644 --- a/service/signals.py +++ b/service/signals.py @@ -1,12 +1,9 @@ from django.contrib.auth.models import Group from rest_registration.signals import user_registered - -from service.layer_service import LayerService -from service.models import Post_and_pvz, Post_and_pvzGroup, Post_and_pvzCategory, OtherObjects, OtherObjectsGroup, \ - OtherObjectsCategory, PostMLChecker +from service.models import OtherObjects, OtherObjectsGroup, \ + OtherObjectsCategory from django.db.models.signals import post_save from django.dispatch import receiver -from service.tasks import raschet def user_created(sender, user, request, **kwargs): @@ -18,41 +15,6 @@ def user_created(sender, user, request, **kwargs): user_registered.connect(user_created) -@receiver(post_save, sender=Post_and_pvz) -def post_pvz_handler(sender, instance, **kwargs): - LayerService().count_post_pvz_for_placementpoint(instance) - checker = PostMLChecker.objects.first() - if not checker: - raschet.delay() - else: - if checker.current >= checker.target - 1: - raschet.delay() - PostMLChecker.objects.all().delete() - else: - checker.current += 1 - checker.save() - - -@receiver(post_save, sender=Post_and_pvzGroup) -def post_group_handler(sender, instance, **kwargs): - objects = Post_and_pvz.objects.filter(group=instance) - PostMLChecker.objects.create(target=objects.count()) - for obj in objects: - obj.include_in_ml = instance.include_in_ml - obj.visible = instance.visible - obj.save() - - -@receiver(post_save, sender=Post_and_pvzCategory) -def post_category_handler(sender, instance, **kwargs): - objects = Post_and_pvzGroup.objects.filter(category=instance) - PostMLChecker.objects.create(target=Post_and_pvz.objects.filter(category=instance).count()) - for obj in objects: - obj.include_in_ml = instance.include_in_ml - obj.visible = instance.visible - obj.save() - - @receiver(post_save, sender=OtherObjectsGroup) def other_group_handler(sender, instance, **kwargs): OtherObjects.objects.filter(group=instance).update(visible=instance.visible) diff --git a/service/tasks.py b/service/tasks.py index e6ca9d7..3dd0a9d 100644 --- a/service/tasks.py +++ b/service/tasks.py @@ -437,3 +437,24 @@ def load_data(obj_id: int): status.status = "Загрузка данных завершена" 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() + objects = models.Post_and_pvz.objects.filter(group=instance) + objects.update(include_in_ml=instance.include_in_ml, visible=instance.visible) + for obj in objects: + LayerService().count_post_pvz_for_placementpoint(obj) + + +@shared_task() +def start_pvz_category_count(instance_id: int): + instance = models.Post_and_pvzCategory.objects.filter(id=instance_id).first() + groups = models.Post_and_pvzGroup.objects.filter(category=instance) + groups.update(include_in_ml=instance.include_in_ml, visible=instance.visible) + for gr in groups: + objects = models.Post_and_pvz.objects.filter(group=gr) + objects.update(include_in_ml=instance.include_in_ml, visible=instance.visible) + for obj in objects: + LayerService().count_post_pvz_for_placementpoint(obj)