From efe15e3de5721a881868cf7ba338b65a15166253 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Thu, 15 Feb 2024 15:58:23 +0100 Subject: 🗃️ biographical notes - model, admin: add organization MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../migrations/0115_auto_20240215_1443.py | 427 --------------------- .../migrations/0115_auto_20240215_1547.py | 427 +++++++++++++++++++++ .../0116_data_migration_museum_technical.py | 2 +- ishtar_common/admin.py | 7 + .../migrations/0236_auto_20240209_1558.py | 122 ------ .../migrations/0236_auto_20240215_1547.py | 124 ++++++ .../0237_data_migration_licenses_shootingangle.py | 2 +- ishtar_common/models.py | 16 +- 8 files changed, 574 insertions(+), 553 deletions(-) delete mode 100644 archaeological_finds/migrations/0115_auto_20240215_1443.py create mode 100644 archaeological_finds/migrations/0115_auto_20240215_1547.py delete mode 100644 ishtar_common/migrations/0236_auto_20240209_1558.py create mode 100644 ishtar_common/migrations/0236_auto_20240215_1547.py diff --git a/archaeological_finds/migrations/0115_auto_20240215_1443.py b/archaeological_finds/migrations/0115_auto_20240215_1443.py deleted file mode 100644 index 529ab5abd..000000000 --- a/archaeological_finds/migrations/0115_auto_20240215_1443.py +++ /dev/null @@ -1,427 +0,0 @@ -# Generated by Django 2.2.24 on 2024-02-15 14:43 - -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 = [ - ('ishtar_common', '0237_data_migration_licenses_shootingangle'), - ('archaeological_finds', '0114_auto_20231115_1617'), - ] - - operations = [ - migrations.CreateModel( - name='InventoryConformity', - 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')), - ], - options={ - 'verbose_name': 'Inventory conformity type', - 'verbose_name_plural': 'Inventory conformity types', - 'ordering': ('order', 'label'), - }, - bases=(ishtar_common.models_common.Cached, models.Model), - ), - migrations.CreateModel( - name='InventoryMarkingPresence', - 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')), - ], - options={ - 'verbose_name': 'Presence of inventory marking type', - 'verbose_name_plural': 'Presence of inventory marking types', - 'ordering': ('order', 'label'), - }, - bases=(ishtar_common.models_common.Cached, models.Model), - ), - migrations.CreateModel( - name='MarkingType', - 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')), - ], - options={ - 'verbose_name': 'Marking type', - 'verbose_name_plural': 'Marking types', - 'ordering': ('order', 'label'), - }, - bases=(ishtar_common.models_common.Cached, models.Model), - ), - migrations.CreateModel( - name='MuseumCollection', - 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')), - ], - options={ - 'verbose_name': 'Museum collection', - 'verbose_name_plural': 'Museum collections', - 'ordering': ('order', 'label'), - }, - bases=(ishtar_common.models_common.Cached, models.Model), - ), - migrations.CreateModel( - name='OriginalReproduction', - 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')), - ], - options={ - 'verbose_name': 'Original/reproduction type', - 'verbose_name_plural': 'Original/reproduction types', - 'ordering': ('order', 'label'), - }, - bases=(ishtar_common.models_common.Cached, models.Model), - ), - migrations.AddField( - model_name='find', - name='cache_complete_museum_id', - field=models.TextField(blank=True, db_index=True, default='', help_text='Cached value - do not edit', verbose_name='Complete museum ID'), - ), - migrations.AddField( - model_name='find', - name='museum_allocation_date', - field=models.DateField(blank=True, null=True, verbose_name='Date of museum allocation'), - ), - migrations.AddField( - model_name='find', - name='museum_custodian_institution', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='deposited', to='ishtar_common.Organization', verbose_name='Custodian institution'), - ), - migrations.AddField( - model_name='find', - name='museum_depositor_inventory_number', - field=models.TextField(blank=True, default='', verbose_name='Depositor inventory number'), - ), - migrations.AddField( - model_name='find', - name='museum_donor', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='has_provided', to='ishtar_common.BiographicalNote', verbose_name='Donor, testator or vendor'), - ), - migrations.AddField( - model_name='find', - name='museum_entry_date', - field=models.DateField(blank=True, null=True, verbose_name='Museum entry date (exact or start)'), - ), - migrations.AddField( - model_name='find', - name='museum_entry_date_comment', - field=models.TextField(blank=True, default='', verbose_name='Comment on museum entry date'), - ), - migrations.AddField( - model_name='find', - name='museum_entry_date_end', - field=models.DateField(blank=True, null=True, verbose_name='Museum entry date (end)'), - ), - migrations.AddField( - model_name='find', - name='museum_entry_mode_comment', - field=models.TextField(blank=True, default='', verbose_name='Comment on museum entry mode'), - ), - migrations.AddField( - model_name='find', - name='museum_former_collections', - field=models.ManyToManyField(blank=True, related_name='finds_former_collections', to='ishtar_common.BiographicalNote', verbose_name='Former collection'), - ), - migrations.AddField( - model_name='find', - name='museum_id_comment', - field=models.TextField(blank=True, default='', verbose_name='Comment on museum ID'), - ), - migrations.AddField( - model_name='find', - name='museum_id_prefix', - field=models.TextField(blank=True, default='', verbose_name='Museum ID prefix'), - ), - migrations.AddField( - model_name='find', - name='museum_id_suffix', - field=models.TextField(blank=True, default='', verbose_name='Museum ID suffix'), - ), - migrations.AddField( - model_name='find', - name='museum_inventory_entry_year', - field=models.PositiveIntegerField(blank=True, null=True, verbose_name='Inventory entry year'), - ), - migrations.AddField( - model_name='find', - name='museum_inventory_transcript', - field=models.TextField(blank=True, default='', verbose_name='Inventory transcript'), - ), - migrations.AddField( - model_name='find', - name='museum_marking_comment', - field=models.TextField(blank=True, default='', verbose_name='Comment on marking'), - ), - migrations.AddField( - model_name='find', - name='museum_non_conformity_comment', - field=models.TextField(blank=True, default='', verbose_name='Comment of non-conformity'), - ), - migrations.AddField( - model_name='find', - name='museum_owner_institution', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='owns', to='ishtar_common.Organization', verbose_name='Owner institution'), - ), - migrations.AddField( - model_name='find', - name='museum_purchase_price', - field=models.TextField(blank=True, default='', verbose_name='Purchase price'), - ), - migrations.AddField( - model_name='find', - name='quantity_comment', - field=models.TextField(blank=True, default='', verbose_name='Comment on quantity'), - ), - migrations.AddField( - model_name='historicalfind', - name='cache_complete_museum_id', - field=models.TextField(blank=True, db_index=True, default='', help_text='Cached value - do not edit', verbose_name='Complete museum ID'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_allocation_date', - field=models.DateField(blank=True, null=True, verbose_name='Date of museum allocation'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_custodian_institution', - field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='ishtar_common.Organization', verbose_name='Custodian institution'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_depositor_inventory_number', - field=models.TextField(blank=True, default='', verbose_name='Depositor inventory number'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_donor', - field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='ishtar_common.BiographicalNote', verbose_name='Donor, testator or vendor'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_entry_date', - field=models.DateField(blank=True, null=True, verbose_name='Museum entry date (exact or start)'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_entry_date_comment', - field=models.TextField(blank=True, default='', verbose_name='Comment on museum entry date'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_entry_date_end', - field=models.DateField(blank=True, null=True, verbose_name='Museum entry date (end)'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_entry_mode_comment', - field=models.TextField(blank=True, default='', verbose_name='Comment on museum entry mode'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_id_comment', - field=models.TextField(blank=True, default='', verbose_name='Comment on museum ID'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_id_prefix', - field=models.TextField(blank=True, default='', verbose_name='Museum ID prefix'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_id_suffix', - field=models.TextField(blank=True, default='', verbose_name='Museum ID suffix'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_inventory_entry_year', - field=models.PositiveIntegerField(blank=True, null=True, verbose_name='Inventory entry year'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_inventory_transcript', - field=models.TextField(blank=True, default='', verbose_name='Inventory transcript'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_marking_comment', - field=models.TextField(blank=True, default='', verbose_name='Comment on marking'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_non_conformity_comment', - field=models.TextField(blank=True, default='', verbose_name='Comment of non-conformity'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_owner_institution', - field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='ishtar_common.Organization', verbose_name='Owner institution'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_purchase_price', - field=models.TextField(blank=True, default='', verbose_name='Purchase price'), - ), - migrations.AddField( - model_name='historicalfind', - name='quantity_comment', - field=models.TextField(blank=True, default='', verbose_name='Comment on quantity'), - ), - migrations.AlterField( - model_name='find', - name='functional_areas', - field=models.ManyToManyField(blank=True, related_name='find', to='archaeological_finds.FunctionalArea', verbose_name='Functional areas'), - ), - migrations.AlterField( - model_name='find', - name='museum_id', - field=models.TextField(blank=True, default='', verbose_name='Museum ID'), - ), - migrations.AlterField( - model_name='historicalfind', - name='museum_id', - field=models.TextField(blank=True, default='', verbose_name='Museum ID'), - ), - migrations.CreateModel( - name='TechnicalProcessType', - 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='archaeological_finds.TechnicalProcessType', verbose_name='Parent')), - ], - options={ - 'verbose_name': 'Technical process type', - 'verbose_name_plural': 'Technical process types', - 'ordering': ('order', 'parent__label', 'label'), - }, - bases=(ishtar_common.models_common.Cached, models.Model), - ), - migrations.CreateModel( - name='TechnicalAreaType', - 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='archaeological_finds.TechnicalAreaType', verbose_name='Parent')), - ], - options={ - 'verbose_name': 'Technical area type', - 'verbose_name_plural': 'Technical area types', - 'ordering': ('order', 'parent__label', 'label'), - }, - bases=(ishtar_common.models_common.Cached, models.Model), - ), - migrations.CreateModel( - name='CollectionEntryModeType', - 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='archaeological_finds.CollectionEntryModeType', verbose_name='Parent')), - ], - options={ - 'verbose_name': 'Collection entry mode type', - 'verbose_name_plural': 'Collection entry mode types', - 'ordering': ('order', 'parent__label', 'label'), - }, - bases=(ishtar_common.models_common.Cached, models.Model), - ), - migrations.AddField( - model_name='find', - name='museum_collection', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='current_collection_of', to='archaeological_finds.MuseumCollection', verbose_name='Collection'), - ), - migrations.AddField( - model_name='find', - name='museum_collection_entry_mode', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='archaeological_finds.CollectionEntryModeType', verbose_name='Collections entry mode'), - ), - migrations.AddField( - model_name='find', - name='museum_inventory_conformity', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='archaeological_finds.InventoryConformity', verbose_name='Conformity with inventory'), - ), - migrations.AddField( - model_name='find', - name='museum_inventory_marking_presence', - field=models.ManyToManyField(blank=True, related_name='finds', to='archaeological_finds.InventoryMarkingPresence', verbose_name='Presence of inventory marking'), - ), - migrations.AddField( - model_name='find', - name='museum_marking_type', - field=models.ManyToManyField(blank=True, related_name='finds', to='archaeological_finds.MarkingType', verbose_name='Type of marking'), - ), - migrations.AddField( - model_name='find', - name='museum_original_repro', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='archaeological_finds.OriginalReproduction', verbose_name='Original/reproduction'), - ), - migrations.AddField( - model_name='find', - name='technical_areas', - field=models.ManyToManyField(blank=True, related_name='find', to='archaeological_finds.TechnicalAreaType', verbose_name='Technical areas'), - ), - migrations.AddField( - model_name='find', - name='technical_processes', - field=models.ManyToManyField(blank=True, related_name='find', to='archaeological_finds.TechnicalProcessType', verbose_name='Technical processes'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_collection', - field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='archaeological_finds.MuseumCollection', verbose_name='Collection'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_collection_entry_mode', - field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='archaeological_finds.CollectionEntryModeType', verbose_name='Collections entry mode'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_inventory_conformity', - field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='archaeological_finds.InventoryConformity', verbose_name='Conformity with inventory'), - ), - migrations.AddField( - model_name='historicalfind', - name='museum_original_repro', - field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='archaeological_finds.OriginalReproduction', verbose_name='Original/reproduction'), - ), - ] diff --git a/archaeological_finds/migrations/0115_auto_20240215_1547.py b/archaeological_finds/migrations/0115_auto_20240215_1547.py new file mode 100644 index 000000000..4bfaec94e --- /dev/null +++ b/archaeological_finds/migrations/0115_auto_20240215_1547.py @@ -0,0 +1,427 @@ +# Generated by Django 2.2.24 on 2024-02-15 15:47 + +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 = [ + ('ishtar_common', '0236_auto_20240215_1547'), + ('archaeological_finds', '0114_auto_20231115_1617'), + ] + + operations = [ + migrations.CreateModel( + name='InventoryConformity', + 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')), + ], + options={ + 'verbose_name': 'Inventory conformity type', + 'verbose_name_plural': 'Inventory conformity types', + 'ordering': ('order', 'label'), + }, + bases=(ishtar_common.models_common.Cached, models.Model), + ), + migrations.CreateModel( + name='InventoryMarkingPresence', + 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')), + ], + options={ + 'verbose_name': 'Presence of inventory marking type', + 'verbose_name_plural': 'Presence of inventory marking types', + 'ordering': ('order', 'label'), + }, + bases=(ishtar_common.models_common.Cached, models.Model), + ), + migrations.CreateModel( + name='MarkingType', + 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')), + ], + options={ + 'verbose_name': 'Marking type', + 'verbose_name_plural': 'Marking types', + 'ordering': ('order', 'label'), + }, + bases=(ishtar_common.models_common.Cached, models.Model), + ), + migrations.CreateModel( + name='MuseumCollection', + 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')), + ], + options={ + 'verbose_name': 'Museum collection', + 'verbose_name_plural': 'Museum collections', + 'ordering': ('order', 'label'), + }, + bases=(ishtar_common.models_common.Cached, models.Model), + ), + migrations.CreateModel( + name='OriginalReproduction', + 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')), + ], + options={ + 'verbose_name': 'Original/reproduction type', + 'verbose_name_plural': 'Original/reproduction types', + 'ordering': ('order', 'label'), + }, + bases=(ishtar_common.models_common.Cached, models.Model), + ), + migrations.AddField( + model_name='find', + name='cache_complete_museum_id', + field=models.TextField(blank=True, db_index=True, default='', help_text='Cached value - do not edit', verbose_name='Complete museum ID'), + ), + migrations.AddField( + model_name='find', + name='museum_allocation_date', + field=models.DateField(blank=True, null=True, verbose_name='Date of museum allocation'), + ), + migrations.AddField( + model_name='find', + name='museum_custodian_institution', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='deposited', to='ishtar_common.Organization', verbose_name='Custodian institution'), + ), + migrations.AddField( + model_name='find', + name='museum_depositor_inventory_number', + field=models.TextField(blank=True, default='', verbose_name='Depositor inventory number'), + ), + migrations.AddField( + model_name='find', + name='museum_donor', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='has_provided', to='ishtar_common.BiographicalNote', verbose_name='Donor, testator or vendor'), + ), + migrations.AddField( + model_name='find', + name='museum_entry_date', + field=models.DateField(blank=True, null=True, verbose_name='Museum entry date (exact or start)'), + ), + migrations.AddField( + model_name='find', + name='museum_entry_date_comment', + field=models.TextField(blank=True, default='', verbose_name='Comment on museum entry date'), + ), + migrations.AddField( + model_name='find', + name='museum_entry_date_end', + field=models.DateField(blank=True, null=True, verbose_name='Museum entry date (end)'), + ), + migrations.AddField( + model_name='find', + name='museum_entry_mode_comment', + field=models.TextField(blank=True, default='', verbose_name='Comment on museum entry mode'), + ), + migrations.AddField( + model_name='find', + name='museum_former_collections', + field=models.ManyToManyField(blank=True, related_name='finds_former_collections', to='ishtar_common.BiographicalNote', verbose_name='Former collection'), + ), + migrations.AddField( + model_name='find', + name='museum_id_comment', + field=models.TextField(blank=True, default='', verbose_name='Comment on museum ID'), + ), + migrations.AddField( + model_name='find', + name='museum_id_prefix', + field=models.TextField(blank=True, default='', verbose_name='Museum ID prefix'), + ), + migrations.AddField( + model_name='find', + name='museum_id_suffix', + field=models.TextField(blank=True, default='', verbose_name='Museum ID suffix'), + ), + migrations.AddField( + model_name='find', + name='museum_inventory_entry_year', + field=models.PositiveIntegerField(blank=True, null=True, verbose_name='Inventory entry year'), + ), + migrations.AddField( + model_name='find', + name='museum_inventory_transcript', + field=models.TextField(blank=True, default='', verbose_name='Inventory transcript'), + ), + migrations.AddField( + model_name='find', + name='museum_marking_comment', + field=models.TextField(blank=True, default='', verbose_name='Comment on marking'), + ), + migrations.AddField( + model_name='find', + name='museum_non_conformity_comment', + field=models.TextField(blank=True, default='', verbose_name='Comment of non-conformity'), + ), + migrations.AddField( + model_name='find', + name='museum_owner_institution', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='owns', to='ishtar_common.Organization', verbose_name='Owner institution'), + ), + migrations.AddField( + model_name='find', + name='museum_purchase_price', + field=models.TextField(blank=True, default='', verbose_name='Purchase price'), + ), + migrations.AddField( + model_name='find', + name='quantity_comment', + field=models.TextField(blank=True, default='', verbose_name='Comment on quantity'), + ), + migrations.AddField( + model_name='historicalfind', + name='cache_complete_museum_id', + field=models.TextField(blank=True, db_index=True, default='', help_text='Cached value - do not edit', verbose_name='Complete museum ID'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_allocation_date', + field=models.DateField(blank=True, null=True, verbose_name='Date of museum allocation'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_custodian_institution', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='ishtar_common.Organization', verbose_name='Custodian institution'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_depositor_inventory_number', + field=models.TextField(blank=True, default='', verbose_name='Depositor inventory number'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_donor', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='ishtar_common.BiographicalNote', verbose_name='Donor, testator or vendor'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_entry_date', + field=models.DateField(blank=True, null=True, verbose_name='Museum entry date (exact or start)'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_entry_date_comment', + field=models.TextField(blank=True, default='', verbose_name='Comment on museum entry date'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_entry_date_end', + field=models.DateField(blank=True, null=True, verbose_name='Museum entry date (end)'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_entry_mode_comment', + field=models.TextField(blank=True, default='', verbose_name='Comment on museum entry mode'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_id_comment', + field=models.TextField(blank=True, default='', verbose_name='Comment on museum ID'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_id_prefix', + field=models.TextField(blank=True, default='', verbose_name='Museum ID prefix'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_id_suffix', + field=models.TextField(blank=True, default='', verbose_name='Museum ID suffix'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_inventory_entry_year', + field=models.PositiveIntegerField(blank=True, null=True, verbose_name='Inventory entry year'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_inventory_transcript', + field=models.TextField(blank=True, default='', verbose_name='Inventory transcript'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_marking_comment', + field=models.TextField(blank=True, default='', verbose_name='Comment on marking'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_non_conformity_comment', + field=models.TextField(blank=True, default='', verbose_name='Comment of non-conformity'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_owner_institution', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='ishtar_common.Organization', verbose_name='Owner institution'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_purchase_price', + field=models.TextField(blank=True, default='', verbose_name='Purchase price'), + ), + migrations.AddField( + model_name='historicalfind', + name='quantity_comment', + field=models.TextField(blank=True, default='', verbose_name='Comment on quantity'), + ), + migrations.AlterField( + model_name='find', + name='functional_areas', + field=models.ManyToManyField(blank=True, related_name='find', to='archaeological_finds.FunctionalArea', verbose_name='Functional areas'), + ), + migrations.AlterField( + model_name='find', + name='museum_id', + field=models.TextField(blank=True, default='', verbose_name='Museum ID'), + ), + migrations.AlterField( + model_name='historicalfind', + name='museum_id', + field=models.TextField(blank=True, default='', verbose_name='Museum ID'), + ), + migrations.CreateModel( + name='TechnicalProcessType', + 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='archaeological_finds.TechnicalProcessType', verbose_name='Parent')), + ], + options={ + 'verbose_name': 'Technical process type', + 'verbose_name_plural': 'Technical process types', + 'ordering': ('order', 'parent__label', 'label'), + }, + bases=(ishtar_common.models_common.Cached, models.Model), + ), + migrations.CreateModel( + name='TechnicalAreaType', + 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='archaeological_finds.TechnicalAreaType', verbose_name='Parent')), + ], + options={ + 'verbose_name': 'Technical area type', + 'verbose_name_plural': 'Technical area types', + 'ordering': ('order', 'parent__label', 'label'), + }, + bases=(ishtar_common.models_common.Cached, models.Model), + ), + migrations.CreateModel( + name='CollectionEntryModeType', + 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='archaeological_finds.CollectionEntryModeType', verbose_name='Parent')), + ], + options={ + 'verbose_name': 'Collection entry mode type', + 'verbose_name_plural': 'Collection entry mode types', + 'ordering': ('order', 'parent__label', 'label'), + }, + bases=(ishtar_common.models_common.Cached, models.Model), + ), + migrations.AddField( + model_name='find', + name='museum_collection', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='current_collection_of', to='archaeological_finds.MuseumCollection', verbose_name='Collection'), + ), + migrations.AddField( + model_name='find', + name='museum_collection_entry_mode', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='archaeological_finds.CollectionEntryModeType', verbose_name='Collections entry mode'), + ), + migrations.AddField( + model_name='find', + name='museum_inventory_conformity', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='archaeological_finds.InventoryConformity', verbose_name='Conformity with inventory'), + ), + migrations.AddField( + model_name='find', + name='museum_inventory_marking_presence', + field=models.ManyToManyField(blank=True, related_name='finds', to='archaeological_finds.InventoryMarkingPresence', verbose_name='Presence of inventory marking'), + ), + migrations.AddField( + model_name='find', + name='museum_marking_type', + field=models.ManyToManyField(blank=True, related_name='finds', to='archaeological_finds.MarkingType', verbose_name='Type of marking'), + ), + migrations.AddField( + model_name='find', + name='museum_original_repro', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='archaeological_finds.OriginalReproduction', verbose_name='Original/reproduction'), + ), + migrations.AddField( + model_name='find', + name='technical_areas', + field=models.ManyToManyField(blank=True, related_name='find', to='archaeological_finds.TechnicalAreaType', verbose_name='Technical areas'), + ), + migrations.AddField( + model_name='find', + name='technical_processes', + field=models.ManyToManyField(blank=True, related_name='find', to='archaeological_finds.TechnicalProcessType', verbose_name='Technical processes'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_collection', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='archaeological_finds.MuseumCollection', verbose_name='Collection'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_collection_entry_mode', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='archaeological_finds.CollectionEntryModeType', verbose_name='Collections entry mode'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_inventory_conformity', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='archaeological_finds.InventoryConformity', verbose_name='Conformity with inventory'), + ), + migrations.AddField( + model_name='historicalfind', + name='museum_original_repro', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='archaeological_finds.OriginalReproduction', verbose_name='Original/reproduction'), + ), + ] diff --git a/archaeological_finds/migrations/0116_data_migration_museum_technical.py b/archaeological_finds/migrations/0116_data_migration_museum_technical.py index e0f393e36..523388f31 100644 --- a/archaeological_finds/migrations/0116_data_migration_museum_technical.py +++ b/archaeological_finds/migrations/0116_data_migration_museum_technical.py @@ -14,7 +14,7 @@ def load_data(_, __): class Migration(migrations.Migration): dependencies = [ - ('archaeological_finds', '0115_auto_20240215_1443'), + ('archaeological_finds', '0115_auto_20240215_1547'), ] operations = [ diff --git a/ishtar_common/admin.py b/ishtar_common/admin.py index da35fe48c..527584f39 100644 --- a/ishtar_common/admin.py +++ b/ishtar_common/admin.py @@ -735,6 +735,13 @@ class PersonAdmin(HistorizedObjectAdmin): admin_site.register(models.Person, PersonAdmin) +@admin.register(models.BiographicalNote, site=admin_site) +class BiographicalNoteAdmin(admin.ModelAdmin): + list_display = ("denomination", "last_name", "first_name") + autocomplete_fields = ["person", "organization"] + model = models.BiographicalNote + + @admin.register(models.GDPRLog, site=admin_site) class GDPRLogAdmin(admin.ModelAdmin): list_display = ("user", "date", "ip", "routable_ip", "activity") diff --git a/ishtar_common/migrations/0236_auto_20240209_1558.py b/ishtar_common/migrations/0236_auto_20240209_1558.py deleted file mode 100644 index 6fd6014fe..000000000 --- a/ishtar_common/migrations/0236_auto_20240209_1558.py +++ /dev/null @@ -1,122 +0,0 @@ -# Generated by Django 2.2.24 on 2024-02-09 15:58 - -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 = [ - ('ishtar_common', '0235_default_geo_types'), - ] - - operations = [ - migrations.CreateModel( - name='ShootingAngle', - 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')), - ], - options={ - 'verbose_name': 'Shooting angle', - 'verbose_name_plural': 'Shooting angles', - 'ordering': ('order', 'label'), - }, - bases=(ishtar_common.models_common.Cached, models.Model), - ), - migrations.AlterModelOptions( - name='licensetype', - options={'ordering': ('parent__label', 'order', 'label'), 'verbose_name': 'License type', 'verbose_name_plural': 'License types'}, - ), - migrations.AddField( - model_name='document', - name='copyright', - field=models.TextField(blank=True, default='', verbose_name='Copyright'), - ), - migrations.AddField( - model_name='document', - name='rights_owner', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='ishtar_common.Organization', verbose_name='Rights owner'), - ), - migrations.AddField( - model_name='historicaldocument', - name='copyright', - field=models.TextField(blank=True, default='', verbose_name='Copyright'), - ), - migrations.AddField( - model_name='historicaldocument', - name='rights_owner', - field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='ishtar_common.Organization', verbose_name='Rights owner'), - ), - migrations.AddField( - model_name='historicalorganization', - name='museum_museofile_id', - field=models.TextField(blank=True, default='', verbose_name='Museofile id'), - ), - migrations.AddField( - model_name='ishtarsiteprofile', - name='museum', - field=models.BooleanField(default=False, help_text='Need finds module', verbose_name='Museum module'), - ), - migrations.AddField( - model_name='ishtarsiteprofile', - name='museum_complete_identifier', - field=models.TextField(default='{{museum_id_prefix}}.{{museum_id}}.{{museum_id_suffix}}', help_text='Formula to manage cached label. If not set a default formula is used.', verbose_name='Find - Complete museum ID'), - ), - migrations.AddField( - model_name='licensetype', - name='order', - field=models.IntegerField(default=10, verbose_name='Order'), - ), - migrations.AddField( - model_name='licensetype', - name='parent', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='ishtar_common.LicenseType', verbose_name='Parent'), - ), - migrations.AddField( - model_name='organization', - name='museum_museofile_id', - field=models.TextField(blank=True, default='', verbose_name='Museofile id'), - ), - migrations.AlterField( - model_name='document', - name='licenses', - field=models.ManyToManyField(blank=True, to='ishtar_common.LicenseType', verbose_name='Rights of use / license'), - ), - migrations.AlterField( - model_name='gdprlog', - name='activity', - field=models.CharField(choices=[('DC', 'Directory consultation'), ('DE', 'Directory export'), ('PV', "Viewing a person's notice"), ('PE', "Exporting a person's notice"), ('PC', 'Person creation'), ('PM', 'Person modification'), ('Pm', 'Person merge'), ('PD', 'Person deletion'), ('AC', 'Admin - Directory consultation'), ('AV', 'Admin - Person view'), ('AM', 'Admin - Person modification'), ('AD', 'Admin - Person deletion')], max_length=2, verbose_name='Activity'), - ), - migrations.CreateModel( - name='BiographicalNote', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('denomination', models.TextField(verbose_name='Denomination')), - ('last_name', models.TextField(blank=True, default='', verbose_name='Last name')), - ('first_name', models.TextField(blank=True, default='', verbose_name='First name')), - ('birth_year', models.PositiveIntegerField(blank=True, null=True, verbose_name='Year of birth')), - ('death_year', models.PositiveIntegerField(blank=True, null=True, verbose_name='Year of death')), - ('biography', models.TextField(blank=True, default='', verbose_name='Biography')), - ('biography_format', models.CharField(blank=True, choices=[('NO', 'None'), ('MD', 'Markdown'), ('HT', 'HTML')], default='NO', max_length=2, verbose_name='Biography format')), - ('person', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='ishtar_common.Person', verbose_name='Person')), - ], - ), - migrations.AddField( - model_name='document', - name='shooting_angle', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='ishtar_common.ShootingAngle', verbose_name='Shooting angle'), - ), - migrations.AddField( - model_name='historicaldocument', - name='shooting_angle', - field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='ishtar_common.ShootingAngle', verbose_name='Shooting angle'), - ), - ] diff --git a/ishtar_common/migrations/0236_auto_20240215_1547.py b/ishtar_common/migrations/0236_auto_20240215_1547.py new file mode 100644 index 000000000..4a2897560 --- /dev/null +++ b/ishtar_common/migrations/0236_auto_20240215_1547.py @@ -0,0 +1,124 @@ +# Generated by Django 2.2.24 on 2024-02-15 15:47 + +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 = [ + ('ishtar_common', '0235_default_geo_types'), + ] + + operations = [ + migrations.CreateModel( + name='ShootingAngle', + 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')), + ], + options={ + 'verbose_name': 'Shooting angle', + 'verbose_name_plural': 'Shooting angles', + 'ordering': ('order', 'label'), + }, + bases=(ishtar_common.models_common.Cached, models.Model), + ), + migrations.AlterModelOptions( + name='licensetype', + options={'ordering': ('parent__label', 'order', 'label'), 'verbose_name': 'License type', 'verbose_name_plural': 'License types'}, + ), + migrations.AddField( + model_name='document', + name='copyright', + field=models.TextField(blank=True, default='', verbose_name='Copyright'), + ), + migrations.AddField( + model_name='document', + name='rights_owner', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='ishtar_common.Organization', verbose_name='Rights owner'), + ), + migrations.AddField( + model_name='historicaldocument', + name='copyright', + field=models.TextField(blank=True, default='', verbose_name='Copyright'), + ), + migrations.AddField( + model_name='historicaldocument', + name='rights_owner', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='ishtar_common.Organization', verbose_name='Rights owner'), + ), + migrations.AddField( + model_name='historicalorganization', + name='museum_museofile_id', + field=models.TextField(blank=True, default='', verbose_name='Museofile id'), + ), + migrations.AddField( + model_name='ishtarsiteprofile', + name='museum', + field=models.BooleanField(default=False, help_text='Need finds module', verbose_name='Museum module'), + ), + migrations.AddField( + model_name='ishtarsiteprofile', + name='museum_complete_identifier', + field=models.TextField(default='{% if museum_id_prefix %}{{museum_id_prefix}}.{% endif %}{{museum_id}}{% if museum_id_suffix %}.{{museum_id_suffix}}{% endif %}', help_text='Formula to manage cached label. If not set a default formula is used.', verbose_name='Find - Complete museum ID'), + ), + migrations.AddField( + model_name='licensetype', + name='order', + field=models.IntegerField(default=10, verbose_name='Order'), + ), + migrations.AddField( + model_name='licensetype', + name='parent', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='ishtar_common.LicenseType', verbose_name='Parent'), + ), + migrations.AddField( + model_name='organization', + name='museum_museofile_id', + field=models.TextField(blank=True, default='', verbose_name='Museofile id'), + ), + migrations.AlterField( + model_name='document', + name='licenses', + field=models.ManyToManyField(blank=True, to='ishtar_common.LicenseType', verbose_name='Rights of use / license'), + ), + migrations.AlterField( + model_name='gdprlog', + name='activity', + field=models.CharField(choices=[('DC', 'Directory consultation'), ('DE', 'Directory export'), ('PV', "Viewing a person's notice"), ('PE', "Exporting a person's notice"), ('PC', 'Person creation'), ('PM', 'Person modification'), ('Pm', 'Person merge'), ('PD', 'Person deletion'), ('AC', 'Admin - Directory consultation'), ('AV', 'Admin - Person view'), ('AM', 'Admin - Person modification'), ('AD', 'Admin - Person deletion')], max_length=2, verbose_name='Activity'), + ), + migrations.CreateModel( + name='BiographicalNote', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('denomination', models.TextField(verbose_name='Denomination')), + ('last_name', models.TextField(blank=True, default='', verbose_name='Last name')), + ('first_name', models.TextField(blank=True, default='', verbose_name='First name')), + ('birth_year', models.PositiveIntegerField(blank=True, null=True, verbose_name='Year of birth')), + ('death_year', models.PositiveIntegerField(blank=True, null=True, verbose_name='Year of death')), + ('biography', models.TextField(blank=True, default='', verbose_name='Biography')), + ('biography_format', models.CharField(blank=True, choices=[('NO', 'None'), ('MD', 'Markdown'), ('HT', 'HTML')], default='NO', max_length=2, verbose_name='Biography format')), + ('organization', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='ishtar_common.Organization', verbose_name='Organization')), + ('person', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='ishtar_common.Person', verbose_name='Person')), + ], + options={'verbose_name': 'Biographical note', 'verbose_name_plural': 'Biographical notes'}, + ), + migrations.AddField( + model_name='document', + name='shooting_angle', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='ishtar_common.ShootingAngle', verbose_name='Shooting angle'), + ), + migrations.AddField( + model_name='historicaldocument', + name='shooting_angle', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='ishtar_common.ShootingAngle', verbose_name='Shooting angle'), + ), + ] diff --git a/ishtar_common/migrations/0237_data_migration_licenses_shootingangle.py b/ishtar_common/migrations/0237_data_migration_licenses_shootingangle.py index ec25de658..9d5190c15 100644 --- a/ishtar_common/migrations/0237_data_migration_licenses_shootingangle.py +++ b/ishtar_common/migrations/0237_data_migration_licenses_shootingangle.py @@ -14,7 +14,7 @@ def load_data(_, __): class Migration(migrations.Migration): dependencies = [ - ('ishtar_common', '0236_auto_20240209_1558'), + ('ishtar_common', '0236_auto_20240215_1547'), ] operations = [ diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 5858fdb78..d51784b72 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -1385,7 +1385,7 @@ class IshtarSiteProfile(models.Model, Cached): ) museum_complete_identifier = models.TextField( _("Find - Complete museum ID"), - default="{{museum_id_prefix}}.{{museum_id}}.{{museum_id_suffix}}", + default="{% if museum_id_prefix %}{{museum_id_prefix}}.{% endif %}{{museum_id}}{% if museum_id_suffix %}.{{museum_id_suffix}}{% endif %}", help_text=_( "Formula to manage cached label. If not set a default formula is used." ), @@ -3244,12 +3244,24 @@ class BiographicalNote(models.Model): biography_format = models.CharField( _("Biography format"), blank=True, default="NO", max_length=2, choices=TEXT_FORMAT ) - person = models.ForeignKey(Person, verbose_name=_("Person"), blank=True, null=True, on_delete=models.SET_NULL) + person = models.ForeignKey(Person, blank=True, null=True, on_delete=models.SET_NULL, verbose_name=_("Person")) + organization = models.ForeignKey( + Organization, blank=True, null=True, on_delete=models.SET_NULL, + verbose_name=_("Organization"), + ) + + class Meta: + verbose_name = _("Biographical note") + verbose_name_plural = _("Biographical notes") + ADMIN_SECTION = _("Directory") @property def formatted_biography(self): return text_format(self.biography, self.biography_format) + def __str__(self): + return self.denomination + GDPR_ACTIVITY = ( ("DC", _("Directory consultation")), -- cgit v1.2.3