django-admin2/djadmin2/apiviews.py

115 lines
3.7 KiB
Python
Raw Permalink Normal View History

2013-05-19 09:45:44 +00:00
from django.utils.encoding import force_str
2013-05-18 16:28:26 +00:00
from rest_framework import fields, generics, serializers
2013-05-19 09:45:44 +00:00
from rest_framework.response import Response
from rest_framework.reverse import reverse as drf_reverse
2013-05-19 09:45:44 +00:00
from rest_framework.views import APIView
from . import utils
from .viewmixins import Admin2Mixin
2013-05-19 09:45:44 +00:00
API_VERSION = '0.1'
2013-05-19 09:08:25 +00:00
class Admin2APISerializer(serializers.HyperlinkedModelSerializer):
_default_view_name = 'admin2:%(app_label)s_%(model_name)s_api_detail'
2013-05-19 09:08:25 +00:00
2016-05-19 18:06:53 +00:00
pk = fields.ReadOnlyField()
__unicode__ = fields.ReadOnlyField(source='__str__')
def get_extra_kwargs(self):
2021-10-17 11:01:51 +00:00
extra_kwargs = super().get_extra_kwargs()
2016-05-19 18:06:53 +00:00
extra_kwargs.update({
'url': {'view_name': self._get_default_view_name(self.Meta.model)}
})
return extra_kwargs
def _get_default_view_name(self, model):
"""
Return the view name to use if 'view_name' is not specified in 'Meta'
"""
model_meta = model._meta
format_kwargs = {
'app_label': model_meta.app_label,
'model_name': model_meta.object_name.lower()
}
return self._default_view_name % format_kwargs
2016-05-19 18:07:45 +00:00
2013-05-19 08:40:46 +00:00
class Admin2APIMixin(Admin2Mixin):
2016-05-19 18:06:53 +00:00
model = None
raise_exception = True
def get_serializer_class(self):
if self.serializer_class is None:
2013-05-19 08:40:46 +00:00
model_class = self.get_model()
2013-05-19 10:08:42 +00:00
class ModelAPISerilizer(Admin2APISerializer):
2013-05-19 10:08:42 +00:00
# we need to reset this here, since we don't know anything
# about the name of the admin instance when declaring the
# Admin2APISerializer base class
_default_view_name = ':'.join((
self.model_admin.admin.name,
'%(app_label)s_%(model_name)s_api_detail'))
2013-05-19 10:08:42 +00:00
class Meta:
2013-05-19 08:40:46 +00:00
model = model_class
fields = '__all__'
return ModelAPISerilizer
2021-10-17 11:01:51 +00:00
return super().get_serializer_class()
2013-05-18 16:28:26 +00:00
2013-05-19 09:45:44 +00:00
class IndexAPIView(Admin2APIMixin, APIView):
apps = None
2013-05-19 09:45:44 +00:00
registry = None
app_verbose_names = None
app_verbose_name = None
2013-05-19 09:45:44 +00:00
def get_model_data(self, model):
model_admin = self.registry[model]
model_options = utils.model_options(model)
2013-05-19 09:45:44 +00:00
opts = {
'current_app': model_admin.admin.name,
'app_label': model_options.app_label,
'model_name': model_options.object_name.lower(),
2013-05-19 09:45:44 +00:00
}
model_url = drf_reverse(
'%(current_app)s:%(app_label)s_%(model_name)s_api_list' % opts,
2013-05-19 09:45:44 +00:00
request=self.request,
format=self.kwargs.get('format'))
model_options = utils.model_options(model)
2013-05-19 09:45:44 +00:00
return {
'url': model_url,
'verbose_name': force_str(model_options.verbose_name),
'verbose_name_plural': force_str(model_options.verbose_name_plural),
2013-05-19 09:45:44 +00:00
}
def get_app_data(self, app_label, models):
2013-05-19 10:53:37 +00:00
model_data = []
for model in models:
model_data.append(self.get_model_data(model))
return {
'app_label': app_label,
2013-05-19 10:53:37 +00:00
'models': model_data,
2013-08-27 00:20:09 +00:00
'app_verbose_name': force_str(self.app_verbose_names.get(app_label))
2013-05-19 10:53:37 +00:00
}
def get(self, request):
app_data = []
for app_label, registry in self.apps.items():
models = registry.keys()
app_data.append(self.get_app_data(app_label, models))
2013-05-19 09:45:44 +00:00
index_data = {
'version': API_VERSION,
'apps': app_data,
2013-05-19 09:45:44 +00:00
}
return Response(index_data)
class ListCreateAPIView(Admin2APIMixin, generics.ListCreateAPIView):
2016-05-19 18:06:53 +00:00
pass
2013-05-18 16:28:26 +00:00
class RetrieveUpdateDestroyAPIView(Admin2APIMixin, generics.RetrieveUpdateDestroyAPIView):
2016-05-19 18:06:53 +00:00
pass