diff --git a/djadmin2/apiviews.py b/djadmin2/apiviews.py index 203e7e2..2991e0e 100644 --- a/djadmin2/apiviews.py +++ b/djadmin2/apiviews.py @@ -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 diff --git a/djadmin2/core.py b/djadmin2/core.py index 2303136..1afd8be 100644 --- a/djadmin2/core.py +++ b/djadmin2/core.py @@ -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('', diff --git a/example/blog/admin2.py b/example/blog/admin2.py index e2cbad3..8367587 100644 --- a/example/blog/admin2.py +++ b/example/blog/admin2.py @@ -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)