diff --git a/awx/main/models/mixins.py b/awx/main/models/mixins.py index 0db9ebb5fb..ddbf16243b 100644 --- a/awx/main/models/mixins.py +++ b/awx/main/models/mixins.py @@ -441,4 +441,6 @@ class CustomVirtualEnvMixin(models.Model): raise ValidationError( _('{} is not a valid virtualenv in {}').format(value, settings.BASE_VENV_PATH) ) - return os.path.join(value or '', '') + if value: + return os.path.join(value, '') + return None diff --git a/awx/main/tests/functional/api/test_job_template.py b/awx/main/tests/functional/api/test_job_template.py index 29f67d8ae8..af16dad584 100644 --- a/awx/main/tests/functional/api/test_job_template.py +++ b/awx/main/tests/functional/api/test_job_template.py @@ -602,3 +602,16 @@ def test_job_template_invalid_custom_virtualenv(get, patch, organization_factory assert resp.data['custom_virtualenv'] == [ '/foo/bar is not a valid virtualenv in {}'.format(settings.BASE_VENV_PATH) ] + + +@pytest.mark.django_db +@pytest.mark.parametrize('value', ["", None]) +def test_job_template_unset_custom_virtualenv(get, patch, organization_factory, + job_template_factory, value): + objs = organization_factory("org", superusers=['admin']) + jt = job_template_factory("jt", organization=objs.organization, + inventory='test_inv', project='test_proj').job_template + + url = reverse('api:job_template_detail', kwargs={'pk': jt.id}) + resp = patch(url, {'custom_virtualenv': value}, user=objs.superusers.admin, expect=200) + assert resp.data['custom_virtualenv'] is None diff --git a/awx/main/tests/functional/api/test_organizations.py b/awx/main/tests/functional/api/test_organizations.py index c3905bd8e8..54d7df5fd2 100644 --- a/awx/main/tests/functional/api/test_organizations.py +++ b/awx/main/tests/functional/api/test_organizations.py @@ -207,3 +207,11 @@ def test_organization_invalid_custom_virtualenv(get, patch, organization, admin) assert resp.data['custom_virtualenv'] == [ '/foo/bar is not a valid virtualenv in {}'.format(settings.BASE_VENV_PATH) ] + + +@pytest.mark.django_db +@pytest.mark.parametrize('value', ["", None]) +def test_organization_unset_custom_virtualenv(get, patch, organization, admin, value): + url = reverse('api:organization_detail', kwargs={'pk': organization.id}) + resp = patch(url, {'custom_virtualenv': value}, user=admin, expect=200) + assert resp.data['custom_virtualenv'] is None diff --git a/awx/main/tests/functional/api/test_project.py b/awx/main/tests/functional/api/test_project.py index e554c33280..b66835431f 100644 --- a/awx/main/tests/functional/api/test_project.py +++ b/awx/main/tests/functional/api/test_project.py @@ -36,3 +36,11 @@ def test_project_invalid_custom_virtualenv(get, patch, project, admin): assert resp.data['custom_virtualenv'] == [ '/foo/bar is not a valid virtualenv in {}'.format(settings.BASE_VENV_PATH) ] + + +@pytest.mark.django_db +@pytest.mark.parametrize('value', ["", None]) +def test_project_unset_custom_virtualenv(get, patch, project, admin, value): + url = reverse('api:project_detail', kwargs={'pk': project.id}) + resp = patch(url, {'custom_virtualenv': value}, user=admin, expect=200) + assert resp.data['custom_virtualenv'] is None