You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bloodhound.apache.org by gj...@apache.org on 2020/09/23 20:27:55 UTC

[bloodhound-core] 12/14: Refactor api

This is an automated email from the ASF dual-hosted git repository.

gjm pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/bloodhound-core.git

commit ac3d18794ac0566a8f28f2fb19bac0843d3c8c29
Author: Gary Martin <gj...@apache.org>
AuthorDate: Tue Feb 19 13:29:30 2019 +0000

    Refactor api
    
     * move api under its own path
     * add urls to model views to help with api navigation
     * add user and group to api
     * experiment with change events as a subpath of tickets
    
    git-svn-id: https://svn.apache.org/repos/asf/bloodhound/branches/bh_core_experimental@1853879 13f79535-47bb-0310-9956-ffa450edef68
---
 bh_core/settings.py     |  6 ++++++
 trackers/models.py      | 16 +++++++++++++---
 trackers/serializers.py | 31 +++++++++++++++++++++++++++++++
 trackers/urls.py        | 17 +++++++++++++----
 trackers/views.py       | 28 +++++++++++++++-------------
 5 files changed, 78 insertions(+), 20 deletions(-)

diff --git a/bh_core/settings.py b/bh_core/settings.py
index 1cf7328..67148b7 100644
--- a/bh_core/settings.py
+++ b/bh_core/settings.py
@@ -142,3 +142,9 @@ USE_TZ = True
 # https://docs.djangoproject.com/en/2.0/howto/static-files/
 
 STATIC_URL = '/static/'
+
+REST_FRAMEWORK = {
+    'DEFAULT_PERMISSION_CLASSES': [
+        'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly',
+    ]
+}
diff --git a/trackers/models.py b/trackers/models.py
index 6ddd882..7baab71 100644
--- a/trackers/models.py
+++ b/trackers/models.py
@@ -35,11 +35,12 @@ class ModelCommon(models.Model):
 
 
 class Ticket(ModelCommon):
-    title = models.CharField(max_length=200, null=True)
-    description = models.TextField(null=True)
 
     def api_url(self):
-        return reverse('ticket_view', args=(self.id,))
+        return reverse('ticket-detail', args=(self.id,))
+
+    def api_events_url(self):
+        return reverse('changeevent-list', args=(self.id,))
 
     def last_update(self):
         last_event = self.changeevent_set.order_by('created').last()
@@ -67,6 +68,9 @@ class Ticket(ModelCommon):
 class TicketField(ModelCommon):
     name = models.CharField(max_length=32)
 
+    def api_url(self):
+        return reverse('ticketfield-detail', args=(self.id,))
+
 
 class ChangeEvent(ModelCommon):
     ticket = models.ForeignKey(Ticket, models.CASCADE, null=False)
@@ -81,3 +85,9 @@ class ChangeEvent(ModelCommon):
     def __str__(self):
         return "Change to: {}; Field: {}; Diff: {}".format(
             self.ticket, self.field, self.diff)
+
+    def api_url(self):
+        return reverse('changeevent-detail', args=(self.ticket.id, self.id,))
+
+    def api_ticket_url(self):
+        return reverse('ticket-detail', args=(self.ticket.id,))
diff --git a/trackers/serializers.py b/trackers/serializers.py
index b38dcdb..2616ff1 100644
--- a/trackers/serializers.py
+++ b/trackers/serializers.py
@@ -1,9 +1,23 @@
+from django.contrib.auth.models import User, Group
 from rest_framework import serializers
 from trackers import models
 
 
+class UserSerializer(serializers.HyperlinkedModelSerializer):
+    class Meta:
+        model = User
+        fields = ('url', 'username', 'email', 'is_staff')
+
+
+class GroupSerializer(serializers.HyperlinkedModelSerializer):
+    class Meta:
+        model = Group
+        fields = ('url', 'name')
+
+
 class TicketSerializer(serializers.ModelSerializer):
     api_url = serializers.SerializerMethodField()
+    api_events_url = serializers.SerializerMethodField()
 
     class Meta:
         model = models.Ticket
@@ -12,14 +26,31 @@ class TicketSerializer(serializers.ModelSerializer):
     def get_api_url(self, obj):
         return self.context['request'].build_absolute_uri(obj.api_url())
 
