mirror of
				https://github.com/encode/django-rest-framework.git
				synced 2025-11-04 18:08:03 +03:00 
			
		
		
		
	* Identify code that needs to be pulled out of/removed from compat.py * Extract modern code from get_names_and_managers in compat.py and remove compat code * Extract modern code from is_authenticated() in compat.py and remove. * Extract modern code from is_anonymous() in compat.py and remove * Extract modern code from get_related_model() from compat.py and remove * Extract modern code from value_from_object() in compat.py and remove * Update postgres compat JSONField now always available. * Remove DecimalValidator compat * Remove get_remote_field compat * Remove template_render compat Plus isort. * Remove set_many compat * Remove include compat
		
			
				
	
	
		
			108 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""
 | 
						|
Helper functions for creating user-friendly representations
 | 
						|
of serializer classes and serializer fields.
 | 
						|
"""
 | 
						|
from __future__ import unicode_literals
 | 
						|
 | 
						|
import re
 | 
						|
 | 
						|
from django.db import models
 | 
						|
from django.utils.encoding import force_text
 | 
						|
from django.utils.functional import Promise
 | 
						|
 | 
						|
from rest_framework.compat import unicode_repr
 | 
						|
 | 
						|
 | 
						|
def manager_repr(value):
 | 
						|
    model = value.model
 | 
						|
    opts = model._meta
 | 
						|
    names_and_managers = [
 | 
						|
        (manager.name, manager)
 | 
						|
        for manager
 | 
						|
        in opts.managers
 | 
						|
    ]
 | 
						|
    for manager_name, manager_instance in names_and_managers:
 | 
						|
        if manager_instance == value:
 | 
						|
            return '%s.%s.all()' % (model._meta.object_name, manager_name)
 | 
						|
    return repr(value)
 | 
						|
 | 
						|
 | 
						|
def smart_repr(value):
 | 
						|
    if isinstance(value, models.Manager):
 | 
						|
        return manager_repr(value)
 | 
						|
 | 
						|
    if isinstance(value, Promise) and value._delegate_text:
 | 
						|
        value = force_text(value)
 | 
						|
 | 
						|
    value = unicode_repr(value)
 | 
						|
 | 
						|
    # Representations like u'help text'
 | 
						|
    # should simply be presented as 'help text'
 | 
						|
    if value.startswith("u'") and value.endswith("'"):
 | 
						|
        return value[1:]
 | 
						|
 | 
						|
    # Representations like
 | 
						|
    # <django.core.validators.RegexValidator object at 0x1047af050>
 | 
						|
    # Should be presented as
 | 
						|
    # <django.core.validators.RegexValidator object>
 | 
						|
    value = re.sub(' at 0x[0-9A-Fa-f]{4,32}>', '>', value)
 | 
						|
 | 
						|
    return value
 | 
						|
 | 
						|
 | 
						|
def field_repr(field, force_many=False):
 | 
						|
    kwargs = field._kwargs
 | 
						|
    if force_many:
 | 
						|
        kwargs = kwargs.copy()
 | 
						|
        kwargs['many'] = True
 | 
						|
        kwargs.pop('child', None)
 | 
						|
 | 
						|
    arg_string = ', '.join([smart_repr(val) for val in field._args])
 | 
						|
    kwarg_string = ', '.join([
 | 
						|
        '%s=%s' % (key, smart_repr(val))
 | 
						|
        for key, val in sorted(kwargs.items())
 | 
						|
    ])
 | 
						|
    if arg_string and kwarg_string:
 | 
						|
        arg_string += ', '
 | 
						|
 | 
						|
    if force_many:
 | 
						|
        class_name = force_many.__class__.__name__
 | 
						|
    else:
 | 
						|
        class_name = field.__class__.__name__
 | 
						|
 | 
						|
    return "%s(%s%s)" % (class_name, arg_string, kwarg_string)
 | 
						|
 | 
						|
 | 
						|
def serializer_repr(serializer, indent, force_many=None):
 | 
						|
    ret = field_repr(serializer, force_many) + ':'
 | 
						|
    indent_str = '    ' * indent
 | 
						|
 | 
						|
    if force_many:
 | 
						|
        fields = force_many.fields
 | 
						|
    else:
 | 
						|
        fields = serializer.fields
 | 
						|
 | 
						|
    for field_name, field in fields.items():
 | 
						|
        ret += '\n' + indent_str + field_name + ' = '
 | 
						|
        if hasattr(field, 'fields'):
 | 
						|
            ret += serializer_repr(field, indent + 1)
 | 
						|
        elif hasattr(field, 'child'):
 | 
						|
            ret += list_repr(field, indent + 1)
 | 
						|
        elif hasattr(field, 'child_relation'):
 | 
						|
            ret += field_repr(field.child_relation, force_many=field.child_relation)
 | 
						|
        else:
 | 
						|
            ret += field_repr(field)
 | 
						|
 | 
						|
    if serializer.validators:
 | 
						|
        ret += '\n' + indent_str + 'class Meta:'
 | 
						|
        ret += '\n' + indent_str + '    validators = ' + smart_repr(serializer.validators)
 | 
						|
 | 
						|
    return ret
 | 
						|
 | 
						|
 | 
						|
def list_repr(serializer, indent):
 | 
						|
    child = serializer.child
 | 
						|
    if hasattr(child, 'fields'):
 | 
						|
        return serializer_repr(serializer, indent, force_many=child)
 | 
						|
    return field_repr(serializer)
 |