diff --git a/netbox/extras/api/serializers.py b/netbox/extras/api/serializers.py index 7dbecc5af..2a9d3ec28 100644 --- a/netbox/extras/api/serializers.py +++ b/netbox/extras/api/serializers.py @@ -385,8 +385,8 @@ class JobResultSerializer(BaseModelSerializer): class Meta: model = JobResult fields = [ - 'id', 'url', 'display', 'status', 'created', 'scheduled', 'started', 'completed', 'name', 'obj_type', - 'user', 'data', 'job_id', + 'id', 'url', 'display', 'status', 'created', 'scheduled', 'interval', 'started', 'completed', 'name', + 'obj_type', 'user', 'data', 'job_id', ] diff --git a/netbox/extras/filtersets.py b/netbox/extras/filtersets.py index 0dbbaa314..74b98ccf6 100644 --- a/netbox/extras/filtersets.py +++ b/netbox/extras/filtersets.py @@ -17,10 +17,10 @@ __all__ = ( 'ConfigContextFilterSet', 'ContentTypeFilterSet', 'CustomFieldFilterSet', - 'JobResultFilterSet', 'CustomLinkFilterSet', 'ExportTemplateFilterSet', 'ImageAttachmentFilterSet', + 'JobResultFilterSet', 'JournalEntryFilterSet', 'LocalConfigContextFilterSet', 'ObjectChangeFilterSet', @@ -537,7 +537,7 @@ class JobResultFilterSet(BaseFilterSet): class Meta: model = JobResult - fields = ('id', 'status', 'user', 'obj_type', 'name') + fields = ('id', 'interval', 'status', 'user', 'obj_type', 'name') def search(self, queryset, name, value): if not value.strip(): diff --git a/netbox/extras/migrations/0079_scheduled_jobs.py b/netbox/extras/migrations/0079_scheduled_jobs.py index 807e980a4..d387bd492 100644 --- a/netbox/extras/migrations/0079_scheduled_jobs.py +++ b/netbox/extras/migrations/0079_scheduled_jobs.py @@ -13,6 +13,11 @@ class Migration(migrations.Migration): name='scheduled', field=models.DateTimeField(blank=True, null=True), ), + migrations.AddField( + model_name='jobresult', + name='interval', + field=models.PositiveIntegerField(blank=True, null=True), + ), migrations.AddField( model_name='jobresult', name='started', diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index 95a414225..59954c4e8 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -585,6 +585,11 @@ class JobResult(models.Model): null=True, blank=True ) + interval = models.PositiveIntegerField( + blank=True, + null=True, + help_text=_("Recurrence interval (in minutes)") + ) started = models.DateTimeField( null=True, blank=True @@ -662,32 +667,31 @@ class JobResult(models.Model): self.completed = timezone.now() @classmethod - def enqueue_job(cls, func, name, obj_type, user, schedule_at=None, *args, **kwargs): + def enqueue_job(cls, func, name, obj_type, user, schedule_at=None, interval=None, *args, **kwargs): """ Create a JobResult instance and enqueue a job using the given callable - func: The callable object to be enqueued for execution - name: Name for the JobResult instance - obj_type: ContentType to link to the JobResult instance obj_type - user: User object to link to the JobResult instance - schedule_at: Schedule the job to be executed at the passed date and time - args: additional args passed to the callable - kwargs: additional kargs passed to the callable + Args: + func: The callable object to be enqueued for execution + name: Name for the JobResult instance + obj_type: ContentType to link to the JobResult instance obj_type + user: User object to link to the JobResult instance + schedule_at: Schedule the job to be executed at the passed date and time + interval: Recurrence interval (in minutes) """ - job_result: JobResult = cls.objects.create( + queue = django_rq.get_queue('default') + status = JobResultStatusChoices.STATUS_SCHEDULED if schedule_at else JobResultStatusChoices.STATUS_PENDING + job_result: JobResult = JobResult.objects.create( name=name, + status=status, obj_type=obj_type, + scheduled=schedule_at, + interval=interval, user=user, job_id=uuid.uuid4() ) - queue = django_rq.get_queue("default") - if schedule_at: - job_result.status = JobResultStatusChoices.STATUS_SCHEDULED - job_result.scheduled = schedule_at - job_result.save() - queue.enqueue_at(schedule_at, func, job_id=str(job_result.job_id), job_result=job_result, **kwargs) else: queue.enqueue(func, job_id=str(job_result.job_id), job_result=job_result, **kwargs) diff --git a/netbox/extras/tables/tables.py b/netbox/extras/tables/tables.py index 7e5357dcd..498a61b69 100644 --- a/netbox/extras/tables/tables.py +++ b/netbox/extras/tables/tables.py @@ -8,9 +8,9 @@ from .template_code import * __all__ = ( 'ConfigContextTable', 'CustomFieldTable', - 'JobResultTable', 'CustomLinkTable', 'ExportTemplateTable', + 'JobResultTable', 'JournalEntryTable', 'ObjectChangeTable', 'SavedFilterTable', @@ -41,7 +41,6 @@ class JobResultTable(NetBoxTable): name = tables.Column( linkify=True ) - actions = columns.ActionsColumn( actions=('delete',) ) @@ -49,10 +48,12 @@ class JobResultTable(NetBoxTable): class Meta(NetBoxTable.Meta): model = JobResult fields = ( - 'pk', 'id', 'name', 'obj_type', 'status', 'created', 'scheduled', 'started', 'completed', 'user', 'job_id', + 'pk', 'id', 'name', 'obj_type', 'status', 'created', 'scheduled', 'interval', 'started', 'completed', + 'user', 'job_id', ) default_columns = ( - 'pk', 'id', 'name', 'obj_type', 'status', 'created', 'scheduled', 'started', 'completed', 'user', + 'pk', 'id', 'name', 'obj_type', 'status', 'created', 'scheduled', 'interval', 'started', 'completed', + 'user', )