mirror of
https://github.com/encode/django-rest-framework.git
synced 2024-11-26 19:43:59 +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
|
|
|