Move determine_path_prefix() logic into CoreAPI module.

This commit is contained in:
Carlton Gibson 2019-07-20 21:03:47 +02:00 committed by Carlton Gibson
parent e309a4f0b8
commit de26af4295
2 changed files with 43 additions and 44 deletions

View File

@ -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 #

View File

@ -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.