From 7c1ea53383bb39b549c5de2d4bf6028f7ce3a49b Mon Sep 17 00:00:00 2001 From: Jonas Braathen <jonas.braathen@usit.uio.no> Date: Fri, 3 Sep 2021 00:27:29 +0200 Subject: [PATCH] Rename PersonIdentity to Identity --- greg/admin.py | 12 ++++---- greg/api/filters.py | 6 ++-- greg/api/serializers/person.py | 12 ++++---- greg/api/urls.py | 6 ++-- greg/api/views/person.py | 14 +++++----- greg/migrations/0003_auto_20210902_2225.py | 21 ++++++++++++++ greg/models.py | 13 ++++----- greg/signals.py | 8 +++--- greg/tests/api/test_person.py | 16 +++++------ greg/tests/conftest.py | 20 +++++++------- greg/tests/models/test_identity.py | 9 ++++++ greg/tests/models/test_person.py | 32 +++++++++++----------- greg/tests/models/test_personidentity.py | 9 ------ greg/tests/populate_database.py | 16 +++++------ greg/tests/test_notifications.py | 32 +++++++++++----------- 15 files changed, 122 insertions(+), 104 deletions(-) create mode 100644 greg/migrations/0003_auto_20210902_2225.py create mode 100644 greg/tests/models/test_identity.py delete mode 100644 greg/tests/models/test_personidentity.py diff --git a/greg/admin.py b/greg/admin.py index 91825c58..a688726b 100644 --- a/greg/admin.py +++ b/greg/admin.py @@ -5,7 +5,7 @@ from greg.models import ( Person, Role, RoleType, - PersonIdentity, + Identity, ConsentType, Consent, OrganizationalUnit, @@ -21,8 +21,8 @@ class RoleInline(admin.TabularInline): extra = 1 -class PersonIdentityInline(admin.TabularInline): - model = PersonIdentity +class IdentityInline(admin.TabularInline): + model = Identity extra = 1 @@ -39,7 +39,7 @@ class PersonAdmin(VersionAdmin): ) search_fields = ("first_name", "last_name") # TODO: "identities__value"? readonly_fields = ("id", "created", "updated") - inlines = (RoleInline, PersonIdentityInline, ConsentInline) + inlines = (RoleInline, IdentityInline, ConsentInline) def role_count(self, person): return str(person.roles.count()) @@ -62,7 +62,7 @@ class RoleTypeAdmin(VersionAdmin): readonly_fields = ("id", "created", "updated") -class PersonIdentityAdmin(VersionAdmin): +class IdentityAdmin(VersionAdmin): list_display = ("id", "person", "type", "verified") list_filter = ("verified",) readonly_fields = ("id", "created", "updated") @@ -106,7 +106,7 @@ class SponsorOrganizationalUnitAdmin(VersionAdmin): admin.site.register(Person, PersonAdmin) admin.site.register(Role, RoleAdmin) admin.site.register(RoleType, RoleTypeAdmin) -admin.site.register(PersonIdentity, PersonIdentityAdmin) +admin.site.register(Identity, IdentityAdmin) admin.site.register(Consent, ConsentAdmin) admin.site.register(ConsentType, ConsentTypeAdmin) admin.site.register(OrganizationalUnit, OrganizationalUnitAdmin) diff --git a/greg/api/filters.py b/greg/api/filters.py index 1c97b58f..e3edf773 100644 --- a/greg/api/filters.py +++ b/greg/api/filters.py @@ -10,7 +10,7 @@ from django_filters.rest_framework import ( from greg.models import ( Person, Role, - PersonIdentity, + Identity, ) @@ -51,7 +51,7 @@ class PersonFilter(FilterSet): return queryset -class PersonIdentityFilter(FilterSet): +class IdentityFilter(FilterSet): class Meta: - model = PersonIdentity + model = Identity fields = ["type", "verified_by_id"] diff --git a/greg/api/serializers/person.py b/greg/api/serializers/person.py index 72e18ba6..1d15baaf 100644 --- a/greg/api/serializers/person.py +++ b/greg/api/serializers/person.py @@ -1,6 +1,6 @@ from rest_framework import serializers -from greg.models import Person, Role, RoleType, PersonIdentity, Consent, ConsentType +from greg.models import Person, Role, RoleType, Identity, Consent, ConsentType class RoleSerializer(serializers.ModelSerializer): @@ -22,9 +22,9 @@ class RoleSerializer(serializers.ModelSerializer): ] -class PersonIdentitySerializer(serializers.ModelSerializer): +class IdentitySerializer(serializers.ModelSerializer): class Meta: - model = PersonIdentity + model = Identity fields = "__all__" def is_duplicate(self, identity_type: str, value: str) -> bool: @@ -32,12 +32,12 @@ class PersonIdentitySerializer(serializers.ModelSerializer): # which the sponsor is required to elaborate in the value column. # In this case we cannot assume the union of the identity type and # the value to be unique across all records. - if identity_type == PersonIdentity.IdentityType.OTHER: + if identity_type == Identity.IdentityType.OTHER: return False # If the type is a specific ID type, then duplicates are not expected return ( - PersonIdentity.objects.filter(type__like=identity_type) + Identity.objects.filter(type__like=identity_type) .filter(value__like=value) .exists() ) @@ -62,7 +62,7 @@ class ConsentSerializerBrief(serializers.ModelSerializer): class PersonSerializer(serializers.ModelSerializer): - identities = PersonIdentitySerializer(many=True, read_only=True) + identities = IdentitySerializer(many=True, read_only=True) roles = RoleSerializer(many=True, read_only=True) consents = ConsentSerializerBrief(many=True, read_only=True) diff --git a/greg/api/urls.py b/greg/api/urls.py index 71ecf1bf..c20513ef 100644 --- a/greg/api/urls.py +++ b/greg/api/urls.py @@ -8,7 +8,7 @@ from greg.api.views.organizational_unit import OrganizationalUnitViewSet from greg.api.views.person import ( RoleViewSet, PersonViewSet, - PersonIdentityViewSet, + IdentityViewSet, ) from greg.api.views.role_type import RoleTypeViewSet from greg.api.views.sponsor import SponsorViewSet, SponsorGuestsViewSet @@ -38,12 +38,12 @@ urlpatterns += [ ), re_path( r"^persons/(?P<person_id>[0-9]+)/identities/$", - PersonIdentityViewSet.as_view({"get": "list", "post": "create"}), + IdentityViewSet.as_view({"get": "list", "post": "create"}), name="person_identity-list", ), re_path( r"^persons/(?P<person_id>[0-9]+)/identities/(?P<id>[0-9]+)$", - PersonIdentityViewSet.as_view( + IdentityViewSet.as_view( {"get": "retrieve", "delete": "destroy", "patch": "partial_update"} ), name="person_identity-detail", diff --git a/greg/api/views/person.py b/greg/api/views/person.py index 2c330928..33bf6b3a 100644 --- a/greg/api/views/person.py +++ b/greg/api/views/person.py @@ -4,14 +4,14 @@ from drf_spectacular.utils import extend_schema, OpenApiParameter from rest_framework import viewsets, status from rest_framework.response import Response -from greg.api.filters import PersonFilter, RoleFilter, PersonIdentityFilter +from greg.api.filters import PersonFilter, RoleFilter, IdentityFilter from greg.api.pagination import PrimaryKeyCursorPagination from greg.api.serializers.person import ( PersonSerializer, RoleSerializer, - PersonIdentitySerializer, + IdentitySerializer, ) -from greg.models import Person, Role, PersonIdentity +from greg.models import Person, Role, Identity class PersonViewSet(viewsets.ModelViewSet): @@ -76,16 +76,16 @@ class RoleViewSet(viewsets.ModelViewSet): serializer.save(person_id=person_id) -class PersonIdentityViewSet(viewsets.ModelViewSet): +class IdentityViewSet(viewsets.ModelViewSet): """ Person identity API """ - queryset = PersonIdentity.objects.all().order_by("id") - serializer_class = PersonIdentitySerializer + queryset = Identity.objects.all().order_by("id") + serializer_class = IdentitySerializer pagination_class = PrimaryKeyCursorPagination filter_backends = (filters.DjangoFilterBackend,) - filterset_class = PersonIdentityFilter + filterset_class = IdentityFilter # This is set so that the id parameter in the path of the URL is used for looking up objects lookup_url_kwarg = "id" diff --git a/greg/migrations/0003_auto_20210902_2225.py b/greg/migrations/0003_auto_20210902_2225.py new file mode 100644 index 00000000..f78856db --- /dev/null +++ b/greg/migrations/0003_auto_20210902_2225.py @@ -0,0 +1,21 @@ +# Generated by Django 3.2.7 on 2021-09-02 22:25 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('greg', '0002_auto_20210902_2159'), + ] + + operations = [ + migrations.RenameModel( + old_name='PersonIdentity', + new_name='Identity', + ), + migrations.AlterModelOptions( + name='identity', + options={'verbose_name_plural': 'identities'}, + ), + ] diff --git a/greg/models.py b/greg/models.py index 63a354cc..baaca10a 100644 --- a/greg/models.py +++ b/greg/models.py @@ -1,15 +1,12 @@ -from datetime import ( - date, - datetime, -) - -from greg.utils import utcnow +from datetime import date from dirtyfields import DirtyFieldsMixin from django.db import models from django.db.models import Lookup from django.db.models.fields import Field +from greg.utils import utcnow + @Field.register_lookup class Like(Lookup): @@ -197,7 +194,7 @@ class Notification(BaseModel): ) -class PersonIdentity(BaseModel): +class Identity(BaseModel): class IdentityType(models.TextChoices): ID_PORTEN = "ID_PORTEN" FEIDE_ID = "FEIDE_ID" @@ -237,7 +234,7 @@ class PersonIdentity(BaseModel): ) class Meta: - verbose_name_plural = "person identities" + verbose_name_plural = "identities" class ConsentType(BaseModel): diff --git a/greg/signals.py b/greg/signals.py index b9fcde01..51c1dfc0 100644 --- a/greg/signals.py +++ b/greg/signals.py @@ -10,7 +10,7 @@ from greg.models import ( Role, RoleType, Notification, - PersonIdentity, + Identity, Consent, ConsentType, ) @@ -21,7 +21,7 @@ SUPPORTED_MODELS = ( Person, Role, RoleType, - PersonIdentity, + Identity, Consent, ) @@ -123,7 +123,7 @@ def m2m_changed_notification_callback( ): if action not in ("post_add", "post_remove"): return - if sender not in (Consent, Role, PersonIdentity): + if sender not in (Consent, Role, Identity): return operation = "add" if action == "post_add" else "delete" @@ -171,7 +171,7 @@ def _create_metadata(instance) -> Dict: if isinstance(instance, Role): meta["person_id"] = instance.person.id meta["type_id"] = instance.type.id - if isinstance(instance, PersonIdentity): + if isinstance(instance, Identity): meta["person_id"] = instance.person.id meta["identity_id"] = instance.id if isinstance(instance, Consent): diff --git a/greg/tests/api/test_person.py b/greg/tests/api/test_person.py index c8632cea..512a2a64 100644 --- a/greg/tests/api/test_person.py +++ b/greg/tests/api/test_person.py @@ -9,7 +9,7 @@ from rest_framework.status import HTTP_200_OK from rest_framework.test import APIClient from greg.models import ( - PersonIdentity, + Identity, Sponsor, RoleType, OrganizationalUnit, @@ -208,7 +208,7 @@ def test_identity_add(client, person_foo): assert len(results) == 0 data = { - "type": PersonIdentity.IdentityType.FEIDE_ID, + "type": Identity.IdentityType.FEIDE_ID, "source": "Test source", "value": "12345", } @@ -227,7 +227,7 @@ def test_identity_add(client, person_foo): @pytest.mark.django_db def test_identity_add_duplicate(client, person_foo, person_bar): data = { - "type": PersonIdentity.IdentityType.FEIDE_ID, + "type": Identity.IdentityType.FEIDE_ID, "source": "Test source", "value": "12345", } @@ -246,7 +246,7 @@ def test_identity_add_duplicate(client, person_foo, person_bar): @pytest.mark.django_db def test_identity_add_valid_duplicate(client, person_foo, person_bar): data = { - "type": PersonIdentity.IdentityType.OTHER, + "type": Identity.IdentityType.OTHER, "source": "Test source", "value": "12345", } @@ -270,7 +270,7 @@ def test_identity_delete(client, person_foo): assert len(results) == 0 data = { - "type": PersonIdentity.IdentityType.FEIDE_ID, + "type": Identity.IdentityType.FEIDE_ID, "source": "Test source", "value": "12345", } @@ -282,7 +282,7 @@ def test_identity_delete(client, person_foo): # Create two identities for the user data = { - "type": PersonIdentity.IdentityType.PASSPORT, + "type": Identity.IdentityType.PASSPORT, "source": "Test", "value": "1234413241235", } @@ -325,7 +325,7 @@ def test_identity_update(client, person_foo): assert len(results) == 0 data = { - "type": PersonIdentity.IdentityType.FEIDE_ID, + "type": Identity.IdentityType.FEIDE_ID, "source": "Test source", "value": "12345", } @@ -347,7 +347,7 @@ def test_identity_update(client, person_foo): assert results[0]["value"] == data["value"] data_updated = { - "type": PersonIdentity.IdentityType.PASSPORT, + "type": Identity.IdentityType.PASSPORT, "source": "Test", "value": "10000", } diff --git a/greg/tests/conftest.py b/greg/tests/conftest.py index b1d6ff94..54fa0f6d 100644 --- a/greg/tests/conftest.py +++ b/greg/tests/conftest.py @@ -12,7 +12,7 @@ from greg.models import ( Person, Sponsor, SponsorOrganizationalUnit, - PersonIdentity, + Identity, Role, RoleType, OrganizationalUnit, @@ -75,28 +75,28 @@ def sponsor_guy() -> Sponsor: @pytest.fixture -def person_foo_verified(person_foo, sponsor_guy) -> PersonIdentity: - pi = PersonIdentity.objects.create( +def person_foo_verified(person_foo, sponsor_guy) -> Identity: + pi = Identity.objects.create( person=person_foo, - type=PersonIdentity.IdentityType.PASSPORT, + type=Identity.IdentityType.PASSPORT, source="Test", value="12345", - verified=PersonIdentity.Verified.MANUAL, + verified=Identity.Verified.MANUAL, verified_by=sponsor_guy, verified_at="2021-06-15T12:34:56Z", ) - return PersonIdentity.objects.get(id=pi.id) + return Identity.objects.get(id=pi.id) @pytest.fixture -def person_foo_not_verified(person_foo) -> PersonIdentity: - pi = PersonIdentity.objects.create( +def person_foo_not_verified(person_foo) -> Identity: + pi = Identity.objects.create( person=person_foo, - type=PersonIdentity.IdentityType.DRIVERS_LICENSE, + type=Identity.IdentityType.DRIVERS_LICENSE, source="Test", value="12345", ) - return PersonIdentity.objects.get(id=pi.id) + return Identity.objects.get(id=pi.id) @pytest.fixture() diff --git a/greg/tests/models/test_identity.py b/greg/tests/models/test_identity.py new file mode 100644 index 00000000..b63b6166 --- /dev/null +++ b/greg/tests/models/test_identity.py @@ -0,0 +1,9 @@ +import pytest + + +@pytest.mark.django_db +def test_identity_repr(person_foo_verified): + assert ( + repr(person_foo_verified) + == "Identity(id=1, type='PASSPORT', source='Test', value='12345', verified_by=Sponsor(id=1, feide_id='guy@example.org', first_name='Sponsor', last_name='Guy'), verified_at=datetime.datetime(2021, 6, 15, 12, 34, 56, tzinfo=<UTC>))" + ) diff --git a/greg/tests/models/test_person.py b/greg/tests/models/test_person.py index 8be21856..5fc6b28e 100644 --- a/greg/tests/models/test_person.py +++ b/greg/tests/models/test_person.py @@ -6,7 +6,7 @@ import pytest from greg.models import ( OrganizationalUnit, Person, - PersonIdentity, + Identity, Role, RoleType, Sponsor, @@ -52,36 +52,36 @@ def person_registered_future() -> Person: @pytest.fixture -def feide_id() -> PersonIdentity: - return PersonIdentity( - type=PersonIdentity.IdentityType.FEIDE_ID, +def feide_id() -> Identity: + return Identity( + type=Identity.IdentityType.FEIDE_ID, verified_at=_a_year_ago, ) @pytest.fixture -def passport() -> PersonIdentity: - return PersonIdentity( - type=PersonIdentity.IdentityType.PASSPORT, +def passport() -> Identity: + return Identity( + type=Identity.IdentityType.PASSPORT, verified_at=_a_year_ago, ) @pytest.fixture -def unverified_passport() -> PersonIdentity: - return PersonIdentity(type=PersonIdentity.IdentityType.PASSPORT) +def unverified_passport() -> Identity: + return Identity(type=Identity.IdentityType.PASSPORT) @pytest.fixture -def future_identity() -> PersonIdentity: - return PersonIdentity( - type=PersonIdentity.IdentityType.NATIONAL_ID_CARD, +def future_identity() -> Identity: + return Identity( + type=Identity.IdentityType.NATIONAL_ID_CARD, verified_at=_a_year_into_future, ) @pytest.fixture -def feide_verified(person: Person, feide_id: PersonIdentity) -> Person: +def feide_verified(person: Person, feide_id: Identity) -> Person: person.identities.add(feide_id, bulk=False) return person @@ -107,7 +107,7 @@ def test_add_multiple_roles_to_person( @pytest.mark.django_db -def test_identities(person: Person, feide_id: PersonIdentity, passport: PersonIdentity): +def test_identities(person: Person, feide_id: Identity, passport: Identity): person.identities.add(feide_id, bulk=False) assert list(person.identities.all()) == [feide_id] person.identities.add(passport, bulk=False) @@ -131,9 +131,9 @@ def test_is_registered_completed_in_future(person_registered_future): @pytest.mark.django_db -@pytest.mark.parametrize("identity_type", PersonIdentity.IdentityType) +@pytest.mark.parametrize("identity_type", Identity.IdentityType) def test_is_verified(identity_type, person): - identity = PersonIdentity(type=identity_type, verified_at=_a_year_ago) + identity = Identity(type=identity_type, verified_at=_a_year_ago) person.identities.add(identity, bulk=False) assert person.is_verified diff --git a/greg/tests/models/test_personidentity.py b/greg/tests/models/test_personidentity.py deleted file mode 100644 index b2414bf6..00000000 --- a/greg/tests/models/test_personidentity.py +++ /dev/null @@ -1,9 +0,0 @@ -import pytest - - -@pytest.mark.django_db -def test_personidentity_repr(person_foo_verified): - assert ( - repr(person_foo_verified) - == "PersonIdentity(id=1, type='PASSPORT', source='Test', value='12345', verified_by=Sponsor(id=1, feide_id='guy@example.org', first_name='Sponsor', last_name='Guy'), verified_at=datetime.datetime(2021, 6, 15, 12, 34, 56, tzinfo=<UTC>))" - ) diff --git a/greg/tests/populate_database.py b/greg/tests/populate_database.py index b39f1104..605a6703 100644 --- a/greg/tests/populate_database.py +++ b/greg/tests/populate_database.py @@ -9,7 +9,7 @@ from greg.models import ( ConsentType, OrganizationalUnit, Person, - PersonIdentity, + Identity, Role, RoleType, Sponsor, @@ -101,22 +101,22 @@ class DatabasePopulation: self.__add_random_person_identification_connections() def __add_random_person_identification_connections(self, connections_to_create=5): - person_identifier_count = 0 - while person_identifier_count < connections_to_create: + identifier_count = 0 + while identifier_count < connections_to_create: person = random.choice(self.persons) - identity_type = random.choice(PersonIdentity.IdentityType.choices)[0] + identity_type = random.choice(Identity.IdentityType.choices)[0] if self.random.random() > 0.5: sponsor = random.choice(self.sponsors) verified_at = self.faker.date_time_this_year() - identity_type = random.choice(PersonIdentity.IdentityType.choices)[0] + identity_type = random.choice(Identity.IdentityType.choices)[0] verified = self.faker.text(max_nb_chars=50) else: sponsor = None verified_at = None verified = "" - PersonIdentity.objects.create( + Identity.objects.create( person=person, type=identity_type, source=self.faker.text(max_nb_chars=50), @@ -126,7 +126,7 @@ class DatabasePopulation: verified_at=verified_at, ) - person_identifier_count += 1 + identifier_count += 1 def __add_random_sponsor_unit_connections(self, connections_to_create=5): sponsor_unit_count = 0 @@ -180,7 +180,7 @@ class DatabasePopulation: "greg_consent", "greg_consenttype", "greg_notification", - "greg_personidentity", + "greg_identity", "greg_person", "greg_sponsororganizationalunit", "greg_sponsor", diff --git a/greg/tests/test_notifications.py b/greg/tests/test_notifications.py index 8e0798b3..e1c3a98c 100644 --- a/greg/tests/test_notifications.py +++ b/greg/tests/test_notifications.py @@ -6,7 +6,7 @@ from greg.models import ( Notification, OrganizationalUnit, Person, - PersonIdentity, + Identity, Role, RoleType, Sponsor, @@ -24,10 +24,10 @@ def sponsor() -> Sponsor: @pytest.fixture -def person_identity(person: Person) -> PersonIdentity: - return PersonIdentity.objects.create( +def identity(person: Person) -> Identity: + return Identity.objects.create( person=person, - type=PersonIdentity.IdentityType.PASSPORT, + type=Identity.IdentityType.PASSPORT, source="Test", value="12345678901", ) @@ -185,33 +185,33 @@ def test_consent_delete_notification(person: Person, consent_type: ConsentType): @pytest.mark.django_db -def test_person_identity_add_notification( - person: Person, person_identity: PersonIdentity, sponsor: Sponsor +def test_identity_add_notification( + person: Person, identity: Identity, sponsor: Sponsor ): - notifications = Notification.objects.filter(object_type="PersonIdentity") + notifications = Notification.objects.filter(object_type="Identity") assert len(notifications) == 1 assert notifications[0].identifier == person.id assert notifications[0].operation == "add" meta_data = notifications[0].meta assert meta_data["person_id"] == person.id - assert meta_data["identity_id"] == person_identity.id + assert meta_data["identity_id"] == identity.id @pytest.mark.django_db -def test_person_identity_update_notification( - person: Person, person_identity: PersonIdentity, sponsor: Sponsor +def test_identity_update_notification( + person: Person, identity: Identity, sponsor: Sponsor ): - person_identity.verified = PersonIdentity.Verified.MANUAL - person_identity.verified_by = sponsor - person_identity.verified_at = "2021-08-02T12:34:56Z" - person_identity.save() + identity.verified = Identity.Verified.MANUAL + identity.verified_by = sponsor + identity.verified_at = "2021-08-02T12:34:56Z" + identity.save() - notifications = Notification.objects.filter(object_type="PersonIdentity") + notifications = Notification.objects.filter(object_type="Identity") # One notification for adding person identity and one for updating it assert len(notifications) == 2 assert notifications[1].operation == "update" meta_data = notifications[1].meta assert meta_data["person_id"] == person.id - assert meta_data["identity_id"] == person_identity.id + assert meta_data["identity_id"] == identity.id -- GitLab