status_enum

dev
AlexP077 3 years ago committed by Dmitry Titov
parent d4bb63bc50
commit d8204efba7

@ -169,4 +169,4 @@ CELERY_BROKER_URL = 'amqp://loyalty-rabbit'
CELERY_NAMESPACE = 'CELERY' CELERY_NAMESPACE = 'CELERY'
PROJECT_NAME = 'postamates' PROJECT_NAME = 'postamates'
CACHE_TIMEOUT = 0 CACHE_TIMEOUT = 0
POINT_RADIUS = 500 DEFAULT_PLACEMENT_POINT_UPDATE_RADIUS = 500

@ -0,0 +1,8 @@
from enum import Enum
class PointStatus(Enum):
Pending = 'К рассмотрению'
Installation = 'Согласование-Установка'
Working = 'Работает'
Cancelled = 'Отменено'

@ -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='Статус'),
),
]

@ -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='Статус'),
),
]

@ -2,16 +2,12 @@ from django.contrib.gis.db import models as gis_models
from django.db import models from django.db import models
from postamates.settings import SRID from postamates.settings import SRID
from service.enums import PointStatus
from service.signals import * from service.signals import *
class PlacementPoint(models.Model): class PlacementPoint(models.Model):
STATUS_CHOICES = ( STATUS_CHOICES = [(tag.name, tag.value) for tag in PointStatus]
('Pending', 'К рассмотрению'),
('Installation', 'Согласование-Установка'),
('Working', 'Работает'),
('Cancelled', 'Отменено'),
)
address = models.TextField(null=True, blank=True, verbose_name='Адрес') address = models.TextField(null=True, blank=True, verbose_name='Адрес')
name = 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 постамата') postamat_id = models.TextField(unique=True, null=True, blank=True, verbose_name='ID постамата')

@ -4,8 +4,9 @@ import pandas as pd
from django.contrib.gis.measure import Distance from django.contrib.gis.measure import Distance
from django.db.models import F 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 import models
from service.enums import PointStatus
class PointService: class PointService:
@ -20,16 +21,16 @@ class PointService:
@staticmethod @staticmethod
def update_points_in_radius(qs: models.PlacementPoint, new_status: str): def update_points_in_radius(qs: models.PlacementPoint, new_status: str):
for point in qs: for point in qs:
if new_status == 'Installation': if new_status == PointStatus.Installation.name:
if point.status == 'Pending': if point.status == PointStatus.Pending.name:
pnts = models.PlacementPoint.objects.filter( 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) pnts.update(target_post_cnt=F('target_post_cnt') + 1)
elif new_status == 'Cancelled' or new_status == 'Pending': elif new_status == PointStatus.Cancelled.name or new_status == PointStatus.Pending.name:
if point.status == 'Installation': if point.status == PointStatus.Installation.name:
pnts = models.PlacementPoint.objects.filter( 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) pnts.update(target_post_cnt=F('target_post_cnt') - 1 if F('target_post_cnt') != 0 else 0)

@ -16,6 +16,7 @@ from service import models
from service import pagination from service import pagination
from service import serializers from service import serializers
from service import utils from service import utils
from service.enums import PointStatus
from service.permissions import UserPermission from service.permissions import UserPermission
from service.service import PointService from service.service import PointService
from service.tasks import raschet from service.tasks import raschet
@ -138,8 +139,7 @@ class PlacementPointViewSet(ReadOnlyModelViewSet):
def update_status(self, request): def update_status(self, request):
qs = self.get_queryset() qs = self.get_queryset()
new_status = self.request.GET.get('status') 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 [tag.name for tag in PointStatus]:
if not new_status or new_status not in choices:
return Response({'message': 'No status'}, HTTPStatus.BAD_REQUEST) return Response({'message': 'No status'}, HTTPStatus.BAD_REQUEST)
PointService.update_points_in_radius(qs, new_status) PointService.update_points_in_radius(qs, new_status)
PointService.update_status(qs, new_status) PointService.update_status(qs, new_status)

Loading…
Cancel
Save