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'