mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
Closes #855: Added an API endpoint for recent activity
This commit is contained in:
@ -1,7 +1,9 @@
|
|||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
from dcim.api.serializers import NestedSiteSerializer
|
from dcim.api.serializers import NestedSiteSerializer
|
||||||
from extras.models import Graph, TopologyMap
|
from extras.models import ACTION_CHOICES, Graph, TopologyMap, UserAction
|
||||||
|
from users.api.serializers import NestedUserSerializer
|
||||||
|
from utilities.api import ChoiceFieldSerializer
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -40,3 +42,16 @@ class WritableTopologyMapSerializer(serializers.ModelSerializer):
|
|||||||
class Meta:
|
class Meta:
|
||||||
model = TopologyMap
|
model = TopologyMap
|
||||||
fields = ['name', 'slug', 'site', 'device_patterns', 'description']
|
fields = ['name', 'slug', 'site', 'device_patterns', 'description']
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# User actions
|
||||||
|
#
|
||||||
|
|
||||||
|
class UserActionSerializer(serializers.ModelSerializer):
|
||||||
|
user = NestedUserSerializer()
|
||||||
|
action = ChoiceFieldSerializer(choices=ACTION_CHOICES)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = UserAction
|
||||||
|
fields = ['id', 'time', 'user', 'action', 'message']
|
||||||
|
@ -8,4 +8,7 @@ router = routers.DefaultRouter()
|
|||||||
# Topology maps
|
# Topology maps
|
||||||
router.register(r'topology-maps', views.TopologyMapViewSet)
|
router.register(r'topology-maps', views.TopologyMapViewSet)
|
||||||
|
|
||||||
|
# Recent activity
|
||||||
|
router.register(r'recent-activity', views.RecentActivityViewSet)
|
||||||
|
|
||||||
urlpatterns = router.urls
|
urlpatterns = router.urls
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
from rest_framework import generics
|
from rest_framework import generics
|
||||||
from rest_framework.decorators import detail_route
|
from rest_framework.decorators import detail_route
|
||||||
from rest_framework.viewsets import ModelViewSet
|
from rest_framework.viewsets import ModelViewSet, ReadOnlyModelViewSet
|
||||||
|
|
||||||
from django.contrib.contenttypes.models import ContentType
|
from django.contrib.contenttypes.models import ContentType
|
||||||
from django.http import Http404, HttpResponse
|
from django.http import Http404, HttpResponse
|
||||||
@ -9,14 +9,14 @@ from django.shortcuts import get_object_or_404
|
|||||||
from circuits.models import Provider
|
from circuits.models import Provider
|
||||||
from dcim.models import Site, Interface
|
from dcim.models import Site, Interface
|
||||||
from extras import filters
|
from extras import filters
|
||||||
from extras.models import Graph, TopologyMap, GRAPH_TYPE_INTERFACE, GRAPH_TYPE_PROVIDER, GRAPH_TYPE_SITE
|
from extras.models import Graph, TopologyMap, GRAPH_TYPE_INTERFACE, GRAPH_TYPE_PROVIDER, GRAPH_TYPE_SITE, UserAction
|
||||||
from utilities.api import WritableSerializerMixin
|
from utilities.api import WritableSerializerMixin
|
||||||
from . import serializers
|
from . import serializers
|
||||||
|
|
||||||
|
|
||||||
class CustomFieldModelViewSet(ModelViewSet):
|
class CustomFieldModelViewSet(ModelViewSet):
|
||||||
"""
|
"""
|
||||||
Include the applicable set of CustomField in the ModelViewSet context.
|
Include the applicable set of CustomFields in the ModelViewSet context.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def get_serializer_context(self):
|
def get_serializer_context(self):
|
||||||
@ -95,3 +95,12 @@ class TopologyMapViewSet(WritableSerializerMixin, ModelViewSet):
|
|||||||
response['Content-Disposition'] = 'inline; filename="{}.{}"'.format(tmap.slug, img_format)
|
response['Content-Disposition'] = 'inline; filename="{}.{}"'.format(tmap.slug, img_format)
|
||||||
|
|
||||||
return response
|
return response
|
||||||
|
|
||||||
|
|
||||||
|
class RecentActivityViewSet(ReadOnlyModelViewSet):
|
||||||
|
"""
|
||||||
|
List all UserActions to provide a log of recent activity.
|
||||||
|
"""
|
||||||
|
queryset = UserAction.objects.all()
|
||||||
|
serializer_class = serializers.UserActionSerializer
|
||||||
|
filter_class = filters.UserActionFilter
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
import django_filters
|
import django_filters
|
||||||
|
|
||||||
|
from django.contrib.auth.models import User
|
||||||
from django.contrib.contenttypes.models import ContentType
|
from django.contrib.contenttypes.models import ContentType
|
||||||
|
|
||||||
from dcim.models import Site
|
from dcim.models import Site
|
||||||
from .models import CF_TYPE_SELECT, CustomField, TopologyMap
|
from .models import CF_TYPE_SELECT, CustomField, TopologyMap, UserAction
|
||||||
|
|
||||||
|
|
||||||
class CustomFieldFilter(django_filters.Filter):
|
class CustomFieldFilter(django_filters.Filter):
|
||||||
@ -63,3 +64,15 @@ class TopologyMapFilter(django_filters.FilterSet):
|
|||||||
class Meta:
|
class Meta:
|
||||||
model = TopologyMap
|
model = TopologyMap
|
||||||
fields = ['name', 'slug']
|
fields = ['name', 'slug']
|
||||||
|
|
||||||
|
|
||||||
|
class UserActionFilter(django_filters.FilterSet):
|
||||||
|
username = django_filters.ModelMultipleChoiceFilter(
|
||||||
|
name='user__username',
|
||||||
|
queryset=User.objects.all(),
|
||||||
|
to_field_name='username',
|
||||||
|
)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = UserAction
|
||||||
|
fields = ['user']
|
||||||
|
0
netbox/users/api/__init__.py
Normal file
0
netbox/users/api/__init__.py
Normal file
10
netbox/users/api/serializers.py
Normal file
10
netbox/users/api/serializers.py
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
from django.contrib.auth.models import User
|
||||||
|
|
||||||
|
from rest_framework import serializers
|
||||||
|
|
||||||
|
|
||||||
|
class NestedUserSerializer(serializers.ModelSerializer):
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = User
|
||||||
|
fields = ['id', 'username']
|
Reference in New Issue
Block a user