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'
PROJECT_NAME = 'postamates'
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 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 постамата')

@ -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)

@ -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)

Loading…
Cancel
Save