summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--archaeological_context_records/migrations/0107_auto_20220211_1630.py71
-rw-r--r--archaeological_files/migrations/0107_auto_20220211_1630.py45
-rw-r--r--archaeological_finds/migrations/0109_auto_20220211_1630.py142
-rw-r--r--archaeological_operations/migrations/0108_auto_20220211_1630.py17
-rw-r--r--archaeological_operations/migrations/0109_auto_20220211_1630.py201
-rw-r--r--archaeological_warehouse/migrations/0113_auto_20220211_1630.py171
-rw-r--r--ishtar_common/admin.py41
-rw-r--r--ishtar_common/migrations/0220_auto_20220211_1630.py114
-rw-r--r--ishtar_common/models_common.py119
9 files changed, 903 insertions, 18 deletions
diff --git a/archaeological_context_records/migrations/0107_auto_20220211_1630.py b/archaeological_context_records/migrations/0107_auto_20220211_1630.py
new file mode 100644
index 000000000..725cdbf7e
--- /dev/null
+++ b/archaeological_context_records/migrations/0107_auto_20220211_1630.py
@@ -0,0 +1,71 @@
+# Generated by Django 2.2.24 on 2022-02-11 16:30
+
+import django.contrib.postgres.fields.jsonb
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('ishtar_common', '0220_auto_20220211_1630'),
+ ('archaeological_context_records', '0106_auto_20210326_1434'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='contextrecord',
+ name='geodata',
+ field=models.ManyToManyField(blank=True, related_name='related_items_archaeological_context_records_contextrecord', to='ishtar_common.GeoVectorData'),
+ ),
+ migrations.AddField(
+ model_name='contextrecord',
+ name='main_geodata',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='main_related_items_archaeological_context_records_contextrecord', to='ishtar_common.GeoVectorData'),
+ ),
+ migrations.AddField(
+ model_name='historicalcontextrecord',
+ name='main_geodata',
+ field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='ishtar_common.GeoVectorData'),
+ ),
+ migrations.AlterField(
+ model_name='contextrecord',
+ name='data',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='contextrecord',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='contextrecord',
+ name='spatial_reference_system',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='ishtar_common.SpatialReferenceSystem', verbose_name='Spatial Reference System'),
+ ),
+ migrations.AlterField(
+ model_name='dating',
+ name='period',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='archaeological_operations.Period', verbose_name='Period'),
+ ),
+ migrations.AlterField(
+ model_name='historicalcontextrecord',
+ name='data',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='historicalcontextrecord',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='recordrelations',
+ name='relation_type',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='archaeological_context_records.RelationType'),
+ ),
+ migrations.AlterField(
+ model_name='relationtype',
+ name='inverse_relation',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='archaeological_context_records.RelationType', verbose_name='Inverse relation'),
+ ),
+ ]
diff --git a/archaeological_files/migrations/0107_auto_20220211_1630.py b/archaeological_files/migrations/0107_auto_20220211_1630.py
new file mode 100644
index 000000000..b5bcaebf1
--- /dev/null
+++ b/archaeological_files/migrations/0107_auto_20220211_1630.py
@@ -0,0 +1,45 @@
+# Generated by Django 2.2.24 on 2022-02-11 16:30
+
+import django.contrib.postgres.fields.jsonb
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('archaeological_files', '0106_auto_20210803_1730'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='file',
+ name='data',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='file',
+ name='file_type',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='archaeological_files.FileType', verbose_name='File type'),
+ ),
+ migrations.AlterField(
+ model_name='file',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='historicalfile',
+ name='data',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='historicalfile',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='job',
+ name='child',
+ field=models.ForeignKey(blank=True, help_text='Auto-add this job when a parent is added', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='parents', to='archaeological_files.Job', verbose_name='Child'),
+ ),
+ ]
diff --git a/archaeological_finds/migrations/0109_auto_20220211_1630.py b/archaeological_finds/migrations/0109_auto_20220211_1630.py
new file mode 100644
index 000000000..42421f3ce
--- /dev/null
+++ b/archaeological_finds/migrations/0109_auto_20220211_1630.py
@@ -0,0 +1,142 @@
+# Generated by Django 2.2.24 on 2022-02-11 16:30
+
+import archaeological_finds.models_treatments
+import django.contrib.postgres.fields.jsonb
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('ishtar_common', '0220_auto_20220211_1630'),
+ ('archaeological_finds', '0108_auto_20210602_2234'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='basefind',
+ name='geodata',
+ field=models.ManyToManyField(blank=True, related_name='related_items_archaeological_finds_basefind', to='ishtar_common.GeoVectorData'),
+ ),
+ migrations.AddField(
+ model_name='basefind',
+ name='main_geodata',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='main_related_items_archaeological_finds_basefind', to='ishtar_common.GeoVectorData'),
+ ),
+ migrations.AddField(
+ model_name='historicalbasefind',
+ name='main_geodata',
+ field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='ishtar_common.GeoVectorData'),
+ ),
+ migrations.AlterField(
+ model_name='basefind',
+ name='data',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='basefind',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='basefind',
+ name='spatial_reference_system',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='ishtar_common.SpatialReferenceSystem', verbose_name='Spatial Reference System'),
+ ),
+ migrations.AlterField(
+ model_name='find',
+ name='data',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='find',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='historicalbasefind',
+ name='data',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='historicalbasefind',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='historicalfind',
+ name='data',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='historicalfind',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='historicaltreatment',
+ name='data',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='historicaltreatment',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='historicaltreatmentfile',
+ name='data',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='historicaltreatmentfile',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='property',
+ name='data',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='property',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='treatment',
+ name='data',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='treatment',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='treatment',
+ name='treatment_state',
+ field=models.ForeignKey(default=archaeological_finds.models_treatments.TreatmentState.get_default, on_delete=django.db.models.deletion.PROTECT, to='archaeological_finds.TreatmentState', verbose_name='State'),
+ ),
+ migrations.AlterField(
+ model_name='treatmentfile',
+ name='data',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='treatmentfile',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='treatmentfile',
+ name='type',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='archaeological_finds.TreatmentFileType', verbose_name='Treatment request type'),
+ ),
+ migrations.AlterField(
+ model_name='treatmentfiletype',
+ name='treatment_type',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='archaeological_finds.TreatmentType'),
+ ),
+ ]
diff --git a/archaeological_operations/migrations/0108_auto_20220211_1630.py b/archaeological_operations/migrations/0108_auto_20220211_1630.py
new file mode 100644
index 000000000..2a6f2d313
--- /dev/null
+++ b/archaeological_operations/migrations/0108_auto_20220211_1630.py
@@ -0,0 +1,17 @@
+# Generated by Django 2.2.24 on 2022-02-11 16:30
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('archaeological_operations', '0107_auto_20210326_1434'),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name='parcel',
+ options={'ordering': ('town', 'year', 'section', 'parcel_number'), 'verbose_name': 'Parcel', 'verbose_name_plural': 'Parcels'},
+ ),
+ ]
diff --git a/archaeological_operations/migrations/0109_auto_20220211_1630.py b/archaeological_operations/migrations/0109_auto_20220211_1630.py
new file mode 100644
index 000000000..12f509af1
--- /dev/null
+++ b/archaeological_operations/migrations/0109_auto_20220211_1630.py
@@ -0,0 +1,201 @@
+# Generated by Django 2.2.24 on 2022-02-11 16:30
+
+import django.contrib.postgres.fields.jsonb
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('archaeological_operations', '0108_auto_20220211_1630'),
+ ('ishtar_common', '0220_auto_20220211_1630'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='archaeologicalsite',
+ name='geodata',
+ field=models.ManyToManyField(blank=True, related_name='related_items_archaeological_operations_archaeologicalsite', to='ishtar_common.GeoVectorData'),
+ ),
+ migrations.AddField(
+ model_name='archaeologicalsite',
+ name='main_geodata',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='main_related_items_archaeological_operations_archaeologicalsite', to='ishtar_common.GeoVectorData'),
+ ),
+ migrations.AddField(
+ model_name='historicalarchaeologicalsite',
+ name='main_geodata',
+ field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='ishtar_common.GeoVectorData'),
+ ),
+ migrations.AddField(
+ model_name='historicaloperation',
+ name='main_geodata',
+ field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='ishtar_common.GeoVectorData'),
+ ),
+ migrations.AddField(
+ model_name='operation',
+ name='geodata',
+ field=models.ManyToManyField(blank=True, related_name='related_items_archaeological_operations_operation', to='ishtar_common.GeoVectorData'),
+ ),
+ migrations.AddField(
+ model_name='operation',
+ name='main_geodata',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='main_related_items_archaeological_operations_operation', to='ishtar_common.GeoVectorData'),
+ ),
+ migrations.AlterField(
+ model_name='administrativeact',
+ name='act_type',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='archaeological_operations.ActType', verbose_name='Act type'),
+ ),
+ migrations.AlterField(
+ model_name='administrativeact',
+ name='data',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='administrativeact',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='archaeologicalsite',
+ name='data',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='archaeologicalsite',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='archaeologicalsite',
+ name='spatial_reference_system',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='ishtar_common.SpatialReferenceSystem', verbose_name='Spatial Reference System'),
+ ),
+ migrations.AlterField(
+ model_name='historicaladministrativeact',
+ name='data',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='historicaladministrativeact',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='historicalarchaeologicalsite',
+ name='data',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='historicalarchaeologicalsite',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='historicaloperation',
+ name='data',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='historicaloperation',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='historicaloperation',
+ name='in_charge',
+ field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='ishtar_common.Person', verbose_name='Operation monitor'),
+ ),
+ migrations.AlterField(
+ model_name='historicaloperation',
+ name='scientist',
+ field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='ishtar_common.Person', verbose_name='Scientific manager'),
+ ),
+ migrations.AlterField(
+ model_name='operation',
+ name='applicant_authority',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='operation_applicant_authority', to='ishtar_common.Organization', verbose_name='Applicant authority'),
+ ),
+ migrations.AlterField(
+ model_name='operation',
+ name='data',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='operation',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='operation',
+ name='in_charge',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='operation_monitoring', to='ishtar_common.Person', verbose_name='Operation monitor'),
+ ),
+ migrations.AlterField(
+ model_name='operation',
+ name='minutes_writer',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='minutes_writer', to='ishtar_common.Person', verbose_name='Writer of the minutes'),
+ ),
+ migrations.AlterField(
+ model_name='operation',
+ name='operation_type',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to='ishtar_common.OperationType', verbose_name='Operation type'),
+ ),
+ migrations.AlterField(
+ model_name='operation',
+ name='protagonist',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='operation_protagonist', to='ishtar_common.Person', verbose_name='Name of the protagonist'),
+ ),
+ migrations.AlterField(
+ model_name='operation',
+ name='scientist',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='operation_scientist_responsability', to='ishtar_common.Person', verbose_name='Scientific manager'),
+ ),
+ migrations.AlterField(
+ model_name='operation',
+ name='spatial_reference_system',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='ishtar_common.SpatialReferenceSystem', verbose_name='Spatial Reference System'),
+ ),
+ migrations.AlterField(
+ model_name='parcel',
+ name='data',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='parcel',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='parcel',
+ name='town',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='parcels', to='ishtar_common.Town', verbose_name='Town'),
+ ),
+ migrations.AlterField(
+ model_name='parcelowner',
+ name='data',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='parcelowner',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='parcelowner',
+ name='owner',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='parcel_owner', to='ishtar_common.Person', verbose_name='Owner'),
+ ),
+ migrations.AlterField(
+ model_name='recordrelations',
+ name='relation_type',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='archaeological_operations.RelationType'),
+ ),
+ migrations.AlterField(
+ model_name='relationtype',
+ name='inverse_relation',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='archaeological_operations.RelationType', verbose_name='Inverse relation'),
+ ),
+ ]
diff --git a/archaeological_warehouse/migrations/0113_auto_20220211_1630.py b/archaeological_warehouse/migrations/0113_auto_20220211_1630.py
new file mode 100644
index 000000000..4b758ac05
--- /dev/null
+++ b/archaeological_warehouse/migrations/0113_auto_20220211_1630.py
@@ -0,0 +1,171 @@
+# Generated by Django 2.2.24 on 2022-02-11 16:30
+
+import django.contrib.postgres.fields.jsonb
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('ishtar_common', '0220_auto_20220211_1630'),
+ ('archaeological_warehouse', '0112_auto_20210308_1628'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='container',
+ name='geodata',
+ field=models.ManyToManyField(blank=True, related_name='related_items_archaeological_warehouse_container', to='ishtar_common.GeoVectorData'),
+ ),
+ migrations.AddField(
+ model_name='container',
+ name='main_geodata',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='main_related_items_archaeological_warehouse_container', to='ishtar_common.GeoVectorData'),
+ ),
+ migrations.AddField(
+ model_name='historicalwarehouse',
+ name='main_geodata',
+ field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='ishtar_common.GeoVectorData'),
+ ),
+ migrations.AddField(
+ model_name='warehouse',
+ name='geodata',
+ field=models.ManyToManyField(blank=True, related_name='related_items_archaeological_warehouse_warehouse', to='ishtar_common.GeoVectorData'),
+ ),
+ migrations.AddField(
+ model_name='warehouse',
+ name='main_geodata',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='main_related_items_archaeological_warehouse_warehouse', to='ishtar_common.GeoVectorData'),
+ ),
+ migrations.AlterField(
+ model_name='container',
+ name='cached_weight',
+ field=models.FloatField(blank=True, help_text='Entered weight if available otherwise calculated weight.', null=True, verbose_name='Cached weight (g)'),
+ ),
+ migrations.AlterField(
+ model_name='container',
+ name='container_type',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='containers', to='archaeological_warehouse.ContainerType', verbose_name='Container type'),
+ ),
+ migrations.AlterField(
+ model_name='container',
+ name='data',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='container',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='container',
+ name='responsibility',
+ field=models.ForeignKey(blank=True, help_text='Warehouse that owns the container', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='responsibilities', to='archaeological_warehouse.Warehouse', verbose_name='Responsibility'),
+ ),
+ migrations.AlterField(
+ model_name='container',
+ name='responsible',
+ field=models.ForeignKey(blank=True, help_text='Deprecated - do not use', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='owned_containers', to='archaeological_warehouse.Warehouse', verbose_name='Responsible warehouse'),
+ ),
+ migrations.AlterField(
+ model_name='container',
+ name='spatial_reference_system',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='ishtar_common.SpatialReferenceSystem', verbose_name='Spatial Reference System'),
+ ),
+ migrations.AlterField(
+ model_name='container',
+ name='weight',
+ field=models.FloatField(blank=True, null=True, verbose_name='Measured weight (g)'),
+ ),
+ migrations.AlterField(
+ model_name='containertype',
+ name='stationary',
+ field=models.BooleanField(default=False, help_text='Container that will not usually be moved. Ex: building, room, span, shelf. Stationary containers are not automatically numbered.', verbose_name='Stationary'),
+ ),
+ migrations.AlterField(
+ model_name='historicalwarehouse',
+ name='data',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='historicalwarehouse',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='historicalwarehouse',
+ name='mobile_phone',
+ field=models.CharField(blank=True, max_length=32, null=True, verbose_name='Mobile phone'),
+ ),
+ migrations.AlterField(
+ model_name='historicalwarehouse',
+ name='phone',
+ field=models.CharField(blank=True, max_length=32, null=True, verbose_name='Phone'),
+ ),
+ migrations.AlterField(
+ model_name='historicalwarehouse',
+ name='phone2',
+ field=models.CharField(blank=True, max_length=32, null=True, verbose_name='Phone description 2'),
+ ),
+ migrations.AlterField(
+ model_name='historicalwarehouse',
+ name='phone3',
+ field=models.CharField(blank=True, max_length=32, null=True, verbose_name='Phone 3'),
+ ),
+ migrations.AlterField(
+ model_name='warehouse',
+ name='data',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='warehouse',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
+ ),
+ migrations.AlterField(
+ model_name='warehouse',
+ name='mobile_phone',
+ field=models.CharField(blank=True, max_length=32, null=True, verbose_name='Mobile phone'),
+ ),
+ migrations.AlterField(
+ model_name='warehouse',
+ name='phone',
+ field=models.CharField(blank=True, max_length=32, null=True, verbose_name='Phone'),
+ ),
+ migrations.AlterField(
+ model_name='warehouse',
+ name='phone2',
+ field=models.CharField(blank=True, max_length=32, null=True, verbose_name='Phone description 2'),
+ ),
+ migrations.AlterField(
+ model_name='warehouse',
+ name='phone3',
+ field=models.CharField(blank=True, max_length=32, null=True, verbose_name='Phone 3'),
+ ),
+ migrations.AlterField(
+ model_name='warehouse',
+ name='precise_town',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='ishtar_common.Town', verbose_name='Town (precise)'),
+ ),
+ migrations.AlterField(
+ model_name='warehouse',
+ name='spatial_reference_system',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='ishtar_common.SpatialReferenceSystem', verbose_name='Spatial Reference System'),
+ ),
+ migrations.AlterField(
+ model_name='warehouse',
+ name='warehouse_type',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='archaeological_warehouse.WarehouseType', verbose_name='Warehouse type'),
+ ),
+ migrations.AlterField(
+ model_name='warehousedivisionlink',
+ name='container_type',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='archaeological_warehouse.ContainerType'),
+ ),
+ migrations.AlterField(
+ model_name='warehousedivisionlink',
+ name='division',
+ field=models.ForeignKey(blank=True, help_text='Deprecated - do not use', null=True, on_delete=django.db.models.deletion.SET_NULL, to='archaeological_warehouse.WarehouseDivision'),
+ ),
+ ]
diff --git a/ishtar_common/admin.py b/ishtar_common/admin.py
index e1f823d75..0ef72991f 100644
--- a/ishtar_common/admin.py
+++ b/ishtar_common/admin.py
@@ -1145,6 +1145,9 @@ general_models = [
models.LicenseType,
models.Language,
models.PersonType,
+ models_common.GeoProviderType,
+ models_common.GeoDataType,
+ models_common.GeoOriginType,
]
for model in general_models:
admin_site.register(model, GeneralTypeAdmin)
@@ -2407,3 +2410,41 @@ class ApiSheetFilterAdmin(admin.ModelAdmin):
admin_site.register(models_rest.ApiSheetFilter, ApiSheetFilterAdmin)
+
+
+class GeoVectorDataForm(forms.ModelForm):
+ class Meta:
+ model = models_common.GeoVectorData
+ exclude = []
+
+ def clean(self):
+ fields = [
+ "x",
+ "point_2d",
+ "point_3d",
+ "multi_points",
+ "multi_line",
+ "multi_polygon",
+ ]
+ non_empty = [f for f in fields if self.cleaned_data.get(f, None)]
+ if len(non_empty) > 1:
+ raise forms.ValidationError(
+ _(
+ "Only one type of geographic data is accepted. "
+ "Create different objects if you have many."
+ )
+ )
+ if bool(self.cleaned_data.get("x", None)) != bool(
+ self.cleaned_data.get("y", None)
+ ):
+ raise forms.ValidationError(
+ _("You cannot set only x or only y coordinate.")
+ )
+ return self.cleaned_data
+
+
+class GeoVectorDataAdmin(admin.ModelAdmin):
+ model = models_common.GeoVectorData
+
+
+admin_site.register(models_common.GeoVectorData, GeoVectorDataAdmin) \ No newline at end of file
diff --git a/ishtar_common/migrations/0220_auto_20220211_1630.py b/ishtar_common/migrations/0220_auto_20220211_1630.py
new file mode 100644
index 000000000..159b65fcd
--- /dev/null
+++ b/ishtar_common/migrations/0220_auto_20220211_1630.py
@@ -0,0 +1,114 @@
+# Generated by Django 2.2.24 on 2022-02-11 16:30
+
+import django.contrib.gis.db.models.fields
+import django.core.validators
+from django.db import migrations, models
+import django.db.models.deletion
+import ishtar_common.models_common
+import re
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('contenttypes', '0002_remove_content_type_name'),
+ ('ishtar_common', '0219_auto_20220120_1552'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='GeoDataType',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('label', models.TextField(verbose_name='Label')),
+ ('txt_idx', models.TextField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')),
+ ('comment', models.TextField(blank=True, default='', verbose_name='Comment')),
+ ('available', models.BooleanField(default=True, verbose_name='Available')),
+ ('order', models.IntegerField(default=10, verbose_name='Order')),
+ ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='ishtar_common.GeoDataType', verbose_name='Parent')),
+ ],
+ options={
+ 'verbose_name': 'Geographic - Data type',
+ 'verbose_name_plural': 'Geographic - Data types',
+ 'ordering': ('order', 'label'),
+ },
+ bases=(ishtar_common.models_common.Cached, models.Model),
+ ),
+ migrations.CreateModel(
+ name='GeoOriginType',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('label', models.TextField(verbose_name='Label')),
+ ('txt_idx', models.TextField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')),
+ ('comment', models.TextField(blank=True, default='', verbose_name='Comment')),
+ ('available', models.BooleanField(default=True, verbose_name='Available')),
+ ('order', models.IntegerField(default=10, verbose_name='Order')),
+ ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='ishtar_common.GeoOriginType', verbose_name='Parent')),
+ ],
+ options={
+ 'verbose_name': 'Geographic - Origin type',
+ 'verbose_name_plural': 'Geographic - Origin types',
+ 'ordering': ('order', 'label'),
+ },
+ bases=(ishtar_common.models_common.Cached, models.Model),
+ ),
+ migrations.CreateModel(
+ name='GeoProviderType',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('label', models.TextField(verbose_name='Label')),
+ ('txt_idx', models.TextField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')),
+ ('comment', models.TextField(blank=True, default='', verbose_name='Comment')),
+ ('available', models.BooleanField(default=True, verbose_name='Available')),
+ ('order', models.IntegerField(default=10, verbose_name='Order')),
+ ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='ishtar_common.GeoProviderType', verbose_name='Parent')),
+ ],
+ options={
+ 'verbose_name': 'Geographic - Provider type',
+ 'verbose_name_plural': 'Geographic - Provider types',
+ 'ordering': ('order', 'label'),
+ },
+ bases=(ishtar_common.models_common.Cached, models.Model),
+ ),
+ migrations.AlterModelOptions(
+ name='person',
+ options={'ordering': ['name', 'surname'], 'permissions': (('view_own_person', 'Can view own Person'), ('add_own_person', 'Can add own Person'), ('change_own_person', 'Can change own Person'), ('delete_own_person', 'Can delete own Person')), 'verbose_name': 'Person', 'verbose_name_plural': 'Persons'},
+ ),
+ migrations.AlterModelOptions(
+ name='spatialreferencesystem',
+ options={'ordering': ('order', 'label'), 'verbose_name': 'Spatial reference system', 'verbose_name_plural': 'Spatial reference systems'},
+ ),
+ migrations.CreateModel(
+ name='GeoVectorData',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(default='Default', max_length=200, verbose_name='Name')),
+ ('source_id', models.PositiveIntegerField()),
+ ('comment', models.TextField(blank=True, default='', verbose_name='Comment')),
+ ('x', models.FloatField(blank=True, help_text='User input', null=True, verbose_name='X')),
+ ('y', models.FloatField(blank=True, help_text='User input', null=True, verbose_name='Y')),
+ ('z', models.FloatField(blank=True, help_text='User input', null=True, verbose_name='Z')),
+ ('cached_x', models.FloatField(blank=True, null=True, verbose_name='X (cached)')),
+ ('cached_y', models.FloatField(blank=True, null=True, verbose_name='Y (cached)')),
+ ('cached_z', models.FloatField(blank=True, null=True, verbose_name='Z (cached)')),
+ ('estimated_error_x', models.FloatField(blank=True, null=True, verbose_name='Estimated error for X')),
+ ('estimated_error_y', models.FloatField(blank=True, null=True, verbose_name='Estimated error for Y')),
+ ('estimated_error_z', models.FloatField(blank=True, null=True, verbose_name='Estimated error for Z')),
+ ('point_2d', django.contrib.gis.db.models.fields.PointField(blank=True, null=True, srid=4326, verbose_name='Point (2D)')),
+ ('point_3d', django.contrib.gis.db.models.fields.PointField(blank=True, dim=3, null=True, srid=4326, verbose_name='Point (3D)')),
+ ('multi_points', django.contrib.gis.db.models.fields.MultiPointField(blank=True, null=True, srid=4326, verbose_name='Multi points')),
+ ('multi_line', django.contrib.gis.db.models.fields.MultiLineStringField(blank=True, null=True, srid=4326, verbose_name='Multi line')),
+ ('multi_polygon', django.contrib.gis.db.models.fields.MultiPolygonField(blank=True, null=True, srid=4326, verbose_name='Multi polygon')),
+ ('need_update', models.BooleanField(default=False, verbose_name='Need update')),
+ ('data_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='ishtar_common.GeoDataType', verbose_name='Data type')),
+ ('origin', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='ishtar_common.GeoOriginType', verbose_name='Origin')),
+ ('provider', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='ishtar_common.GeoProviderType', verbose_name='Provider')),
+ ('source_content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='content_type_geovectordata', to='contenttypes.ContentType')),
+ ('spatial_reference_system', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='ishtar_common.SpatialReferenceSystem', verbose_name='Spatial Reference System')),
+ ],
+ options={
+ 'verbose_name': 'Geographic - Vector data',
+ 'verbose_name_plural': 'Geographic - Vector data',
+ },
+ ),
+ ]
diff --git a/ishtar_common/models_common.py b/ishtar_common/models_common.py
index 5cbb5da1e..ebf480ff0 100644
--- a/ishtar_common/models_common.py
+++ b/ishtar_common/models_common.py
@@ -2876,7 +2876,10 @@ class SpatialReferenceSystem(GeneralType):
class Meta:
verbose_name = _("Spatial reference system")
verbose_name_plural = _("Spatial reference systems")
- ordering = ("label",)
+ ordering = (
+ "order",
+ "label",
+ )
@classmethod
def get_documentation_string(cls):
@@ -2894,18 +2897,87 @@ post_save.connect(post_save_cache, sender=SpatialReferenceSystem)
post_delete.connect(post_save_cache, sender=SpatialReferenceSystem)
+class GeoOriginType(HierarchicalType):
+ """
+ ex: topographical surveys, georeferencing, ...
+ """
+
+ order = models.IntegerField(_("Order"), default=10)
+
+ class Meta:
+ verbose_name = _("Geographic - Origin type")
+ verbose_name_plural = _("Geographic - Origin types")
+ ordering = (
+ "order",
+ "label",
+ )
+
+
+class GeoDataType(HierarchicalType):
+ """
+ ex: outline, z-sup, ...
+ """
+
+ order = models.IntegerField(_("Order"), default=10)
+
+ class Meta:
+ verbose_name = _("Geographic - Data type")
+ verbose_name_plural = _("Geographic - Data types")
+ ordering = (
+ "order",
+ "label",
+ )
+
+
+class GeoProviderType(HierarchicalType):
+ """
+ ex: GeoNames, IGN, ...
+ """
+
+ order = models.IntegerField(_("Order"), default=10)
+
+ class Meta:
+ verbose_name = _("Geographic - Provider type")
+ verbose_name_plural = _("Geographic - Provider types")
+ ordering = (
+ "order",
+ "label",
+ )
+
+
class GeoVectorData(models.Model):
name = models.CharField(_("Name"), default=_("Default"), max_length=200)
source_content_type = models.ForeignKey(
- ContentType, related_name="content_type_geovectordata",
- on_delete=models.CASCADE)
+ ContentType, related_name="content_type_geovectordata", on_delete=models.CASCADE
+ )
source_id = models.PositiveIntegerField()
- source = GenericForeignKey('content_type', 'object_id')
-
+ source = GenericForeignKey("source_content_type", "source_id")
+ origin = models.ForeignKey(
+ GeoOriginType,
+ blank=True,
+ null=True,
+ on_delete=models.PROTECT,
+ verbose_name=_("Origin"),
+ )
+ data_type = models.ForeignKey(
+ GeoDataType,
+ blank=True,
+ null=True,
+ on_delete=models.PROTECT,
+ verbose_name=_("Data type"),
+ )
+ provider = models.ForeignKey(
+ GeoProviderType,
+ blank=True,
+ null=True,
+ on_delete=models.PROTECT,
+ verbose_name=_("Provider"),
+ )
+ comment = models.TextField(_("Comment"), default="", blank=True)
x = models.FloatField(_("X"), blank=True, null=True, help_text=_("User input"))
y = models.FloatField(_("Y"), blank=True, null=True, help_text=_("User input"))
z = models.FloatField(_("Z"), blank=True, null=True, help_text=_("User input"))
- # x == cached_x if user input else get it from point_2d
+ # x == cached_x if user input else get it from other sources
# cached is converted to the display SRID
cached_x = models.FloatField(_("X (cached)"), blank=True, null=True)
cached_y = models.FloatField(_("Y (cached)"), blank=True, null=True)
@@ -2926,14 +2998,16 @@ class GeoVectorData(models.Model):
null=True,
on_delete=models.PROTECT,
)
- point = models.PointField(_("Point"), blank=True, null=True, dim=3)
point_2d = models.PointField(_("Point (2D)"), blank=True, null=True)
+ point_3d = models.PointField(_("Point (3D)"), blank=True, null=True, dim=3)
+ multi_points = models.MultiPointField(_("Multi points"), blank=True, null=True)
+ multi_line = models.MultiLineStringField(_("Multi line"), blank=True, null=True)
multi_polygon = models.MultiPolygonField(_("Multi polygon"), blank=True, null=True)
need_update = models.BooleanField(_("Need update"), default=False)
class Meta:
- verbose_name = _("Geographic vector data")
- verbose_name_plural = _("Geographic vector data")
+ verbose_name = _("Geographic - Vector data")
+ verbose_name_plural = _("Geographic - Vector data")
def display_coordinates(self, rounded=5, dim=2, cache=True):
srid = None
@@ -2956,8 +3030,11 @@ class GeoVectorData(models.Model):
if dim == 3:
coordinates.append(self.z)
else:
- args = {"x": self.x, "y": self.y,
- "srid": self.spatial_reference_system.srid}
+ args = {
+ "x": self.x,
+ "y": self.y,
+ "srid": self.spatial_reference_system.srid,
+ }
if dim == 3:
args["z"] = self.z
point = Point(**args).transform(srid, clone=True)
@@ -2967,8 +3044,8 @@ class GeoVectorData(models.Model):
elif self.point_2d and dim == 2:
point = self.point_2d.transform(srid, clone=True)
coordinates = [point.x, point.y]
- elif self.point and dim == 3:
- point = self.point.transform(srid, clone=True)
+ elif self.point_3d and dim == 3:
+ point = self.point_3d.transform(srid, clone=True)
coordinates = [point.x, point.y, point.z]
else:
return
@@ -2978,8 +3055,9 @@ class GeoVectorData(models.Model):
def get_coordinates_from_polygon(self, rounded=5, srid: int = None):
if self.multi_polygon:
- return self.convert_coordinates(self.multi_polygon.centroid,
- rounded=rounded, srid=srid)
+ return self.convert_coordinates(
+ self.multi_polygon.centroid, rounded=rounded, srid=srid
+ )
def get_x(self, srid: int = None) -> float:
coord = self.get_coordinates(srid)
@@ -3097,16 +3175,21 @@ class GeoVectorData(models.Model):
return self._geojson_serialize("multi_polygon")
+
+
post_save.connect(post_save_geodata, sender=GeoVectorData)
class GeoItem(models.Model):
main_geodata = models.ForeignKey(
- GeoVectorData, on_delete=models.SET_NULL, blank=True, null=True,
- related_name="main_related_items_%(app_label)s_%(class)s"
+ GeoVectorData,
+ on_delete=models.SET_NULL,
+ blank=True,
+ null=True,
+ related_name="main_related_items_%(app_label)s_%(class)s",
)
geodata = models.ManyToManyField(
- GeoVectorData, null=True, related_name="related_items_%(app_label)s_%(class)s"
+ GeoVectorData, blank=True, related_name="related_items_%(app_label)s_%(class)s"
)
GEO_SOURCE = (("T", _("Town")), ("P", _("Precise")), ("M", _("Polygon")))