diff --git a/awx/api/serializers.py b/awx/api/serializers.py index 2e70d2c8c9..497eb1952e 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -1333,6 +1333,8 @@ class ProjectOptionsSerializer(BaseSerializer): scm_type = attrs.get('scm_type', u'') or u'' if self.instance and not scm_type: valid_local_paths.append(self.instance.local_path) + if scm_type and self.instance.local_path != attrs.get('local_path'): + errors['local_path'] = _(f'Cannot change local_path for {scm_type}-based projects') if scm_type: attrs.pop('local_path', None) if 'local_path' in attrs and attrs['local_path'] not in valid_local_paths: diff --git a/awx/main/tests/functional/api/test_project.py b/awx/main/tests/functional/api/test_project.py index 09fed17c67..a31eb0804a 100644 --- a/awx/main/tests/functional/api/test_project.py +++ b/awx/main/tests/functional/api/test_project.py @@ -99,3 +99,12 @@ def test_changing_overwrite_behavior_okay_if_not_used(post, patch, organization, expect=200 ) assert Project.objects.get(pk=r1.data['id']).allow_override is False + + +@pytest.mark.django_db +def test_scm_project_local_path_invalid(get, patch, project, admin): + url = reverse('api:project_detail', kwargs={'pk': project.id}) + resp = patch(url, {'local_path': '/foo/bar'}, user=admin, expect=400) + assert resp.data['local_path'] == [ + 'Cannot change local_path for git-based projects' + ]