Add a REST API endpoint to synchronize config context data

This commit is contained in:
jeremystretch 2023-02-07 16:26:06 -05:00
parent a97db67237
commit bb6eff8940
2 changed files with 34 additions and 2 deletions

View File

@ -17,6 +17,7 @@ from extras.models import CustomField
from extras.reports import get_report, get_reports, run_report from extras.reports import get_report, get_reports, run_report
from extras.scripts import get_script, get_scripts, run_script from extras.scripts import get_script, get_scripts, run_script
from netbox.api.authentication import IsAuthenticatedOrLoginNotRequired from netbox.api.authentication import IsAuthenticatedOrLoginNotRequired
from netbox.api.features import SyncedDataMixin
from netbox.api.metadata import ContentTypeMetadata from netbox.api.metadata import ContentTypeMetadata
from netbox.api.viewsets import NetBoxModelViewSet from netbox.api.viewsets import NetBoxModelViewSet
from utilities.exceptions import RQWorkerNotRunningException from utilities.exceptions import RQWorkerNotRunningException
@ -147,9 +148,10 @@ class JournalEntryViewSet(NetBoxModelViewSet):
# Config contexts # Config contexts
# #
class ConfigContextViewSet(NetBoxModelViewSet): class ConfigContextViewSet(SyncedDataMixin, NetBoxModelViewSet):
queryset = ConfigContext.objects.prefetch_related( queryset = ConfigContext.objects.prefetch_related(
'regions', 'site_groups', 'sites', 'locations', 'roles', 'platforms', 'tenant_groups', 'tenants', 'regions', 'site_groups', 'sites', 'locations', 'roles', 'platforms', 'tenant_groups', 'tenants', 'data_source',
'data_file',
) )
serializer_class = serializers.ConfigContextSerializer serializer_class = serializers.ConfigContextSerializer
filterset_class = filtersets.ConfigContextFilterSet filterset_class = filtersets.ConfigContextFilterSet

View File

@ -0,0 +1,30 @@
from django.shortcuts import get_object_or_404
from rest_framework.decorators import action
from rest_framework.exceptions import PermissionDenied
from rest_framework.response import Response
from utilities.permissions import get_permission_for_model
__all__ = (
'SyncedDataMixin',
)
class SyncedDataMixin:
@action(detail=True, methods=['post'])
def sync(self, request, pk):
"""
Provide a /sync API endpoint to synchronize an object's data from its associated DataFile (if any).
"""
permission = get_permission_for_model(self.queryset.model, 'sync')
if not request.user.has_perm(permission):
raise PermissionDenied(f"Missing permission: {permission}")
obj = get_object_or_404(self.queryset, pk=pk)
if obj.data_file:
obj.sync_data()
obj.save()
serializer = self.serializer_class(obj, context={'request': request})
return Response(serializer.data)