diff --git a/greg/api/serializers/person.py b/greg/api/serializers/person.py index a42ab80575d78b5741dc1c75e2a95900942d230d..77eec13afec9c235552e84b503b085ee80c44a77 100644 --- a/greg/api/serializers/person.py +++ b/greg/api/serializers/person.py @@ -6,7 +6,14 @@ from greg.models import Person, PersonRole, Role class PersonSerializer(serializers.ModelSerializer): class Meta: model = Person - fields = ("id", "first_name", "last_name") + fields = [ + "id", + "first_name", + "last_name", + "date_of_birth", + "email", + "mobile_phone", + ] class PersonRoleSerializer(serializers.ModelSerializer): @@ -16,6 +23,10 @@ class PersonRoleSerializer(serializers.ModelSerializer): model = PersonRole fields = [ "id", + "start_date", + "end_date", + "registered_by", + "unit", "created", "updated", "role", diff --git a/greg/api/urls.py b/greg/api/urls.py index 62ee2d499a1cc1ab3e866522c8dd7b8e6c1159f3..3d92c2682e9ec665f74ebec6820cebeac181d771 100644 --- a/greg/api/urls.py +++ b/greg/api/urls.py @@ -23,7 +23,7 @@ urlpatterns += [ path("health/", Health.as_view()), url( r"^persons/(?P<person_id>[0-9]+)/roles/$", - PersonRoleViewSet.as_view({"get": "list"}), + PersonRoleViewSet.as_view({"get": "list", "post": "create"}), name="person_role-list", ), url( diff --git a/greg/api/views/person.py b/greg/api/views/person.py index 556cc8ce2ade09badc0c386cd6c9da67869d4cee..c856392bf83084053a417f424c61f4bacb5d8dfa 100644 --- a/greg/api/views/person.py +++ b/greg/api/views/person.py @@ -1,3 +1,4 @@ +from django.core.exceptions import BadRequest from django_filters import rest_framework as filters from rest_framework import viewsets @@ -38,3 +39,12 @@ class PersonRoleViewSet(viewsets.ModelViewSet): if person_role_id: qs = qs.filter(id=person_role_id) return qs + + def perform_create(self, serializer): + person_id = self.kwargs["person_id"] + + if person_id is None: + # Should not happen, the person ID is part of the API path + raise BadRequest("No person id") + + serializer.save(person_id=person_id) diff --git a/greg/tests/test_api_person.py b/greg/tests/test_api_person.py index cc0b0932a73859aee37327cb38ced81f4187f77b..9a4ae2afbe7d7b4dfe75dbb671e942a8303221dd 100644 --- a/greg/tests/test_api_person.py +++ b/greg/tests/test_api_person.py @@ -8,6 +8,7 @@ from rest_framework.test import ( ) from greg.models import Person +from greg.tests.populate_database import DatabasePopulation class GregAPITestCase(APITestCase): @@ -44,6 +45,11 @@ class PersonTestData(GregAPITestCase): class PersonAPITestCase(PersonTestData): + def setUp(self): + super().setUp() + database_populater = DatabasePopulation() + database_populater.populate_database() + def test_get_person(self): url = reverse("person-detail", kwargs={"id": self.person_foo.id}) response = self.client.get(url) @@ -58,4 +64,30 @@ class PersonAPITestCase(PersonTestData): response = self.client.get(url) data = response.json() self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(2, len(data["results"])) + # The DatabasePopulation class will add 10 persons and then there 2 added by the + # test class, so there should be 12 persons in total + self.assertEqual(12, len(data["results"])) + + def test_add_role(self): + url = reverse("person_role-list", kwargs={"person_id": self.person_foo.id}) + roles_for_person = self.client.get(url).json()["results"] + + # Check that there are no roles for the person, and then add one + self.assertEqual(0, len(roles_for_person)) + + role_data = { + "role": "Visiting Professor", + "start_date": "2021-06-10", + "end_date": "2021-08-10", + "registered_by": "1", + "unit": "1", + } + response = self.client.post(url, role_data) + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + + response_data = response.json() + roles_for_person = self.client.get(url).json()["results"] + + # Check that the role shows up when listing roles for the person now + self.assertEqual(1, len(roles_for_person)) + self.assertEqual(response_data["id"], roles_for_person[0]["id"])