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 Rayon
from service.models import PrePlacementPoint, Post_and_pvz, Post_and_pvzCategory, Post_and_pvzGroup, OtherObjects, \ from service.models import PrePlacementPoint, Post_and_pvz, Post_and_pvzCategory, Post_and_pvzGroup, OtherObjects, \
OtherObjectsGroup, \ OtherObjectsGroup, \
OtherObjectsCategory, PrePlacementPointPVZDistance, TempFiles, RaschetGroups OtherObjectsCategory, PrePlacementPointPVZDistance, TempFiles, RaschetGroups, House
from service.models import PlacementPointPVZDistance, TaskStatus from service.models import PlacementPointPVZDistance, TaskStatus
from postamates.settings import DEBUG from postamates.settings import DEBUG
from django.core.cache import cache 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(Post_and_pvz, Post_and_PVZAdmin)
my_admin_site.register(OtherObjects) my_admin_site.register(OtherObjects)
my_admin_site.register(House)
my_admin_site.register(PrePlacementPoint) my_admin_site.register(PrePlacementPoint)
my_admin_site.register(PrePlacementPointPVZDistance) 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) sample_trn = models.BooleanField(null=True, blank=True)
flat_cnt = models.IntegerField(null=True, blank=True, verbose_name='Количество квартир') flat_cnt = models.IntegerField(null=True, blank=True, verbose_name='Количество квартир')
year_bld = 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) enrg_cls = models.TextField(null=True, blank=True)
mat_nes = models.TextField(null=True, blank=True) mat_nes = models.TextField(null=True, blank=True)
doors = models.IntegerField(null=True, blank=True) doors = models.IntegerField(null=True, blank=True)
@ -278,3 +278,20 @@ class RaschetGroups(models.Model):
class RaschetObjects(models.Model): class RaschetObjects(models.Model):
obj_id = models.IntegerField(null=False, blank=False) 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}" req_url = f"https://geocode.search.hereapi.com/v1/geocode?q={addr}&apiKey={GEOCODER_API_KEY}"
response = requests.get(req_url).json().get('items') response = requests.get(req_url).json().get('items')
if not response: 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 problem += 1
continue continue
coords = response[0].get('position') coords = response[0].get('position')
if not coords: 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 problem += 1
continue continue
wkt = "POINT(" + str(coords['lng']) + " " + str(coords['lat']) + ")" wkt = "POINT(" + str(coords['lng']) + " " + str(coords['lat']) + ")"
response = response[0]['address'] response = response[0]['address']
obj = models.PlacementPoint.objects.filter(street=response.get('street'), obj = models.PlacementPoint.objects.filter(street=response.get('street'),
house_number=response.get('houseNumber'), house_number=response.get('houseNumber'),
category=cat).values().first() category=cat).values()
rayon = models.Rayon.objects.filter(polygon__intersects=wkt).first() rayon = models.Rayon.objects.filter(polygon__intersects=wkt).first()
if obj: if obj:
distances = models.PlacementPointPVZDistance.objects.filter(placement_point=obj.get('id')).all() if cat == 'Подъезд жилого дома':
obj.pop('id') 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( pre_obj, _ = models.PrePlacementPoint.objects.get_or_create(
**{**obj, "matching_status": MatchingStatus.Matched.name}) **{**o, "matching_status": MatchingStatus.Matched.name})
for d in distances: for d in distances:
models.PrePlacementPointPVZDistance.objects.get_or_create(placement_point=pre_obj, models.PrePlacementPointPVZDistance.objects.get_or_create(placement_point=pre_obj,
pvz_postamates_group=d.pvz_postamates_group, pvz_postamates_group=d.pvz_postamates_group,
@ -75,6 +82,28 @@ class PointService:
matching_status=MatchingStatus.Error.name, matching_status=MatchingStatus.Error.name,
status=PointStatus.Pending.name) status=PointStatus.Pending.name)
problem += 1 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: else:
models.PrePlacementPoint.objects.get_or_create(address=addr, street=response.get('street'), models.PrePlacementPoint.objects.get_or_create(address=addr, street=response.get('street'),
house_number=response.get('houseNumber'), 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'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_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_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(r'me/', views.get_current_user, name='me'),
url('download_pvz_template/', views.download_pvz_template, name='download_pvz_template'), url('download_pvz_template/', views.download_pvz_template, name='download_pvz_template'),
url('download_other_template/', views.download_other_template, name='download_other_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 import psycopg2
from postamates.settings import DB_URL from postamates.settings import DB_URL
def run_sql_command(command): def run_sql_command(command):
connection = psycopg2.connect( connection = psycopg2.connect(
DB_URL DB_URL
@ -103,3 +104,12 @@ class CustomReadOnlyModelViewSet(ReadOnlyModelViewSet):
def create_columns_dist(row): def create_columns_dist(row):
return pd.Series(row['min_distance_to_group']) 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') 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']) @api_view(['GET'])
@permission_classes([IsAuthenticated]) @permission_classes([IsAuthenticated])
def get_current_user(request): def get_current_user(request):

@ -64,6 +64,12 @@
<input type="file" name="file_other_objects" accept=".xlsx"> <input type="file" name="file_other_objects" accept=".xlsx">
<input type="submit" value="Отправить"> <input type="submit" value="Отправить">
</form> </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 %} {% endif %}
</div> </div>

Loading…
Cancel
Save