From c2d33639302188614d0b14a620387b0106d9726b Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 28 Jul 2025 12:04:38 -0400 Subject: [PATCH] Closes #18399: Refactor logic for marking data source syncing as queued (#19960) --- netbox/core/api/views.py | 19 ++++++++----------- netbox/core/jobs.py | 11 +++++++++++ netbox/core/views.py | 7 +------ 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/netbox/core/api/views.py b/netbox/core/api/views.py index 4e5b148fc..fc4b85e61 100644 --- a/netbox/core/api/views.py +++ b/netbox/core/api/views.py @@ -1,29 +1,28 @@ from django.http import Http404, HttpResponse from django.shortcuts import get_object_or_404 from django.utils.translation import gettext_lazy as _ +from django_rq.queues import get_redis_connection +from django_rq.settings import QUEUES_LIST +from django_rq.utils import get_statistics from drf_spectacular.types import OpenApiTypes from drf_spectacular.utils import extend_schema +from rest_framework import viewsets from rest_framework.decorators import action from rest_framework.exceptions import PermissionDenied +from rest_framework.permissions import IsAdminUser from rest_framework.response import Response from rest_framework.routers import APIRootView from rest_framework.viewsets import ReadOnlyModelViewSet +from rq.job import Job as RQ_Job +from rq.worker import Worker from core import filtersets -from core.choices import DataSourceStatusChoices from core.jobs import SyncDataSourceJob from core.models import * from core.utils import delete_rq_job, enqueue_rq_job, get_rq_jobs, requeue_rq_job, stop_rq_job -from django_rq.queues import get_redis_connection -from django_rq.utils import get_statistics -from django_rq.settings import QUEUES_LIST from netbox.api.metadata import ContentTypeMetadata from netbox.api.pagination import LimitOffsetListPagination from netbox.api.viewsets import NetBoxModelViewSet, NetBoxReadOnlyModelViewSet -from rest_framework import viewsets -from rest_framework.permissions import IsAdminUser -from rq.job import Job as RQ_Job -from rq.worker import Worker from . import serializers @@ -50,10 +49,8 @@ class DataSourceViewSet(NetBoxModelViewSet): if not request.user.has_perm('core.sync_datasource', obj=datasource): raise PermissionDenied(_("This user does not have permission to synchronize this data source.")) - # Enqueue the sync job & update the DataSource's status + # Enqueue the sync job SyncDataSourceJob.enqueue(instance=datasource, user=request.user) - datasource.status = DataSourceStatusChoices.QUEUED - DataSource.objects.filter(pk=datasource.pk).update(status=datasource.status) serializer = serializers.DataSourceSerializer(datasource, context={'request': request}) diff --git a/netbox/core/jobs.py b/netbox/core/jobs.py index b3dfaf1e7..5806d7d42 100644 --- a/netbox/core/jobs.py +++ b/netbox/core/jobs.py @@ -21,6 +21,17 @@ class SyncDataSourceJob(JobRunner): class Meta: name = 'Synchronization' + @classmethod + def enqueue(cls, *args, **kwargs): + job = super().enqueue(*args, **kwargs) + + # Update the DataSource's synchronization status to queued + if datasource := job.object: + datasource.status = DataSourceStatusChoices.QUEUED + DataSource.objects.filter(pk=datasource.pk).update(status=datasource.status) + + return job + def run(self, *args, **kwargs): datasource = DataSource.objects.get(pk=self.job.object_id) diff --git a/netbox/core/views.py b/netbox/core/views.py index ef52147f1..8ae8e82d8 100644 --- a/netbox/core/views.py +++ b/netbox/core/views.py @@ -33,7 +33,6 @@ from utilities.json import ConfigJSONEncoder from utilities.query import count_related from utilities.views import ContentTypePermissionRequiredMixin, GetRelatedModelsMixin, register_model_view from . import filtersets, forms, tables -from .choices import DataSourceStatusChoices from .jobs import SyncDataSourceJob from .models import * from .plugins import get_catalog_plugins, get_local_plugins @@ -78,12 +77,8 @@ class DataSourceSyncView(BaseObjectView): def post(self, request, pk): datasource = get_object_or_404(self.queryset, pk=pk) - - # Enqueue the sync job & update the DataSource's status + # Enqueue the sync job job = SyncDataSourceJob.enqueue(instance=datasource, user=request.user) - datasource.status = DataSourceStatusChoices.QUEUED - DataSource.objects.filter(pk=datasource.pk).update(status=datasource.status) - messages.success( request, _("Queued job #{id} to sync {datasource}").format(id=job.pk, datasource=datasource)