diff options
12 files changed, 188 insertions, 12 deletions
diff --git a/archaeological_context_records/migrations/0122_cr_ishtar_users.py b/archaeological_context_records/migrations/0122_cr_ishtar_users.py index 8e16cfb45..89c9e6cd9 100644 --- a/archaeological_context_records/migrations/0122_cr_ishtar_users.py +++ b/archaeological_context_records/migrations/0122_cr_ishtar_users.py @@ -107,4 +107,9 @@ class Migration(migrations.Migration): name='relation_image_below', field=models.TextField(blank=True, help_text=ishtar_common.utils.max_size_help, max_length=100, null=True, verbose_name='Generated below relation image (SVG)'), ), + migrations.AlterField( + model_name='contextrecord', + name='ishtar_users', + field=models.ManyToManyField(blank=True, related_name='contextrecord_associated', to='ishtar_common.IshtarUser'), + ), ] diff --git a/archaeological_files/migrations/0119_file_ishtar_users.py b/archaeological_files/migrations/0119_file_ishtar_users.py index eb33f34b9..32cbb2fa2 100644 --- a/archaeological_files/migrations/0119_file_ishtar_users.py +++ b/archaeological_files/migrations/0119_file_ishtar_users.py @@ -16,4 +16,9 @@ class Migration(migrations.Migration): name='ishtar_users', field=models.ManyToManyField(blank=True, related_name='file_permission_associated', to='ishtar_common.IshtarUser'), ), + migrations.AlterField( + model_name='file', + name='ishtar_users', + field=models.ManyToManyField(blank=True, related_name='file_associated', to='ishtar_common.IshtarUser'), + ), ] diff --git a/archaeological_finds/fixtures/initial_data-fr.json b/archaeological_finds/fixtures/initial_data-fr.json index 4b0c75553..ef6af8b9e 100644 --- a/archaeological_finds/fixtures/initial_data-fr.json +++ b/archaeological_finds/fixtures/initial_data-fr.json @@ -7029,16 +7029,18 @@ "label": "Demande de pr\u00eat pour \u00e9tude", "txt_idx": "loan_demand_study", "comment": "", - "available": true + "available": true, + "is_exhibition": false } }, { "model": "archaeological_finds.treatmentfiletype", "fields": { - "label": "Demande de pr\u00eat pour exposition", + "label": "Exposition", "txt_idx": "loan-for-exhibition", "comment": "", - "available": true + "available": true, + "is_exhibition": true } }, { @@ -7047,7 +7049,8 @@ "label": "Intention de donation", "txt_idx": "gift_wish", "comment": "", - "available": true + "available": true, + "is_exhibition": false } }, { diff --git a/archaeological_finds/migrations/0131_ishtar_users.py b/archaeological_finds/migrations/0131_ishtar_users.py index 8d8772343..4b6baa73c 100644 --- a/archaeological_finds/migrations/0131_ishtar_users.py +++ b/archaeological_finds/migrations/0131_ishtar_users.py @@ -57,4 +57,29 @@ class Migration(migrations.Migration): name='thumbnail', field=models.ImageField(blank=True, help_text=ishtar_common.utils.max_size_help, max_length=255, null=True, upload_to=ishtar_common.utils.get_image_path), ), + migrations.AlterField( + model_name='basefind', + name='ishtar_users', + field=models.ManyToManyField(blank=True, related_name='basefind_associated', to='ishtar_common.IshtarUser'), + ), + migrations.AlterField( + model_name='find', + name='ishtar_users', + field=models.ManyToManyField(blank=True, related_name='find_associated', to='ishtar_common.IshtarUser'), + ), + migrations.AlterField( + model_name='property', + name='ishtar_users', + field=models.ManyToManyField(blank=True, related_name='property_associated', to='ishtar_common.IshtarUser'), + ), + migrations.AlterField( + model_name='treatment', + name='ishtar_users', + field=models.ManyToManyField(blank=True, related_name='treatment_associated', to='ishtar_common.IshtarUser'), + ), + migrations.AlterField( + model_name='treatmentfile', + name='ishtar_users', + field=models.ManyToManyField(blank=True, related_name='treatmentfile_associated', to='ishtar_common.IshtarUser'), + ), ] diff --git a/archaeological_finds/migrations/0132_exhibitions_basket_for_treatment.py b/archaeological_finds/migrations/0132_exhibitions_basket_for_treatment.py new file mode 100644 index 000000000..874a01744 --- /dev/null +++ b/archaeological_finds/migrations/0132_exhibitions_basket_for_treatment.py @@ -0,0 +1,59 @@ +# Generated by Django 2.2.24 on 2024-11-19 17:49 + +from django.db import migrations, models + + +MAJ_SQL1 = "UPDATE archaeological_finds_treatmentfile SET basket_id=associated_basket_id;" +MAJ_SQL2 = "UPDATE archaeological_finds_historicaltreatmentfile SET basket_id=associated_basket_id;" + + +class Migration(migrations.Migration): + + dependencies = [ + ('archaeological_finds', '0131_ishtar_users'), + ] + + operations = [ + migrations.AlterModelOptions( + name='basefind', + options={'verbose_name': 'Base find', 'verbose_name_plural': 'Base finds'}, + ), + migrations.AddField( + model_name='historicaltreatmentfile', + name='basket_id', + field=models.PositiveIntegerField(blank=True, null=True, verbose_name='Basket ID'), + ), + migrations.AddField( + model_name='treatmentfile', + name='basket_id', + field=models.PositiveIntegerField(blank=True, null=True, verbose_name='Basket ID'), + ), + migrations.RunSQL(MAJ_SQL1), + migrations.RunSQL(MAJ_SQL2), + migrations.RemoveField( + model_name='historicaltreatmentfile', + name='associated_basket', + ), + migrations.RemoveField( + model_name='treatmentfile', + name='associated_basket', + ), + migrations.RenameField(model_name="treatmentfile", old_name="basket_id", new_name="associated_basket_id"), + migrations.RenameField(model_name="historicaltreatmentfile", old_name="basket_id", new_name="associated_basket_id"), + + migrations.AddField( + model_name='treatment', + name='associated_basket_id', + field=models.PositiveIntegerField(blank=True, null=True, verbose_name='Basket ID'), + ), + migrations.AddField( + model_name='historicaltreatment', + name='associated_basket_id', + field=models.PositiveIntegerField(blank=True, null=True, verbose_name='Basket ID'), + ), + migrations.AddField( + model_name='treatmentfiletype', + name='is_exhibition', + field=models.BooleanField(default=False, verbose_name='Is an exhibition'), + ), + ] diff --git a/archaeological_finds/models_treatments.py b/archaeological_finds/models_treatments.py index 935a14f2f..c7c4fcac9 100644 --- a/archaeological_finds/models_treatments.py +++ b/archaeological_finds/models_treatments.py @@ -96,6 +96,25 @@ post_save.connect(post_save_cache, sender=TreatmentState) post_delete.connect(post_save_cache, sender=TreatmentState) +class AssociatedFindBasket: + @property + def associated_basket(self): + if not self.associated_basket_id: + return + try: + return FindBasket.objects.get(pk=self.associated_basket_id) + except FindBasket.DoesNotExist: + return + + def pre_save_basket(self): + associated_basket = self.associated_basket + if self.associated_basket_id and not associated_basket: + self.associated_basket_id = None + elif associated_basket and associated_basket.pk != self.associated_basket_id: + self.associated_basket_id = associated_basket.pk + + + class Treatment( DashboardFormItem, ValueGetter, @@ -106,6 +125,7 @@ class Treatment( OwnPerms, ShortMenuItem, SheetItem, + AssociatedFindBasket, ): SLUG = "treatment" APP = "archaeological-finds" @@ -308,6 +328,11 @@ class Treatment( blank=True, null=True, ) + # prevent circular imports... + associated_basket_id = models.PositiveIntegerField( + verbose_name=_("Basket ID"), blank=True, null=True + ) + # associated_basket = models.ForeignKey(FindBasket) history = HistoricalRecords(bases=[HistoryModel]) class Meta: @@ -629,6 +654,7 @@ class Treatment( return self._is_reference_container_changer def save(self, *args, **kwargs): + self.pre_save_basket() items, user, extra_args_for_new, resulting_find = [], None, [], None upstream_items, upstream_item, resulting_finds = [], None, None treatment_types, return_new = [], False @@ -1104,6 +1130,7 @@ class TreatmentFileType(GeneralType): treatment_type = models.ForeignKey( TreatmentType, blank=True, null=True, on_delete=models.SET_NULL ) + is_exhibition = models.BooleanField(_("Is an exhibition"), default=False) class Meta: verbose_name = _("Treatment request type") @@ -1125,6 +1152,7 @@ class TreatmentFile( OwnPerms, ValueGetter, MainItem, + AssociatedFindBasket, ): SLUG = "treatmentfile" APP = "archaeological-finds" @@ -1276,13 +1304,11 @@ class TreatmentFile( blank=True, null=True, ) - associated_basket = models.ForeignKey( - FindBasket, - null=True, - blank=True, - on_delete=models.SET_NULL, - related_name="treatment_files", + # prevent circular imports... + associated_basket_id = models.PositiveIntegerField( + verbose_name=_("Basket ID"), blank=True, null=True ) + # associated_basket = models.ForeignKey(FindBasket) history = HistoricalRecords() class Meta: @@ -1303,6 +1329,9 @@ class TreatmentFile( def __str__(self): return self.cached_label or "" + def natural_key(self): + return (self.year, self.index) + @property def short_class_name(self): return _("Treatment request") @@ -1403,7 +1432,7 @@ class TreatmentFile( def save(self, *args, **kwargs): self.pre_save() - super(TreatmentFile, self).save(*args, **kwargs) + super().save(*args, **kwargs) m2m_changed.connect(document_attached_changed, sender=TreatmentFile.documents.through) diff --git a/archaeological_finds/urls.py b/archaeological_finds/urls.py index 688fe5da3..ad4082f8e 100644 --- a/archaeological_finds/urls.py +++ b/archaeological_finds/urls.py @@ -641,6 +641,11 @@ urlpatterns = [ name="get-treatmentfile", ), url( + r"get-exhibition/(?P<type>.+)?$", + views.get_exhibition, + name="get-exhibition", + ), + url( r"get-treatmentfile-shortcut/(?P<type>.+)?$", views.get_treatmentfile, name="get-treatmentfile-shortcut", diff --git a/archaeological_finds/views.py b/archaeological_finds/views.py index 1ea2712fb..c50f4fb1b 100644 --- a/archaeological_finds/views.py +++ b/archaeological_finds/views.py @@ -142,6 +142,14 @@ get_treatmentfile = get_item( search_form=forms.TreatmentFileSelect, ) +get_exhibition = get_item( + models.TreatmentFile, + "get_treatmentfile", + "treatmentfile", + search_form=forms.TreatmentFileSelect, + base_request={"type__is_exhibition": True}, +) + get_administrativeacttreatmentfile = get_item( AdministrativeAct, "get_administrativeacttreatmentfile", diff --git a/archaeological_operations/migrations/0121_ishtar_users.py b/archaeological_operations/migrations/0121_ishtar_users.py index b906003c1..feca26bcb 100644 --- a/archaeological_operations/migrations/0121_ishtar_users.py +++ b/archaeological_operations/migrations/0121_ishtar_users.py @@ -143,4 +143,29 @@ class Migration(migrations.Migration): name='relation_image_below', field=models.FileField(blank=True, help_text=ishtar_common.utils.max_size_help, null=True, upload_to=ishtar_common.utils.get_image_path, verbose_name='Generated below relation image (SVG)'), ), + migrations.AlterField( + model_name='administrativeact', + name='ishtar_users', + field=models.ManyToManyField(blank=True, related_name='administrativeact_associated', to='ishtar_common.IshtarUser'), + ), + migrations.AlterField( + model_name='archaeologicalsite', + name='ishtar_users', + field=models.ManyToManyField(blank=True, related_name='archaeologicalsite_associated', to='ishtar_common.IshtarUser'), + ), + migrations.AlterField( + model_name='operation', + name='ishtar_users', + field=models.ManyToManyField(blank=True, related_name='operation_associated', to='ishtar_common.IshtarUser'), + ), + migrations.AlterField( + model_name='parcel', + name='ishtar_users', + field=models.ManyToManyField(blank=True, related_name='parcel_associated', to='ishtar_common.IshtarUser'), + ), + migrations.AlterField( + model_name='parcelowner', + name='ishtar_users', + field=models.ManyToManyField(blank=True, related_name='parcelowner_associated', to='ishtar_common.IshtarUser'), + ), ] diff --git a/archaeological_warehouse/migrations/0123_warehouse_container_ishtar_users.py b/archaeological_warehouse/migrations/0123_warehouse_container_ishtar_users.py index 2a15e477e..59f07fce8 100644 --- a/archaeological_warehouse/migrations/0123_warehouse_container_ishtar_users.py +++ b/archaeological_warehouse/migrations/0123_warehouse_container_ishtar_users.py @@ -21,4 +21,14 @@ class Migration(migrations.Migration): name='ishtar_users', field=models.ManyToManyField(blank=True, related_name='warehouse_permission_associated', to='ishtar_common.IshtarUser'), ), + migrations.AlterField( + model_name='container', + name='ishtar_users', + field=models.ManyToManyField(blank=True, related_name='container_associated', to='ishtar_common.IshtarUser'), + ), + migrations.AlterField( + model_name='warehouse', + name='ishtar_users', + field=models.ManyToManyField(blank=True, related_name='warehouse_associated', to='ishtar_common.IshtarUser'), + ), ] diff --git a/archaeological_warehouse/models.py b/archaeological_warehouse/models.py index d0168f295..e985d6667 100644 --- a/archaeological_warehouse/models.py +++ b/archaeological_warehouse/models.py @@ -2163,3 +2163,5 @@ class ContainerLocalisation(models.Model): super(ContainerLocalisation, self).save(*args, **kwargs) self.container.skip_history_when_saving = True cached_label_changed(Container, instance=self.container, force_update=True) + + diff --git a/ishtar_common/migrations/0257_sheet_filters.py b/ishtar_common/migrations/0257_sheet_filters.py index 32ad007b0..a747d7f76 100644 --- a/ishtar_common/migrations/0257_sheet_filters.py +++ b/ishtar_common/migrations/0257_sheet_filters.py @@ -26,7 +26,7 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('key', models.CharField(max_length=200, verbose_name='Key')), - ('exclude_or_include', models.CharField(choices=[('E', 'exclude'), ('I', 'Include')], default='E', max_length=1, verbose_name='Exclude or include')), + ('exclude_or_include', models.CharField(choices=[('E', 'exclude'), ('I', 'include')], default='E', max_length=1, verbose_name='Exclude or include')), ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='content_type_sheetfilter', to='contenttypes.ContentType')), ], options={ |