Merge branch 'remove_dist_models' into 'dev'

Remove dist models

See merge request spatial/postamates!162
dev
Timofey Malinin 2 years ago
commit da00f0430e

@ -1,23 +1,186 @@
[{"model": "service.otherobjectscategory", "pk": 4, "fields": {"name": "business_activity", "image": "", "visible": false}},
{"model": "service.otherobjectscategory", "pk": 5, "fields": {"name": "metro_stations", "image": "", "visible": false}},
{"model": "service.otherobjectscategory", "pk": 22, "fields": {"name": "bargains", "image": "", "visible": false}},
{"model": "service.otherobjectscategory", "pk": 23, "fields": {"name": "BC", "image": "", "visible": false}},
{"model": "service.otherobjectscategory", "pk": 24, "fields": {"name": "flats_cnt", "image": "", "visible": false}},
{"model": "service.otherobjectscategory", "pk": 25, "fields": {"name": "offers_estate", "image": "", "visible": false}}, {
"model": "service.otherobjectscategory", "pk": 26, "fields": {"name": "schools", "image": "", "visible": false}},
{"model": "service.otherobjectscategory", "pk": 27, "fields": {"name": "kindergar", "image": "", "visible": false}},
{"model": "service.otherobjectscategory", "pk": 28, "fields": {"name": "stops", "image": "", "visible": false}},
{"model": "service.otherobjectscategory", "pk": 29, "fields": {"name": "pharmacies", "image": "", "visible": false}},
{"model": "service.otherobjectscategory", "pk": 30, "fields": {"name": "sport_centers", "image": "", "visible": false}},
{"model": "service.otherobjectscategory", "pk": 31, "fields": {"name": "supermarkets", "image": "", "visible": false}},
{"model": "service.otherobjectscategory", "pk": 32, "fields": {"name": "supermarkets_premium", "image": "", "visible": false}},
{"model": "service.otherobjectscategory", "pk": 33, "fields": {"name": "banks", "image": "", "visible": false}},
{"model": "service.otherobjectscategory", "pk": 34, "fields": {"name": "recas", "image": "", "visible": false}},
{"model": "service.otherobjectscategory", "pk": 35, "fields": {"name": "labs", "image": "", "visible": false}},
{"model": "service.otherobjectscategory", "pk": 36, "fields": {"name": "clinics", "image": "", "visible": false}},
{"model": "service.otherobjectscategory", "pk": 37, "fields": {"name": "attractions", "image": "", "visible": false}},
{"model": "service.otherobjectscategory", "pk": 38, "fields": {"name": "cultures", "image": "", "visible": false}},
{"model": "service.otherobjectscategory", "pk": 39, "fields": {"name": "public_services", "image": "", "visible": false}},
{"model": "service.otherobjectscategory", "pk": 40, "fields": {"name": "popul_home_job", "image": "", "visible": false}},
{"model": "service.otherobjectscategory", "pk": 41, "fields": {"name": "TC", "image": "", "visible": false}},
{"model": "service.otherobjectscategory", "pk": 42, "fields": {"name": "yndx_food_cnt_amt", "image": "", "visible": false}}]
[
{
"model": "service.otherobjectscategory",
"pk": 4,
"fields": {
"name": "business_activity",
"visible": false
}
},
{
"model": "service.otherobjectscategory",
"pk": 5,
"fields": {
"name": "metro_stations",
"visible": false
}
},
{
"model": "service.otherobjectscategory",
"pk": 22,
"fields": {
"name": "bargains",
"visible": false
}
},
{
"model": "service.otherobjectscategory",
"pk": 23,
"fields": {
"name": "BC",
"visible": false
}
},
{
"model": "service.otherobjectscategory",
"pk": 24,
"fields": {
"name": "flats_cnt",
"visible": false
}
},
{
"model": "service.otherobjectscategory",
"pk": 25,
"fields": {
"name": "offers_estate",
"visible": false
}
},
{
"model": "service.otherobjectscategory",
"pk": 26,
"fields": {
"name": "schools",
"visible": false
}
},
{
"model": "service.otherobjectscategory",
"pk": 27,
"fields": {
"name": "kindergar",
"visible": false
}
},
{
"model": "service.otherobjectscategory",
"pk": 28,
"fields": {
"name": "stops",
"visible": false
}
},
{
"model": "service.otherobjectscategory",
"pk": 29,
"fields": {
"name": "pharmacies",
"visible": false
}
},
{
"model": "service.otherobjectscategory",
"pk": 30,
"fields": {
"name": "sport_centers",
"visible": false
}
},
{
"model": "service.otherobjectscategory",
"pk": 31,
"fields": {
"name": "supermarkets",
"visible": false
}
},
{
"model": "service.otherobjectscategory",
"pk": 32,
"fields": {
"name": "supermarkets_premium",
"visible": false
}
},
{
"model": "service.otherobjectscategory",
"pk": 33,
"fields": {
"name": "banks",
"visible": false
}
},
{
"model": "service.otherobjectscategory",
"pk": 34,
"fields": {
"name": "recas",
"visible": false
}
},
{
"model": "service.otherobjectscategory",
"pk": 35,
"fields": {
"name": "labs",
"visible": false
}
},
{
"model": "service.otherobjectscategory",
"pk": 36,
"fields": {
"name": "clinics",
"visible": false
}
},
{
"model": "service.otherobjectscategory",
"pk": 37,
"fields": {
"name": "attractions",
"visible": false
}
},
{
"model": "service.otherobjectscategory",
"pk": 38,
"fields": {
"name": "cultures",
"visible": false
}
},
{
"model": "service.otherobjectscategory",
"pk": 39,
"fields": {
"name": "public_services",
"visible": false
}
},
{
"model": "service.otherobjectscategory",
"pk": 40,
"fields": {
"name": "popul_home_job",
"visible": false
}
},
{
"model": "service.otherobjectscategory",
"pk": 41,
"fields": {
"name": "TC",
"visible": false
}
},
{
"model": "service.otherobjectscategory",
"pk": 42,
"fields": {
"name": "yndx_food_cnt_amt",
"visible": false
}
}
]

