Merge pull request #1159 from AuScalableDroneCloud/swagger

Swagger and Django,DRF version
pull/1162/head
Piero Toffanin 2022-03-25 10:53:12 -04:00 zatwierdzone przez GitHub
commit 2a09d27903
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
7 zmienionych plików z 50 dodań i 27 usunięć

Wyświetl plik

@ -1,6 +1,6 @@
from guardian.shortcuts import get_perms, get_users_with_perms, assign_perm, remove_perm
from rest_framework import serializers, viewsets
from rest_framework.decorators import detail_route
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework import status
from django.db import transaction
@ -53,7 +53,7 @@ class ProjectViewSet(viewsets.ModelViewSet):
return None
return super().paginate_queryset(queryset)
@detail_route(methods=['post'])
@action(detail=True, methods=['post'])
def duplicate(self, request, pk=None):
"""
Duplicate a task
@ -66,7 +66,7 @@ class ProjectViewSet(viewsets.ModelViewSet):
else:
return Response({'error': _("Cannot duplicate project")}, status=status.HTTP_200_OK)
@detail_route(methods=['get'])
@action(detail=True, methods=['get'])
def permissions(self, request, pk=None):
project = get_and_check_project(request, pk, ('change_project', ))
@ -81,7 +81,7 @@ class ProjectViewSet(viewsets.ModelViewSet):
result.sort(key=lambda r: r['owner'], reverse=True)
return Response(result, status=status.HTTP_200_OK)
@detail_route(methods=['post'])
@action(detail=True, methods=['post'])
def edit(self, request, pk=None):
project = get_and_check_project(request, pk, ('change_project', ))
@ -135,4 +135,4 @@ class ProjectViewSet(viewsets.ModelViewSet):
except AttributeError as e:
return Response({'error': _("Invalid permissions")}, status=status.HTTP_400_BAD_REQUEST)
return Response({'success': True}, status=status.HTTP_200_OK)
return Response({'success': True}, status=status.HTTP_200_OK)

Wyświetl plik

@ -10,7 +10,7 @@ from django.db import transaction
from django.http import FileResponse
from django.http import HttpResponse
from rest_framework import status, serializers, viewsets, filters, exceptions, permissions, parsers
from rest_framework.decorators import detail_route
from rest_framework.decorators import action
from rest_framework.permissions import AllowAny
from rest_framework.response import Response
from rest_framework.views import APIView
@ -117,19 +117,19 @@ class TaskViewSet(viewsets.ViewSet):
return Response({'success': True})
@detail_route(methods=['post'])
@action(detail=True, methods=['post'])
def cancel(self, *args, **kwargs):
return self.set_pending_action(pending_actions.CANCEL, *args, **kwargs)
@detail_route(methods=['post'])
@action(detail=True, methods=['post'])
def restart(self, *args, **kwargs):
return self.set_pending_action(pending_actions.RESTART, *args, **kwargs)
@detail_route(methods=['post'])
@action(detail=True, methods=['post'])
def remove(self, *args, **kwargs):
return self.set_pending_action(pending_actions.REMOVE, *args, perms=('delete_project', ), **kwargs)
@detail_route(methods=['get'])
@action(detail=True, methods=['get'])
def output(self, request, pk=None, project_pk=None):
"""
Retrieve the console output for this task.
@ -165,7 +165,7 @@ class TaskViewSet(viewsets.ViewSet):
serializer = TaskSerializer(task)
return Response(serializer.data)
@detail_route(methods=['post'])
@action(detail=True, methods=['post'])
def commit(self, request, pk=None, project_pk=None):
"""
Commit a task after all images have been uploaded
@ -188,7 +188,7 @@ class TaskViewSet(viewsets.ViewSet):
serializer = TaskSerializer(task)
return Response(serializer.data, status=status.HTTP_200_OK)
@detail_route(methods=['post'])
@action(detail=True, methods=['post'])
def upload(self, request, pk=None, project_pk=None):
"""
Add images to a task
@ -216,7 +216,7 @@ class TaskViewSet(viewsets.ViewSet):
return Response({'success': True}, status=status.HTTP_200_OK)
@detail_route(methods=['post'])
@action(detail=True, methods=['post'])
def duplicate(self, request, pk=None, project_pk=None):
"""
Duplicate a task

Wyświetl plik

@ -18,14 +18,14 @@ from webodm import settings
router = routers.DefaultRouter()
router.register(r'projects', ProjectViewSet)
router.register(r'processingnodes', ProcessingNodeViewSet)
router.register(r'presets', PresetViewSet, base_name='presets')
router.register(r'presets', PresetViewSet, basename='presets')
tasks_router = routers.NestedSimpleRouter(router, r'projects', lookup='project')
tasks_router.register(r'tasks', TaskViewSet, base_name='projects-tasks')
tasks_router.register(r'tasks', TaskViewSet, basename='projects-tasks')
admin_router = routers.DefaultRouter()
admin_router.register(r'admin/users', AdminUserViewSet, base_name='admin-users')
admin_router.register(r'admin/groups', AdminGroupViewSet, base_name='admin-groups')
admin_router.register(r'admin/users', AdminUserViewSet, basename='admin-users')
admin_router.register(r'admin/groups', AdminGroupViewSet, basename='admin-groups')
urlpatterns = [
url(r'processingnodes/options/$', ProcessingNodeOptionsView.as_view()),

Wyświetl plik

@ -151,8 +151,8 @@ def welcome(request):
})
def handler404(request):
def handler404(request, exception):
return render(request, '404.html', status=404)
def handler500(request):
return render(request, '500.html', status=500)
return render(request, '500.html', status=500)

Wyświetl plik

@ -3,20 +3,21 @@ appdirs==1.4.0
APScheduler==3.2.0
billiard==3.6.3.0
celery==4.4.0
coreapi==2.0.9
Django==2.1.15
coreapi>=2.3.3
Django==2.2.27
django-appconf==1.0.2
django-codemirror2==0.2
django-colorfield==0.1.15
django-compressor==2.2
django-cors-headers==3.0.2
django-filter==2.0.0
django-filter==2.4.0
django-guardian==1.4.9
django-imagekit==4.0.1
django-libsass==0.7
django-webpack-loader==0.6.0
djangorestframework==3.9.1
djangorestframework==3.13.1
djangorestframework-jwt==1.9.0
djangorestframework-guardian==0.3.0
drf-nested-routers==0.11.1
funcsigs==1.0.2
futures==3.1.1
@ -33,7 +34,6 @@ piexif==1.0.13
pilkit==2.0
Pillow==8.3.2
pip-autoremove==0.9.0
psycopg2==2.8.6
psycopg2-binary==2.8.6
PyJWT==1.5.3
pyodm==1.5.9
@ -61,4 +61,6 @@ https://github.com/OpenDroneMap/WebODM/releases/download/v1.9.7/GDAL-3.3.3-cp39-
Shapely==1.7.0 ; sys_platform == "win32"
eventlet==0.32.0 ; sys_platform == "win32"
pyopenssl==19.1.0 ; sys_platform == "win32"
numpy==1.21.1
numpy==1.21.1
drf-yasg==1.20.0

Wyświetl plik

@ -105,6 +105,7 @@ INSTALLED_APPS = [
'guardian',
'rest_framework',
'rest_framework_nested',
'drf_yasg',
'webpack_loader',
'corsheaders',
'colorfield',
@ -311,7 +312,7 @@ REST_FRAMEWORK = {
'rest_framework.permissions.DjangoObjectPermissions',
],
'DEFAULT_FILTER_BACKENDS': [
'rest_framework.filters.DjangoObjectPermissionsFilter',
'rest_framework_guardian.filters.ObjectPermissionsFilter',
'django_filters.rest_framework.DjangoFilterBackend',
'rest_framework.filters.OrderingFilter',
],

Wyświetl plik

@ -16,16 +16,36 @@ Including another URLconf
import os
from django.conf.urls import include, url
from django.urls import re_path
from django.contrib import admin
from . import settings
from django.views.static import serve
from rest_framework import permissions
from drf_yasg.views import get_schema_view
from drf_yasg import openapi
admin.site.site_header = 'WebODM Administration'
schema_view = get_schema_view(
openapi.Info(
title="WebODM API",
default_version='v1.0.0',
description="WebODM API",
#terms_of_service="",
#contact=openapi.Contact(email=""),
),
public=True,
permission_classes=[permissions.AllowAny],
)
urlpatterns = [
url(r'^', include('app.urls')),
url(r'^', include('django.contrib.auth.urls')),
url(r'^admin/', admin.site.urls),
re_path(r'^swagger(?P<format>\.json|\.yaml)$', schema_view.without_ui(cache_timeout=0), name='schema-json'),
re_path(r'^swagger/$', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
re_path(r'^redoc/$', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'),
]
if settings.DEBUG or settings.FORCE_MEDIA_STATICFILES:
@ -40,6 +60,6 @@ if settings.DEBUG or settings.FORCE_MEDIA_STATICFILES:
]
#from django.contrib.staticfiles.urls import staticfiles_urlpatterns
#urlpatterns += staticfiles_urlpatterns()