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:50 UTC

[bloodhound-core] 07/14: Add swagger for api viewing and more api endpoints

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 e810572d83da6650d2cbbe0367a79134d005f385
Author: Gary Martin <gj...@apache.org>
AuthorDate: Sun Oct 14 00:23:29 2018 +0000

    Add swagger for api viewing and more api endpoints
    
    git-svn-id: https://svn.apache.org/repos/asf/bloodhound/branches/bh_core_experimental@1843804 13f79535-47bb-0310-9956-ffa450edef68
---
 Pipfile                 |   1 +
 Pipfile.lock            | 118 +++++++++++++++++++++++++++++++++++++++++++++++-
 bh_core/settings.py     |   1 +
 trackers/models.py      |  10 ++--
 trackers/serializers.py |   9 +++-
 trackers/urls.py        |   3 ++
 trackers/views.py       |  29 +++++++++---
 7 files changed, 159 insertions(+), 12 deletions(-)

diff --git a/Pipfile b/Pipfile
index 056c071..fe4fd91 100644
--- a/Pipfile
+++ b/Pipfile
@@ -11,6 +11,7 @@ PyYAML = "*"
 [packages]
 django = ">=2.0.0"
 djangorestframework = "*"
+django-rest-swagger = "*"
 
 [requires]
 python_version = "3.6"