@ -1,22 +1,20 @@
[
{
"model": "service.post_and_pvzcategory",
"pk": 1,
"fields": {
"name": "ПВЗ",
"image": "",
"visible": true,
"include_in_ml": true
{
"model": "service.post_and_pvzcategory",
"pk": 1,
"fields": {
"name": "ПВЗ",
"visible": true,
"include_in_ml": true
}
},
{
"model": "service.post_and_pvzcategory",
"pk": 2,
"fields": {
"name": "Постаматы прочих сетей",
"visible": true,
"include_in_ml": true
}
}
},
{
"model": "service.post_and_pvzcategory",
"pk": 2,
"fields": {
"name": "Постаматы прочих сетей",
"image": "",
"visible": true,
"include_in_ml": true
}
}
]

@ -1 +1,112 @@
[{"model": "service.post_and_pvzgroup", "pk": 7, "fields": {"name": "Ozon", "category": 1, "image": "post_and_pvz_group_images/nameozon_typePVZ_SizeM.png", "visible": true, "include_in_ml": true}}, {"model": "service.post_and_pvzgroup", "pk": 8, "fields": {"name": "СДЭК", "category": 1, "image": "post_and_pvz_group_images/namesdek_typePVZ_SizeM.png", "visible": true, "include_in_ml": true}}, {"model": "service.post_and_pvzgroup", "pk": 9, "fields": {"name": "Халва", "category": 2, "image": "post_and_pvz_group_images/namekhalva_typepostamat_SizeM.png", "visible": true, "include_in_ml": false}}, {"model": "service.post_and_pvzgroup", "pk": 10, "fields": {"name": "СДЭК", "category": 2, "image": "post_and_pvz_group_images/namesdek_typepostamat_SizeM.png", "visible": true, "include_in_ml": false}}, {"model": "service.post_and_pvzgroup", "pk": 12, "fields": {"name": "Ozon", "category": 2, "image": "post_and_pvz_group_images/nameozon_typepostamat_SizeM.png", "visible": true, "include_in_ml": false}}, {"model": "service.post_and_pvzgroup", "pk": 17, "fields": {"name": "WildBerries", "category": 1, "image": "post_and_pvz_group_images/namewb_typePVZ_SizeM.png", "visible": true, "include_in_ml": false}}, {"model": "service.post_and_pvzgroup", "pk": 19, "fields": {"name": "Яндекс.Маркет", "category": 1, "image": "post_and_pvz_group_images/ya.market-PVZ-M_KWksDvo.png", "visible": true, "include_in_ml": true}}, {"model": "service.post_and_pvzgroup", "pk": 20, "fields": {"name": "Яндекс.Маркет", "category": 2, "image": "post_and_pvz_group_images/ya.market-postamat-M.png", "visible": true, "include_in_ml": true}}, {"model": "service.post_and_pvzgroup", "pk": 24, "fields": {"name": "Почта России", "category": 1, "image": "post_and_pvz_group_images/pochta-PVZ-M.png", "visible": true, "include_in_ml": true}}, {"model": "service.post_and_pvzgroup", "pk": 25, "fields": {"name": "Почта России", "category": 2, "image": "post_and_pvz_group_images/pochta-postamat-M_gBJlHTO.png", "visible": true, "include_in_ml": true}}]
[
{
"model":"service.post_and_pvzgroup",
"pk":7,
"fields":{
"name":"Ozon",
"category":1,
"image":"post_and_pvz_group_images/nameozon_typePVZ_SizeM.png",
"visible":true,
"include_in_ml":true
}
},
{
"model":"service.post_and_pvzgroup",
"pk":8,
"fields":{
"name":"СДЭК",
"category":1,
"image":"post_and_pvz_group_images/namesdek_typePVZ_SizeM.png",
"visible":true,
"include_in_ml":true
}
},
{
"model":"service.post_and_pvzgroup",
"pk":9,
"fields":{
"name":"Халва",
"category":2,
"image":"post_and_pvz_group_images/namekhalva_typepostamat_SizeM.png",
"visible":true,
"include_in_ml":false
}
},
{
"model":"service.post_and_pvzgroup",
"pk":10,
"fields":{
"name":"СДЭК",
"category":2,
"image":"post_and_pvz_group_images/namesdek_typepostamat_SizeM.png",
"visible":true,
"include_in_ml":false
}
},
{
"model":"service.post_and_pvzgroup",
"pk":12,
"fields":{
"name":"Ozon",
"category":2,
"image":"post_and_pvz_group_images/nameozon_typepostamat_SizeM.png",
"visible":true,
"include_in_ml":false
}
},
{
"model":"service.post_and_pvzgroup",
"pk":17,
"fields":{
"name":"WildBerries",
"category":1,
"image":"post_and_pvz_group_images/namewb_typePVZ_SizeM.png",
"visible":true,
"include_in_ml":false
}
},
{
"model":"service.post_and_pvzgroup",
"pk":19,
"fields":{
"name":"Яндекс.Маркет",
"category":1,
"image":"post_and_pvz_group_images/ya.market-PVZ-M_KWksDvo.png",
"visible":true,
"include_in_ml":true
}
},
{
"model":"service.post_and_pvzgroup",
"pk":20,
"fields":{
"name":"Яндекс.Маркет",
"category":2,
"image":"post_and_pvz_group_images/ya.market-postamat-M.png",
"visible":true,
"include_in_ml":true
}
},
{
"model":"service.post_and_pvzgroup",
"pk":24,
"fields":{
"name":"Почта России",
"category":1,
"image":"post_and_pvz_group_images/pochta-PVZ-M.png",
"visible":true,
"include_in_ml":true
}
},
{
"model":"service.post_and_pvzgroup",
"pk":25,
"fields":{
"name":"Почта России",
"category":2,
"image":"post_and_pvz_group_images/pochta-postamat-M_gBJlHTO.png",
"visible":true,
"include_in_ml":true
}
}
]

@ -9,6 +9,7 @@ https://docs.djangoproject.com/en/3.2/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.2/ref/settings/
"""
import json
import os
from pathlib import Path
@ -197,3 +198,6 @@ JSON_EXPORT_FILENAME = 'placement_points.json'
DATA_UPLOAD_MAX_NUMBER_FIELDS = None
GEOCODER_API_KEY = os.getenv('GEOCODER_API_KEY','TzgdKWgyI2nfaz1WHRD-aYJK4e400MiOJQP7Enf1e1M')
STATUS_TASK_NAME='status_task'
MAPPING_POST_PVZ_GROUP = json.loads(open(os.path.join(BASE_DIR, 'fixtures', 'post_pvz_groups.json')).read())
GROUP_IDS = [group['pk'] for group in MAPPING_POST_PVZ_GROUP]

@ -11,9 +11,7 @@ from service.models import AO
from service.models import PlacementPoint
from service.models import Rayon
from service.models import PrePlacementPoint, Post_and_pvz, Post_and_pvzCategory, Post_and_pvzGroup, OtherObjects, \
OtherObjectsGroup, \
OtherObjectsCategory, PrePlacementPointPVZDistance, TempFiles, RaschetGroups, House
from service.models import PlacementPointPVZDistance, TaskStatus
OtherObjectsGroup, OtherObjectsCategory, TempFiles, RaschetGroups, House, TaskStatus
from postamates.settings import DEBUG
from django.core.cache import cache
from service.utils import run_psql_command
@ -32,7 +30,6 @@ if DEBUG:
my_admin_site.register(AO)
my_admin_site.register(Rayon)
my_admin_site.register(TempFiles)
my_admin_site.register(PlacementPointPVZDistance)
class Post_and_PVZAdmin(admin.ModelAdmin):
@ -46,7 +43,6 @@ my_admin_site.register(Post_and_pvz, Post_and_PVZAdmin)
my_admin_site.register(OtherObjects)
my_admin_site.register(House)
my_admin_site.register(PrePlacementPoint)
my_admin_site.register(PrePlacementPointPVZDistance)
class TaskStatusAdmin(admin.ModelAdmin):

@ -0,0 +1,135 @@
# Generated by Django 3.2 on 2023-10-08 08:41
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('service', '0037_auto_20231002_1349'),
]
operations = [
migrations.RemoveField(
model_name='preplacementpointpvzdistance',
name='placement_point',
),
migrations.RemoveField(
model_name='preplacementpointpvzdistance',
name='pvz_postamates_group',
),
migrations.RemoveField(
model_name='otherobjectscategory',
name='image',
),
migrations.RemoveField(
model_name='post_and_pvzcategory',
name='image',
),
migrations.AddField(
model_name='placementpoint',
name='d10',
field=models.FloatField(blank=True, null=True, verbose_name='Расстояние до Постамата СДЭК'),
),
migrations.AddField(
model_name='placementpoint',
name='d12',
field=models.FloatField(blank=True, null=True, verbose_name='Расстояние до Постамата Ozon'),
),
migrations.AddField(
model_name='placementpoint',
name='d17',
field=models.FloatField(null=True, verbose_name='Расстояние до ПВЗ Wildberries'),
),
migrations.AddField(
model_name='placementpoint',
name='d19',
field=models.FloatField(blank=True, null=True, verbose_name='Расстояние до ПВЗ Yandex'),
),
migrations.AddField(
model_name='placementpoint',
name='d20',
field=models.FloatField(blank=True, null=True, verbose_name='Расстояние до Постамата Yandex'),
),
migrations.AddField(
model_name='placementpoint',
name='d24',
field=models.FloatField(blank=True, null=True, verbose_name='Расстояние до ПВЗ Почта России'),
),
migrations.AddField(
model_name='placementpoint',
name='d25',
field=models.FloatField(blank=True, null=True, verbose_name='Расстояние до Постамата Почта России'),
),
migrations.AddField(
model_name='placementpoint',
name='d7',
field=models.FloatField(blank=True, null=True, verbose_name='Расстояние до ПВЗ Ozon'),
),
migrations.AddField(
model_name='placementpoint',
name='d8',
field=models.FloatField(blank=True, null=True, verbose_name='Расстояние до ПВЗ СДЭК'),
),
migrations.AddField(
model_name='placementpoint',
name='d9',
field=models.FloatField(blank=True, null=True, verbose_name='Расстояние до Постамата Халва'),
),
migrations.AddField(
model_name='preplacementpoint',
name='d10',
field=models.FloatField(blank=True, null=True, verbose_name='Расстояние до Постамата СДЭК'),
),
migrations.AddField(
model_name='preplacementpoint',
name='d12',
field=models.FloatField(blank=True, null=True, verbose_name='Расстояние до Постамата Ozon'),
),
migrations.AddField(
model_name='preplacementpoint',
name='d17',
field=models.FloatField(null=True, verbose_name='Расстояние до ПВЗ Wildberries'),
),
migrations.AddField(
model_name='preplacementpoint',
name='d19',
field=models.FloatField(blank=True, null=True, verbose_name='Расстояние до ПВЗ Yandex'),
),
migrations.AddField(
model_name='preplacementpoint',
name='d20',
field=models.FloatField(blank=True, null=True, verbose_name='Расстояние до Постамата Yandex'),
),
migrations.AddField(
model_name='preplacementpoint',
name='d24',
field=models.FloatField(blank=True, null=True, verbose_name='Расстояние до ПВЗ Почта России'),
),
migrations.AddField(
model_name='preplacementpoint',
name='d25',
field=models.FloatField(blank=True, null=True, verbose_name='Расстояние до Постамата Почта России'),
),
migrations.AddField(
model_name='preplacementpoint',
name='d7',
field=models.FloatField(blank=True, null=True, verbose_name='Расстояние до ПВЗ Ozon'),
),
migrations.AddField(
model_name='preplacementpoint',
name='d8',
field=models.FloatField(blank=True, null=True, verbose_name='Расстояние до ПВЗ СДЭК'),
),
migrations.AddField(
model_name='preplacementpoint',
name='d9',
field=models.FloatField(blank=True, null=True, verbose_name='Расстояние до Постамата Халва'),
),
migrations.DeleteModel(
name='PlacementPointPVZDistance',
),
migrations.DeleteModel(
name='PrePlacementPointPVZDistance',
),
]

@ -115,6 +115,19 @@ class AbstractPlacementPoint(models.Model):
business_activity_shap = models.IntegerField(null=True, blank=True)
# group_distances
d7 = models.FloatField(null=True, blank=True, verbose_name='Расстояние до ПВЗ Ozon')
d8 = models.FloatField(null=True, blank=True, verbose_name='Расстояние до ПВЗ СДЭК')
d9 = models.FloatField(null=True, blank=True, verbose_name='Расстояние до Постамата Халва')
d10 = models.FloatField(null=True, blank=True, verbose_name='Расстояние до Постамата СДЭК')
d12 = models.FloatField(null=True, blank=True, verbose_name='Расстояние до Постамата Ozon')
d17 = models.FloatField(null=True, verbose_name='Расстояние до ПВЗ Wildberries')
d19 = models.FloatField(null=True, blank=True, verbose_name='Расстояние до ПВЗ Yandex')
d20 = models.FloatField(null=True, blank=True, verbose_name='Расстояние до Постамата Yandex')
d24 = models.FloatField(null=True, blank=True, verbose_name='Расстояние до ПВЗ Почта России')
d25 = models.FloatField(null=True, blank=True, verbose_name='Расстояние до Постамата Почта России')
class PlacementPoint(AbstractPlacementPoint):
class Meta:
verbose_name = 'Точка'
@ -189,8 +202,6 @@ class Post_and_pvzCategory(models.Model):
return self.name
name = models.TextField(null=False, blank=False, verbose_name='Название слоя')
image = models.ImageField(blank=True, null=True, default=None, upload_to='post_and_pvz_category_images/',
verbose_name='Картинка')
visible = models.BooleanField(default=True)
include_in_ml = models.BooleanField(default=True)
@ -220,8 +231,6 @@ class OtherObjectsCategory(models.Model):
return self.name
name = models.TextField(null=False, blank=False, verbose_name='Название слоя')
image = models.ImageField(blank=True, null=True, default=None, upload_to='other_objects_category_images/',
verbose_name='Картинка')
visible = models.BooleanField(default=True)
@ -240,16 +249,18 @@ class OtherObjectsGroup(models.Model):
visible = models.BooleanField(default=True)
class PlacementPointPVZDistance(models.Model):
placement_point = models.ForeignKey('PlacementPoint', default=None, on_delete=models.CASCADE)
pvz_postamates_group = models.ForeignKey('Post_and_pvzGroup', default=None, on_delete=models.CASCADE)
dist = models.FloatField(blank=True, null=True, default=None)
class PrePlacementPointPVZDistance(models.Model):
placement_point = models.ForeignKey('PrePlacementPoint', default=None, on_delete=models.CASCADE)
pvz_postamates_group = models.ForeignKey('Post_and_pvzGroup', default=None, on_delete=models.CASCADE)
dist = models.FloatField(blank=True, null=True, default=None)
# class PlacementPointPVZDistance(models.Model):
# pass
# placement_point = models.ForeignKey('PlacementPoint', default=None, on_delete=models.CASCADE)
# pvz_postamates_group = models.ForeignKey('Post_and_pvzGroup', default=None, on_delete=models.CASCADE)
# dist = models.FloatField(blank=True, null=True, default=None)
#
#
# class PrePlacementPointPVZDistance(models.Model):
# pass
# placement_point = models.ForeignKey('PrePlacementPoint', default=None, on_delete=models.CASCADE)
# pvz_postamates_group = models.ForeignKey('Post_and_pvzGroup', default=None, on_delete=models.CASCADE)
# dist = models.FloatField(blank=True, null=True, default=None)
class TaskStatus(models.Model):

@ -9,11 +9,6 @@ class PlacementPointSerializer(serializers.ModelSerializer):
model = models.PlacementPoint
fields = '__all__'
def to_representation(self, instance):
representation = super().to_representation(instance)
min_distances = PointService.get_min_distances_to_group(instance.id)
representation['min_distance_to_group'] = min_distances
return representation
class PrePlacementPointSerializer(PlacementPointSerializer):
class Meta:
@ -21,7 +16,6 @@ class PrePlacementPointSerializer(PlacementPointSerializer):
fields = '__all__'
class PostAndPVZGroupSerializer(serializers.ModelSerializer):
class Meta:
model = models.Post_and_pvzGroup

@ -62,7 +62,7 @@ class PointService:
else:
objs = [obj.first()]
for o in objs:
distances = models.PlacementPointPVZDistance.objects.filter(placement_point=o.get('id')).all()
# distances = models.PlacementPointPVZDistance.objects.filter(placement_point=o.get('id')).all()
o.pop('id')
street = o.pop('street')
house_number = o.pop('house_number')
@ -77,10 +77,11 @@ class PointService:
house_number=house_number,
matching_status=MatchingStatus.Matched.name,
defaults=o)
for d in distances:
models.PrePlacementPointPVZDistance.objects.get_or_create(placement_point=pre_obj,
pvz_postamates_group=d.pvz_postamates_group,
dist=d.dist)
# по идее можно дропать
# for d in distances:
# models.PrePlacementPointPVZDistance.objects.get_or_create(placement_point=pre_obj,
# pvz_postamates_group=d.pvz_postamates_group,
# dist=d.dist)
matched += 1
elif not rayon:
@ -239,34 +240,25 @@ class PointService:
point.target_cnt_ao_mean = placement_point.target_cnt_ao_mean
point.save()
for group in groups:
self.calculate_dist_for_group(point, group, instance_type=models.PrePlacementPointPVZDistance)
self.calculate_dist_for_group(point, group)
run_psql_command()
@staticmethod
def calculate_dist_for_group(point, group, instance_type=models.PlacementPointPVZDistance):
def calculate_dist_for_group(point, group):
post_object = models.Post_and_pvz.objects.filter(group__name=group.name).annotate(
distance=Dist("wkt", point.geometry)).order_by('distance').first()
d = instance_type.objects.filter(placement_point=point,
pvz_postamates_group=group).first()
if post_object:
if d:
if d.dist > post_object.distance.m:
d.dist = post_object.distance.m
d.save()
else:
instance_type.objects.create(placement_point=point,
pvz_postamates_group=group,
dist=post_object.distance.m)
setattr(point, f'd{group.id}', post_object.distance.m)
point.save()
@staticmethod
def delete_preplacement_points(ids: list):
models.PrePlacementPoint.objects.filter(id__in=ids).all().delete()
@staticmethod
def get_min_distances_to_group(postamat_id: str):
return {d['pvz_postamates_group']: d['dist'] for d in list(
models.PlacementPointPVZDistance.objects.filter(placement_point=postamat_id).values(
'pvz_postamates_group', 'dist'))}
# @staticmethod
# def get_min_distances_to_group(postamat_id: str):
# return {d['pvz_postamates_group']: d['dist'] for d in list(
# models.PlacementPointPVZDistance.objects.filter(placement_point=postamat_id).values(
# 'pvz_postamates_group', 'dist'))}
@staticmethod
def update_points_in_radius(qs: models.PlacementPoint, new_status: str):

@ -423,15 +423,16 @@ def load_post_and_pvz(obj_id: int):
status.save()
post_object = models.Post_and_pvz.objects.filter(group__name=group.name).annotate(
distance=Distance("wkt", point.geometry)).order_by('distance').first()
d = models.PlacementPointPVZDistance.objects.filter(placement_point=point,
pvz_postamates_group=group).first()
if d:
if d.dist > post_object.distance.m:
d.dist = post_object.distance.m
d.save()
else:
models.PlacementPointPVZDistance.objects.create(placement_point=point, pvz_postamates_group=group,
dist=post_object.distance.m)
setattr(point, f'd{group.id}', post_object.distance.m)
# d = models.PlacementPointPVZDistance.objects.filter(placement_point=point,
# pvz_postamates_group=group).first()
# if d:
# if d.dist > post_object.distance.m:
# d.dist = post_object.distance.m
# d.save()
# else:
# 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()

@ -1,5 +1,6 @@
import warnings
from http import HTTPStatus
from django.conf import settings
from django.db.models import Q
from django.http import HttpResponse
@ -29,7 +30,6 @@ from django.contrib import messages
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import filters
from service.utils import CustomReadOnlyModelViewSet
from django.db.models import Min, Max
import os
from django.forms.models import model_to_dict
import base64
@ -186,34 +186,17 @@ class PlacementPointViewSet(ReadOnlyModelViewSet):
inclded = list(included.split(','))
qs2 = self.queryset.filter(pk__in=inclded).all()
qs = (qs | qs2).distinct()
# TODO: fix to new fields
if group_dists_lt:
g_d = [list(g.split(',')) for g in group_dists_lt]
for group in g_d:
if basename == 'preplacementpoint':
filtered_points = list(
models.PrePlacementPointPVZDistance.objects.filter(pvz_postamates_group__id=int(group[0]),
dist__lt=int(group[1])).values_list(
'placement_point__id', flat=True))
else:
filtered_points = list(
models.PlacementPointPVZDistance.objects.filter(pvz_postamates_group__id=int(group[0]),
dist__lt=int(group[1])).values_list(
'placement_point__id', flat=True))
qs = qs.filter(id__in=filtered_points)
kwargs = {f'd{group[0]}__lt': group[1]}
qs = qs.filter(**kwargs)
if group_dists_gt:
g_d = [list(g.split(',')) for g in group_dists_gt]
for group in g_d:
if basename == 'preplacementpoint':
filtered_points = list(
models.PrePlacementPointPVZDistance.objects.filter(pvz_postamates_group__id=int(group[0]),
dist__gt=int(group[1])).values_list(
'placement_point__id', flat=True))
else:
filtered_points = list(
models.PlacementPointPVZDistance.objects.filter(pvz_postamates_group__id=int(group[0]),
dist__gt=int(group[1])).values_list(
'placement_point__id', flat=True))
qs = qs.filter(id__in=filtered_points)
kwargs = {f'd{group[0]}__gt': group[1]}
qs = qs.filter(**kwargs)
return qs
@action(methods=['get'], detail=False)
@ -246,10 +229,19 @@ class PlacementPointViewSet(ReadOnlyModelViewSet):
min(temp_data[key]), max(temp_data[key]),
] if temp_data[key] else [0, 100] for key in keys
}
data['dist_to_groups'] = [{'group_id': d['pvz_postamates_group'], 'dist': [d['min_dist'], d['max_dist']]}
for d in list(
models.PlacementPointPVZDistance.objects.values('pvz_postamates_group').annotate(
min_dist=Min('dist'), max_dist=Max('dist')))]
fields_to_aggregate = [f'd{x}' for x in settings.GROUP_IDS]
aggregations = {}
for field_name in fields_to_aggregate:
aggregations[f'min_{field_name}'] = Min(field_name)
aggregations[f'max_{field_name}'] = Max(field_name)
result = models.PlacementPoint.objects.aggregate(**aggregations)
data['dist_to_groups'] = [
{'group_id': d, 'dist': [result[f'min_d{d}'], result[f'max_d{d}']]} for d in settings.GROUP_IDS
]
# data['dist_to_groups'] = [{'group_id': d['pvz_postamates_group'], 'dist': [d['min_dist'], d['max_dist']]}
# for d in list(
# models.PlacementPointPVZDistance.objects.values('pvz_postamates_group').annotate(
# min_dist=Min('dist'), max_dist=Max('dist')))]
return data
@ -354,44 +346,6 @@ class PlacementPointViewSet(ReadOnlyModelViewSet):
st = status.status
return Response({'last_time': models.LastMLCall.objects.first().dt, 'task_status': st}, status=HTTPStatus.OK)
@action(detail=False, methods=['get'])
def avg_bi_values(self, request):
qs = self.get_queryset()
result = qs.aggregate(Avg('target_dist_shap'), Avg('target_post_cnt_shap'), Avg('target_cnt_ao_mean_shap'),
Avg('rival_pvz_cnt_shap'), Avg('rival_post_cnt_shap'), Avg('metro_dist_shap'),
Avg('property_price_bargains_shap'), Avg('property_price_offers_shap'),
Avg('property_mean_floor_shap'), Avg('property_era_shap'), Avg('flats_cnt_shap'),
Avg('popul_home_shap'), Avg('popul_job_shap'), Avg('yndxfood_sum_shap'),
Avg('yndxfood_cnt_shap'),
Avg('school_cnt_shap'), Avg('kindergar_cnt_shap'), Avg('public_stop_cnt_shap'),
Avg('sport_center_cnt_shap'), Avg('pharmacy_cnt_shap'), Avg('supermarket_cnt_shap'),
Avg('supermarket_premium_cnt_shap'), Avg('clinic_cnt_shap'), Avg('bank_cnt_shap'),
Avg('reca_cnt_shap'), Avg('lab_cnt_shap'), Avg('culture_cnt_shap'),
Avg('attraction_cnt_shap'),
Avg('mfc_cnt_shap'), Avg('bc_cnt_shap'), Avg('tc_cnt_shap'), Avg('business_activity_shap'),
Max('target_dist_shap'), Max('target_post_cnt_shap'), Max('target_cnt_ao_mean_shap'),
Max('rival_pvz_cnt_shap'), Max('rival_post_cnt_shap'), Max('metro_dist_shap'),
Max('property_price_bargains_shap'), Max('property_price_offers_shap'),
Max('property_mean_floor_shap'), Max('property_era_shap'), Max('flats_cnt_shap'),
Max('popul_home_shap'), Max('popul_job_shap'), Max('yndxfood_sum_shap'),
Max('yndxfood_cnt_shap'), Max('school_cnt_shap'), Max('kindergar_cnt_shap'),
Max('public_stop_cnt_shap'), Max('sport_center_cnt_shap'), Max('pharmacy_cnt_shap'),
Max('supermarket_cnt_shap'), Max('supermarket_premium_cnt_shap'), Max('clinic_cnt_shap'),
Max('bank_cnt_shap'), Max('reca_cnt_shap'), Max('lab_cnt_shap'), Max('culture_cnt_shap'),
Max('attraction_cnt_shap'), Max('mfc_cnt_shap'), Max('bc_cnt_shap'), Max('tc_cnt_shap'),
Max('business_activity_shap'), Min('target_dist_shap'), Min('target_post_cnt_shap'),
Min('target_cnt_ao_mean_shap'), Min('rival_pvz_cnt_shap'), Min('rival_post_cnt_shap'),
Min('metro_dist_shap'), Min('property_price_bargains_shap'),
Min('property_price_offers_shap'), Min('property_mean_floor_shap'), Min('property_era_shap'),
Min('flats_cnt_shap'), Min('popul_home_shap'), Min('popul_job_shap'),
Min('yndxfood_sum_shap'), Min('yndxfood_cnt_shap'), Min('school_cnt_shap'),
Min('kindergar_cnt_shap'), Min('public_stop_cnt_shap'), Min('sport_center_cnt_shap'),
Min('pharmacy_cnt_shap'), Min('supermarket_cnt_shap'), Min('supermarket_premium_cnt_shap'),
Min('clinic_cnt_shap'), Min('bank_cnt_shap'), Min('reca_cnt_shap'), Min('lab_cnt_shap'),
Min('culture_cnt_shap'), Min('attraction_cnt_shap'), Min('mfc_cnt_shap'), Min('bc_cnt_shap'),
Min('tc_cnt_shap'), Min('business_activity_shap'))
return Response({'result': result}, status=HTTPStatus.OK)
class PrePlacementPointViewSet(PlacementPointViewSet):
queryset = models.PrePlacementPoint.objects
@ -439,12 +393,13 @@ class PrePlacementPointViewSet(PlacementPointViewSet):
obj['district'] = models.AO.objects.get(id=ao)
obj['area'] = models.Rayon.objects.get(id=rayon)
obj['age_day'] = 1
new_obj = models.PlacementPoint.objects.create(**obj)
dists = models.PrePlacementPointPVZDistance.objects.filter(placement_point=q).all()
for d in dists:
models.PlacementPointPVZDistance.objects.get_or_create(placement_point=new_obj,
pvz_postamates_group=d.pvz_postamates_group,
dist=d.dist)
models.PlacementPoint.objects.create(**obj)
# new_obj = models.PlacementPoint.objects.create(**obj)
# dists = models.PrePlacementPointPVZDistance.objects.filter(placement_point=q).all()
# for d in dists:
# models.PlacementPointPVZDistance.objects.get_or_create(placement_point=new_obj,
# pvz_postamates_group=d.pvz_postamates_group,
# dist=d.dist)
models.PrePlacementPoint.objects.all().delete()
return Response(status=HTTPStatus.OK, )

Loading…
Cancel
Save