diff --git a/greg/migrations/0001_initial.py b/greg/migrations/0001_initial.py index fddea6eade9e3f3a9b3ddbedea4cecc4cb3d8f2b..b9ba63b87241f1a03191aeb51224b21c08dbffa8 100644 --- a/greg/migrations/0001_initial.py +++ b/greg/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2.5 on 2021-08-06 10:47 +# Generated by Django 3.2.5 on 2021-08-06 13:28 import datetime import dirtyfields.dirtyfields @@ -150,7 +150,7 @@ class Migration(migrations.Migration): ('contact_person_unit', models.TextField()), ('comments', models.TextField(blank=True)), ('available_in_search', models.BooleanField(default=False)), - ('person', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='person_roles', to='greg.person')), + ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='person_roles', to='greg.person')), ('registered_by', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='sponsor_role', to='greg.sponsor')), ('role', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='person_roles', to='greg.role')), ('unit', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='unit_person_role', to='greg.organizationalunit')), @@ -171,7 +171,7 @@ class Migration(migrations.Migration): ('value', models.CharField(max_length=256)), ('verified', models.CharField(blank=True, choices=[('AUTOMATIC', 'Automatic'), ('MANUAL', 'Manual')], max_length=9)), ('verified_when', models.DateField(null=True)), - ('person', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='person', to='greg.person')), + ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='person', to='greg.person')), ('verified_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='sponsor', to='greg.sponsor')), ], options={ @@ -187,7 +187,7 @@ class Migration(migrations.Migration): ('updated', models.DateTimeField(auto_now=True)), ('consent_given_at', models.DateField(null=True)), ('consent', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='link_person_consent', to='greg.consent')), - ('person', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='link_person_consent', to='greg.person')), + ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='link_person_consent', to='greg.person')), ], bases=(dirtyfields.dirtyfields.DirtyFieldsMixin, models.Model), ), diff --git a/greg/models.py b/greg/models.py index a0db3da1a55c194ed4d5b04f52af2c7ed3c37239..81ccc1e058381702b8904405e1289b0e896e7d38 100644 --- a/greg/models.py +++ b/greg/models.py @@ -85,7 +85,7 @@ class PersonRole(BaseModel): """The relationship between a person and a role.""" person = models.ForeignKey( - "Person", on_delete=models.PROTECT, related_name="person_roles" + "Person", on_delete=models.CASCADE, related_name="person_roles" ) role = models.ForeignKey( "Role", on_delete=models.PROTECT, related_name="person_roles" @@ -145,7 +145,7 @@ class PersonIdentity(BaseModel): MANUAL = "MANUAL" person = models.ForeignKey( - "Person", on_delete=models.PROTECT, related_name="person" + "Person", on_delete=models.CASCADE, related_name="person" ) type = models.CharField(max_length=16, choices=IdentityType.choices) source = models.CharField(max_length=256) @@ -201,7 +201,7 @@ class PersonConsent(BaseModel): """ person = models.ForeignKey( - "Person", on_delete=models.PROTECT, related_name="link_person_consent" + "Person", on_delete=models.CASCADE, related_name="link_person_consent" ) consent = models.ForeignKey( "Consent", on_delete=models.PROTECT, related_name="link_person_consent" diff --git a/greg/tests/api/test_person.py b/greg/tests/api/test_person.py index a81e383fd2f1c75cd3d35d899195a2ead12be997..b56c4a4b35411cbef616b231e0d7f16099c2be9a 100644 --- a/greg/tests/api/test_person.py +++ b/greg/tests/api/test_person.py @@ -5,7 +5,14 @@ from rest_framework import status from rest_framework.reverse import reverse from rest_framework.status import HTTP_200_OK -from greg.models import Person, PersonIdentity, Sponsor, Role, OrganizationalUnit +from greg.models import ( + Person, + PersonIdentity, + Sponsor, + Role, + OrganizationalUnit, + Consent, +) @pytest.fixture @@ -105,6 +112,21 @@ def role_data_guest( } +@pytest.fixture +def consent_foo() -> Consent: + return Consent.objects.create( + type="test_consent", + consent_name_en="Test1", + consent_name_nb="Test2", + consent_description_en="Test description", + consent_description_nb="Test beskrivelse", + consent_link_en="https://example.org", + consent_link_nb="https://example.org", + valid_from="2018-01-20", + user_allowed_to_change=True, + ) + + @pytest.mark.django_db def test_get_person(client, person_foo): resp = client.get(reverse("person-detail", kwargs={"id": person_foo.id})) @@ -362,3 +384,30 @@ def test_identity_update(client, person_foo): assert results[0]["type"] == data_updated["type"] assert results[0]["source"] == data_updated["source"] assert results[0]["value"] == data_updated["value"] + + +@pytest.mark.django_db +def test_remove_person( + client, person_foo, role_data_guest, person_foo_verified, person_foo_not_verified +): + url = reverse("person_role-list", kwargs={"person_id": person_foo.id}) + client.post(url, role_data_guest) + + roles_for_person = client.get(url).json()["results"] + assert len(roles_for_person) == 1 + + response = client.get( + reverse("person_identity-list", kwargs={"person_id": person_foo.id}) + ) + assert len(response.json()["results"]) == 2 + + # Delete the person and check that the data has been removed + client.delete(reverse("person-detail", kwargs={"id": person_foo.id})) + + updated_role_data = client.get(url) + assert len(updated_role_data.json()["results"]) == 0 + + response = client.get( + reverse("person_identity-list", kwargs={"person_id": person_foo.id}) + ) + assert len(response.json()["results"]) == 0 diff --git a/greg/tests/models/test_person.py b/greg/tests/models/test_person.py index fb851f06594a6aa9e9e5996c52cb794f9ff3622d..f4aeba5820a90b2ce592f87e6cf1e124b81c2d12 100644 --- a/greg/tests/models/test_person.py +++ b/greg/tests/models/test_person.py @@ -2,8 +2,6 @@ from functools import partial import pytest -from django.db.models import ProtectedError - from greg.models import ( OrganizationalUnit, Person, @@ -12,7 +10,6 @@ from greg.models import ( Sponsor, ) - person_role_with = partial( PersonRole.objects.create, start_date="2020-03-05", @@ -65,12 +62,3 @@ def test_add_multiple_roles_to_person(person, role_foo, role_bar): assert len(person_roles) == 2 assert role_foo in person_roles assert role_bar in person_roles - - -@pytest.mark.django_db -def test_delete_person_with_roles(person): - # it is not clear what cleanup needs to be done when removing a person, - # so for now it is prohibited to delete a person with role relationships - # attached in other tables - with pytest.raises(ProtectedError): - person.delete()