mirror of
https://github.com/encode/django-rest-framework.git
synced 2024-11-25 19:14:01 +03:00
Move determine_path_prefix() logic into CoreAPI module.
This commit is contained in:
parent
e309a4f0b8
commit
de26af4295
|
@ -20,7 +20,18 @@ from .utils import get_pk_description, is_list_view
|
||||||
header_regex = re.compile('^[a-zA-Z][0-9A-Za-z_]*:')
|
header_regex = re.compile('^[a-zA-Z][0-9A-Za-z_]*:')
|
||||||
|
|
||||||
# Generator #
|
# Generator #
|
||||||
# TODO: Pull some of this into base.
|
|
||||||
|
|
||||||
|
def common_path(paths):
|
||||||
|
split_paths = [path.strip('/').split('/') for path in paths]
|
||||||
|
s1 = min(split_paths)
|
||||||
|
s2 = max(split_paths)
|
||||||
|
common = s1
|
||||||
|
for i, c in enumerate(s1):
|
||||||
|
if c != s2[i]:
|
||||||
|
common = s1[:i]
|
||||||
|
break
|
||||||
|
return '/' + '/'.join(common)
|
||||||
|
|
||||||
|
|
||||||
def is_custom_action(action):
|
def is_custom_action(action):
|
||||||
|
@ -209,6 +220,37 @@ class SchemaGenerator(BaseSchemaGenerator):
|
||||||
# Default action, eg "/users/", "/users/{pk}/"
|
# Default action, eg "/users/", "/users/{pk}/"
|
||||||
return named_path_components + [action]
|
return named_path_components + [action]
|
||||||
|
|
||||||
|
def determine_path_prefix(self, paths):
|
||||||
|
"""
|
||||||
|
Given a list of all paths, return the common prefix which should be
|
||||||
|
discounted when generating a schema structure.
|
||||||
|
|
||||||
|
This will be the longest common string that does not include that last
|
||||||
|
component of the URL, or the last component before a path parameter.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
|
/api/v1/users/
|
||||||
|
/api/v1/users/{pk}/
|
||||||
|
|
||||||
|
The path prefix is '/api/v1'
|
||||||
|
"""
|
||||||
|
prefixes = []
|
||||||
|
for path in paths:
|
||||||
|
components = path.strip('/').split('/')
|
||||||
|
initial_components = []
|
||||||
|
for component in components:
|
||||||
|
if '{' in component:
|
||||||
|
break
|
||||||
|
initial_components.append(component)
|
||||||
|
prefix = '/'.join(initial_components[:-1])
|
||||||
|
if not prefix:
|
||||||
|
# We can just break early in the case that there's at least
|
||||||
|
# one URL that doesn't have a path prefix.
|
||||||
|
return '/'
|
||||||
|
prefixes.append('/' + prefix + '/')
|
||||||
|
return common_path(prefixes)
|
||||||
|
|
||||||
# View Inspectors #
|
# View Inspectors #
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -18,18 +18,6 @@ from rest_framework.settings import api_settings
|
||||||
from rest_framework.utils.model_meta import _get_pk
|
from rest_framework.utils.model_meta import _get_pk
|
||||||
|
|
||||||
|
|
||||||
def common_path(paths):
|
|
||||||
split_paths = [path.strip('/').split('/') for path in paths]
|
|
||||||
s1 = min(split_paths)
|
|
||||||
s2 = max(split_paths)
|
|
||||||
common = s1
|
|
||||||
for i, c in enumerate(s1):
|
|
||||||
if c != s2[i]:
|
|
||||||
common = s1[:i]
|
|
||||||
break
|
|
||||||
return '/' + '/'.join(common)
|
|
||||||
|
|
||||||
|
|
||||||
def get_pk_name(model):
|
def get_pk_name(model):
|
||||||
meta = model._meta.concrete_model._meta
|
meta = model._meta.concrete_model._meta
|
||||||
return _get_pk(meta).name
|
return _get_pk(meta).name
|
||||||
|
@ -236,37 +224,6 @@ class BaseSchemaGenerator(object):
|
||||||
def get_schema(self, request=None, public=False):
|
def get_schema(self, request=None, public=False):
|
||||||
raise NotImplementedError(".get_schema() must be implemented in subclasses.")
|
raise NotImplementedError(".get_schema() must be implemented in subclasses.")
|
||||||
|
|
||||||
def determine_path_prefix(self, paths):
|
|
||||||
"""
|
|
||||||
Given a list of all paths, return the common prefix which should be
|
|
||||||
discounted when generating a schema structure.
|
|
||||||
|
|
||||||
This will be the longest common string that does not include that last
|
|
||||||
component of the URL, or the last component before a path parameter.
|
|
||||||
|
|
||||||
For example:
|
|
||||||
|
|
||||||
/api/v1/users/
|
|
||||||
/api/v1/users/{pk}/
|
|
||||||
|
|
||||||
The path prefix is '/api/v1'
|
|
||||||
"""
|
|
||||||
prefixes = []
|
|
||||||
for path in paths:
|
|
||||||
components = path.strip('/').split('/')
|
|
||||||
initial_components = []
|
|
||||||
for component in components:
|
|
||||||
if '{' in component:
|
|
||||||
break
|
|
||||||
initial_components.append(component)
|
|
||||||
prefix = '/'.join(initial_components[:-1])
|
|
||||||
if not prefix:
|
|
||||||
# We can just break early in the case that there's at least
|
|
||||||
# one URL that doesn't have a path prefix.
|
|
||||||
return '/'
|
|
||||||
prefixes.append('/' + prefix + '/')
|
|
||||||
return common_path(prefixes)
|
|
||||||
|
|
||||||
def has_view_permissions(self, path, method, view):
|
def has_view_permissions(self, path, method, view):
|
||||||
"""
|
"""
|
||||||
Return `True` if the incoming request has the correct view permissions.
|
Return `True` if the incoming request has the correct view permissions.
|
||||||
|
|
Loading…
Reference in New Issue
Block a user