diff options
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 |
commit | 6221b6260a6b97a03557acbdfcbed2c26304ed3f (patch) | |
tree | e5ba182a96b6f27a436c31c5198bf91d9ce39a0d | |
parent | f4c049914fbe5d9cbf88fc265ff6e9dd4876fe8b (diff) | |
download | Ishtar-6221b6260a6b97a03557acbdfcbed2c26304ed3f.tar.bz2 Ishtar-6221b6260a6b97a03557acbdfcbed2c26304ed3f.zip |
✅ test site-operation relations formset
-rw-r--r-- | archaeological_files/tests.py | 3 | ||||
-rw-r--r-- | archaeological_files/views.py | 3 | ||||
-rw-r--r-- | archaeological_operations/tests.py | 95 | ||||
-rw-r--r-- | archaeological_operations/views.py | 8 |
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 |