From 11b826d176f012a41ed16666ad96c3d99e86a5b6 Mon Sep 17 00:00:00 2001 From: AlexP077 Date: Mon, 2 Oct 2023 14:05:05 +0300 Subject: [PATCH] add_house_model --- PrePlacementPoints.xlsx | Bin 11334132 -> 11315639 bytes service/admin.py | 3 +- service/migrations/0036_house.py | 32 +++++++++++ service/migrations/0037_auto_20231002_1349.py | 23 ++++++++ service/models.py | 19 ++++++- service/service.py | 51 ++++++++++++++---- service/urls.py | 1 + service/utils.py | 12 ++++- service/views.py | 19 +++++-- templates/admin/index.html | 6 +++ 10 files changed, 147 insertions(+), 19 deletions(-) create mode 100644 service/migrations/0036_house.py create mode 100644 service/migrations/0037_auto_20231002_1349.py diff --git a/PrePlacementPoints.xlsx b/PrePlacementPoints.xlsx index 80027fe7ed8bce13f9a5493411699ca9deacb0fd..a508bb31637ebec322e36dfbd6b8fe435fb089b3 100644 GIT binary patch delta 34010 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 i#CbUz!m<7c+9?=Z4xz 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 Smqu)lOEl@w;b|iD_`d-9IaS60 diff --git a/service/admin.py b/service/admin.py index f579e59..0977e67 100644 --- a/service/admin.py +++ b/service/admin.py @@ -12,7 +12,7 @@ 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 + OtherObjectsCategory, PrePlacementPointPVZDistance, TempFiles, RaschetGroups, House from service.models import PlacementPointPVZDistance, TaskStatus from postamates.settings import DEBUG from django.core.cache import cache @@ -44,6 +44,7 @@ class Post_and_PVZAdmin(admin.ModelAdmin): 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) diff --git a/service/migrations/0036_house.py b/service/migrations/0036_house.py new file mode 100644 index 0000000..8b1845a --- /dev/null +++ b/service/migrations/0036_house.py @@ -0,0 +1,32 @@ +# Generated by Django 3.2 on 2023-10-02 09:21 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('service', '0035_auto_20230928_1519'), + ] + + operations = [ + migrations.CreateModel( + name='House', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('year_bld', models.IntegerField(blank=True, null=True)), + ('mat_nes', models.TextField(blank=True, null=True)), + ('flat_cnt', models.IntegerField(blank=True, null=True)), + ('levels', models.TextField(blank=True, null=True)), + ('doors', models.IntegerField(blank=True, null=True)), + ('enrg_cls', models.TextField(blank=True, null=True)), + ('street', models.TextField(blank=True, null=True)), + ('house_number', models.TextField(blank=True, null=True)), + ], + options={ + 'verbose_name': 'Дом', + 'verbose_name_plural': 'Дома', + 'ordering': ('id',), + }, + ), + ] diff --git a/service/migrations/0037_auto_20231002_1349.py b/service/migrations/0037_auto_20231002_1349.py new file mode 100644 index 0000000..f18ef38 --- /dev/null +++ b/service/migrations/0037_auto_20231002_1349.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2 on 2023-10-02 10:49 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('service', '0036_house'), + ] + + operations = [ + migrations.AlterField( + model_name='placementpoint', + name='levels', + field=models.TextField(blank=True, null=True), + ), + migrations.AlterField( + model_name='preplacementpoint', + name='levels', + field=models.TextField(blank=True, null=True), + ), + ] diff --git a/service/models.py b/service/models.py index 0522d09..9dd5246 100644 --- a/service/models.py +++ b/service/models.py @@ -30,7 +30,7 @@ class AbstractPlacementPoint(models.Model): sample_trn = models.BooleanField(null=True, blank=True) flat_cnt = models.IntegerField(null=True, blank=True, verbose_name='Количество квартир') year_bld = models.IntegerField(null=True, blank=True, verbose_name='Год постройки') - levels = models.IntegerField(null=True, blank=True) + levels = models.TextField(null=True, blank=True) enrg_cls = models.TextField(null=True, blank=True) mat_nes = models.TextField(null=True, blank=True) doors = models.IntegerField(null=True, blank=True) @@ -278,3 +278,20 @@ class RaschetGroups(models.Model): class RaschetObjects(models.Model): obj_id = models.IntegerField(null=False, blank=False) + + +class House(models.Model): + class Meta: + verbose_name = 'Дом' + verbose_name_plural = 'Дома' + ordering = ('id',) + + year_bld = models.IntegerField(blank=True,null=True) + mat_nes = models.TextField(blank=True,null=True) + flat_cnt = models.IntegerField(blank=True, null=True) + levels = models.TextField(blank=True,null=True) + doors = models.IntegerField(blank=True, null=True) + enrg_cls = models.TextField(blank=True,null=True) + street = models.TextField(blank=True,null=True) + house_number = models.TextField(blank=True,null=True) + diff --git a/service/service.py b/service/service.py index 757db97..83a9cd0 100644 --- a/service/service.py +++ b/service/service.py @@ -40,29 +40,36 @@ class PointService: req_url = f"https://geocode.search.hereapi.com/v1/geocode?q={addr}&apiKey={GEOCODER_API_KEY}" response = requests.get(req_url).json().get('items') if not response: - models.PrePlacementPoint.objects.create(address=addr, matching_status=MatchingStatus.Error.name, status=PointStatus.Pending.name) + models.PrePlacementPoint.objects.create(address=addr, matching_status=MatchingStatus.Error.name, + status=PointStatus.Pending.name) problem += 1 continue coords = response[0].get('position') if not coords: - models.PrePlacementPoint.objects.create(address=addr, matching_status=MatchingStatus.Error.name, status=PointStatus.Pending.name) + models.PrePlacementPoint.objects.create(address=addr, matching_status=MatchingStatus.Error.name, + status=PointStatus.Pending.name) problem += 1 continue wkt = "POINT(" + str(coords['lng']) + " " + str(coords['lat']) + ")" response = response[0]['address'] obj = models.PlacementPoint.objects.filter(street=response.get('street'), house_number=response.get('houseNumber'), - category=cat).values().first() + category=cat).values() rayon = models.Rayon.objects.filter(polygon__intersects=wkt).first() if obj: - distances = models.PlacementPointPVZDistance.objects.filter(placement_point=obj.get('id')).all() - obj.pop('id') - pre_obj, _ = models.PrePlacementPoint.objects.get_or_create( - **{**obj, "matching_status": MatchingStatus.Matched.name}) - for d in distances: - models.PrePlacementPointPVZDistance.objects.get_or_create(placement_point=pre_obj, - pvz_postamates_group=d.pvz_postamates_group, - dist=d.dist) + if cat == 'Подъезд жилого дома': + objs = obj.all() + else: + objs = [obj.first()] + for o in objs: + distances = models.PlacementPointPVZDistance.objects.filter(placement_point=o.get('id')).all() + o.pop('id') + pre_obj, _ = models.PrePlacementPoint.objects.get_or_create( + **{**o, "matching_status": MatchingStatus.Matched.name}) + 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: @@ -75,6 +82,28 @@ class PointService: matching_status=MatchingStatus.Error.name, status=PointStatus.Pending.name) problem += 1 + elif cat == 'Подъезд жилого дома': + houses = models.House.objects.filter(street=response.get('street'), + house_number=response.get('houseNumber')).values().all() + for house in houses: + house.pop('id') + if house.get('doors') and house.get('doors') != 0: + house['flat_cnt'] = int(house['flat_cnt'] / house['doors']) + for _num in range(house['doors']): + models.PrePlacementPoint.objects.get_or_create(**house, address=addr, + name=f'Подъезд {_num + 1}', + matching_status=MatchingStatus.New.name, + sample_trn=False, + is_vis=True, geometry=wkt, + status=PointStatus.Pending.name, area=rayon, + district=rayon.AO) + else: + models.PrePlacementPoint.objects.get_or_create(**house, address=addr, + matching_status=MatchingStatus.New.name, + sample_trn=False, + is_vis=True, geometry=wkt, + status=PointStatus.Pending.name, area=rayon, + district=rayon.AO) else: models.PrePlacementPoint.objects.get_or_create(address=addr, street=response.get('street'), house_number=response.get('houseNumber'), diff --git a/service/urls.py b/service/urls.py index 69d3e6d..cd63db6 100644 --- a/service/urls.py +++ b/service/urls.py @@ -15,6 +15,7 @@ urlpatterns += [ url(r'load_csv/', views.refresh_placement_points.as_view(), name='upload_placement_points'), url(r'upload_post_and_pvz/', views.upload_post_and_pvz, name='upload_post_and_pvz'), url(r'upload_other_objects/', views.upload_other_objects, name='upload_other_objects'), + url(r'upload_houses/', views.upload_houses, name='upload_houses'), url(r'me/', views.get_current_user, name='me'), url('download_pvz_template/', views.download_pvz_template, name='download_pvz_template'), url('download_other_template/', views.download_other_template, name='download_other_template'), diff --git a/service/utils.py b/service/utils.py index 197ac46..d835549 100644 --- a/service/utils.py +++ b/service/utils.py @@ -17,6 +17,7 @@ from rest_framework.viewsets import ReadOnlyModelViewSet import psycopg2 from postamates.settings import DB_URL + def run_sql_command(command): connection = psycopg2.connect( DB_URL @@ -81,7 +82,7 @@ def load_dist(filepath: str): def log_to_telegram(msg): requests.post('https://api.telegram.org/bot6275517704:AAHVp_qv9d9NU740JJdOM2fJdgS4r1AgJrw/sendMessage', - json={"chat_id": "-555238820", "text": str(settings.DOMAIN)+'\n'+msg}) + json={"chat_id": "-555238820", "text": str(settings.DOMAIN) + '\n' + msg}) def cached_func(key, func, timeout=settings.CACHE_TIMEOUT, *args, **kwargs): @@ -103,3 +104,12 @@ class CustomReadOnlyModelViewSet(ReadOnlyModelViewSet): def create_columns_dist(row): return pd.Series(row['min_distance_to_group']) + + +def load_houses(filepath: str): + models.House.objects.all().delete() + df = pd.read_csv(filepath) + df = df.replace(np.nan, None) + df = df.replace('NaT', None) + for row in df.to_dict('records'): + models.House.objects.create(**row) diff --git a/service/views.py b/service/views.py index 054cbd1..405bd76 100644 --- a/service/views.py +++ b/service/views.py @@ -187,10 +187,10 @@ class PlacementPointViewSet(ReadOnlyModelViewSet): if group_dists_lt: g_d = [list(g.split(',')) for g in group_dists_lt] for group in g_d: - if basename=='preplacementpoint': + if basename == 'preplacementpoint': filtered_points = list( models.PrePlacementPointPVZDistance.objects.filter(pvz_postamates_group__id=int(group[0]), - dist__lt=int(group[1])).values_list( + dist__lt=int(group[1])).values_list( 'placement_point__id', flat=True)) else: filtered_points = list( @@ -201,10 +201,10 @@ class PlacementPointViewSet(ReadOnlyModelViewSet): if group_dists_gt: g_d = [list(g.split(',')) for g in group_dists_gt] for group in g_d: - if basename=='preplacementpoint': + if basename == 'preplacementpoint': filtered_points = list( models.PrePlacementPointPVZDistance.objects.filter(pvz_postamates_group__id=int(group[0]), - dist__gt=int(group[1])).values_list( + dist__gt=int(group[1])).values_list( 'placement_point__id', flat=True)) else: filtered_points = list( @@ -396,7 +396,7 @@ class PrePlacementPointViewSet(PlacementPointViewSet): obj.pop('id') ao = obj.pop('district') rayon = obj.pop('area') - obj['district']=models.AO.objects.get(id=ao) + 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) @@ -482,6 +482,15 @@ def upload_dist(request): return redirect('/admin') +@api_view(['POST']) +def upload_houses(request): + warnings.filterwarnings('ignore') + file_dist = request.FILES['file_houses'] + utils.load_houses(file_dist) + messages.success(request, 'Файл с домами успешно загружен') + return redirect('/admin') + + @api_view(['GET']) @permission_classes([IsAuthenticated]) def get_current_user(request): diff --git a/templates/admin/index.html b/templates/admin/index.html index 5e8721b..93ebb19 100644 --- a/templates/admin/index.html +++ b/templates/admin/index.html @@ -64,6 +64,12 @@ +

Загрузить файл с домами

+
+ {% csrf_token %} + + +
{% endif %}