def get_serializer_fields(self, path, method, view): """ Return a list of `coreapi.Field` instances corresponding to any request body input, as determined by the serializer class. """ if method not in ('PUT', 'PATCH', 'POST'): return [] if not hasattr(view, 'get_serializer'): return [] serializer = view.get_serializer() if not isinstance(serializer, Serializer): return [] fields = [] for field in serializer.fields.values(): if field.read_only or isinstance(field, HiddenField): continue required = field.required and method != 'PATCH' description = force_text( field.help_text) if field.help_text else '' field_type = get_field_type(field) description += '; ' + field_type if description else field_type field = coreapi.Field( name=field.field_name, location='form', required=required, description=description, schema=schemas.field_to_schema(field), ) fields.append(field) return fields
def get_response_object(self, response_serializer_class, description): fields = [] serializer = response_serializer_class() nested_obj = {} for field in serializer.fields.values(): # If field is a serializer, attempt to get its schema. if isinstance(field, serializers.Serializer): subfield_schema = self.get_response_object( field.__class__, None)[0].get('schema') # If the schema exists, use it as the nested_obj if subfield_schema is not None: nested_obj[field.field_name] = subfield_schema nested_obj[ field.field_name]['description'] = field.help_text continue # Otherwise, carry-on and use the field's schema. fields.append( Field(name=field.field_name, location='form', required=field.required, schema=field_to_schema(field))) res = _get_parameters(Link(fields=fields), None) if not res: if nested_obj: return { 'description': description, 'schema': { 'type': 'object', 'properties': nested_obj } }, {} else: return {}, {} schema = res[0]['schema'] schema['properties'].update(nested_obj) response_schema = {'description': description, 'schema': schema} error_status_codes = {} response_meta = getattr(response_serializer_class, 'Meta', None) for status_code, description in getattr(response_meta, 'error_status_codes', {}).items(): error_status_codes[status_code] = {'description': description} return response_schema, error_status_codes
def get_response_object(self, response_serializer_class, description): fields = [] serializer = response_serializer_class() nested_obj = {} for field in serializer.fields.values(): if isinstance(field, serializers.Serializer): nested_obj[field.field_name] = self.get_response_object( field.__class__, None)[0]['schema'] nested_obj[field.field_name]['description'] = field.help_text continue fields.append( Field(name=field.field_name, location='form', required=field.required, schema=field_to_schema(field))) res = _get_parameters(Link(fields=fields), None) if not res: if nested_obj: return { 'description': description, 'schema': { 'type': 'object', 'properties': nested_obj } }, {} else: return {}, {} schema = res[0]['schema'] schema['properties'].update(nested_obj) response_schema = {'description': description, 'schema': schema} error_status_codes = {} response_meta = getattr(response_serializer_class, 'Meta', None) for status_code, description in getattr(response_meta, 'error_status_codes', {}).items(): error_status_codes[status_code] = {'description': description} return response_schema, error_status_codes
def get_serializer_fields(self, path, method, view, version=None): """ Return a list of `coreapi.Field` instances corresponding to any request body input, as determined by the serializer class. """ if method not in ('PUT', 'PATCH', 'POST'): return [] if not hasattr(view, 'serializer_class') and not hasattr( view, 'get_serializer_class'): return [] serializer_class = view.get_serializer_class() if hasattr(view, 'get_serializer_class') \ else view.serializer_class serializer = serializer_class() if isinstance(serializer, serializers.ListSerializer): return [ Field(name='data', location='body', required=True, schema=coreschema.Array()) ] if not isinstance(serializer, serializers.Serializer): return [] fields = [] for field in serializer.fields.values(): if field.read_only or isinstance(field, serializers.HiddenField): continue required = field.required and method != 'PATCH' # if the attribute ('help_text') of this field is a lazy translation object, force it to generate a string description = str(field.help_text) if isinstance( field.help_text, Promise) else field.help_text field = Field( name=field.field_name, location='form', required=required, schema=field_to_schema(field), description=description, ) fields.append(field) return fields