diff options
| -rw-r--r-- | archaeological_context_records/migrations/0107_auto_20220211_1630.py | 71 | ||||
| -rw-r--r-- | archaeological_files/migrations/0107_auto_20220211_1630.py | 45 | ||||
| -rw-r--r-- | archaeological_finds/migrations/0109_auto_20220211_1630.py | 142 | ||||
| -rw-r--r-- | archaeological_operations/migrations/0108_auto_20220211_1630.py | 17 | ||||
| -rw-r--r-- | archaeological_operations/migrations/0109_auto_20220211_1630.py | 201 | ||||
| -rw-r--r-- | archaeological_warehouse/migrations/0113_auto_20220211_1630.py | 171 | ||||
| -rw-r--r-- | ishtar_common/admin.py | 41 | ||||
| -rw-r--r-- | ishtar_common/migrations/0220_auto_20220211_1630.py | 114 | ||||
| -rw-r--r-- | ishtar_common/models_common.py | 119 | 
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"))) | 
