-
-
Notifications
You must be signed in to change notification settings - Fork 7k
Schemas & client libraries. #4179
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
bc836aa
b64340b
c890ad4
2d28390
744dba4
56ece73
99adbf1
80c595e
47c7765
29e228d
eeffca4
6c60f58
b7fcdd2
2e60f41
2ffa145
b709dd4
474a23e
4822896
1f76cca
cad24b1
8fb2602
b438281
8519b4e
2f5c974
e78753d
84bb5ea
63e8467
bdbcb33
7236af3
89540ab
e3ced75
12be5b3
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
- Loading branch information
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -23,8 +23,9 @@ | |
| from django.core.exceptions import ImproperlyConfigured | ||
| from django.core.urlresolvers import NoReverseMatch | ||
|
|
||
| from rest_framework import renderers, views | ||
| from rest_framework import exceptions, renderers, views | ||
| from rest_framework.compat import coreapi | ||
| from rest_framework.request import override_method | ||
| from rest_framework.response import Response | ||
| from rest_framework.reverse import reverse | ||
| from rest_framework.settings import api_settings | ||
|
|
@@ -262,7 +263,7 @@ def get_urls(self): | |
|
|
||
| return ret | ||
|
|
||
| def get_links(self): | ||
| def get_links(self, request=None): | ||
| content = {} | ||
|
|
||
| for prefix, viewset, basename in self.registry: | ||
|
|
@@ -284,21 +285,31 @@ def get_links(self): | |
| continue | ||
|
|
||
| for method, action in mapping.items(): | ||
| link = self.get_link(viewset, url, method, request) | ||
| if link is None: | ||
| continue # User does not have permissions. | ||
| if prefix not in content: | ||
| content[prefix] = {} | ||
| link = self.get_link(viewset, url, method) | ||
| content[prefix][action] = link | ||
| return content | ||
|
|
||
| def get_link(self, viewset, url, method): | ||
| def get_link(self, viewset, url, method, request=None): | ||
| view_instance = viewset() | ||
| if request is not None: | ||
| with override_method(view_instance, request, method.upper()) as request: | ||
| try: | ||
| view_instance.check_permissions(request) | ||
| except exceptions.APIException as exc: | ||
| return None | ||
|
|
||
| fields = [] | ||
|
|
||
| for variable in uritemplate.variables(url): | ||
| field = coreapi.Field(name=variable, location='path', required=True) | ||
| fields.append(field) | ||
|
|
||
| if method in ('put', 'patch', 'post'): | ||
| cls = viewset().get_serializer_class() | ||
| cls = view_instance.get_serializer_class() | ||
| serializer = cls() | ||
| for field in serializer.fields.values(): | ||
| if field.read_only: | ||
|
|
@@ -336,16 +347,19 @@ def get_api_root_view(self): | |
|
|
||
| if self.schema_title: | ||
| assert coreapi, '`coreapi` must be installed for schema support.' | ||
| content = self.get_links() | ||
| schema = coreapi.Document(title=self.schema_title, content=content) | ||
| view_renderers += [renderers.CoreJSONRenderer] | ||
| router = self | ||
|
|
||
| class APIRoot(views.APIView): | ||
| _ignore_model_permissions = True | ||
| renderer_classes = view_renderers | ||
|
|
||
| def get(self, request, *args, **kwargs): | ||
| if request.accepted_renderer.format == 'corejson': | ||
|
||
| content = router.get_links(request) | ||
| if not content: | ||
| raise exceptions.PermissionDenied() | ||
| schema = coreapi.Document(title=router.schema_title, content=content) | ||
| return Response(schema) | ||
|
|
||
| ret = OrderedDict() | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Wouldn't it make more sense to expect users to include the
CoreJSONRendererin their default renderers, and raise an error if it is missing from the defaults?