add_house_model

dev
AlexP077 2 years ago
parent 98a1a76c61
commit 11b826d176

Binary file not shown.

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

@ -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',),
},
),
]

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

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

@ -40,25 +40,32 @@ 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')
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(
**{**obj, "matching_status": MatchingStatus.Matched.name})
**{**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,
@ -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'),

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

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

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

@ -64,6 +64,12 @@
<input type="file" name="file_other_objects" accept=".xlsx">
<input type="submit" value="Отправить">
</form>
<h3>Загрузить файл с домами</h3>
<form method="post" action="/api/upload_houses/" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="file_houses" accept=".csv">
<input type="submit" value="Отправить">
</form>
{% endif %}
</div>

Loading…
Cancel
Save