summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2024-10-16 11:20:06 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2024-10-16 11:20:06 +0200
commit6221b6260a6b97a03557acbdfcbed2c26304ed3f (patch)
treee5ba182a96b6f27a436c31c5198bf91d9ce39a0d
parentf4c049914fbe5d9cbf88fc265ff6e9dd4876fe8b (diff)
downloadIshtar-6221b6260a6b97a03557acbdfcbed2c26304ed3f.tar.bz2
Ishtar-6221b6260a6b97a03557acbdfcbed2c26304ed3f.zip
✅ test site-operation relations formset
-rw-r--r--archaeological_files/tests.py3
-rw-r--r--archaeological_files/views.py3
-rw-r--r--archaeological_operations/tests.py95
-rw-r--r--archaeological_operations/views.py8
4 files changed, 99 insertions, 10 deletions
diff --git a/archaeological_files/tests.py b/archaeological_files/tests.py
index 75a6ca7cd..47d0339e8 100644
--- a/archaeological_files/tests.py
+++ b/archaeological_files/tests.py
@@ -40,6 +40,7 @@ from ishtar_common.models import Town, IshtarSiteProfile, Person, PersonType, \
from ishtar_common.utils import ugettext_lazy as _
from archaeological_files import models, views
+from archaeological_operations.views import RELATION_FORMSET_EXTRA_FORM
from archaeological_operations.models import (
Parcel,
ParcelOwner,
@@ -607,7 +608,7 @@ class FileOperationTest(TestCase, OperationInitTest, FileInit):
self.assertContains(response, parcel_2.parcel_number)
data = {}
- for idx in range(2 + views.PARCEL_FORMSET_EXTRA_FORM):
+ for idx in range(2 + RELATION_FORMSET_EXTRA_FORM):
data.update({
f"form-{idx}-pk": "",
f"form-{idx}-year": "",
diff --git a/archaeological_files/views.py b/archaeological_files/views.py
index 2e6cf9aff..44ba75947 100644
--- a/archaeological_files/views.py
+++ b/archaeological_files/views.py
@@ -373,9 +373,6 @@ def file_add_operation(request, pk, current_right=None):
)
-PARCEL_FORMSET_EXTRA_FORM = 3
-
-
file_modify_parcels = get_parcel_modify(
models.File, "associated_file", "file-parcels-modify"
)
diff --git a/archaeological_operations/tests.py b/archaeological_operations/tests.py
index b26ad4bcb..b0b9c9dae 100644
--- a/archaeological_operations/tests.py
+++ b/archaeological_operations/tests.py
@@ -1760,7 +1760,7 @@ class ParcelTest(ImportTest, TestCase):
nb_parcels = models.Parcel.objects.all().count()
town_pk = models.Town.objects.all().first().pk
data = {}
- for idx in range(nb_parcels + views.PARCEL_FORMSET_EXTRA_FORM):
+ for idx in range(nb_parcels + views.RELATION_FORMSET_EXTRA_FORM):
data.update({
f"form-{idx}-pk": "",
f"form-{idx}-year": "",
@@ -2580,6 +2580,99 @@ class OperationTest(TestCase, OperationInitTest):
values = operation.get_containers_values([], [])
self.assertEqual(len(values), 1)
+ def formset_init_data(self, model):
+ nb_items = model.objects.all().count()
+ length = nb_items + views.RELATION_FORMSET_EXTRA_FORM
+ data = {
+ 'form-TOTAL_FORMS': length,
+ 'form-INITIAL_FORMS': 0,
+ 'form-MIN_NUM_FORMS': 0,
+ 'form-MAX_NUM_FORMS': 100,
+ }
+ for idx in range(length):
+ data.update({
+ f"form-{idx}-right_record": "",
+ f"form-{idx}-DELETE": '',
+ })
+
+ return data
+
+ def test_operation_site_formset(self):
+ ope1, ope2 = self.create_operation()[:2]
+ site1 = models.ArchaeologicalSite.objects.create(reference="ref-site")
+ site2 = models.ArchaeologicalSite.objects.create(reference="ref-site2")
+ ope1.archaeological_sites.add(site1)
+ c = Client()
+
+ c.login(username=self.alt_username, password=self.alt_password)
+ url = reverse("operation-site-relations-modify", kwargs={"pk": ope1.pk})
+ response = c.get(url)
+ self.assertRedirects(response, "/") # permission failed, redirect to index
+
+ c.login(username=self.username, password=self.password)
+ response = c.get(url)
+ self.assertEqual(response.status_code, 200)
+ self.assertContains(response, site1.reference)
+
+ # add a site
+ data = self.formset_init_data(models.ArchaeologicalSite)
+ nb_relation_initial = ope1.archaeological_sites.count()
+ data["form-1-right_record"] = site2.pk
+ # form-0 not initialized: has DELETE is not checked, this should not
+ # delete the relation
+ post_response = c.post(url, data)
+ self.assertEqual(post_response.status_code, 200)
+ self.assertEqual(ope1.archaeological_sites.count(), nb_relation_initial + 1)
+ lst = [s.pk for s in ope1.archaeological_sites.all()]
+ self.assertIn(site1.pk, lst)
+ self.assertIn(site2.pk, lst)
+
+ # delete all
+ data["form-0-right_record"] = site1.pk
+ data["form-0-DELETE"] = 1
+ data["form-1-DELETE"] = 1
+ post_response = c.post(url, data)
+ self.assertEqual(post_response.status_code, 200)
+ self.assertEqual(ope1.archaeological_sites.count(), 0)
+
+ def test_site_operation_formset(self):
+ ope1, ope2 = self.create_operation()[:2]
+ site1 = models.ArchaeologicalSite.objects.create(reference="ref-site")
+ site2 = models.ArchaeologicalSite.objects.create(reference="ref-site2")
+ ope1.archaeological_sites.add(site1)
+ c = Client()
+
+ c.login(username=self.alt_username, password=self.alt_password)
+ url = reverse("site-operation-relations-modify", kwargs={"pk": site1.pk})
+ response = c.get(url)
+ self.assertRedirects(response, "/") # permission failed, redirect to index
+
+ c.login(username=self.username, password=self.password)
+ response = c.get(url)
+ self.assertEqual(response.status_code, 200)
+ self.assertContains(response, ope1.code_patriarche)
+
+ # add a site
+ data = self.formset_init_data(models.Operation)
+ nb_relation_initial = site1.operations.count()
+ data["form-1-right_record"] = ope2.pk
+ # form-0 not initialized: has DELETE is not checked, this should not
+ # delete the relation
+ post_response = c.post(url, data)
+ self.assertEqual(post_response.status_code, 200)
+ self.assertEqual(site1.operations.count(), nb_relation_initial + 1)
+ lst = [o.pk for o in site1.operations.all()]
+ self.assertIn(ope1.pk, lst)
+ self.assertIn(ope2.pk, lst)
+
+ # delete all
+ data["form-0-right_record"] = ope1.pk
+ data["form-0-DELETE"] = 1
+ data["form-1-DELETE"] = 1
+ post_response = c.post(url, data)
+ self.assertEqual(post_response.status_code, 200)
+ self.assertEqual(site1.operations.count(), 0)
+
class LockTest(TestCase, OperationInitTest):
fixtures = FILE_FIXTURES
diff --git a/archaeological_operations/views.py b/archaeological_operations/views.py
index 9ebd0a371..0cede556c 100644
--- a/archaeological_operations/views.py
+++ b/archaeological_operations/views.py
@@ -366,10 +366,11 @@ def operation_delete(request, pk):
return redirect(reverse(wizard_url, kwargs={"step": "final-" + wizard_url}))
-PARCEL_FORMSET_EXTRA_FORM = 3
+RELATION_FORMSET_EXTRA_FORM = 3
def get_parcel_modify(model, key_for_parcel, url_name):
+ # TODO: simplify like get_relation_modify
def _modify_parcels(request, pk):
formset_class = SelectedParcelGeneralFormSet
item = model.objects.get(pk=pk)
@@ -390,7 +391,7 @@ def get_parcel_modify(model, key_for_parcel, url_name):
data = {
'TOWNS': available_towns,
- 'form-TOTAL_FORMS': len(initial) + PARCEL_FORMSET_EXTRA_FORM,
+ 'form-TOTAL_FORMS': len(initial) + RELATION_FORMSET_EXTRA_FORM,
'form-INITIAL_FORMS': 0,
'form-MIN_NUM_FORMS': 0,
'form-MAX_NUM_FORMS': 100,
@@ -499,9 +500,6 @@ operation_modify_parcels = get_parcel_modify(
)
-RELATION_FORMSET_EXTRA_FORM = 3
-
-
def _formset_get_deleted(request, data, pk_key):
new_data = dict(request.POST)
new_data = {k: new_data[k][0] for k in new_data} # convert POST to classic dict