diff --git a/postamates/settings.py b/postamates/settings.py index 742a582..7471bb3 100644 --- a/postamates/settings.py +++ b/postamates/settings.py @@ -169,4 +169,4 @@ CELERY_BROKER_URL = 'amqp://loyalty-rabbit' CELERY_NAMESPACE = 'CELERY' PROJECT_NAME = 'postamates' CACHE_TIMEOUT = 0 -POINT_RADIUS = 500 +DEFAULT_PLACEMENT_POINT_UPDATE_RADIUS = 500 diff --git a/service/enums.py b/service/enums.py new file mode 100644 index 0000000..3a8df3c --- /dev/null +++ b/service/enums.py @@ -0,0 +1,8 @@ +from enum import Enum + + +class PointStatus(Enum): + Pending = 'К рассмотрению' + Installation = 'Согласование-Установка' + Working = 'Работает' + Cancelled = 'Отменено' diff --git a/service/migrations/0015_alter_placementpoint_status.py b/service/migrations/0015_alter_placementpoint_status.py new file mode 100644 index 0000000..dfe33de --- /dev/null +++ b/service/migrations/0015_alter_placementpoint_status.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2 on 2023-03-16 08:49 +from django.db import migrations +from django.db import models + +import service.enums + + +class Migration(migrations.Migration): + + dependencies = [ + ('service', '0014_alter_placementpoint_postamat_id'), + ] + + operations = [ + migrations.AlterField( + model_name='placementpoint', + name='status', + field=models.TextField(blank=True, choices=[(service.enums.PointStatus['Pending'], 'К рассмотрению'), (service.enums.PointStatus['Installation'], 'Согласование-Установка'), (service.enums.PointStatus['Working'], 'Работает'), (service.enums.PointStatus['Cancelled'], 'Отменено')], null=True, verbose_name='Статус'), + ), + ] diff --git a/service/migrations/0016_alter_placementpoint_status.py b/service/migrations/0016_alter_placementpoint_status.py new file mode 100644 index 0000000..73f4f6d --- /dev/null +++ b/service/migrations/0016_alter_placementpoint_status.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2 on 2023-03-16 10:09 +from django.db import migrations +from django.db import models + + +class Migration(migrations.Migration): + + dependencies = [ + ('service', '0015_alter_placementpoint_status'), + ] + + operations = [ + migrations.AlterField( + model_name='placementpoint', + name='status', + field=models.TextField(blank=True, choices=[('Pending', 'К рассмотрению'), ('Installation', 'Согласование-Установка'), ('Working', 'Работает'), ('Cancelled', 'Отменено')], null=True, verbose_name='Статус'), + ), + ] diff --git a/service/models.py b/service/models.py index 6e62a7c..aa58eb3 100644 --- a/service/models.py +++ b/service/models.py @@ -2,16 +2,12 @@ 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.signals import * class PlacementPoint(models.Model): - STATUS_CHOICES = ( - ('Pending', 'К рассмотрению'), - ('Installation', 'Согласование-Установка'), - ('Working', 'Работает'), - ('Cancelled', 'Отменено'), - ) + STATUS_CHOICES = [(tag.name, tag.value) for tag in PointStatus] address = models.TextField(null=True, blank=True, verbose_name='Адрес') name = models.TextField(null=True, blank=True, verbose_name='Название') postamat_id = models.TextField(unique=True, null=True, blank=True, verbose_name='ID постамата') diff --git a/service/service.py b/service/service.py index 3e2eb7a..31b062b 100644 --- a/service/service.py +++ b/service/service.py @@ -4,8 +4,9 @@ import pandas as pd from django.contrib.gis.measure import Distance from django.db.models import F -from postamates.settings import POINT_RADIUS +from postamates.settings import DEFAULT_PLACEMENT_POINT_UPDATE_RADIUS from service import models +from service.enums import PointStatus class PointService: @@ -20,16 +21,16 @@ class PointService: @staticmethod def update_points_in_radius(qs: models.PlacementPoint, new_status: str): for point in qs: - if new_status == 'Installation': - if point.status == 'Pending': + if new_status == PointStatus.Installation.name: + if point.status == PointStatus.Pending.name: pnts = models.PlacementPoint.objects.filter( - geometry__distance_lt=(point.geometry, Distance(m=POINT_RADIUS)), + geometry__distance_lt=(point.geometry, Distance(m=DEFAULT_PLACEMENT_POINT_UPDATE_RADIUS)), ) pnts.update(target_post_cnt=F('target_post_cnt') + 1) - elif new_status == 'Cancelled' or new_status == 'Pending': - if point.status == 'Installation': + elif new_status == PointStatus.Cancelled.name or new_status == PointStatus.Pending.name: + if point.status == PointStatus.Installation.name: pnts = models.PlacementPoint.objects.filter( - geometry__distance_lt=(point.geometry, Distance(m=POINT_RADIUS)), + geometry__distance_lt=(point.geometry, Distance(m=DEFAULT_PLACEMENT_POINT_UPDATE_RADIUS)), ) pnts.update(target_post_cnt=F('target_post_cnt') - 1 if F('target_post_cnt') != 0 else 0) diff --git a/service/views.py b/service/views.py index b2b054b..05728df 100644 --- a/service/views.py +++ b/service/views.py @@ -16,6 +16,7 @@ from service import models from service import pagination from service import serializers from service import utils +from service.enums import PointStatus from service.permissions import UserPermission from service.service import PointService from service.tasks import raschet @@ -138,8 +139,7 @@ class PlacementPointViewSet(ReadOnlyModelViewSet): def update_status(self, request): qs = self.get_queryset() new_status = self.request.GET.get('status') - choices = [choice[0] for choice in models.PlacementPoint.STATUS_CHOICES] - if not new_status or new_status not in choices: + if not new_status or new_status not in [tag.name for tag in PointStatus]: return Response({'message': 'No status'}, HTTPStatus.BAD_REQUEST) PointService.update_points_in_radius(qs, new_status) PointService.update_status(qs, new_status)