mirror of
				https://github.com/encode/django-rest-framework.git
				synced 2025-11-04 01:47:59 +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_]*:')
 | 
			
		||||
 | 
			
		||||
# 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):
 | 
			
		||||
| 
						 | 
				
			
			@ -209,6 +220,37 @@ class SchemaGenerator(BaseSchemaGenerator):
 | 
			
		|||
        # Default action, eg "/users/", "/users/{pk}/"
 | 
			
		||||
        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 #
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,18 +18,6 @@ from rest_framework.settings import api_settings
 | 
			
		|||
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):
 | 
			
		||||
    meta = model._meta.concrete_model._meta
 | 
			
		||||
    return _get_pk(meta).name
 | 
			
		||||
| 
						 | 
				
			
			@ -236,37 +224,6 @@ class BaseSchemaGenerator(object):
 | 
			
		|||
    def get_schema(self, request=None, public=False):
 | 
			
		||||
        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):
 | 
			
		||||
        """
 | 
			
		||||
        Return `True` if the incoming request has the correct view permissions.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user