Coverage for /var/srv/projects/api.amasfac.comuna18.com/tmp/venv/lib/python3.9/site-packages/rest_framework/utils/representation.py: 9%

59 statements  

« prev     ^ index     » next       coverage.py v6.4.4, created at 2023-07-17 14:22 -0600

1""" 

2Helper functions for creating user-friendly representations 

3of serializer classes and serializer fields. 

4""" 

5import re 

6 

7from django.db import models 

8from django.utils.encoding import force_str 

9from django.utils.functional import Promise 

10 

11 

12def manager_repr(value): 

13 model = value.model 

14 opts = model._meta 

15 names_and_managers = [ 

16 (manager.name, manager) 

17 for manager 

18 in opts.managers 

19 ] 

20 for manager_name, manager_instance in names_and_managers: 

21 if manager_instance == value: 

22 return '%s.%s.all()' % (model._meta.object_name, manager_name) 

23 return repr(value) 

24 

25 

26def smart_repr(value): 

27 if isinstance(value, models.Manager): 

28 return manager_repr(value) 

29 

30 if isinstance(value, Promise) and value._delegate_text: 

31 value = force_str(value) 

32 

33 value = repr(value) 

34 

35 # Representations like u'help text' 

36 # should simply be presented as 'help text' 

37 if value.startswith("u'") and value.endswith("'"): 

38 return value[1:] 

39 

40 # Representations like 

41 # <django.core.validators.RegexValidator object at 0x1047af050> 

42 # Should be presented as 

43 # <django.core.validators.RegexValidator object> 

44 return re.sub(' at 0x[0-9A-Fa-f]{4,32}>', '>', value) 

45 

46 

47def field_repr(field, force_many=False): 

48 kwargs = field._kwargs 

49 if force_many: 

50 kwargs = kwargs.copy() 

51 kwargs['many'] = True 

52 kwargs.pop('child', None) 

53 

54 arg_string = ', '.join([smart_repr(val) for val in field._args]) 

55 kwarg_string = ', '.join([ 

56 '%s=%s' % (key, smart_repr(val)) 

57 for key, val in sorted(kwargs.items()) 

58 ]) 

59 if arg_string and kwarg_string: 

60 arg_string += ', ' 

61 

62 if force_many: 

63 class_name = force_many.__class__.__name__ 

64 else: 

65 class_name = field.__class__.__name__ 

66 

67 return "%s(%s%s)" % (class_name, arg_string, kwarg_string) 

68 

69 

70def serializer_repr(serializer, indent, force_many=None): 

71 ret = field_repr(serializer, force_many) + ':' 

72 indent_str = ' ' * indent 

73 

74 if force_many: 

75 fields = force_many.fields 

76 else: 

77 fields = serializer.fields 

78 

79 for field_name, field in fields.items(): 

80 ret += '\n' + indent_str + field_name + ' = ' 

81 if hasattr(field, 'fields'): 

82 ret += serializer_repr(field, indent + 1) 

83 elif hasattr(field, 'child'): 

84 ret += list_repr(field, indent + 1) 

85 elif hasattr(field, 'child_relation'): 

86 ret += field_repr(field.child_relation, force_many=field.child_relation) 

87 else: 

88 ret += field_repr(field) 

89 

90 if serializer.validators: 

91 ret += '\n' + indent_str + 'class Meta:' 

92 ret += '\n' + indent_str + ' validators = ' + smart_repr(serializer.validators) 

93 

94 return ret 

95 

96 

97def list_repr(serializer, indent): 

98 child = serializer.child 

99 if hasattr(child, 'fields'): 

100 return serializer_repr(serializer, indent, force_many=child) 

101 return field_repr(serializer)