Author: gjm Date: Tue Feb 19 13:29:30 2019 New Revision: 1853879 URL: http://svn.apache.org/viewvc?rev=1853879&view=rev Log: 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 Modified: bloodhound/branches/bh_core_experimental/bh_core/settings.py bloodhound/branches/bh_core_experimental/trackers/models.py bloodhound/branches/bh_core_experimental/trackers/serializers.py bloodhound/branches/bh_core_experimental/trackers/urls.py bloodhound/branches/bh_core_experimental/trackers/views.py Modified: bloodhound/branches/bh_core_experimental/bh_core/settings.py URL: http://svn.apache.org/viewvc/bloodhound/branches/bh_core_experimental/bh_core/settings.py?rev=1853879&r1=1853878&r2=1853879&view=diff ============================================================================== --- bloodhound/branches/bh_core_experimental/bh_core/settings.py (original) +++ bloodhound/branches/bh_core_experimental/bh_core/settings.py Tue Feb 19 13:29:30 2019 @@ -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', + ] +} Modified: bloodhound/branches/bh_core_experimental/trackers/models.py URL: http://svn.apache.org/viewvc/bloodhound/branches/bh_core_experimental/trackers/models.py?rev=1853879&r1=1853878&r2=1853879&view=diff ============================================================================== --- bloodhound/branches/bh_core_experimental/trackers/models.py (original) +++ bloodhound/branches/bh_core_experimental/trackers/models.py Tue Feb 19 13:29:30 2019 @@ -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,)) Modified: bloodhound/branches/bh_core_experimental/trackers/serializers.py URL: http://svn.apache.org/viewvc/bloodhound/branches/bh_core_experimental/trackers/serializers.py?rev=1853879&r1=1853878&r2=1853879&view=diff ============================================================================== --- bloodhound/branches/bh_core_experimental/trackers/serializers.py (original) +++ bloodhound/branches/bh_core_experimental/trackers/serializers.py Tue Feb 19 13:29:30 2019 @@ -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.Model 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()) Modified: bloodhound/branches/bh_core_experimental/trackers/urls.py URL: http://svn.apache.org/viewvc/bloodhound/branches/bh_core_experimental/trackers/urls.py?rev=1853879&r1=1853878&r2=1853879&view=diff ============================================================================== --- bloodhound/branches/bh_core_experimental/trackers/urls.py (original) +++ bloodhound/branches/bh_core_experimental/trackers/urls.py Tue Feb 19 13:29:30 2019 @@ -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()), ] Modified: bloodhound/branches/bh_core_experimental/trackers/views.py URL: http://svn.apache.org/viewvc/bloodhound/branches/bh_core_experimental/trackers/views.py?rev=1853879&r1=1853878&r2=1853879&view=diff ============================================================================== --- bloodhound/branches/bh_core_experimental/trackers/views.py (original) +++ bloodhound/branches/bh_core_experimental/trackers/views.py Tue Feb 19 13:29:30 2019 @@ -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'