From ea02172a82d8b51d7cf1a1d06d56ce16f41ad385 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Thu, 6 Aug 2015 02:50:14 -0400 Subject: [PATCH] Refactor rest_api app and the method end points are registered. All apps API URL endpoints are now registered under the 'rest_api' namespace. --- mayan/apps/rest_api/apps.py | 10 +++-- mayan/apps/rest_api/classes.py | 33 +++++++++++---- mayan/apps/rest_api/links.py | 2 +- mayan/apps/rest_api/serializers.py | 13 +++--- mayan/apps/rest_api/urls.py | 10 ++--- mayan/apps/rest_api/views.py | 66 +++++++++--------------------- mayan/settings/base.py | 2 +- mayan/urls.py | 1 - 8 files changed, 64 insertions(+), 73 deletions(-) diff --git a/mayan/apps/rest_api/apps.py b/mayan/apps/rest_api/apps.py index c1385f37cf..fdf0e730fd 100644 --- a/mayan/apps/rest_api/apps.py +++ b/mayan/apps/rest_api/apps.py @@ -1,19 +1,21 @@ from __future__ import unicode_literals -from django import apps from django.utils.translation import ugettext_lazy as _ -from common import menu_tools +from common import MayanAppConfig, menu_tools from .classes import APIEndPoint from .links import link_api, link_api_documentation -class RESTAPIApp(apps.AppConfig): +class RESTAPIApp(MayanAppConfig): + app_url = 'api' name = 'rest_api' verbose_name = _('REST API') def ready(self): - APIEndPoint('rest_api') + super(RESTAPIApp, self).ready() + + APIEndPoint(app=self, version_string='1') menu_tools.bind_links(links=(link_api, link_api_documentation)) diff --git a/mayan/apps/rest_api/classes.py b/mayan/apps/rest_api/classes.py index c34dbf8e3f..95f919fa44 100644 --- a/mayan/apps/rest_api/classes.py +++ b/mayan/apps/rest_api/classes.py @@ -4,6 +4,8 @@ from django.conf.urls import include, patterns, url from django.conf import settings from django.utils.module_loading import import_string +from rest_framework.reverse import reverse + class APIEndPoint(object): _registry = {} @@ -17,14 +19,16 @@ class APIEndPoint(object): return cls._registry[name] def __unicode__(self): - return unicode(self.name) + return unicode(self.app.name) - def __init__(self, name, app_name=None): - self.name = name + def __init__(self, app, version_string, name=None): + self.app = app self.endpoints = [] + self.name = name + self.version_string = version_string try: api_urls = import_string( - '{0}.urls.api_urls'.format(app_name or name) + '{0}.urls.api_urls'.format(app.name) ) except Exception: if settings.DEBUG: @@ -35,13 +39,26 @@ class APIEndPoint(object): else: self.register_urls(api_urls) - self.__class__._registry[name] = self + self.__class__._registry[app.name] = self + + @property + def url(self): + return reverse('rest_api:api-version-1-app', args=[self.app.name]) + + @property + def app_name(self): + return self.app.name def register_urls(self, urlpatterns): - from .urls import version_0_urlpatterns + from .urls import version_1_urlpatterns endpoint_urls = patterns( '', - url(r'^%s/' % self.name, include(urlpatterns)), + url(r'^%s/' % self.app.name, include(urlpatterns)), ) + version_1_urlpatterns += endpoint_urls - version_0_urlpatterns += endpoint_urls + +class APIVersion(object): + def __init__(self): + self.version_string = '1' + self.url = reverse('rest_api:api-version-1') diff --git a/mayan/apps/rest_api/links.py b/mayan/apps/rest_api/links.py index 26f1e905f8..bee37954b0 100644 --- a/mayan/apps/rest_api/links.py +++ b/mayan/apps/rest_api/links.py @@ -4,7 +4,7 @@ from django.utils.translation import ugettext_lazy as _ from navigation import Link -link_api = Link(icon='fa fa-plug', text=_('REST API'), view='api-root') +link_api = Link(icon='fa fa-plug', text=_('REST API'), view='rest_api:api-root') link_api_documentation = Link( icon='fa fa-book', text=_('API Documentation'), view='django.swagger.base.view' diff --git a/mayan/apps/rest_api/serializers.py b/mayan/apps/rest_api/serializers.py index 4faa07ceb7..168a59ec5f 100644 --- a/mayan/apps/rest_api/serializers.py +++ b/mayan/apps/rest_api/serializers.py @@ -1,15 +1,14 @@ +from __future__ import unicode_literals + from rest_framework import serializers -class APISerializer(serializers.Serializer): - name = serializers.CharField() +class APIVersionSerializer(serializers.Serializer): url = serializers.URLField() + version_string = serializers.CharField() class APIAppSerializer(serializers.Serializer): - name = serializers.CharField() + app_name = serializers.CharField() url = serializers.URLField() - - -class APIVersionSerializer(serializers.Serializer): - apps = APIAppSerializer() + version_string = serializers.CharField() diff --git a/mayan/apps/rest_api/urls.py b/mayan/apps/rest_api/urls.py index 0868e7fb68..4a3db93b3b 100644 --- a/mayan/apps/rest_api/urls.py +++ b/mayan/apps/rest_api/urls.py @@ -2,21 +2,21 @@ from __future__ import unicode_literals from django.conf.urls import include, patterns, url -from .views import APIBase, Version_0, APIAppView, BrowseableObtainAuthToken +from .views import APIBase, APIVersionView, APIAppView, BrowseableObtainAuthToken -version_0_urlpatterns = patterns( +version_1_urlpatterns = patterns( '', - url(r'^$', Version_0.as_view(), name='api-version-0'), + url(r'^$', APIVersionView.as_view(), name='api-version-1'), url( r'^(?P\w+)/$', APIAppView.as_view(), - name='api-version-0-app' + name='api-version-1-app' ), ) urlpatterns = patterns( '', url(r'^$', APIBase.as_view(), name='api-root'), - url(r'^v0/', include(version_0_urlpatterns)), + url(r'^v1/', include(version_1_urlpatterns)), ) api_urls = patterns( diff --git a/mayan/apps/rest_api/views.py b/mayan/apps/rest_api/views.py index 4a193b2be4..1810509d26 100644 --- a/mayan/apps/rest_api/views.py +++ b/mayan/apps/rest_api/views.py @@ -7,72 +7,46 @@ from rest_framework.authtoken.views import ObtainAuthToken from rest_framework.response import Response from rest_framework.reverse import reverse -from .classes import APIEndPoint -from .serializers import APIAppSerializer, APISerializer, APIVersionSerializer +from .classes import APIVersion, APIEndPoint +from .serializers import APIAppSerializer, APIVersionSerializer logger = logging.getLogger(__name__) -registered_version_0_endpoints = [ +registered_version_1_endpoints = [ ] -class APIBase(generics.GenericAPIView): +class APIBase(generics.RetrieveAPIView): """ Main entry point of the API. """ - serializer_class = APISerializer - - def get(self, request, format=None): - return Response([ - { - 'name': 'Version 0', 'url': reverse( - 'api-version-0', request=request, format=format - ) - } - ]) - - -class Version_0(generics.GenericAPIView): - """ - API version 0 entry points. - """ - serializer_class = APIVersionSerializer - def get(self, request, format=None): - return Response({ - 'apps': [ - { - 'name': unicode(endpoint), - 'url': reverse('api-version-0-app', - args=[unicode(endpoint)], request=request, - format=format - ) - } for endpoint in APIEndPoint.get_all() - ], - }) + def get_object(self): + return APIVersion() -class APIAppView(generics.GenericAPIView): +class APIVersionView(generics.ListAPIView): + """ + API version entry points. + """ + + serializer_class = APIAppSerializer + + def get_queryset(self): + return APIEndPoint.get_all() + + +class APIAppView(generics.RetrieveAPIView): """ Entry points of the selected app. """ serializer_class = APIAppSerializer - def get(self, request, app_name, format=None): - api_app = APIEndPoint.get(app_name) - - return Response( - { - 'name': api_app.name, - 'url': reverse( - 'api-version-0-app', args=[unicode(api_app.name)], - request=request, format=format - ) - } - ) + def get_object(self): + return APIEndPoint.get(self.kwargs['app_name']) class BrowseableObtainAuthToken(ObtainAuthToken): diff --git a/mayan/settings/base.py b/mayan/settings/base.py index 7dc998a979..abd303420e 100644 --- a/mayan/settings/base.py +++ b/mayan/settings/base.py @@ -270,7 +270,7 @@ TEST_RUNNER = 'djcelery.contrib.test_runner.CeleryTestSuiteRunner' CORS_ORIGIN_ALLOW_ALL = True # ------ Django REST Swagger ----- SWAGGER_SETTINGS = { - 'api_version': '0', # Specify your API's version + 'api_version': '1', # Specify your API's version } # ------ Timezone -------- TIMEZONE_COOKIE_NAME = 'django_timezone' diff --git a/mayan/urls.py b/mayan/urls.py index f0a71e9511..bde8f61c97 100644 --- a/mayan/urls.py +++ b/mayan/urls.py @@ -9,7 +9,6 @@ admin.autodiscover() urlpatterns = patterns( '', url(r'^admin/', include(admin.site.urls)), - url(r'^api/', include('rest_api.urls')), url(r'^docs/', include('rest_framework_swagger.urls')), )