From 349a57746aeb19704c4847b61c8aee3710ae076d Mon Sep 17 00:00:00 2001 From: Doston Toirov Date: Fri, 17 Jan 2025 09:43:01 -0500 Subject: [PATCH] fix: [AAP-23882] Add unique together constraint for organization and team name --- src/aap_eda/api/serializers/team.py | 9 +++++++++ tests/integration/api/test_team.py | 16 ++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/aap_eda/api/serializers/team.py b/src/aap_eda/api/serializers/team.py index 8f86eb34d..61efb6107 100644 --- a/src/aap_eda/api/serializers/team.py +++ b/src/aap_eda/api/serializers/team.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. from rest_framework import serializers +from rest_framework.validators import UniqueTogetherValidator from aap_eda.api.serializers.organization import OrganizationRefSerializer from aap_eda.core import models, validators @@ -56,6 +57,14 @@ class Meta: "description", "organization_id", ] + validators = [ + UniqueTogetherValidator( + queryset=models.Team.objects.all(), + fields=["organization_id", "name"], + message="Team with this name already exists in " + "the organization.", + ) + ] def validate(self, data): self.validate_shared_resource() diff --git a/tests/integration/api/test_team.py b/tests/integration/api/test_team.py index bef73b5b9..bc946eeea 100644 --- a/tests/integration/api/test_team.py +++ b/tests/integration/api/test_team.py @@ -121,6 +121,22 @@ def test_create_team_forbidden( assert response.status_code == status.HTTP_403_FORBIDDEN +@pytest.mark.django_db +def test_create_team_unique_name_constraint( + use_shared_resource_setting, + default_organization: models.Organization, + default_team: models.Team, + admin_client: APIClient, +): + data_in = { + "name": default_team.name, + "description": "Test Team", + "organization_id": default_organization.id, + } + response = admin_client.post(f"{api_url_v1}/teams/", data=data_in) + assert response.status_code == status.HTTP_400_BAD_REQUEST + + @pytest.mark.django_db def test_retrieve_team(default_team: models.Team, admin_client: APIClient): response = admin_client.get(f"{api_url_v1}/teams/{default_team.id}/")