diff --git a/awx/api/serializers.py b/awx/api/serializers.py index 4a674a3a6d..4d03ba7616 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -946,6 +946,12 @@ class ProjectSerializer(UnifiedJobTemplateSerializer, ProjectOptionsSerializer): args=(obj.last_update.pk,)) return res + def validate(self, attrs): + if 'organization' not in attrs or type(attrs['organization']) is not Organization: + raise serializers.ValidationError('Missing organization') + return super(ProjectSerializer, self).validate(attrs) + + class ProjectPlaybooksSerializer(ProjectSerializer): diff --git a/awx/main/tests/functional/test_projects.py b/awx/main/tests/functional/test_projects.py index 07917acde7..8cf7b18ccb 100644 --- a/awx/main/tests/functional/test_projects.py +++ b/awx/main/tests/functional/test_projects.py @@ -108,12 +108,19 @@ def test_create_project(post, organization, org_admin, org_member, admin, rando) 'name': 'Project %d' % i, 'organization': organization.id, }, u) + print(result.data) assert result.status_code == expected_status_codes[i] if expected_status_codes[i] == 201: assert Project.objects.filter(name='Project %d' % i, organization=organization).exists() else: assert not Project.objects.filter(name='Project %d' % i, organization=organization).exists() + +@pytest.mark.django_db +def test_cant_create_project_without_org(post, organization, org_admin, org_member, admin, rando): + assert post(reverse('api:project_list'), { 'name': 'Project foo', }, admin).status_code == 400 + assert post(reverse('api:project_list'), { 'name': 'Project foo', 'organization': None}, admin).status_code == 400 + @pytest.mark.django_db def test_create_project_through_org_link(post, organization, org_admin, org_member, admin, rando): test_list = [rando, org_member, org_admin, admin]