diff --git a/awx/main/models/jobs.py b/awx/main/models/jobs.py index 6bae4b6a78..f1f7f9e28d 100644 --- a/awx/main/models/jobs.py +++ b/awx/main/models/jobs.py @@ -456,7 +456,7 @@ class JobTemplate(UnifiedJobTemplate, JobOptions, SurveyJobTemplateMixin, Resour RelatedJobsMixin ''' def _get_active_jobs(self): - return Job.objects.filter(status__in=ACTIVE_STATES) + return Job.objects.filter(status__in=ACTIVE_STATES, job_template=self) class Job(UnifiedJob, JobOptions, SurveyJobMixin, JobNotificationMixin, TaskManagerJobMixin): diff --git a/awx/main/models/projects.py b/awx/main/models/projects.py index 8c7ee0db35..667efedfba 100644 --- a/awx/main/models/projects.py +++ b/awx/main/models/projects.py @@ -25,7 +25,11 @@ from awx.main.models.notifications import ( NotificationTemplate, JobNotificationMixin, ) -from awx.main.models.unified_jobs import * # noqa +from awx.main.models.unified_jobs import ( + UnifiedJob, + UnifiedJobTemplate, + ACTIVE_STATES, +) from awx.main.models.mixins import ( ResourceMixin, TaskManagerProjectUpdateMixin, @@ -230,7 +234,7 @@ class ProjectOptions(models.Model): return proj_path + '.lock' -class Project(UnifiedJobTemplate, ProjectOptions, ResourceMixin, CustomVirtualEnvMixin): +class Project(UnifiedJobTemplate, ProjectOptions, ResourceMixin, CustomVirtualEnvMixin, RelatedJobsMixin): ''' A project represents a playbook git repo that can access a set of inventories ''' @@ -447,8 +451,21 @@ class Project(UnifiedJobTemplate, ProjectOptions, ResourceMixin, CustomVirtualEn def get_absolute_url(self, request=None): return reverse('api:project_detail', kwargs={'pk': self.pk}, request=request) + ''' + RelatedJobsMixin + ''' + def _get_active_jobs(self): + return UnifiedJob.objects.non_polymorphic().filter( + models.Q(status__in=ACTIVE_STATES) & + ( + models.Q(Job___project=self) | + models.Q(ProjectUpdate___project=self) + ) + ) -class ProjectUpdate(UnifiedJob, ProjectOptions, JobNotificationMixin, TaskManagerProjectUpdateMixin, RelatedJobsMixin): + + +class ProjectUpdate(UnifiedJob, ProjectOptions, JobNotificationMixin, TaskManagerProjectUpdateMixin): ''' Internal job for tracking project updates from SCM. ''' @@ -563,15 +580,4 @@ class ProjectUpdate(UnifiedJob, ProjectOptions, JobNotificationMixin, TaskManage return self.global_instance_groups return selected_groups - ''' - RelatedJobsMixin - ''' - def _get_active_jobs(self): - return UnifiedJob.objects.non_polymorphic().filter( - Q(status__in=ACTIVE_STATES) & - ( - Q(Job___project=self) | - Q(ProjectUpdate___project=self) - ) - ) diff --git a/awx/main/models/workflow.py b/awx/main/models/workflow.py index 73a56a2dea..59f3bccb74 100644 --- a/awx/main/models/workflow.py +++ b/awx/main/models/workflow.py @@ -415,7 +415,7 @@ class WorkflowJobTemplate(UnifiedJobTemplate, WorkflowJobOptions, SurveyJobTempl RelatedJobsMixin ''' def _get_active_jobs(self): - return WorkflowJob.objects.filter(status__in=ACTIVE_STATES) + return WorkflowJob.objects.filter(status__in=ACTIVE_STATES, workflow_job_template=self) class WorkflowJob(UnifiedJob, WorkflowJobOptions, SurveyJobMixin, JobNotificationMixin): diff --git a/awx/main/tests/functional/test_projects.py b/awx/main/tests/functional/test_projects.py index 31792683d9..55cc484006 100644 --- a/awx/main/tests/functional/test_projects.py +++ b/awx/main/tests/functional/test_projects.py @@ -251,3 +251,10 @@ def test_project_unique_together_with_org(organization): proj2.validate_unique() proj2 = Project(name='foo', organization=None) proj2.validate_unique() + + +@pytest.mark.django_db +def test_project_delete(delete, organization, admin_user): + proj = Project(name='foo', organization=organization) + proj.save() + delete(reverse('api:project_detail', kwargs={'pk':proj.id,}), admin_user)