diff --git a/greg/api/serializers/person.py b/greg/api/serializers/person.py index b918ad26f8ace0a9f8515ddf2023460ac6988ad4..f5e946e98ead864cd98945d0f3e021ef2decbfa2 100644 --- a/greg/api/serializers/person.py +++ b/greg/api/serializers/person.py @@ -23,6 +23,7 @@ class PersonSerializer(serializers.ModelSerializer): "identities", "roles", "consents", + "meta", ] diff --git a/greg/migrations/0028_person_meta_alter_invitation_role_and_more.py b/greg/migrations/0028_person_meta_alter_invitation_role_and_more.py new file mode 100644 index 0000000000000000000000000000000000000000..eca548a0a4448aceb26164ff5b1ca9fde2d891ed --- /dev/null +++ b/greg/migrations/0028_person_meta_alter_invitation_role_and_more.py @@ -0,0 +1,37 @@ +# Generated by Django 4.1.2 on 2023-01-23 15:47 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ("greg", "0027_add_norwegian_national_id_card_identity_type"), + ] + + operations = [ + migrations.AddField( + model_name="person", + name="meta", + field=models.JSONField(blank=True, null=True), + ), + migrations.AlterField( + model_name="invitation", + name="role", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="invitations", + to="greg.role", + ), + ), + migrations.AlterField( + model_name="invitationlink", + name="invitation", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="invitation_links", + to="greg.invitation", + ), + ), + ] diff --git a/greg/models.py b/greg/models.py index 1f3b6c4fb9ee2938067d992fda2cbb87f311e72f..2edb025079d9c646f14340f615957aeccac6d81d 100644 --- a/greg/models.py +++ b/greg/models.py @@ -44,6 +44,7 @@ class Person(BaseModel): null=True, blank=True, ) + meta = models.JSONField(null=True, blank=True) objects = PersonManager() diff --git a/greg/tests/api/test_person.py b/greg/tests/api/test_person.py index 6d38d206532e70bc84ed27ccf92716f1829eae15..ee746b31db800cc538692740a69320ec7e21c396 100644 --- a/greg/tests/api/test_person.py +++ b/greg/tests/api/test_person.py @@ -132,6 +132,7 @@ def test_person_create(client): "identities": [], "roles": [], "consents": [], + "meta": None, } @@ -711,3 +712,49 @@ def test_identity_post_fails_if_duplicate(client, person, person_foo): results = response.json()["results"] # No Norwegian national ID should have been added assert len(results) == 0 + + +@pytest.mark.django_db +def test_meta_field_person(client): + url = reverse("v1:person-list") + data_bar = {"first_name": "Bar", "last_name": "Bar", "meta": {"likes": "math"}} + resp_post_bar = client.post(url, data=data_bar, format="json").json() + assert resp_post_bar.get("meta").get("likes") == data_bar["meta"]["likes"] + + resp_get = client.get(url).json()["results"] + assert len(resp_get) == 1 + + data_foo = {"first_name": "Foo", "last_name": "Foo", "meta": {"likes": "fishing"}} + resp_post_foo = client.post(url, data=data_foo, format="json").json() + assert resp_post_foo.get("meta") == data_foo["meta"] + + resp_all = client.get(url).json()["results"] + assert len(resp_all) == 2 + + resp_bar = resp_all[0] + resp_foo = resp_all[1] + assert resp_bar.get("meta") == data_bar["meta"] + assert resp_foo.get("meta") == data_foo["meta"] + + +@pytest.mark.django_db +def test_meta_field_person_id(client, person_foo): + url = reverse("v1:person-detail", kwargs={"id": person_foo.id}) + resp = client.get(url).json() + assert resp.get("meta") is None + + put_data = {"first_name": "Foo", "last_name": "Foo", "meta": {"likes": "math"}} + resp_put = client.put(url, data=put_data, format="json").json() + assert resp_put.get("meta").get("likes") == put_data["meta"]["likes"] + + resp = client.get(url).json() + assert resp.get("meta").get("likes") == put_data["meta"]["likes"] + + patch_data = { + "meta": {"likes": "math", "hobby": "eating"}, + } + resp_patch = client.patch(url, data=patch_data, format="json").json() + assert resp_patch.get("meta") == patch_data["meta"] + + resp = client.get(url).json() + assert resp.get("meta") == patch_data["meta"]