From 322cf8ebc99bc22669a2d76b775491bbd842ec98 Mon Sep 17 00:00:00 2001 From: Ryan P Kilby Date: Fri, 1 Dec 2017 04:10:36 -0500 Subject: [PATCH] Manual fields suggestions (#2) * Use OrderedDict in inspectors * Move empty check to 'update_fields()' * Make 'update_fields()' an AutoSchema staticmethod * Add 'AutoSchema.get_manual_fields()' * Conform '.get_manual_fields()' to other methods --- rest_framework/schemas/inspectors.py | 47 ++++++++++++++-------------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/rest_framework/schemas/inspectors.py b/rest_framework/schemas/inspectors.py index b1e461c54..240b713ac 100644 --- a/rest_framework/schemas/inspectors.py +++ b/rest_framework/schemas/inspectors.py @@ -105,25 +105,6 @@ def get_pk_description(model, model_field): ) -def update_fields(fields, update_with): - """ - Update list of coreapi.Field instances, overwriting on `Field.name`. - - Utility function to handle replacing coreapi.Field fields - from a list by name. Used to handle `manual_fields`. - - Parameters: - - * `fields`: list of `coreapi.Field` instances to update - * `update_with: list of `coreapi.Field` instances to add or replace. - """ - by_name = {f.name: f for f in fields} - for f in update_with: - by_name[f.name] = f - fields = list(by_name.values()) - return fields - - class ViewInspector(object): """ Descriptor class on APIView. @@ -200,7 +181,8 @@ class AutoSchema(ViewInspector): fields += self.get_pagination_fields(path, method) fields += self.get_filter_fields(path, method) - fields = self.update_manual_fields(fields) + manual_fields = self.get_manual_fields(path, method) + fields = self.update_fields(fields, manual_fields) if fields and any([field.location in ('form', 'body') for field in fields]): encoding = self.get_encoding(path, method) @@ -394,12 +376,29 @@ class AutoSchema(ViewInspector): fields += filter_backend().get_schema_fields(self.view) return fields - def update_manual_fields(self, fields): + def get_manual_fields(self, path, method): + return self._manual_fields + + @staticmethod + def update_fields(fields, update_with): """ - Adjust `fields` with `manual_fields` + Update list of coreapi.Field instances, overwriting on `Field.name`. + + Utility function to handle replacing coreapi.Field fields + from a list by name. Used to handle `manual_fields`. + + Parameters: + + * `fields`: list of `coreapi.Field` instances to update + * `update_with: list of `coreapi.Field` instances to add or replace. """ - if self._manual_fields is not None: - fields = update_fields(fields, self._manual_fields) + if not update_with: + return fields + + by_name = OrderedDict((f.name, f) for f in fields) + for f in update_with: + by_name[f.name] = f + fields = list(by_name.values()) return fields def get_encoding(self, path, method):