diff options
| author | Tom Christie | 2012-01-21 18:33:34 +0000 | 
|---|---|---|
| committer | Tom Christie | 2012-01-21 18:33:34 +0000 | 
| commit | dea4a45ec72d0bd3cfeeb9382f177eb2fc3b0e14 (patch) | |
| tree | 99c9824ee53d6e57546eceb3551546cf72585c85 /djangorestframework | |
| parent | a851294d052174b53531fdf90b22ddac8738e374 (diff) | |
| download | django-rest-framework-dea4a45ec72d0bd3cfeeb9382f177eb2fc3b0e14.tar.bz2 | |
pep8/pyflakes cleanup
Diffstat (limited to 'djangorestframework')
| -rw-r--r-- | djangorestframework/authentication.py | 1 | ||||
| -rw-r--r-- | djangorestframework/mixins.py | 19 | ||||
| -rw-r--r-- | djangorestframework/parsers.py | 28 | ||||
| -rw-r--r-- | djangorestframework/renderers.py | 19 | ||||
| -rw-r--r-- | djangorestframework/resources.py | 34 | ||||
| -rw-r--r-- | djangorestframework/response.py | 1 | ||||
| -rw-r--r-- | djangorestframework/serializer.py | 18 | ||||
| -rw-r--r-- | djangorestframework/utils/breadcrumbs.py | 1 | ||||
| -rw-r--r-- | djangorestframework/utils/description.py | 3 | ||||
| -rw-r--r-- | djangorestframework/utils/mediatypes.py | 28 | ||||
| -rw-r--r-- | djangorestframework/utils/staticviews.py | 3 | ||||
| -rw-r--r-- | djangorestframework/views.py | 10 | 
12 files changed, 41 insertions, 124 deletions
diff --git a/djangorestframework/authentication.py b/djangorestframework/authentication.py index 8317af9e..b61af32a 100644 --- a/djangorestframework/authentication.py +++ b/djangorestframework/authentication.py @@ -9,7 +9,6 @@ The set of authentication methods which are used is then specified by setting th  from django.contrib.auth import authenticate  from djangorestframework.compat import CsrfViewMiddleware -from djangorestframework.utils import as_tuple  import base64  __all__ = ( diff --git a/djangorestframework/mixins.py b/djangorestframework/mixins.py index 72dfe29d..4077b66c 100644 --- a/djangorestframework/mixins.py +++ b/djangorestframework/mixins.py @@ -68,7 +68,6 @@ class RequestMixin(object):              self._load_method_and_content_type()          return self._method -      @property      def content_type(self):          """ @@ -82,7 +81,6 @@ class RequestMixin(object):              self._load_method_and_content_type()          return self._content_type -      @property      def DATA(self):          """ @@ -95,7 +93,6 @@ class RequestMixin(object):              self._load_data_and_files()          return self._data -      @property      def FILES(self):          """ @@ -107,7 +104,6 @@ class RequestMixin(object):              self._load_data_and_files()          return self._files -      def _load_data_and_files(self):          """          Parse the request content into self.DATA and self.FILES. @@ -118,7 +114,6 @@ class RequestMixin(object):          if not hasattr(self, '_data'):              (self._data, self._files) = self._parse(self._get_stream(), self._content_type) -      def _load_method_and_content_type(self):          """          Set the method and content_type, and then check if they've been overridden. @@ -127,7 +122,6 @@ class RequestMixin(object):          self._content_type = self.request.META.get('HTTP_CONTENT_TYPE', self.request.META.get('CONTENT_TYPE', ''))          self._perform_form_overloading() -      def _get_stream(self):          """          Returns an object that may be used to stream the request content. @@ -144,10 +138,9 @@ class RequestMixin(object):          if content_length == 0:              return None          elif hasattr(request, 'read'): -             return request +            return request          return StringIO(request.raw_post_data) -      def _perform_form_overloading(self):          """          If this is a form POST request, then we need to check if the method and content/content_type have been @@ -173,7 +166,6 @@ class RequestMixin(object):              stream = StringIO(self._data.pop(self._CONTENT_PARAM)[0])              (self._data, self._files) = self._parse(stream, self._content_type) -      def _parse(self, stream, content_type):          """          Parse the request content. @@ -194,7 +186,6 @@ class RequestMixin(object):                              {'error': 'Unsupported media type in request \'%s\'.' %                              content_type}) -      @property      def _parsed_media_types(self):          """ @@ -202,7 +193,6 @@ class RequestMixin(object):          """          return [parser.media_type for parser in self.parsers] -      @property      def _default_parser(self):          """ @@ -211,7 +201,6 @@ class RequestMixin(object):          return self.parsers[0] -  ########## ResponseMixin ##########  class ResponseMixin(object): @@ -233,7 +222,6 @@ class ResponseMixin(object):      Should be a tuple/list of classes as described in the :mod:`renderers` module.      """ -      # TODO: wrap this behavior around dispatch(), ensuring it works      # out of the box with existing Django classes that use render_to_response.      def render(self, response): @@ -266,7 +254,6 @@ class ResponseMixin(object):          return resp -      def _determine_renderer(self, request):          """          Determines the appropriate renderer for the output, given the client's 'Accept' header, @@ -309,7 +296,6 @@ class ResponseMixin(object):                                  {'detail': 'Could not satisfy the client\'s Accept header',                                   'available_types': self._rendered_media_types}) -      @property      def _rendered_media_types(self):          """ @@ -353,7 +339,6 @@ class AuthMixin(object):      Should be a tuple/list of classes as described in the :mod:`permissions` module.      """ -      @property      def user(self):          """ @@ -364,7 +349,6 @@ class AuthMixin(object):              self._user = self._authenticate()          return self._user -      def _authenticate(self):          """          Attempt to authenticate the request using each authentication class in turn. @@ -377,7 +361,6 @@ class AuthMixin(object):                  return user          return AnonymousUser() -      # TODO: wrap this behavior around dispatch()      def _check_permissions(self):          """ diff --git a/djangorestframework/parsers.py b/djangorestframework/parsers.py index 8fd1acbc..c8a014ae 100644 --- a/djangorestframework/parsers.py +++ b/djangorestframework/parsers.py @@ -115,6 +115,7 @@ if yaml:  else:      YAMLParser = None +  class PlainTextParser(BaseParser):      """      Plain text parser. @@ -194,11 +195,11 @@ class XMLParser(BaseParser):      def _xml_convert(self, element):          """ -        convert the xml `element` into the corresponding python object  +        convert the xml `element` into the corresponding python object          """ -         +          children = element.getchildren() -         +          if len(children) == 0:              return self._type_convert(element.text)          else: @@ -206,14 +207,14 @@ class XMLParser(BaseParser):              if children[0].tag == "list-item":                  data = []                  for child in children: -                    data.append(self._xml_convert(child))                        -            else:     +                    data.append(self._xml_convert(child)) +            else:                  data = {}                  for child in children:                      data[child.tag] = self._xml_convert(child)              return data -         +      def _type_convert(self, value):          """          Converts the value returned by the XMl parse into the equivalent @@ -223,7 +224,7 @@ class XMLParser(BaseParser):              return value          try: -            return datetime.datetime.strptime(value,'%Y-%m-%d %H:%M:%S') +            return datetime.datetime.strptime(value, '%Y-%m-%d %H:%M:%S')          except ValueError:              pass @@ -240,11 +241,12 @@ class XMLParser(BaseParser):          return value -DEFAULT_PARSERS = ( JSONParser, -                    FormParser, -                    MultiPartParser, -                    XMLParser -                    ) +DEFAULT_PARSERS = ( +    JSONParser, +    FormParser, +    MultiPartParser, +    XMLParser +)  if YAMLParser: -    DEFAULT_PARSERS += ( YAMLParser, ) +    DEFAULT_PARSERS += (YAMLParser,) diff --git a/djangorestframework/renderers.py b/djangorestframework/renderers.py index 42d80bd4..bb186b0a 100644 --- a/djangorestframework/renderers.py +++ b/djangorestframework/renderers.py @@ -226,7 +226,6 @@ class DocumentingTemplateRenderer(BaseRenderer):          return content -      def _get_form_instance(self, view, method):          """          Get a form, possibly bound to either the input or output data. @@ -262,7 +261,6 @@ class DocumentingTemplateRenderer(BaseRenderer):          return form_instance -      def _get_generic_content_form(self, view):          """          Returns a form that allows for arbitrary content types to be tunneled via standard HTML forms @@ -298,7 +296,6 @@ class DocumentingTemplateRenderer(BaseRenderer):          # Okey doke, let's do it          return GenericContentForm(view) -      def render(self, obj=None, media_type=None):          """          Renders *obj* using the :attr:`template` set on the class. @@ -335,7 +332,7 @@ class DocumentingTemplateRenderer(BaseRenderer):          context = RequestContext(self.view.request, {              'content': content,              'view': self.view, -            'request': self.view.request, # TODO: remove +            'request': self.view.request,  # TODO: remove              'response': self.view.response,              'description': description,              'name': name, @@ -398,12 +395,14 @@ class DocumentingPlainTextRenderer(DocumentingTemplateRenderer):      template = 'renderer.txt' -DEFAULT_RENDERERS = ( JSONRenderer, -                      JSONPRenderer, -                      DocumentingHTMLRenderer, -                      DocumentingXHTMLRenderer, -                      DocumentingPlainTextRenderer, -                      XMLRenderer ) +DEFAULT_RENDERERS = ( +    JSONRenderer, +    JSONPRenderer, +    DocumentingHTMLRenderer, +    DocumentingXHTMLRenderer, +    DocumentingPlainTextRenderer, +    XMLRenderer +)  if YAMLRenderer:      DEFAULT_RENDERERS += (YAMLRenderer,) diff --git a/djangorestframework/resources.py b/djangorestframework/resources.py index 9a43c8af..cc338cc0 100644 --- a/djangorestframework/resources.py +++ b/djangorestframework/resources.py @@ -1,20 +1,11 @@  from django import forms  from django.core.urlresolvers import reverse, get_urlconf, get_resolver, NoReverseMatch  from django.db import models -from django.db.models.query import QuerySet -from django.db.models.fields.related import RelatedField -from django.utils.encoding import smart_unicode  from djangorestframework.response import ErrorResponse  from djangorestframework.serializer import Serializer, _SkipField  from djangorestframework.utils import as_tuple -import decimal -import inspect -import re - - -  class BaseResource(Serializer):      """ @@ -82,11 +73,10 @@ class FormResource(Resource):      """      Flag to check for unknown fields when validating a form. If set to false and      we receive request data that is not expected by the form it raises an -    :exc:`response.ErrorResponse` with status code 400. If set to true, only  +    :exc:`response.ErrorResponse` with status code 400. If set to true, only      expected fields are validated.      """ -      def validate_request(self, data, files=None):          """          Given some content as input return some cleaned, validated content. @@ -101,7 +91,6 @@ class FormResource(Resource):          """          return self._validate(data, files) -      def _validate(self, data, files, allowed_extra_fields=(), fake_data=None):          """          Wrapped by validate to hide the extra flags that are used in the implementation. @@ -187,7 +176,6 @@ class FormResource(Resource):          # Return HTTP 400 response (BAD REQUEST)          raise ErrorResponse(400, detail) -      def get_form_class(self, method=None):          """          Returns the form class used to validate this resource. @@ -209,7 +197,6 @@ class FormResource(Resource):          return form -      def get_bound_form(self, data=None, files=None, method=None):          """          Given some content return a Django form bound to that content. @@ -226,20 +213,6 @@ class FormResource(Resource):          return form() - -#class _RegisterModelResource(type): -#    """ -#    Auto register new ModelResource classes into ``_model_to_resource`` -#    """ -#    def __new__(cls, name, bases, dct): -#        resource_cls = type.__new__(cls, name, bases, dct) -#        model_cls = dct.get('model', None) -#        if model_cls: -#            _model_to_resource[model_cls] = resource_cls -#        return resource_cls - - -  class ModelResource(FormResource):      """      Resource class that uses forms for validation and otherwise falls back to a model form if no form is set. @@ -282,7 +255,6 @@ class ModelResource(FormResource):      The list of fields to exclude.  This is only used if :attr:`fields` is not set.      """ -      include = ('url',)      """      The list of extra fields to include.  This is only used if :attr:`fields` is not set. @@ -298,7 +270,6 @@ class ModelResource(FormResource):          self.model = getattr(view, 'model', None) or self.model -      def validate_request(self, data, files=None):          """          Given some content as input return some cleaned, validated content. @@ -315,7 +286,6 @@ class ModelResource(FormResource):          """          return self._validate(data, files, allowed_extra_fields=self._property_fields_set) -      def get_bound_form(self, data=None, files=None, method=None):          """          Given some content return a ``Form`` instance bound to that content. @@ -348,7 +318,6 @@ class ModelResource(FormResource):          return form() -      def url(self, instance):          """          Attempts to reverse resolve the url of the given model *instance* for this resource. @@ -390,7 +359,6 @@ class ModelResource(FormResource):                      pass          raise _SkipField -      @property      def _model_fields_set(self):          """ diff --git a/djangorestframework/response.py b/djangorestframework/response.py index 0090b070..96345cee 100644 --- a/djangorestframework/response.py +++ b/djangorestframework/response.py @@ -11,6 +11,7 @@ __all__ = ('Response', 'ErrorResponse')  # TODO: remove raw_content/cleaned_content and just use content? +  class Response(object):      """      An HttpResponse that may include content that hasn't yet been serialized. diff --git a/djangorestframework/serializer.py b/djangorestframework/serializer.py index 43d32b29..71c0d93a 100644 --- a/djangorestframework/serializer.py +++ b/djangorestframework/serializer.py @@ -3,10 +3,8 @@ Customizable serialization.  """  from django.db import models  from django.db.models.query import QuerySet -from django.db.models.fields.related import RelatedField  from django.utils.encoding import smart_unicode, is_protected_type, smart_str -import decimal  import inspect  import types @@ -24,12 +22,14 @@ def _field_to_tuple(field):          return (field[0], field[1])      return (field, None) +  def _fields_to_list(fields):      """      Return a list of field names.      """      return [_field_to_tuple(field)[0] for field in fields or ()] +  def _fields_to_dict(fields):      """      Return a `dict` of field name -> None, or tuple of fields, or Serializer class @@ -104,13 +104,11 @@ class Serializer(object):      The maximum depth to serialize to, or `None`.      """ -      def __init__(self, depth=None, stack=[], **kwargs):          if depth is not None:              self.depth = depth          self.stack = stack -      def get_fields(self, obj):          """          Return the set of field names/keys to use for a model instance/dict. @@ -130,7 +128,6 @@ class Serializer(object):          return fields -      def get_default_fields(self, obj):          """          Return the default list of field names/keys for a model instance/dict. @@ -142,7 +139,6 @@ class Serializer(object):          else:              return obj.keys() -      def get_related_serializer(self, key):          info = _fields_to_dict(self.fields).get(key, None) @@ -172,7 +168,6 @@ class Serializer(object):          # Otherwise use `related_serializer` or fall back to `Serializer`          return getattr(self, 'related_serializer') or Serializer -      def serialize_key(self, key):          """          Keys serialize to their string value, @@ -180,7 +175,6 @@ class Serializer(object):          """          return self.rename.get(smart_str(key), smart_str(key)) -      def serialize_val(self, key, obj):          """          Convert a model field or dict value into a serializable representation. @@ -202,7 +196,6 @@ class Serializer(object):          return related_serializer(depth=depth, stack=stack).serialize(obj) -      def serialize_max_depth(self, obj):          """          Determine how objects should be serialized once `depth` is exceeded. @@ -210,7 +203,6 @@ class Serializer(object):          """          raise _SkipField -      def serialize_recursion(self, obj):          """          Determine how objects should be serialized if recursion occurs. @@ -218,7 +210,6 @@ class Serializer(object):          """          raise _SkipField -      def serialize_model(self, instance):          """          Given a model instance or dict, serialize it to a dict.. @@ -253,35 +244,30 @@ class Serializer(object):          return data -      def serialize_iter(self, obj):          """          Convert iterables into a serializable representation.          """          return [self.serialize(item) for item in obj] -      def serialize_func(self, obj):          """          Convert no-arg methods and functions into a serializable representation.          """          return self.serialize(obj()) -      def serialize_manager(self, obj):          """          Convert a model manager into a serializable representation.          """          return self.serialize_iter(obj.all()) -      def serialize_fallback(self, obj):          """          Convert any unhandled object into a serializable representation.          """          return smart_unicode(obj, strings_only=True) -      def serialize(self, obj):          """          Convert any object into a serializable representation. diff --git a/djangorestframework/utils/breadcrumbs.py b/djangorestframework/utils/breadcrumbs.py index fd966282..cfc63a47 100644 --- a/djangorestframework/utils/breadcrumbs.py +++ b/djangorestframework/utils/breadcrumbs.py @@ -1,6 +1,7 @@  from django.core.urlresolvers import resolve  from djangorestframework.utils.description import get_name +  def get_breadcrumbs(url):      """Given a url returns a list of breadcrumbs, which are each a tuple of (name, url).""" diff --git a/djangorestframework/utils/description.py b/djangorestframework/utils/description.py index ce61e558..096cf57f 100644 --- a/djangorestframework/utils/description.py +++ b/djangorestframework/utils/description.py @@ -50,7 +50,6 @@ def get_name(view):      return re.sub('(((?<=[a-z])[A-Z])|([A-Z](?![A-Z]|$)))', ' \\1', name).strip() -  def get_description(view):      """      Provide a description for the view. @@ -63,7 +62,6 @@ def get_description(view):      if getattr(view, 'cls_instance', None):          view = view.cls_instance -      # If this view has a resource that's been overridden, then use the resource's doctring      if getattr(view, 'resource', None) not in (None, Resource, FormResource, ModelResource):          doc = view.resource.__doc__ @@ -88,4 +86,3 @@ def get_description(view):      # otherwise return it as-is      return doc - diff --git a/djangorestframework/utils/mediatypes.py b/djangorestframework/utils/mediatypes.py index c0071f01..48dca0f0 100644 --- a/djangorestframework/utils/mediatypes.py +++ b/djangorestframework/utils/mediatypes.py @@ -61,10 +61,10 @@ def order_by_precedence(media_type_lst):      1. 'type/*'      0. '*/*'      """ -    ret = [[],[],[],[]] +    ret = [[], [], [], []]      for media_type in media_type_lst:          precedence = _MediaType(media_type).precedence -        ret[3-precedence].append(media_type) +        ret[3 - precedence].append(media_type)      return ret @@ -103,29 +103,6 @@ class _MediaType(object):              return 2          return 3 -    #def quality(self): -    #    """ -    #    Return a quality level for the media type. -    #    """ -    #    try: -    #        return Decimal(self.params.get('q', '1.0')) -    #    except Exception: -    #        return Decimal(0) - -    #def score(self): -    #    """ -    #    Return an overall score for a given media type given it's quality and precedence. -    #    """ -    #    # NB. quality values should only have up to 3 decimal points -    #    # http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.9 -    #    return self.quality * 10000 + self.precedence - -    #def as_tuple(self): -    #    return (self.main_type, self.sub_type, self.params) - -    #def __repr__(self): -    #    return "<MediaType %s>" % (self.as_tuple(),) -      def __str__(self):          return unicode(self).encode('utf-8') @@ -134,4 +111,3 @@ class _MediaType(object):          for key, val in self.params.items():              ret += "; %s=%s" % (key, val)          return ret - diff --git a/djangorestframework/utils/staticviews.py b/djangorestframework/utils/staticviews.py index 825ea6b5..12a36f6c 100644 --- a/djangorestframework/utils/staticviews.py +++ b/djangorestframework/utils/staticviews.py @@ -5,13 +5,16 @@ from django.shortcuts import render_to_response  from django.template import RequestContext  import base64 +  def deny_robots(request):      return HttpResponse('User-agent: *\nDisallow: /', mimetype='text/plain') +  def favicon(request):      data = 'AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADLy8tLy8vL3svLy1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAy8vLBsvLywkAAAAATkZFS1xUVPqhn57/y8vL0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJmVlQ/GxcXiy8vL88vLy4FdVlXzTkZF/2RdXP/Ly8vty8vLtMvLy5DLy8vty8vLxgAAAAAAAAAAAAAAAAAAAABORkUJTkZF4lNMS/+Lh4f/cWtq/05GRf9ORkX/Vk9O/3JtbP+Ef3//Vk9O/2ljYv/Ly8v5y8vLCQAAAAAAAAAAAAAAAE5GRQlORkX2TkZF/05GRf9ORkX/TkZF/05GRf9ORkX/TkZF/05GRf9ORkX/UElI/8PDw5cAAAAAAAAAAAAAAAAAAAAAAAAAAE5GRZZORkX/TkZF/05GRf9ORkX/TkZF/05GRf9ORkX/TkZF/05GRf+Cfn3/y8vLvQAAAAAAAAAAAAAAAAAAAADLy8tIaWNi805GRf9ORkX/YVpZ/396eV7Ly8t7qaen9lZOTu5ORkX/TkZF/25oZ//Ly8v/y8vLycvLy0gAAAAATkZFSGNcXPpORkX/TkZF/05GRf+ysLDzTkZFe1NLSv6Oior/raur805GRf9ORkX/TkZF/2hiYf+npaX/y8vL5wAAAABORkXnTkZF/05GRf9ORkX/VU1M/8vLy/9PR0b1TkZF/1VNTP/Ly8uQT0dG+E5GRf9ORkX/TkZF/1hRUP3Ly8tmAAAAAE5GRWBORkXkTkZF/05GRf9ORkX/t7a2/355eOpORkX/TkZFkISAf1BORkX/TkZF/05GRf9XT075TkZFZgAAAAAAAAAAAAAAAAAAAABORkXDTkZF/05GRf9lX17/ubi4/8vLy/+2tbT/Yltb/05GRf9ORkX/a2Vk/8vLy5MAAAAAAAAAAAAAAAAAAAAAAAAAAFNLSqNORkX/TkZF/05GRf9ORkX/TkZF/05GRf9ORkX/TkZF/05GRf+Cfn3/y8vL+cvLyw8AAAAAAAAAAAAAAABORkUSTkZF+U5GRf9ORkX/TkZF/05GRf9ORkX/TkZF/05GRf9ORkX/TkZF/1BJSP/CwsLmy8vLDwAAAAAAAAAAAAAAAE5GRRJORkXtTkZF9FFJSJ1ORkXJTkZF/05GRf9ORkX/ZF5d9k5GRZ9ORkXtTkZF5HFsaxUAAAAAAAAAAAAAAAAAAAAAAAAAAE5GRQxORkUJAAAAAAAAAABORkXhTkZF/2JbWv7Ly8tgAAAAAAAAAABORkUGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5GRWBORkX2TkZFYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//+AAP9/gAD+P4AA4AOAAMADgADAA4AAwAOAAMMBgACCAIAAAAGAAIBDgADAA4AAwAOAAMADgADAB4AA/H+AAP7/gAA='      return HttpResponse(base64.b64decode(data), mimetype='image/vnd.microsoft.icon') +  # BLERGH  # Replicate django.contrib.auth.views.login simply so we don't have get users to update TEMPLATE_CONTEXT_PROCESSORS  # to add ADMIN_MEDIA_PREFIX to the RequestContext.  I don't like this but really really want users to not have to diff --git a/djangorestframework/views.py b/djangorestframework/views.py index 9199d6b7..9f53868b 100644 --- a/djangorestframework/views.py +++ b/djangorestframework/views.py @@ -25,7 +25,6 @@ __all__ = (  ) -  class View(ResourceMixin, RequestMixin, ResponseMixin, AuthMixin, DjangoView):      """      Handles incoming requests and maps them to REST operations. @@ -48,13 +47,13 @@ class View(ResourceMixin, RequestMixin, ResponseMixin, AuthMixin, DjangoView):      List of parsers the resource can parse the request with.      """ -    authentication = ( authentication.UserLoggedInAuthentication, -                       authentication.BasicAuthentication ) +    authentication = (authentication.UserLoggedInAuthentication, +                      authentication.BasicAuthentication)      """      List of all authenticating methods to attempt.      """ -    permissions = ( permissions.FullAnonAccess, ) +    permissions = (permissions.FullAnonAccess,)      """      List of all permissions that must be checked.      """ @@ -185,18 +184,21 @@ class ModelView(View):      """      resource = resources.ModelResource +  class InstanceModelView(InstanceMixin, ReadModelMixin, UpdateModelMixin, DeleteModelMixin, ModelView):      """      A view which provides default operations for read/update/delete against a model instance.      """      _suffix = 'Instance' +  class ListModelView(ListModelMixin, ModelView):      """      A view which provides default operations for list, against a model in the database.      """      _suffix = 'List' +  class ListOrCreateModelView(ListModelMixin, CreateModelMixin, ModelView):      """      A view which provides default operations for list and create, against a model in the database.  | 