diff --git a/Pipfile.lock b/Pipfile.lock
index 7d244b5..c681e5e 100644
--- a/Pipfile.lock
+++ b/Pipfile.lock
@@ -1,7 +1,7 @@
 {
     "_meta": {
         "hash": {
-            "sha256": "f70363525f7fd7a95075f66854bc135a3c1d45142d1e02ebe126442621614be9"
+            "sha256": "9d8b5c33b68a3c95ceadb2fa4e343ea79a7739d9711887ae9562f774b830d49d"
         },
         "pipfile-spec": 6,
         "requires": {
@@ -16,6 +16,34 @@
         ]
     },
     "default": {
+        "certifi": {
+            "hashes": [
+                "sha256:376690d6f16d32f9d1fe8932551d80b23e9d393a8578c5633a2ed39a64861638",
+                "sha256:456048c7e371c089d0a77a5212fb37a2c2dce1e24146e3b7e0261736aaeaa22a"
+            ],
+            "version": "==2018.8.24"
+        },
+        "chardet": {
+            "hashes": [
+                "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae",
+                "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"
+            ],
+            "version": "==3.0.4"
+        },
+        "coreapi": {
+            "hashes": [
+                "sha256:46145fcc1f7017c076a2ef684969b641d18a2991051fddec9458ad3f78ffc1cb",
+                "sha256:bf39d118d6d3e171f10df9ede5666f63ad80bba9a29a8ec17726a66cf52ee6f3"
+            ],
+            "version": "==2.3.3"
+        },
+        "coreschema": {
+            "hashes": [
+                "sha256:5e6ef7bf38c1525d5e55a895934ab4273548629f16aed5c0a6caa74ebf45551f",
+                "sha256:9503506007d482ab0867ba14724b93c18a33b22b6d19fb419ef2d239dd4a1607"
+            ],
+            "version": "==0.0.4"
+        },
         "django": {
             "hashes": [
                 "sha256:acdcc1f61fdb0a0c82a1d3bf1879a414e7732ea894a7632af7f6d66ec7ab5bb3",
@@ -24,6 +52,14 @@
             "index": "pypi",
             "version": "==2.1.2"
         },
+        "django-rest-swagger": {
+            "hashes": [
+                "sha256:48f6aded9937e90ae7cbe9e6c932b9744b8af80cc4e010088b3278c700e0685b",
+                "sha256:b039b0288bab4665cd45dc5d16f94b13911bc4ad0ed55f74ad3b90aa31c87c17"
+            ],
+            "index": "pypi",
+            "version": "==2.2.0"
+        },
         "djangorestframework": {
             "hashes": [
                 "sha256:b6714c3e4b0f8d524f193c91ecf5f5450092c2145439ac2769711f7eba89a9d9",
@@ -32,12 +68,92 @@
             "index": "pypi",
             "version": "==3.8.2"
         },
+        "idna": {
+            "hashes": [
+                "sha256:156a6814fb5ac1fc6850fb002e0852d56c0c8d2531923a51032d1b70760e186e",
+                "sha256:684a38a6f903c1d71d6d5fac066b58d7768af4de2b832e426ec79c30daa94a16"
+            ],
+            "version": "==2.7"
+        },
+        "itypes": {
+            "hashes": [
+                "sha256:c6e77bb9fd68a4bfeb9d958fea421802282451a25bac4913ec94db82a899c073"
+            ],
+            "version": "==1.1.0"
+        },
+        "jinja2": {
+            "hashes": [
+                "sha256:74c935a1b8bb9a3947c50a54766a969d4846290e1e788ea44c1392163723c3bd",
+                "sha256:f84be1bb0040caca4cea721fcbbbbd61f9be9464ca236387158b0feea01914a4"
+            ],
+            "version": "==2.10"
+        },
+        "markupsafe": {
+            "hashes": [
+                "sha256:a6be69091dac236ea9c6bc7d012beab42010fa914c459791d627dad4910eb665"
+            ],
+            "version": "==1.0"
+        },
+        "openapi-codec": {
+            "hashes": [
+                "sha256:1bce63289edf53c601ea3683120641407ff6b708803b8954c8a876fe778d2145"
+            ],
+            "version": "==1.3.2"
+        },
         "pytz": {
             "hashes": [
                 "sha256:a061aa0a9e06881eb8b3b2b43f05b9439d6583c206d0a6c340ff72a7b6669053",
                 "sha256:ffb9ef1de172603304d9d2819af6f5ece76f2e85ec10692a524dd876e72bf277"
             ],
             "version": "==2018.5"
+        },
+        "requests": {
+            "hashes": [
+                "sha256:63b52e3c866428a224f97cab011de738c36aec0185aa91cfacd418b5d58911d1",
+                "sha256:ec22d826a36ed72a7358ff3fe56cbd4ba69dd7a6718ffd450ff0e9df7a47ce6a"
+            ],
+            "version": "==2.19.1"
+        },
+        "simplejson": {
+            "hashes": [
+                "sha256:067a7177ddfa32e1483ba5169ebea1bc2ea27f224853211ca669325648ca5642",
+                "sha256:2b8cb601d9ba0381499db719ccc9dfbb2fbd16013f5ff096b1a68a4775576a04",
+                "sha256:2c139daf167b96f21542248f8e0a06596c9b9a7a41c162cc5c9ee9f3833c93cd",
+                "sha256:2fc546e6af49fb45b93bbe878dea4c48edc34083729c0abd09981fe55bdf7f91",
+                "sha256:354fa32b02885e6dae925f1b5bbf842c333c1e11ea5453ddd67309dc31fdb40a",
+                "sha256:37e685986cf6f8144607f90340cff72d36acf654f3653a6c47b84c5c38d00df7",
+                "sha256:3af610ee72efbe644e19d5eaad575c73fb83026192114e5f6719f4901097fce2",
+                "sha256:3b919fc9cf508f13b929a9b274c40786036b31ad28657819b3b9ba44ba651f50",
+                "sha256:3dd289368bbd064974d9a5961101f080e939cbe051e6689a193c99fb6e9ac89b",
+                "sha256:491de7acc423e871a814500eb2dcea8aa66c4a4b1b4825d18f756cdf58e370cb",
+                "sha256:495511fe5f10ccf4e3ed4fc0c48318f533654db6c47ecbc970b4ed215c791968",
+                "sha256:65b41a5cda006cfa7c66eabbcf96aa704a6be2a5856095b9e2fd8c293bad2b46",
+                "sha256:6c3258ffff58712818a233b9737fe4be943d306c40cf63d14ddc82ba563f483a",
+                "sha256:75e3f0b12c28945c08f54350d91e624f8dd580ab74fd4f1bbea54bc6b0165610",
+                "sha256:79b129fe65fdf3765440f7a73edaffc89ae9e7885d4e2adafe6aa37913a00fbb",
+                "sha256:b1f329139ba647a9548aa05fb95d046b4a677643070dc2afc05fa2e975d09ca5",
+                "sha256:c206f47cbf9f32b573c9885f0ec813d2622976cf5effcf7e472344bc2e020ac1",
+                "sha256:d8e238f20bcf70063ee8691d4a72162bcec1f4c38f83c93e6851e72ad545dabb",
+                "sha256:ee9625fc8ee164902dfbb0ff932b26df112da9f871c32f0f9c1bcf20c350fe2a",
+                "sha256:fb2530b53c28f0d4d84990e945c2ebb470edb469d63e389bf02ff409012fe7c5",
+                "sha256:feadb95170e45f439455354904768608e356c5b174ca30b3d11b0e3f24b5c0df"
+            ],
+            "version": "==3.16.0"
+        },
+        "uritemplate": {
+            "hashes": [
+                "sha256:01c69f4fe8ed503b2951bef85d996a9d22434d2431584b5b107b2981ff416fbd",
+                "sha256:1b9c467a940ce9fb9f50df819e8ddd14696f89b9a8cc87ac77952ba416e0a8fd",
+                "sha256:c02643cebe23fc8adb5e6becffe201185bf06c40bda5c0b4028a93f1527d011d"
+            ],
+            "version": "==3.0.0"
+        },
+        "urllib3": {
+            "hashes": [
+                "sha256:a68ac5e15e76e7e5dd2b8f94007233e01effe3e50e8daddf69acfd81cb686baf",
+                "sha256:b5725a0bd4ba422ab0e66e89e030c806576753ea3ee08554382c14e685d117b5"
+            ],
+            "version": "==1.23"
         }
     },
     "develop": {
diff --git a/bh_core/settings.py b/bh_core/settings.py
index 7482fd8..1cf7328 100644
--- a/bh_core/settings.py
+++ b/bh_core/settings.py
@@ -60,6 +60,7 @@ INSTALLED_APPS = [
     'django.contrib.messages',
     'django.contrib.staticfiles',
     'rest_framework',
+    'rest_framework_swagger',
 ]
 
 MIDDLEWARE = [
diff --git a/trackers/models.py b/trackers/models.py
index 6637f17..d819fd4 100644
--- a/trackers/models.py
+++ b/trackers/models.py
@@ -24,6 +24,7 @@ from django.db import models
 
 logger = logging.getLogger(__name__)
 
+
 class ModelCommon(models.Model):
     id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
     created = models.DateTimeField(auto_now_add=True, editable=False)
@@ -31,6 +32,7 @@ class ModelCommon(models.Model):
     class Meta:
         abstract = True
 
+
 class Ticket(ModelCommon):
     title = models.CharField(max_length=200, null=True)
     description = models.TextField(null=True)
@@ -61,10 +63,11 @@ class Ticket(ModelCommon):
 class TicketField(ModelCommon):
     name = models.CharField(max_length=32)
 
+
 class ChangeEvent(ModelCommon):
-    ticket = models.ForeignKey(Ticket, models.CASCADE, editable=False, null=False)
-    field = models.ForeignKey(TicketField, models.CASCADE, editable=False, null=False)
-    diff = models.TextField(editable=False)
+    ticket = models.ForeignKey(Ticket, models.CASCADE, null=False)
+    field = models.ForeignKey(TicketField, models.CASCADE)
+    diff = models.TextField()
 
     def value(self, which=2):
         return ''.join(difflib.restore(self.diff.splitlines(keepends=True), which)).strip()
@@ -74,4 +77,3 @@ class ChangeEvent(ModelCommon):
     def __str__(self):
         return "Change to: {}; Field: {}; Diff: {}".format(
             self.ticket, self.field, self.diff)
-
diff --git a/trackers/serializers.py b/trackers/serializers.py
index 8d0a8d6..5416191 100644
--- a/trackers/serializers.py
+++ b/trackers/serializers.py
@@ -1,5 +1,5 @@
 from rest_framework import serializers
-from trackers.models import Ticket
+from trackers.models import Ticket, TicketField, ChangeEvent
 
 
 class TicketSerializer(serializers.ModelSerializer):
@@ -7,6 +7,13 @@ class TicketSerializer(serializers.ModelSerializer):
         model = Ticket
         fields = '__all__'
 
+
+class TicketFieldSerializer(serializers.ModelSerializer):
+    class Meta:
+        model = TicketField
+        fields = '__all__'
+
+
 class ChangeEventSerializer(serializers.ModelSerializer):
     class Meta:
         model = ChangeEvent
diff --git a/trackers/urls.py b/trackers/urls.py
index 3987dd5..20b115b 100644
--- a/trackers/urls.py
+++ b/trackers/urls.py
@@ -20,6 +20,9 @@ from . import views
 
 urlpatterns = [
     path('', views.home, name='home'),
+    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()),
+    path('ticket/<uuid:id>/event/', views.ChangeEventListCreate.as_view()),
 ]
diff --git a/trackers/views.py b/trackers/views.py
index 8aa474e..13498ed 100644
--- a/trackers/views.py
+++ b/trackers/views.py
@@ -18,19 +18,36 @@
 from django.http import HttpResponse
 from django.shortcuts import render
 from rest_framework import generics
-from trackers.serializers import TicketSerializer
-from trackers.models import Ticket
+from . import serializers
+from . import models
+
+from rest_framework_swagger.views import get_swagger_view
+
+schema_view = get_swagger_view(title='Bloodhound Core API')
+
 
 def home(request):
     return HttpResponse('<html><title>Bloodhound Trackers</title></html>')
 
 
 class TicketListCreate(generics.ListCreateAPIView):
-    queryset = Ticket.objects.all()
-    serializer_class = TicketSerializer
+    queryset = models.Ticket.objects.all()
+    serializer_class = serializers.TicketSerializer
 
 
 class TicketViewUpdate(generics.RetrieveUpdateAPIView):
-    queryset = Ticket.objects.all()
-    serializer_class = TicketSerializer
+    queryset = models.Ticket.objects.all()
+    serializer_class = serializers.TicketSerializer
     lookup_field = 'id'
+
+
+class TicketFieldListCreate(generics.ListCreateAPIView):
+    queryset = models.TicketField.objects.all()
+    serializer_class = serializers.TicketFieldSerializer
+    lookup_field = 'ticket'
+
+
+class ChangeEventListCreate(generics.ListCreateAPIView):
+    queryset = models.ChangeEvent.objects.all()
+    serializer_class = serializers.ChangeEventSerializer
+    lookup_field = 'ticket'