Adding an index resource for the API.

This commit is contained in:
Gregor Müllegger 2013-05-19 11:45:44 +02:00
parent 09a1f2465f
commit 68d6b96f84
3 changed files with 54 additions and 3 deletions

View file

@ -1,9 +1,15 @@
from django.utils.encoding import force_str
from rest_framework import fields, generics, serializers
from rest_framework.response import Response
from rest_framework.reverse import reverse
from rest_framework.views import APIView
from .views import Admin2Mixin
API_VERSION = '0.1'
class Admin2APISerializer(serializers.HyperlinkedModelSerializer):
_default_view_name = 'admin2:api_%(app_label)s_%(model_name)s_detail'
_default_view_name = 'admin2:%(app_label)s_%(model_name)s_api-detail'
pk = fields.Field(source='pk')
__str__ = fields.Field(source='__unicode__')
@ -21,6 +27,41 @@ class Admin2APIMixin(Admin2Mixin):
return super(Admin2APIMixin, self).get_serializer_class()
class IndexAPIView(Admin2APIMixin, APIView):
registry = None
def get_model_data(self, model, modeladmin):
opts = {
'app_label': model._meta.app_label,
'model_name': model._meta.object_name.lower(),
}
model_url = reverse(
'admin2:%(app_label)s_%(model_name)s_api-list' % opts,
request=self.request,
format=self.kwargs.get('format'))
return {
'url': model_url,
'verbose_name': force_str(model._meta.verbose_name),
'verbose_name_plural': force_str(model._meta.verbose_name_plural),
}
def get(self, request):
index_data = {
'version': API_VERSION,
'apps': [],
}
for model, modeladmin in self.registry.items():
app_data = {
'url': '-- todo --',
'app_label': '-- todo --',
'models': [
self.get_model_data(model, modeladmin),
],
}
index_data['apps'].append(app_data)
return Response(index_data)
class ListCreateAPIView(Admin2APIMixin, generics.ListCreateAPIView):
pass

View file

@ -4,6 +4,7 @@ from django.core.exceptions import ImproperlyConfigured
from django.utils.importlib import import_module
from . import apiviews
from . import models
from . import views
@ -17,6 +18,7 @@ class Admin2(object):
It also provides an index view that serves as an entry point to the admin site.
"""
index_view = views.IndexView
api_index_view = apiviews.IndexAPIView
def __init__(self, name='admin2'):
self.registry = {}
@ -82,9 +84,15 @@ class Admin2(object):
'apps': self.apps,
}
def get_api_index_kwargs(self):
return {
'registry': self.registry,
}
def get_urls(self):
urlpatterns = patterns('',
url(r'^$', self.index_view.as_view(), name='index'),
url(r'^$', self.index_view.as_view(**self.get_index_kwargs()), name='dashboard'),
url(r'^api/v0/$', self.api_index_view.as_view(**self.get_index_kwargs()), name='api'),
)
for model, modeladmin in self.registry.iteritems():
urlpatterns += patterns('',

View file

@ -2,7 +2,7 @@
# Import your custom models
from .models import Post, Comment
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from django.contrib.auth.models import User
from django.contrib.auth.models import Group, Permission, User
import djadmin2
@ -18,3 +18,5 @@ class UserAdmin2(ModelAdmin2):
djadmin2.default.register(Post)
djadmin2.default.register(Comment)
djadmin2.default.register(User, UserAdmin2)
djadmin2.default.register(Permission)
djadmin2.default.register(Group)