+    def get_api_events_url(self, obj):
+        return self.context['request'].build_absolute_uri(obj.api_events_url())
+
 
 class TicketFieldSerializer(serializers.ModelSerializer):
+    api_url = serializers.SerializerMethodField()
+
     class Meta:
         model = models.TicketField
         fields = '__all__'
 
+    def get_api_url(self, obj):
+        return self.context['request'].build_absolute_uri(obj.api_url())
+
 
 class ChangeEventSerializer(serializers.ModelSerializer):
+    api_url = serializers.SerializerMethodField()
+    api_ticket_url = serializers.SerializerMethodField()
+
     class Meta:
         model = models.ChangeEvent
         fields = '__all__'
+
+    def get_api_url(self, obj):
+        return self.context['request'].build_absolute_uri(obj.api_url())
+
+    def get_api_ticket_url(self, obj):
+        return self.context['request'].build_absolute_uri(obj.api_ticket_url())
diff --git a/trackers/urls.py b/trackers/urls.py
index d211bb4..bebc31c 100644
--- a/trackers/urls.py
+++ b/trackers/urls.py
@@ -16,13 +16,22 @@
 #  under the License.
 
 from django.urls import path
+from django.conf.urls import include
+from rest_framework import routers
 from . import views
 
+router = routers.DefaultRouter()
+router.register('users', views.UserViewSet)
+router.register('groups', views.GroupViewSet)
+router.register('tickets', views.TicketViewSet)
+router.register('ticketfields', views.TicketFieldViewSet)
+
+ticket_router = routers.DefaultRouter()
+ticket_router.register('ticketevents', views.ChangeEventViewSet)
+
 urlpatterns = [
     path('', views.home, name='home'),
+    path('api/', include(router.urls)),
+    path('api/tickets/<uuid:id>/', include(ticket_router.urls)),
     path('schema_view/', views.schema_view),
-    path('field/', views.TicketFieldListCreate.as_view()),
-    path('ticket/', views.TicketListCreate.as_view()),
-    path('ticket/<uuid:id>', views.TicketViewUpdate.as_view(), name='ticket_view'),
-    path('ticket/<uuid:id>/event/', views.ChangeEventListCreate.as_view()),
 ]
diff --git a/trackers/views.py b/trackers/views.py
index 13498ed..03559b8 100644
--- a/trackers/views.py
+++ b/trackers/views.py
@@ -15,9 +15,9 @@
 #  specific language governing permissions and limitations
 #  under the License.
 
+from django.contrib.auth.models import User, Group
 from django.http import HttpResponse
-from django.shortcuts import render
-from rest_framework import generics
+from rest_framework import viewsets
 from . import serializers
 from . import models
 
@@ -30,24 +30,26 @@ def home(request):
     return HttpResponse('<html><title>Bloodhound Trackers</title></html>')
 
 
-class TicketListCreate(generics.ListCreateAPIView):
-    queryset = models.Ticket.objects.all()
-    serializer_class = serializers.TicketSerializer
+class UserViewSet(viewsets.ModelViewSet):
+    queryset = User.objects.all()
+    serializer_class = serializers.UserSerializer
 
 
-class TicketViewUpdate(generics.RetrieveUpdateAPIView):
-    queryset = models.Ticket.objects.all()
-    serializer_class = serializers.TicketSerializer
-    lookup_field = 'id'
+class GroupViewSet(viewsets.ModelViewSet):
+    queryset = Group.objects.all()
+    serializer_class = serializers.GroupSerializer
 
 
-class TicketFieldListCreate(generics.ListCreateAPIView):
+class TicketFieldViewSet(viewsets.ModelViewSet):
     queryset = models.TicketField.objects.all()
     serializer_class = serializers.TicketFieldSerializer
-    lookup_field = 'ticket'
 
 
-class ChangeEventListCreate(generics.ListCreateAPIView):
+class TicketViewSet(viewsets.ModelViewSet):
+    queryset = models.Ticket.objects.all()
+    serializer_class = serializers.TicketSerializer
+
+
+class ChangeEventViewSet(viewsets.ModelViewSet):
     queryset = models.ChangeEvent.objects.all()
     serializer_class = serializers.ChangeEventSerializer
-    lookup_field = 'ticket'