Skip to content

Commit

Permalink
Merge pull request #11 from grahamu/django-prepare-mixin
Browse files Browse the repository at this point in the history
Add Django Model EndpointSet mixin
  • Loading branch information
grahamu committed Jul 5, 2016
2 parents 092e800 + 711a03c commit 4a3dc2a
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 31 deletions.
1 change: 1 addition & 0 deletions pinax/api/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

from . import authentication, permissions # noqa
from .http import Response, Redirect # noqa
from .mixins import DjangoModelEndpointSetMixin # noqa
from .registry import register, bind, registry # noqa
from .relationships import Relationship # noqa
from .resource import Resource, Attribute # noqa
Expand Down
38 changes: 38 additions & 0 deletions pinax/api/mixins.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@


class DjangoModelEndpointSetMixin(object):

def get_pk(self):
"""
Convenience method returning URL PK kwarg.
"""
pk_url_kwarg = self.url.lookup["field"]
return self.kwargs[pk_url_kwarg] if pk_url_kwarg in self.kwargs else None

def get_resource_object_model(self):
"""
Convenience method returning Resource's object model, if any.
"""
if hasattr(self, "resource_class"):
return self.resource_class.model if hasattr(self.resource_class, "model") else None
else:
return None

def get_queryset(self):
"""
Convenience method returning all Resource's object model objects.
"""
return self.get_resource_object_model()._default_manager.all()

def prepare(self):
"""
Sets `self.pk` to the requested PK
Sets `self.obj` to a retrieved Resource object.
Assumes Resource object is based on Django model.
No action is taken if requested method does not operate on single objects.
"""
if self.get_resource_object_model():
if self.requested_method in ["retrieve", "update", "destroy"]:
self.pk = self.get_pk()
self.obj = self.get_object_or_404(self.get_queryset(), pk=self.pk)
41 changes: 10 additions & 31 deletions pinax/api/tests/viewsets.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@

from pinax import api

from .models import (
Article,
ArticleTag,
Author,
)
from ..mixins import DjangoModelEndpointSetMixin
from .relationships import (
ArticleTagCollectionEndpointSet,
ArticleAuthorEndpointSet,
Expand All @@ -18,7 +14,7 @@


@api.bind(resource=ArticleResource)
class ArticleViewSet(api.ResourceEndpointSet):
class ArticleViewSet(DjangoModelEndpointSetMixin, api.ResourceEndpointSet):
"""
Handle Article retrieval.
"""
Expand All @@ -40,16 +36,6 @@ class ArticleViewSet(api.ResourceEndpointSet):
]
}

def get_queryset(self):
return Article.objects.all()

def prepare(self):
if self.requested_method in ["retrieve", "update", "destroy"]:
self.article = self.get_object_or_404(
self.get_queryset(),
pk=self.kwargs["pk"] if "pk" in self.kwargs else None,
)

def create(self, request):
with self.validate(self.resource_class) as resource:
resource.save()
Expand All @@ -69,26 +55,27 @@ def retrieve(self, request, pk):
"""
Identifier: Retrieve an Article
"""
resource = self.resource_class(obj=self.article)
resource = self.resource_class(obj=self.obj)
return self.render(resource)

def update(self, request, pk):
"""
Update an Article
"""
with self.validate(self.resource_class(obj=self.article)) as resource:
with self.validate(self.resource_class(obj=self.obj)) as resource:
resource.save()
return self.render(resource)

def destroy(self, request, pk):
"""
Delete an Article
"""
return super(ArticleViewSet, self).destroy(request, pk)
self.obj.delete()
return self.render_delete()


@api.bind(resource=ArticleTagResource)
class ArticleTagViewSet(api.ResourceEndpointSet):
class ArticleTagViewSet(DjangoModelEndpointSetMixin, api.ResourceEndpointSet):
"""
Handle ArticleTag retrieval.
"""
Expand All @@ -107,9 +94,6 @@ class ArticleTagViewSet(api.ResourceEndpointSet):
]
}

def get_queryset(self):
return ArticleTag.objects.all()

def list(self, request):
"""
Identifier: List all tags
Expand All @@ -121,13 +105,12 @@ def retrieve(self, request, pk):
"""
Identifier: Retrieve a tag
"""
articletag = self.get_object_or_404(self.get_queryset(), pk=pk)
resource = self.resource_class(articletag)
resource = self.resource_class(self.obj)
return self.render(resource)


@api.bind(resource=AuthorResource)
class AuthorViewSet(api.ResourceEndpointSet):
class AuthorViewSet(DjangoModelEndpointSetMixin, api.ResourceEndpointSet):
"""
Handle Author retrieval.
"""
Expand All @@ -146,9 +129,6 @@ class AuthorViewSet(api.ResourceEndpointSet):
]
}

def get_queryset(self):
return Author.objects.all()

def list(self, request):
"""
Identifier: List all Authors
Expand All @@ -160,6 +140,5 @@ def retrieve(self, request, pk):
"""
Identifier: Retrieve an Author
"""
author = self.get_object_or_404(self.get_queryset(), pk=pk)
resource = self.resource_class(author)
resource = self.resource_class(self.obj)
return self.render(resource)

0 comments on commit 4a3dc2a

Please sign in to comment.