Add ViewInspector setter to store instances

This commit is contained in:
Ryan P Kilby 2018-05-17 02:10:05 -04:00
parent 92bb9ec3e9
commit 3642fe0b30
2 changed files with 20 additions and 4 deletions

View File

@ -365,9 +365,7 @@ class SchemaGenerator(object):
""" """
Given a callback, return an actual view instance. Given a callback, return an actual view instance.
""" """
view = callback.cls() view = callback.cls(**getattr(callback, 'initkwargs', {}))
for attr, val in getattr(callback, 'initkwargs', {}).items():
setattr(view, attr, val)
view.args = () view.args = ()
view.kwargs = {} view.kwargs = {}
view.format_kwarg = None view.format_kwarg = None

View File

@ -7,6 +7,7 @@ See schemas.__init__.py for package overview.
import re import re
import warnings import warnings
from collections import OrderedDict from collections import OrderedDict
from weakref import WeakKeyDictionary
from django.db import models from django.db import models
from django.utils.encoding import force_text, smart_text from django.utils.encoding import force_text, smart_text
@ -128,6 +129,10 @@ class ViewInspector(object):
Provide subclass for per-view schema generation Provide subclass for per-view schema generation
""" """
def __init__(self):
self.instance_schemas = WeakKeyDictionary()
def __get__(self, instance, owner): def __get__(self, instance, owner):
""" """
Enables `ViewInspector` as a Python _Descriptor_. Enables `ViewInspector` as a Python _Descriptor_.
@ -144,9 +149,16 @@ class ViewInspector(object):
See: https://docs.python.org/3/howto/descriptor.html for info on See: https://docs.python.org/3/howto/descriptor.html for info on
descriptor usage. descriptor usage.
""" """
if instance in self.instance_schemas:
return self.instance_schemas[instance]
self.view = instance self.view = instance
return self return self
def __set__(self, instance, other):
self.instance_schemas[instance] = other
other.view = instance
@property @property
def view(self): def view(self):
"""View property.""" """View property."""
@ -189,6 +201,7 @@ class AutoSchema(ViewInspector):
* `manual_fields`: list of `coreapi.Field` instances that * `manual_fields`: list of `coreapi.Field` instances that
will be added to auto-generated fields, overwriting on `Field.name` will be added to auto-generated fields, overwriting on `Field.name`
""" """
super(AutoSchema, self).__init__()
if manual_fields is None: if manual_fields is None:
manual_fields = [] manual_fields = []
self._manual_fields = manual_fields self._manual_fields = manual_fields
@ -455,6 +468,7 @@ class ManualSchema(ViewInspector):
* `fields`: list of `coreapi.Field` instances. * `fields`: list of `coreapi.Field` instances.
* `descripton`: String description for view. Optional. * `descripton`: String description for view. Optional.
""" """
super(ManualSchema, self).__init__()
assert all(isinstance(f, coreapi.Field) for f in fields), "`fields` must be a list of coreapi.Field instances" assert all(isinstance(f, coreapi.Field) for f in fields), "`fields` must be a list of coreapi.Field instances"
self._fields = fields self._fields = fields
self._description = description self._description = description
@ -474,9 +488,13 @@ class ManualSchema(ViewInspector):
) )
class DefaultSchema(object): class DefaultSchema(ViewInspector):
"""Allows overriding AutoSchema using DEFAULT_SCHEMA_CLASS setting""" """Allows overriding AutoSchema using DEFAULT_SCHEMA_CLASS setting"""
def __get__(self, instance, owner): def __get__(self, instance, owner):
result = super(DefaultSchema, self).__get__(instance, owner)
if not isinstance(result, DefaultSchema):
return result
inspector_class = api_settings.DEFAULT_SCHEMA_CLASS inspector_class = api_settings.DEFAULT_SCHEMA_CLASS
assert issubclass(inspector_class, ViewInspector), "DEFAULT_SCHEMA_CLASS must be set to a ViewInspector (usually an AutoSchema) subclass" assert issubclass(inspector_class, ViewInspector), "DEFAULT_SCHEMA_CLASS must be set to a ViewInspector (usually an AutoSchema) subclass"
inspector = inspector_class() inspector = inspector_class()