mirror of
				https://github.com/encode/django-rest-framework.git
				synced 2025-11-04 09:57:55 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			92 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""
 | 
						|
Get a descriptive name and description for a view.
 | 
						|
"""
 | 
						|
import re
 | 
						|
from djangorestframework.resources import Resource, FormResource, ModelResource
 | 
						|
 | 
						|
 | 
						|
# These a a bit Grungy, but they do the job.
 | 
						|
 | 
						|
def get_name(view):
 | 
						|
    """
 | 
						|
    Return a name for the view.
 | 
						|
    
 | 
						|
    If view has a name attribute, use that, otherwise use the view's class name, with 'CamelCaseNames' converted to 'Camel Case Names'.
 | 
						|
    """
 | 
						|
 | 
						|
    # If we're looking up the name of a view callable, as found by reverse,
 | 
						|
    # grok the class instance that we stored when as_view was called.
 | 
						|
    if getattr(view, 'cls_instance', None):
 | 
						|
        view = view.cls_instance
 | 
						|
 | 
						|
    # If this view has a resource that's been overridden, then use that resource for the name
 | 
						|
    if getattr(view, 'resource', None) not in (None, Resource, FormResource, ModelResource):
 | 
						|
        name = view.resource.__name__
 | 
						|
        
 | 
						|
        # Chomp of any non-descriptive trailing part of the resource class name
 | 
						|
        if name.endswith('Resource') and name != 'Resource':
 | 
						|
            name = name[:-len('Resource')]
 | 
						|
 | 
						|
        # If the view has a descriptive suffix, eg '*** List', '*** Instance'
 | 
						|
        if getattr(view, '_suffix', None):
 | 
						|
            name += view._suffix
 | 
						|
 
 | 
						|
    # Otherwise if it's a function view use the function's name
 | 
						|
    elif getattr(view, '__name__', None) is not None:
 | 
						|
        name = view.__name__
 | 
						|
 | 
						|
    # If it's a view class with no resource then grok the name from the class name
 | 
						|
    elif getattr(view, '__class__', None) is not None:
 | 
						|
        name = view.__class__.__name__
 | 
						|
 | 
						|
        # Chomp of any non-descriptive trailing part of the view class name
 | 
						|
        if name.endswith('View') and name != 'View':
 | 
						|
            name = name[:-len('View')]
 | 
						|
 | 
						|
    # I ain't got nuthin fo' ya
 | 
						|
    else:
 | 
						|
        return ''
 | 
						|
 | 
						|
    return re.sub('(((?<=[a-z])[A-Z])|([A-Z](?![A-Z]|$)))', ' \\1', name).strip()
 | 
						|
 | 
						|
 | 
						|
 | 
						|
def get_description(view):
 | 
						|
    """
 | 
						|
    Provide a description for the view.
 | 
						|
 | 
						|
    By default this is the view's docstring with nice unindention applied.
 | 
						|
    """
 | 
						|
 | 
						|
    # If we're looking up the name of a view callable, as found by reverse,
 | 
						|
    # grok the class instance that we stored when as_view was called.
 | 
						|
    if getattr(view, 'cls_instance', None):
 | 
						|
        view = view.cls_instance
 | 
						|
        
 | 
						|
 | 
						|
    # If this view has a resource that's been overridden, then use the resource's doctring
 | 
						|
    if getattr(view, 'resource', None) not in (None, Resource, FormResource, ModelResource):
 | 
						|
        doc = view.resource.__doc__
 | 
						|
    
 | 
						|
    # Otherwise use the view doctring
 | 
						|
    elif getattr(view, '__doc__', None):
 | 
						|
        doc = view.__doc__
 | 
						|
 | 
						|
    # I ain't got nuthin fo' ya
 | 
						|
    else:
 | 
						|
        return ''
 | 
						|
 | 
						|
    if not doc:
 | 
						|
        return ''
 | 
						|
 | 
						|
    whitespace_counts = [len(line) - len(line.lstrip(' ')) for line in doc.splitlines()[1:] if line.lstrip()]
 | 
						|
 | 
						|
    # unindent the docstring if needed 
 | 
						|
    if whitespace_counts:
 | 
						|
        whitespace_pattern = '^' + (' ' * min(whitespace_counts))
 | 
						|
        return re.sub(re.compile(whitespace_pattern, re.MULTILINE), '', doc)
 | 
						|
 | 
						|
    # otherwise return it as-is
 | 
						|
    return doc
 | 
						|
    
 |