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
|
2018-05-10 19:23:23 +00:00
|
|
|
from rest_framework.reverse import reverse as drf_reverse
|
2013-05-19 09:45:44 +00:00
|
|
|
from rest_framework.views import APIView
|
2013-05-22 16:40:53 +00:00
|
|
|
|
2013-05-23 17:46:03 +00:00
|
|
|
from . import utils
|
2013-05-22 16:40:53 +00:00
|
|
|
from .viewmixins import Admin2Mixin
|
2013-05-18 15:50:09 +00:00
|
|
|
|
2013-05-19 09:45:44 +00:00
|
|
|
API_VERSION = '0.1'
|
|
|
|
|
|
2013-05-18 15:50:09 +00:00
|
|
|
|
2013-05-19 09:08:25 +00:00
|
|
|
class Admin2APISerializer(serializers.HyperlinkedModelSerializer):
|
2013-06-01 11:48:53 +00:00
|
|
|
_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
|
2013-05-18 15:50:09 +00:00
|
|
|
|
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
|
2013-05-26 15:09:22 +00:00
|
|
|
raise_exception = True
|
|
|
|
|
|
2013-05-18 15:50:09 +00:00
|
|
|
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
|
|
|
|
2013-05-18 15:50:09 +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((
|
2013-05-19 13:45:24 +00:00
|
|
|
self.model_admin.admin.name,
|
2013-06-01 11:48:53 +00:00
|
|
|
'%(app_label)s_%(model_name)s_api_detail'))
|
2013-05-19 10:08:42 +00:00
|
|
|
|
2013-05-18 15:50:09 +00:00
|
|
|
class Meta:
|
2013-05-19 08:40:46 +00:00
|
|
|
model = model_class
|
2016-11-29 17:16:39 +00:00
|
|
|
fields = '__all__'
|
2013-05-18 15:50:09 +00:00
|
|
|
|
|
|
|
|
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):
|
2013-05-19 11:35:57 +00:00
|
|
|
apps = None
|
2013-05-19 09:45:44 +00:00
|
|
|
registry = None
|
2013-08-05 07:35:03 +00:00
|
|
|
app_verbose_names = None
|
|
|
|
|
app_verbose_name = None
|
2013-05-19 09:45:44 +00:00
|
|
|
|
2013-05-19 11:35:57 +00:00
|
|
|
def get_model_data(self, model):
|
2013-05-19 13:45:24 +00:00
|
|
|
model_admin = self.registry[model]
|
2013-05-23 17:46:03 +00:00
|
|
|
model_options = utils.model_options(model)
|
2013-05-19 09:45:44 +00:00
|
|
|
opts = {
|
2013-05-19 13:45:24 +00:00
|
|
|
'current_app': model_admin.admin.name,
|
2013-05-23 17:46:03 +00:00
|
|
|
'app_label': model_options.app_label,
|
|
|
|
|
'model_name': model_options.object_name.lower(),
|
2013-05-19 09:45:44 +00:00
|
|
|
}
|
2018-05-10 19:23:23 +00:00
|
|
|
model_url = drf_reverse(
|
2013-06-01 11:48:53 +00:00
|
|
|
'%(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'))
|
2013-05-23 17:46:03 +00:00
|
|
|
model_options = utils.model_options(model)
|
2013-05-19 09:45:44 +00:00
|
|
|
return {
|
|
|
|
|
'url': model_url,
|
2013-05-23 17:46:03 +00:00
|
|
|
'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
|
|
|
}
|
|
|
|
|
|
2013-05-19 11:35:57 +00:00
|
|
|
def get_app_data(self, app_label, models):
|
2013-05-19 10:53:37 +00:00
|
|
|
model_data = []
|
2013-05-19 11:35:57 +00:00
|
|
|
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
|
|
|
}
|
2013-05-19 11:35:57 +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,
|
2013-05-19 11:35:57 +00:00
|
|
|
'apps': app_data,
|
2013-05-19 09:45:44 +00:00
|
|
|
}
|
|
|
|
|
return Response(index_data)
|
|
|
|
|
|
|
|
|
|
|
2013-05-19 07:51:09 +00:00
|
|
|
class ListCreateAPIView(Admin2APIMixin, generics.ListCreateAPIView):
|
2016-05-19 18:06:53 +00:00
|
|
|
pass
|
2013-05-18 16:28:26 +00:00
|
|
|
|
|
|
|
|
|
2013-05-19 07:51:09 +00:00
|
|
|
class RetrieveUpdateDestroyAPIView(Admin2APIMixin, generics.RetrieveUpdateDestroyAPIView):
|
2016-05-19 18:06:53 +00:00
|
|
|
pass
|