From b79833ecddcea788b4a8d8901bd25f0afe83bbf7 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Thu, 6 Sep 2012 15:58:44 +0100 Subject: [PATCH] Move generic views into seperate module --- djangorestframework/generics.py | 112 ++++++++++++++++++++++++++ djangorestframework/views.py | 137 ++------------------------------ 2 files changed, 117 insertions(+), 132 deletions(-) create mode 100644 djangorestframework/generics.py diff --git a/djangorestframework/generics.py b/djangorestframework/generics.py new file mode 100644 index 000000000..87a2a4b89 --- /dev/null +++ b/djangorestframework/generics.py @@ -0,0 +1,112 @@ +""" +Generic views that provide commmonly needed behaviour. +""" + +from djangorestframework import views, mixins +from django.views.generic.detail import SingleObjectMixin +from django.views.generic.list import MultipleObjectMixin + + +### Base classes for the generic views ### + +class BaseView(views.APIView): + """ + Base class for all other generic views. + """ + serializer_class = None + + def get_serializer(self, data=None, files=None, instance=None): + # TODO: add support for files + # TODO: add support for seperate serializer/deserializer + context = { + 'request': self.request, + 'format': self.kwargs.get('format', None) + } + return self.serializer_class(data, instance=instance, context=context) + + +class MultipleObjectBaseView(MultipleObjectMixin, BaseView): + """ + Base class for generic views onto a queryset. + """ + pass + + +class SingleObjectBaseView(SingleObjectMixin, BaseView): + """ + Base class for generic views onto a model instance. + """ + + def get_object(self): + """ + Override default to add support for object-level permissions. + """ + super(self, SingleObjectBaseView).get_object() + self.check_permissions(self.request, self.object) + + +### Concrete view classes that provide method handlers ### +### by composing the mixin classes with a base view. ### + +class ListAPIView(mixins.ListModelMixin, + mixins.MetadataMixin, + MultipleObjectBaseView): + """ + Concrete view for listing a queryset. + """ + def get(self, request, *args, **kwargs): + return self.list(request, *args, **kwargs) + + def options(self, request, *args, **kwargs): + return self.metadata(request, *args, **kwargs) + + +class RootAPIView(mixins.ListModelMixin, + mixins.CreateModelMixin, + mixins.MetadataMixin, + MultipleObjectBaseView): + """ + Concrete view for listing a queryset or creating a model instance. + """ + def get(self, request, *args, **kwargs): + return self.list(request, *args, **kwargs) + + def post(self, request, *args, **kwargs): + return self.create(request, *args, **kwargs) + + def options(self, request, *args, **kwargs): + return self.metadata(request, *args, **kwargs) + + +class DetailAPIView(mixins.RetrieveModelMixin, + mixins.MetadataMixin, + SingleObjectBaseView): + """ + Concrete view for retrieving a model instance. + """ + def get(self, request, *args, **kwargs): + return self.retrieve(request, *args, **kwargs) + + def options(self, request, *args, **kwargs): + return self.metadata(request, *args, **kwargs) + + +class InstanceAPIView(mixins.RetrieveModelMixin, + mixins.UpdateModelMixin, + mixins.DestroyModelMixin, + mixins.MetadataMixin, + SingleObjectBaseView): + """ + Concrete view for retrieving, updating or deleting a model instance. + """ + def get(self, request, *args, **kwargs): + return self.retrieve(request, *args, **kwargs) + + def put(self, request, *args, **kwargs): + return self.update(request, *args, **kwargs) + + def delete(self, request, *args, **kwargs): + return self.destroy(request, *args, **kwargs) + + def options(self, request, *args, **kwargs): + return self.metadata(request, *args, **kwargs) diff --git a/djangorestframework/views.py b/djangorestframework/views.py index e4d47a31e..43feee9cd 100644 --- a/djangorestframework/views.py +++ b/djangorestframework/views.py @@ -11,14 +11,12 @@ from django.http import Http404 from django.utils.html import escape from django.utils.safestring import mark_safe from django.views.decorators.csrf import csrf_exempt -from django.views.generic.detail import SingleObjectMixin -from django.views.generic.list import MultipleObjectMixin from djangorestframework.compat import View as _View, apply_markdown from djangorestframework.response import Response from djangorestframework.request import Request from djangorestframework.settings import api_settings -from djangorestframework import parsers, authentication, status, exceptions, mixins +from djangorestframework import status, exceptions def _remove_trailing_string(content, trailing): @@ -57,30 +55,10 @@ def _camelcase_to_spaces(content): class APIView(_View): renderers = api_settings.DEFAULT_RENDERERS - """ - List of renderer classes the view can serialize the response with, ordered by preference. - """ - - parsers = parsers.DEFAULT_PARSERS - """ - List of parser classes the view can parse the request with. - """ - - authentication = (authentication.SessionAuthentication, - authentication.UserBasicAuthentication) - """ - List of all authenticating methods to attempt. - """ - - throttle_classes = () - """ - List of all throttles to check. - """ - - permission_classes = () - """ - List of all permissions that must be checked. - """ + parsers = api_settings.DEFAULT_PARSERS + authentication = api_settings.DEFAULT_AUTHENTICATION + throttle_classes = api_settings.DEFAULT_THROTTLES + permission_classes = api_settings.DEFAULT_PERMISSIONS @classmethod def as_view(cls, **initkwargs): @@ -300,108 +278,3 @@ class APIView(_View): self.response = self.finalize_response(request, response, *args, **kwargs) return self.response - - -# Abstract view classes that do not provide any method handlers, -# but which provide required behaviour for concrete views to build on. - -class BaseView(APIView): - """ - Base class for all generic views. - """ - serializer_class = None - - def get_serializer(self, data=None, files=None, instance=None): - # TODO: add support for files - context = { - 'request': self.request, - 'format': self.kwargs.get('format', None) - } - return self.serializer_class(data, instance=instance, context=context) - - -class MultipleObjectBaseView(MultipleObjectMixin, BaseView): - """ - Base class for generic views onto a queryset. - """ - pass - - -class SingleObjectBaseView(SingleObjectMixin, BaseView): - """ - Base class for generic views onto a model instance. - """ - - def get_object(self): - """ - Override default to add support for object-level permissions. - """ - super(self, SingleObjectBaseView).get_object() - self.check_permissions(self.request, self.object) - - -# Concrete view classes that provide method handlers -# by composing the mixin classes with a base view. - -class ListAPIView(mixins.ListModelMixin, - mixins.MetadataMixin, - MultipleObjectBaseView): - """ - Concrete view for listing a queryset. - """ - def get(self, request, *args, **kwargs): - return self.list(request, *args, **kwargs) - - def options(self, request, *args, **kwargs): - return self.metadata(request, *args, **kwargs) - - -class RootAPIView(mixins.ListModelMixin, - mixins.CreateModelMixin, - mixins.MetadataMixin, - MultipleObjectBaseView): - """ - Concrete view for listing a queryset or creating a model instance. - """ - def get(self, request, *args, **kwargs): - return self.list(request, *args, **kwargs) - - def post(self, request, *args, **kwargs): - return self.create(request, *args, **kwargs) - - def options(self, request, *args, **kwargs): - return self.metadata(request, *args, **kwargs) - - -class DetailAPIView(mixins.RetrieveModelMixin, - mixins.MetadataMixin, - SingleObjectBaseView): - """ - Concrete view for retrieving a model instance. - """ - def get(self, request, *args, **kwargs): - return self.retrieve(request, *args, **kwargs) - - def options(self, request, *args, **kwargs): - return self.metadata(request, *args, **kwargs) - - -class InstanceAPIView(mixins.RetrieveModelMixin, - mixins.UpdateModelMixin, - mixins.DestroyModelMixin, - mixins.MetadataMixin, - SingleObjectBaseView): - """ - Concrete view for retrieving, updating or deleting a model instance. - """ - def get(self, request, *args, **kwargs): - return self.retrieve(request, *args, **kwargs) - - def put(self, request, *args, **kwargs): - return self.update(request, *args, **kwargs) - - def delete(self, request, *args, **kwargs): - return self.destroy(request, *args, **kwargs) - - def options(self, request, *args, **kwargs): - return self.metadata(request, *args, **kwargs)