diff --git a/awx/api/serializers.py b/awx/api/serializers.py index a3d8d43306..d95a754e71 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -4658,6 +4658,10 @@ class ScheduleSerializer(LaunchConfigurationBaseSerializer, SchedulePreviewSeria def get_summary_fields(self, obj): summary_fields = super(ScheduleSerializer, self).get_summary_fields(obj) + + if isinstance(obj.unified_job_template, SystemJobTemplate): + summary_fields['unified_job_template']['job_type'] = obj.unified_job_template.job_type + if 'inventory' in summary_fields: return summary_fields diff --git a/awx/main/migrations/0078_v360_clear_sessions_tokens_jt.py b/awx/main/migrations/0078_v360_clear_sessions_tokens_jt.py index 83095d2056..c6a00a24c1 100644 --- a/awx/main/migrations/0078_v360_clear_sessions_tokens_jt.py +++ b/awx/main/migrations/0078_v360_clear_sessions_tokens_jt.py @@ -19,11 +19,11 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='systemjob', name='job_type', - field=models.CharField(blank=True, choices=[('cleanup_jobs', 'Remove jobs older than a certain number of days'), ('cleanup_activitystream', 'Remove activity stream entries older than a certain number of days'), ('clearsessions', 'Removes expired browser sessions from the database'), ('cleartokens', 'Removes expired OAuth 2 access tokens and refresh tokens')], default='', max_length=32), + field=models.CharField(blank=True, choices=[('cleanup_jobs', 'Remove jobs older than a certain number of days'), ('cleanup_activitystream', 'Remove activity stream entries older than a certain number of days'), ('cleanup_sessions', 'Removes expired browser sessions from the database'), ('cleanup_tokens', 'Removes expired OAuth 2 access tokens and refresh tokens')], default='', max_length=32), ), migrations.AlterField( model_name='systemjobtemplate', name='job_type', - field=models.CharField(blank=True, choices=[('cleanup_jobs', 'Remove jobs older than a certain number of days'), ('cleanup_activitystream', 'Remove activity stream entries older than a certain number of days'), ('clearsessions', 'Removes expired browser sessions from the database'), ('cleartokens', 'Removes expired OAuth 2 access tokens and refresh tokens')], default='', max_length=32), + field=models.CharField(blank=True, choices=[('cleanup_jobs', 'Remove jobs older than a certain number of days'), ('cleanup_activitystream', 'Remove activity stream entries older than a certain number of days'), ('cleanup_sessions', 'Removes expired browser sessions from the database'), ('cleanup_tokens', 'Removes expired OAuth 2 access tokens and refresh tokens')], default='', max_length=32), ), ] diff --git a/awx/main/models/jobs.py b/awx/main/models/jobs.py index d573d1ed96..c5ed46bb3e 100644 --- a/awx/main/models/jobs.py +++ b/awx/main/models/jobs.py @@ -1103,8 +1103,8 @@ class SystemJobOptions(BaseModel): SYSTEM_JOB_TYPE = [ ('cleanup_jobs', _('Remove jobs older than a certain number of days')), ('cleanup_activitystream', _('Remove activity stream entries older than a certain number of days')), - ('clearsessions', _('Removes expired browser sessions from the database')), - ('cleartokens', _('Removes expired OAuth 2 access tokens and refresh tokens')) + ('cleanup_sessions', _('Removes expired browser sessions from the database')), + ('cleanup_tokens', _('Removes expired OAuth 2 access tokens and refresh tokens')) ] class Meta: @@ -1179,18 +1179,19 @@ class SystemJobTemplate(UnifiedJobTemplate, SystemJobOptions): for key in unallowed_vars: rejected[key] = data.pop(key) - if 'days' in data: - try: - if type(data['days']) is bool: - raise ValueError - if float(data['days']) != int(data['days']): - raise ValueError - days = int(data['days']) - if days < 0: - raise ValueError - except ValueError: - errors_list.append(_("days must be a positive integer.")) - rejected['days'] = data.pop('days') + if self.job_type in ('cleanup_jobs', 'cleanup_activitystream'): + if 'days' in data: + try: + if isinstance(data['days'], (bool, type(None))): + raise ValueError + if float(data['days']) != int(data['days']): + raise ValueError + days = int(data['days']) + if days < 0: + raise ValueError + except ValueError: + errors_list.append(_("days must be a positive integer.")) + rejected['days'] = data.pop('days') if errors_list: errors['extra_vars'] = errors_list diff --git a/awx/main/tasks.py b/awx/main/tasks.py index 7429f8f458..37ef703a29 100644 --- a/awx/main/tasks.py +++ b/awx/main/tasks.py @@ -2761,10 +2761,11 @@ class RunSystemJob(BaseTask): json_vars = {} else: json_vars = json.loads(system_job.extra_vars) - if 'days' in json_vars: - args.extend(['--days', str(json_vars.get('days', 60))]) - if 'dry_run' in json_vars and json_vars['dry_run']: - args.extend(['--dry-run']) + if system_job.job_type in ('cleanup_jobs', 'cleanup_activitystream'): + if 'days' in json_vars: + args.extend(['--days', str(json_vars.get('days', 60))]) + if 'dry_run' in json_vars and json_vars['dry_run']: + args.extend(['--dry-run']) if system_job.job_type == 'cleanup_jobs': args.extend(['--jobs', '--project-updates', '--inventory-updates', '--management-jobs', '--ad-hoc-commands', '--workflow-jobs', diff --git a/awx/main/tests/unit/models/test_system_jobs.py b/awx/main/tests/unit/models/test_system_jobs.py index 045928be07..2ed9204adb 100644 --- a/awx/main/tests/unit/models/test_system_jobs.py +++ b/awx/main/tests/unit/models/test_system_jobs.py @@ -12,7 +12,9 @@ from awx.main.models import SystemJobTemplate {"days": 13435}, ]) def test_valid__clean_extra_data_system_jobs(extra_data): - accepted, rejected, errors = SystemJobTemplate().accept_or_ignore_variables(extra_data) + accepted, rejected, errors = SystemJobTemplate( + job_type='cleanup_jobs' + ).accept_or_ignore_variables(extra_data) assert not rejected assert not errors @@ -32,12 +34,14 @@ def test_valid__clean_extra_data_system_jobs(extra_data): {"days": "foobar"}, ]) def test_invalid__extra_data_system_jobs(extra_data): - accepted, rejected, errors = SystemJobTemplate().accept_or_ignore_variables(extra_data) + accepted, rejected, errors = SystemJobTemplate( + job_type='cleanup_jobs' + ).accept_or_ignore_variables(extra_data) assert str(errors['extra_vars'][0]) == u'days must be a positive integer.' def test_unallowed_system_job_data(): - sjt = SystemJobTemplate() + sjt = SystemJobTemplate(job_type='cleanup_jobs') accepted, ignored, errors = sjt.accept_or_ignore_variables({ 'days': 34, 'foobar': 'baz' @@ -54,7 +58,7 @@ def test_reject_other_prommpts(): def test_reject_some_accept_some(): - sjt = SystemJobTemplate() + sjt = SystemJobTemplate(job_type='cleanup_jobs') accepted, ignored, errors = sjt._accept_or_ignore_job_kwargs(limit="", extra_vars={ 'days': 34, 'foobar': 'baz' diff --git a/awx/ui/client/src/management-jobs/card/card.controller.js b/awx/ui/client/src/management-jobs/card/card.controller.js index 930f04cd51..d266900ea5 100644 --- a/awx/ui/client/src/management-jobs/card/card.controller.js +++ b/awx/ui/client/src/management-jobs/card/card.controller.js @@ -31,7 +31,6 @@ export default }; getManagementJobs(); - $scope.cleanupJob = true; // This handles the case where the user refreshes the management job notifications page. if($state.current.name === 'managementJobsList.notifications') { $scope.activeCard = parseInt($state.params.management_id); diff --git a/awx/ui/client/src/management-jobs/scheduler/schedulerForm.partial.html b/awx/ui/client/src/management-jobs/scheduler/schedulerForm.partial.html index 065a78d4e3..58dfbff4c9 100644 --- a/awx/ui/client/src/management-jobs/scheduler/schedulerForm.partial.html +++ b/awx/ui/client/src/management-jobs/scheduler/schedulerForm.partial.html @@ -164,7 +164,7 @@ ng-show="sheduler_frequency_error"> -
+