summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--archaeological_context_records/migrations/0122_cr_ishtar_users.py5
-rw-r--r--archaeological_files/migrations/0119_file_ishtar_users.py5
-rw-r--r--archaeological_finds/fixtures/initial_data-fr.json11
-rw-r--r--archaeological_finds/migrations/0131_ishtar_users.py25
-rw-r--r--archaeological_finds/migrations/0132_exhibitions_basket_for_treatment.py59
-rw-r--r--archaeological_finds/models_treatments.py43
-rw-r--r--archaeological_finds/urls.py5
-rw-r--r--archaeological_finds/views.py8
-rw-r--r--archaeological_operations/migrations/0121_ishtar_users.py25
-rw-r--r--archaeological_warehouse/migrations/0123_warehouse_container_ishtar_users.py10
-rw-r--r--archaeological_warehouse/models.py2
-rw-r--r--ishtar_common/migrations/0257_sheet_filters.py2
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={