diff --git a/Dockerfile.gdal b/Dockerfile.gdal index 3df04db..b4e236e 100644 --- a/Dockerfile.gdal +++ b/Dockerfile.gdal @@ -53,6 +53,3 @@ RUN pip install -r requirements.txt COPY . /app -COPY wait-for-it.sh /wait-for-it.sh -RUN chmod +x /wait-for-it.sh - diff --git a/requirements.txt b/requirements.txt index e754cfb..6be9c95 100644 --- a/requirements.txt +++ b/requirements.txt @@ -62,3 +62,4 @@ tomli==1.2.2 typing_extensions==4.0.0 urllib3==1.26.7 django-extra-fields==3.0.2 +django-phonenumber-field==6.1.0 diff --git a/rog/admin.py b/rog/admin.py index 6f319a0..c4bc69d 100644 --- a/rog/admin.py +++ b/rog/admin.py @@ -2,7 +2,7 @@ from django.contrib import admin from leaflet.admin import LeafletGeoAdmin from leaflet.admin import LeafletGeoAdminMixin from leaflet_admin_list.admin import LeafletAdminListMixin -from .models import RogEvent, Shop, EventRoute, ShopRoute +from .models import RogUser, Location, SystemSettings, JoinedEvent, Favorite, TravelList, TravelPoint, ShapeLayers class RogAdmin(LeafletAdminListMixin, LeafletGeoAdminMixin, admin.ModelAdmin): @@ -17,7 +17,11 @@ class EventRouteAdmin(LeafletAdminListMixin, LeafletGeoAdminMixin, admin.ModelAd class ShopRouteAdmin(LeafletAdminListMixin, LeafletGeoAdminMixin, admin.ModelAdmin): list_display=['name',] -admin.site.register(RogEvent, RogAdmin) -admin.site.register(Shop, ShopAdmin) -admin.site.register(EventRoute, EventRouteAdmin) -admin.site.register(ShopRoute, ShopRouteAdmin) \ No newline at end of file +admin.site.register(RogUser, admin.ModelAdmin) +admin.site.register(Location, LeafletGeoAdmin) +admin.site.register(SystemSettings, admin.ModelAdmin) +admin.site.register(JoinedEvent, admin.ModelAdmin) +admin.site.register(Favorite, admin.ModelAdmin) +admin.site.register(TravelList, admin.ModelAdmin) +admin.site.register(TravelPoint, admin.ModelAdmin) +admin.site.register(ShapeLayers, admin.ModelAdmin) diff --git a/rog/choices.py b/rog/choices.py new file mode 100644 index 0000000..0b0e58a --- /dev/null +++ b/rog/choices.py @@ -0,0 +1,5 @@ +from django.utils.translation import gettext_lazy as _ + +LAYER_CHOICES = ( + (1, _("locations")), +) \ No newline at end of file diff --git a/rog/mapping.py b/rog/mapping.py new file mode 100644 index 0000000..ad5b58c --- /dev/null +++ b/rog/mapping.py @@ -0,0 +1,7 @@ +from django.contrib.gis.utils import LayerMapping + +location_mapping = { + 'location_name': 'Name', + 'category': 'descriptio', + 'geom': 'MULTIPOLYGON', +} \ No newline at end of file diff --git a/rog/migrations/0005_favorite_joinedevent_layer_location_roguser_systemsettings_travellist_travelpoint.py b/rog/migrations/0005_favorite_joinedevent_layer_location_roguser_systemsettings_travellist_travelpoint.py new file mode 100644 index 0000000..880d504 --- /dev/null +++ b/rog/migrations/0005_favorite_joinedevent_layer_location_roguser_systemsettings_travellist_travelpoint.py @@ -0,0 +1,162 @@ +# Generated by Django 3.2.9 on 2022-02-22 12:54 + +from django.conf import settings +import django.contrib.gis.db.models.fields +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('rog', '0004_shoproute'), + ] + + operations = [ + migrations.CreateModel( + name='Layer', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=155, verbose_name='Layer Name')), + ('description', models.CharField(blank=True, max_length=512, verbose_name='Layer description')), + ('file', models.FileField(blank=True, upload_to='%y%m%d')), + ('uploaded_date', models.DateTimeField(auto_now_add=True)), + ], + options={ + 'verbose_name_plural': 'Layers', + }, + ), + migrations.CreateModel( + name='Location', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('location_id', models.IntegerField(verbose_name='Location Name')), + ('location_name', models.CharField(max_length=255, verbose_name='Location Name')), + ('category', models.CharField(max_length=255, verbose_name='Category')), + ('zip', models.CharField(max_length=12, verbose_name='Zip code')), + ('address', models.CharField(max_length=512, verbose_name='Address')), + ('prefecture', models.CharField(max_length=255, verbose_name='Prefecture')), + ('area', models.CharField(max_length=255, verbose_name='Area')), + ('city', models.CharField(max_length=255, verbose_name='City')), + ('photos', models.JSONField(blank=True, null=True, verbose_name='Phptos')), + ('videos', models.JSONField(blank=True, null=True, verbose_name='Videos')), + ('web_content', models.JSONField(blank=True, null=True, verbose_name='Web Content')), + ('tags', models.CharField(blank=True, max_length=512, null=True, verbose_name='Tags')), + ('parammeters', models.CharField(max_length=512, verbose_name='Parameters')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('last_updated_at', models.DateTimeField(auto_now=True)), + ('geom', django.contrib.gis.db.models.fields.MultiPointField(srid=4326)), + ('file', models.FileField(blank=True, upload_to='%y%m%d')), + ('last_updated_user', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='location_updated_user', to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='TravelPoint', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('travel_id', models.IntegerField(verbose_name='Travel Id')), + ('distance', models.FloatField()), + ('transportation', models.CharField(max_length=255, verbose_name='Transpotation')), + ('eta', models.DateTimeField()), + ('order_number', models.IntegerField()), + ('parammeters', models.CharField(max_length=512, verbose_name='Parameters')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('last_updated_at', models.DateTimeField(auto_now=True)), + ('last_updated_user', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='travelpoint_updated_user', to=settings.AUTH_USER_MODEL)), + ('location', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rog.location')), + ], + ), + migrations.CreateModel( + name='TravelList', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('travel_id', models.IntegerField(verbose_name='Travel Id')), + ('start_date', models.DateTimeField()), + ('finish_date', models.DateTimeField()), + ('category', models.CharField(max_length=255, verbose_name='Category')), + ('title', models.CharField(max_length=255, verbose_name='Title')), + ('transportation', models.CharField(max_length=255, verbose_name='Transpotation')), + ('moving_distance', models.IntegerField()), + ('duration', models.DurationField(verbose_name='Duration')), + ('eta', models.DateTimeField()), + ('parammeters', models.CharField(max_length=512, verbose_name='Parameters')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('last_updated_at', models.DateTimeField(auto_now=True)), + ('last_updated_user', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='travel_list_updated_user', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='SystemSettings', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('setting_name', models.CharField(max_length=255, verbose_name='Settings Name')), + ('version', models.CharField(blank=True, max_length=10, null=True, verbose_name='Version')), + ('effective_date', models.DateTimeField()), + ('end_date', models.DateTimeField()), + ('parammeters', models.CharField(max_length=512, verbose_name='Parameters')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('last_updated_at', models.DateTimeField(auto_now=True)), + ('last_updated_user', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='system_setting_updated_user', to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='RogUser', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('email', models.EmailField(max_length=254, verbose_name='Email')), + ('phone', models.CharField(max_length=55, verbose_name='Phone Number')), + ('first_name', models.CharField(max_length=255, verbose_name='First Name')), + ('middle_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='Middle Name')), + ('last_name', models.CharField(max_length=255, verbose_name='last_name')), + ('nickname', models.CharField(blank=True, max_length=255, null=True, verbose_name='Nickname')), + ('country', models.CharField(default='Japan', max_length=255, verbose_name='Country')), + ('language', models.CharField(default='Japanese', max_length=255, verbose_name='Language')), + ('prefecture', models.CharField(blank=True, max_length=255, null=True, verbose_name='Prefecture')), + ('sex', models.CharField(blank=True, default='unknown', max_length=255, null=True, verbose_name='Sex')), + ('birth_year', models.IntegerField(blank=True, null=True, verbose_name='Birth year')), + ('family_structure', models.IntegerField(blank=True, null=True, verbose_name='Family Structure')), + ('introducer', models.IntegerField(blank=True, default=0, null=True, verbose_name='Introducerr')), + ('level', models.IntegerField(blank=True, default=0, null=True, verbose_name='Level')), + ('parammeters', models.CharField(max_length=512, verbose_name='Parameters')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('last_updated_at', models.DateTimeField(auto_now=True)), + ('last_updated_user', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='roguser_updated_user', to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='JoinedEvent', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('tag_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='Tag Name')), + ('status', models.CharField(choices=[('REGISTERED', 'Registered'), ('ACCEPTED', 'accepted'), ('PAID', 'paid'), ('JOINED', 'joined'), ('CANCELED', 'Canceled')], max_length=256)), + ('registration_id', models.CharField(max_length=56, verbose_name='Registration Id')), + ('payment_code', models.CharField(max_length=255, verbose_name='Payment Code')), + ('paied_amount', models.IntegerField(default=0, verbose_name='Paid Amount')), + ('remark', models.CharField(blank=True, max_length=255, null=True, verbose_name='Remark')), + ('parammeters', models.CharField(max_length=512, verbose_name='Parameters')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('last_updated_at', models.DateTimeField(auto_now=True)), + ('last_updated_user', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='joined_event_updated_user', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='Favorite', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('good', models.IntegerField(default=0, verbose_name='Good')), + ('favorite', models.IntegerField(default=0, verbose_name='Favorite')), + ('evaluation', models.IntegerField(default=0, verbose_name='Evaluation')), + ('number_visit', models.IntegerField(default=0, verbose_name='Good')), + ('last_visited', models.DateTimeField(verbose_name='Last Visited')), + ('parammeters', models.CharField(max_length=512, verbose_name='Parameters')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('last_updated_at', models.DateTimeField(auto_now=True)), + ('last_updated_user', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='favorite_updated_user', to=settings.AUTH_USER_MODEL)), + ('location', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rog.location')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/rog/migrations/0006_auto_20220222_2308.py b/rog/migrations/0006_auto_20220222_2308.py new file mode 100644 index 0000000..76175f5 --- /dev/null +++ b/rog/migrations/0006_auto_20220222_2308.py @@ -0,0 +1,31 @@ +# Generated by Django 3.2.9 on 2022-02-22 14:08 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('rog', '0005_favorite_joinedevent_layer_location_roguser_systemsettings_travellist_travelpoint'), + ] + + operations = [ + migrations.CreateModel( + name='ShapeLayers', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255, verbose_name='Shape Layer')), + ('file', models.FileField(blank=True, upload_to='%y%m%d')), + ('uploaded_date', models.DateField(auto_now_add=True)), + ('layerof', models.IntegerField(choices=[(1, 'locations')], default=1)), + ('table_name', models.CharField(blank=True, max_length=255, verbose_name='Table name')), + ], + ), + migrations.DeleteModel( + name='Layer', + ), + migrations.RemoveField( + model_name='location', + name='file', + ), + ] diff --git a/rog/migrations/0007_auto_20220222_2320.py b/rog/migrations/0007_auto_20220222_2320.py new file mode 100644 index 0000000..91bcf1d --- /dev/null +++ b/rog/migrations/0007_auto_20220222_2320.py @@ -0,0 +1,48 @@ +# Generated by Django 3.2.9 on 2022-02-22 14:20 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('rog', '0006_auto_20220222_2308'), + ] + + operations = [ + migrations.AlterField( + model_name='location', + name='address', + field=models.CharField(blank=True, max_length=512, null=True, verbose_name='Address'), + ), + migrations.AlterField( + model_name='location', + name='area', + field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Area'), + ), + migrations.AlterField( + model_name='location', + name='city', + field=models.CharField(blank=True, max_length=255, null=True, verbose_name='City'), + ), + migrations.AlterField( + model_name='location', + name='location_id', + field=models.IntegerField(blank=True, null=True, verbose_name='Location Name'), + ), + migrations.AlterField( + model_name='location', + name='parammeters', + field=models.CharField(blank=True, max_length=512, null=True, verbose_name='Parameters'), + ), + migrations.AlterField( + model_name='location', + name='prefecture', + field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Prefecture'), + ), + migrations.AlterField( + model_name='location', + name='zip', + field=models.CharField(blank=True, max_length=12, null=True, verbose_name='Zip code'), + ), + ] diff --git a/rog/migrations/0008_alter_location_category.py b/rog/migrations/0008_alter_location_category.py new file mode 100644 index 0000000..1f2b491 --- /dev/null +++ b/rog/migrations/0008_alter_location_category.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.9 on 2022-02-22 14:22 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('rog', '0007_auto_20220222_2320'), + ] + + operations = [ + migrations.AlterField( + model_name='location', + name='category', + field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Category'), + ), + ] diff --git a/rog/migrations/0009_alter_location_last_updated_user.py b/rog/migrations/0009_alter_location_last_updated_user.py new file mode 100644 index 0000000..867cb02 --- /dev/null +++ b/rog/migrations/0009_alter_location_last_updated_user.py @@ -0,0 +1,21 @@ +# Generated by Django 3.2.9 on 2022-02-22 14:36 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('rog', '0008_alter_location_category'), + ] + + operations = [ + migrations.AlterField( + model_name='location', + name='last_updated_user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='location_updated_user', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/rog/models.py b/rog/models.py index 8fa19c5..84cb00f 100644 --- a/rog/models.py +++ b/rog/models.py @@ -1,5 +1,143 @@ +from typing import ChainMap from django.contrib.gis.db import models from django.utils.translation import gettext_lazy as _ +from django.contrib.auth.models import User +from django.db.models.signals import post_save, post_delete, pre_save +from django.dispatch import receiver +import geopandas as gpd +from sqlalchemy import * +from geoalchemy2 import Geometry, WKTElement +import os, zipfile, glob +import environ +from geo.Postgres import Db +from sqlalchemy.sql.functions import mode +from .mapping import location_mapping +from .choices import LAYER_CHOICES +from django.contrib.gis.utils import LayerMapping + +env = environ.Env(DEBUG=(bool, False)) +environ.Env.read_env(env_file=".env") + +db = Db(dbname=env("POSTGRES_DBNAME"), user=env("POSTGRES_USER"), password=env("POSTGRES_PASS"), host="postgres-db", port=env("PG_PORT")) + + +class RogUser(models.Model): + email=models.EmailField(_('Email')) + phone=models.CharField(_('Phone Number'), max_length=55) + first_name=models.CharField(_('First Name'), max_length=255) + middle_name=models.CharField(_('Middle Name'), max_length=255, blank=True, null=True) + last_name=models.CharField(_('last_name'), max_length=255) + nickname=models.CharField(_('Nickname'), max_length=255, blank=True, null=True) + country=models.CharField(_('Country'), max_length=255, default='Japan') + language=models.CharField(_('Language'), max_length=255, default='Japanese') + prefecture=models.CharField(_('Prefecture'), max_length=255, blank=True, null=True) + sex=models.CharField(_('Sex'), max_length=255, default='unknown', blank=True, null=True) + birth_year=models.IntegerField(_('Birth year'), blank=True, null=True) + family_structure =models.IntegerField(_('Family Structure'), blank=True, null=True) + introducer = models.IntegerField(_('Introducerr'), blank=True, null=True, default=0) + level= models.IntegerField(_('Level'), blank=True, null=True, default=0) + parammeters=models.CharField(_('Parameters'), max_length=512) + created_at=models.DateTimeField(auto_now_add=True) + last_updated_user=models.ForeignKey(User, related_name="roguser_updated_user", on_delete=models.DO_NOTHING) + last_updated_at=models.DateTimeField(auto_now=True) + + +class SystemSettings(models.Model): + setting_name=models.CharField(_('Settings Name'), max_length=255) + version=models.CharField(_('Version'), max_length=10, blank=True, null=True) + effective_date=models.DateTimeField() + end_date=models.DateTimeField() + parammeters=models.CharField(_('Parameters'), max_length=512) + created_at=models.DateTimeField(auto_now_add=True) + last_updated_user=models.ForeignKey(User, related_name="system_setting_updated_user", on_delete=models.DO_NOTHING) + last_updated_at=models.DateTimeField(auto_now=True) + +class Location(models.Model): + location_id=models.IntegerField(_('Location Name'), blank=True, null=True) + location_name=models.CharField(_('Location Name'), max_length=255) + category=models.CharField(_('Category'), max_length=255, blank=True, null=True) + zip=models.CharField(_('Zip code'), max_length=12, blank=True, null=True) + address = models.CharField(_('Address'), max_length=512, blank=True, null=True) + prefecture = models.CharField(_('Prefecture'), max_length=255, blank=True, null=True) + area= models.CharField(_('Area'), max_length=255, blank=True, null=True) + city= models.CharField(_('City'), max_length=255, blank=True, null=True) + photos=models.JSONField(_('Phptos'), blank=True, null=True) + videos=models.JSONField(_('Videos'), blank=True, null=True) + web_content=models.JSONField(_('Web Content'), blank=True, null=True) + tags=models.CharField(_('Tags'), max_length=512, blank=True, null=True) + parammeters=models.CharField(_('Parameters'), max_length=512, blank=True, null=True) + created_at=models.DateTimeField(auto_now_add=True) + last_updated_user=models.ForeignKey(User, related_name="location_updated_user", on_delete=models.DO_NOTHING,blank=True, null=True) + last_updated_at=models.DateTimeField(auto_now=True) + geom=models.MultiPointField(srid=4326) + + +ROG_STATUS = ( + ("REGISTERED", _("Registered")), + ("ACCEPTED", _("accepted")), + ("PAID", _("paid")), + ("JOINED", _("joined")), + ("CANCELED", _("Canceled")) +) + +class JoinedEvent(models.Model): + user=models.ForeignKey(User, on_delete=models.DO_NOTHING) + tag_name=models.CharField(_('Tag Name'), max_length=255, blank=True, null=True) + status=models.CharField(max_length=256, choices=ROG_STATUS) + registration_id=models.CharField(_('Registration Id'), max_length=56) + payment_code=models.CharField(_('Payment Code'), max_length=255) + paied_amount=models.IntegerField(_('Paid Amount'), default=0) + remark=models.CharField(_('Remark'), max_length=255, blank=True, null=True) + parammeters=models.CharField(_('Parameters'), max_length=512) + created_at=models.DateTimeField(auto_now_add=True) + last_updated_user=models.ForeignKey(User, related_name="joined_event_updated_user", on_delete=models.DO_NOTHING) + last_updated_at=models.DateTimeField(auto_now=True) + + +class Favorite(models.Model): + user=models.ForeignKey(User, on_delete=models.DO_NOTHING) + location=models.ForeignKey(Location, on_delete=models.CASCADE) + good=models.IntegerField(_('Good'), default=0) + favorite=models.IntegerField(_('Favorite'), default=0) + evaluation=models.IntegerField(_('Evaluation'), default=0) + number_visit=models.IntegerField(_('Good'), default=0) + last_visited=models.DateTimeField(_('Last Visited')) + parammeters=models.CharField(_('Parameters'), max_length=512) + created_at=models.DateTimeField(auto_now_add=True) + last_updated_user=models.ForeignKey(User, related_name="favorite_updated_user", on_delete=models.DO_NOTHING) + last_updated_at=models.DateTimeField(auto_now=True) + + +class TravelList(models.Model): + travel_id= models.IntegerField(_('Travel Id')) + user=models.ForeignKey(User, on_delete=models.DO_NOTHING) + start_date=models.DateTimeField() + finish_date=models.DateTimeField() + category=models.CharField(_('Category'), max_length=255) + title=models.CharField(_('Title'), max_length=255) + transportation=models.CharField(_('Transpotation'), max_length=255) + moving_distance=models.IntegerField() + duration=models.DurationField(_('Duration')) + eta=models.DateTimeField() + parammeters=models.CharField(_('Parameters'), max_length=512) + created_at=models.DateTimeField(auto_now_add=True) + last_updated_user=models.ForeignKey(User, related_name="travel_list_updated_user", on_delete=models.DO_NOTHING) + last_updated_at=models.DateTimeField(auto_now=True) + + +class TravelPoint(models.Model): + travel_id= models.IntegerField(_('Travel Id')) + location=models.ForeignKey(Location, on_delete=models.CASCADE) + distance=models.FloatField() + transportation=models.CharField(_('Transpotation'), max_length=255) + eta=models.DateTimeField() + order_number=models.IntegerField() + parammeters=models.CharField(_('Parameters'), max_length=512) + created_at=models.DateTimeField(auto_now_add=True) + last_updated_user=models.ForeignKey(User, related_name="travelpoint_updated_user", on_delete=models.DO_NOTHING) + last_updated_at=models.DateTimeField(auto_now=True) + + class RogEvent(models.Model): @@ -34,4 +172,63 @@ class ShopRoute(models.Model): geom = models.MultiLineStringField(srid=4326) def __str__(self): - return self.name \ No newline at end of file + return self.name + + +def getTableForModel(tbl): + if tbl == 1: + return Location.objects.model._meta.db_table; + +def getMappingforModel(tbl, shp): + if tbl == 1: + return LayerMapping(Location, shp, location_mapping, transform=False) + + +class ShapeLayers(models.Model): + name = models.CharField(_("Shape Layer"), max_length=255) + file = models.FileField(upload_to='%y%m%d', blank=True) + uploaded_date = models.DateField(auto_now_add=True) + layerof = models.IntegerField(choices=LAYER_CHOICES, default=1) + table_name = models.CharField(_("Table name"), max_length=255, blank=True) + + def __str__(self): + return self.name + + + + +@receiver(pre_save, sender=ShapeLayers) +def my_callback(sender, instance, *args, **kwargs): + instance.table_name = getTableForModel(instance.layerof) + +@receiver(post_save, sender=ShapeLayers) +def publish_date(sender, instance, created, **kwargs): + file = instance.file.path + file_format = os.path.basename(file).split('.')[-1] + file_name = os.path.basename(file).split('.')[0] + file_path = os.path.dirname(file) + name = instance.name + conn_str = f'postgresql://{env("POSTGRES_USER")}:{env("POSTGRES_PASS")}@{env("PG_HOST")}:{env("PG_PORT")}/{env("POSTGRES_DBNAME")}' + + with zipfile.ZipFile(file, 'r') as zip_ref: + zip_ref.extractall(file_path) + + os.remove(file) + + try: + shp = glob.glob(r'{}/**/*.shp'.format(file_path), recursive=True)[0] + gdf = gpd.read_file(shp) + crs_name = str(gdf.crs.srs) + print(crs_name, 'crs - name') + epsg = int(crs_name.replace('epsg:','')) + if epsg is None: + epsg=4326 + + print("### shape file is ###") + + lm2 = getMappingforModel(instance.layerof, shp) + lm2.save(strict=True, verbose=True) + + os.remove(shp) + except Exception as e: + print('##################',e)