diff --git a/djangoldp/templates/swagger-ui.html b/djangoldp/templates/swagger-ui.html new file mode 100644 index 0000000000000000000000000000000000000000..18456413e2212a1ed5755ada538c490c37ffb5f2 --- /dev/null +++ b/djangoldp/templates/swagger-ui.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<html> + +<head> + <title>Swagger</title> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <link rel="stylesheet" type="text/css" href="https://unpkg.com/swagger-ui-dist@3/swagger-ui.css"> +</head> + +<body> + <div id="swagger-ui"></div> + <script src="https://unpkg.com/swagger-ui-dist@3/swagger-ui-bundle.js"></script> + <script> + const ui = SwaggerUIBundle({ + url: "{% url 'schema' %}", + dom_id: '#swagger-ui', + presets: [ + SwaggerUIBundle.presets.apis, + SwaggerUIBundle.SwaggerUIStandalonePreset + ], + layout: "BaseLayout", + requestInterceptor: (request) => { + request.headers['X-CSRFToken'] = "{{ csrf_token }}" + return request; + } + }) + </script> +</body> + +</html> \ No newline at end of file diff --git a/djangoldp/urls.py b/djangoldp/urls.py index 12d0e723211e01e515678363332241cb717eaf90..ed6a1648777a854d47724aebc5b2d187e4a5b2b0 100644 --- a/djangoldp/urls.py +++ b/djangoldp/urls.py @@ -2,12 +2,13 @@ from importlib import import_module from django.conf import settings from django.conf.urls import re_path, include +from django.urls import path from djangoldp.models import LDPSource, Model from djangoldp.permissions import LDPPermissions from djangoldp.views import LDPSourceViewSet, WebFingerView, InboxView from djangoldp.views import LDPViewSet - +from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView def __clean_path(path): '''ensures path is Django-friendly''' @@ -41,6 +42,15 @@ urlpatterns = [ permission_classes=[LDPPermissions], )), re_path(r'^\.well-known/webfinger/?$', WebFingerView.as_view()), re_path(r'^inbox/$', InboxView.as_view()), + path("schema/", SpectacularAPIView.as_view(), name="schema"), + path( + "docs/", + SpectacularSwaggerView.as_view( + template_name="swagger-ui.html", url_name="schema" + ), + name="swagger-ui", + ), + # re_path(r'^api-auth/', include("rest_framework.urls", namespace="rest_framework")), ] for package in settings.DJANGOLDP_PACKAGES: diff --git a/djangoldp/views.py b/djangoldp/views.py index 32316c641bf5e65e0f634859cbdd7c38ae6f2920..a574ab4ed5c3746b796fdc43109e17379be15cf7 100644 --- a/djangoldp/views.py +++ b/djangoldp/views.py @@ -467,26 +467,39 @@ class LDPViewSet(LDPViewSetGenerator): def build_read_serializer(self): model_name = self.model._meta.object_name.lower() - lookup_field = get_resolver().reverse_dict[model_name + '-detail'][0][0][1][0] + try: + lookup_field = get_resolver().reverse_dict[model_name + '-detail'][0][0][1][0] + except: + lookup_field = 'urlid' + pass + meta_args = {'model': self.model, 'extra_kwargs': { '@id': {'lookup_field': lookup_field}}, 'depth': getattr(self, 'depth', Model.get_meta(self.model, 'depth', 0)), # 'depth': getattr(self, 'depth', 4), 'extra_fields': self.nested_fields} + if self.fields: meta_args['fields'] = self.fields else: meta_args['exclude'] = Model.get_meta(self.model, 'serializer_fields_exclude') or () - + return self.build_serializer(meta_args, 'Read') def build_write_serializer(self): model_name = self.model._meta.object_name.lower() - lookup_field = get_resolver().reverse_dict[model_name + '-detail'][0][0][1][0] + + try: + lookup_field = get_resolver().reverse_dict[model_name + '-detail'][0][0][1][0] + except: + lookup_field = 'urlid' + pass + meta_args = {'model': self.model, 'extra_kwargs': { '@id': {'lookup_field': lookup_field}}, 'depth': 10, 'extra_fields': self.nested_fields} + if self.fields: meta_args['fields'] = self.fields else: diff --git a/setup.cfg b/setup.cfg index 3dd375f7bcf7ee82ba5088a2158008f509649c99..30ec40ccc8dbe20ae028e31b51ca94b94bd5f477 100644 --- a/setup.cfg +++ b/setup.cfg @@ -23,6 +23,7 @@ install_requires = django-guardian==2.3.0 django-cookies-samesite~=0.8.0 djangorestframework~=3.12 + drf-spectacular~=0.24 requests==2.23.0 pyyaml==5.3.1 pyyaml==5.3.1