From 4a9f7ed454978c28ba7b85022bda0ebed0c5c2a9 Mon Sep 17 00:00:00 2001 From: lins05 Date: Thu, 25 Dec 2014 12:27:44 +0900 Subject: [PATCH] added /api2/server-info/ endpoint --- seahub/api2/urls.py | 9 +++++---- seahub/api2/utils.py | 12 ++++++++++++ seahub/api2/views_misc.py | 30 ++++++++++++++++++++++++++++++ tests/api/test_misc.py | 10 +++++++++- tests/api/urls.py | 1 + 5 files changed, 57 insertions(+), 5 deletions(-) create mode 100644 seahub/api2/views_misc.py diff --git a/seahub/api2/urls.py b/seahub/api2/urls.py index 871301452e..48f960ed55 100644 --- a/seahub/api2/urls.py +++ b/seahub/api2/urls.py @@ -1,12 +1,14 @@ from django.conf.urls.defaults import * -from views import * +from .views import * +from .views_misc import ServerInfoView urlpatterns = patterns('', url(r'^ping/$', Ping.as_view()), url(r'^auth/ping/$', AuthPing.as_view()), url(r'^auth-token/', ObtainAuthToken.as_view()), + url(r'^server-info/$', ServerInfoView.as_view()), # RESTful API url(r'^accounts/$', Accounts.as_view(), name="accounts"), @@ -75,7 +77,7 @@ urlpatterns = patterns('', url(r'^html/usermsgs/(?P[^/]+)/$', UserMsgsHtml.as_view()), url(r'^html/more_usermsgs/(?P[^/]+)/$', AjaxUserMsgs.as_view(), name="api_more_usermsgs"), - # Folowing is only for debug, will be removed + # Folowing is only for debug, will be removed #url(r'^html/newreply2/$', api_new_replies), #url(r'^html/events2/$', activity2), #url(r'^html/more_events/$', events2, name="more_events"), @@ -87,8 +89,7 @@ urlpatterns = patterns('', #url(r'^html/usermsgs2/(?P[^/]+)/$', api_usermsgs), #url(r'^html/more_usermsgs/(?P[^/]+)/$', api_more_usermsgs, name="api_more_usermsgs"), - - # Deprecated + # Deprecated url(r'^repos/(?P[-0-9-a-f]{36})/fileops/delete/$', OpDeleteView.as_view()), url(r'^repos/(?P[-0-9-a-f]{36})/fileops/copy/$', OpCopyView.as_view()), url(r'^repos/(?P[-0-9-a-f]{36})/fileops/move/$', OpMoveView.as_view()), diff --git a/seahub/api2/utils.py b/seahub/api2/utils.py index 07301f21e2..8834eddb82 100644 --- a/seahub/api2/utils.py +++ b/seahub/api2/utils.py @@ -3,10 +3,13 @@ import os import time +import json from collections import defaultdict +from functools import wraps from django.core.paginator import EmptyPage, InvalidPage +from django.http import HttpResponse from rest_framework.response import Response from rest_framework import status from seaserv import seafile_api, get_commits, server_repo_size, \ @@ -505,3 +508,12 @@ def get_diff_details(repo_id, commit1, commit2): result['deleted_dirs'].append(d.name) return result + +JSON_CONTENT_TYPE = 'application/json; charset=utf-8' +def json_response(func): + @wraps(func) + def wrapped(*a, **kw): + result = func(*a, **kw) + return HttpResponse(json.dumps(result), status=200, + content_type=JSON_CONTENT_TYPE) + return wrapped diff --git a/seahub/api2/views_misc.py b/seahub/api2/views_misc.py new file mode 100644 index 0000000000..fef673a01c --- /dev/null +++ b/seahub/api2/views_misc.py @@ -0,0 +1,30 @@ +from rest_framework.views import APIView + +from seahub.api2.utils import json_response +from seahub import settings +from seahub.utils import HAS_OFFICE_CONVERTER, HAS_FILE_SEARCH + +class ServerInfoView(APIView): + """ + Returns the server info (version, supported features). + """ + @json_response + def get(self, request, format=None): + info = { + 'version': settings.SEAFILE_VERSION, + } + + features = ['seafile-basic'] + + if any(['seahub_extra' in app for app in settings.INSTALLED_APPS]): + features.append('seafile-pro') + + if HAS_OFFICE_CONVERTER: + features.append('office-preview') + + if HAS_FILE_SEARCH: + features.append('file-search') + + info['features'] = features + + return info diff --git a/tests/api/test_misc.py b/tests/api/test_misc.py index 8416d38fa8..0964a8e630 100644 --- a/tests/api/test_misc.py +++ b/tests/api/test_misc.py @@ -1,6 +1,7 @@ import unittest +import requests from tests.api.apitestbase import ApiTestBase -from tests.api.urls import LIST_GROUP_AND_CONTACTS_URL +from tests.api.urls import LIST_GROUP_AND_CONTACTS_URL, SERVER_INFO_URL class MiscApiTest(ApiTestBase): def test_list_group_and_contacts(self): @@ -12,3 +13,10 @@ class MiscApiTest(ApiTestBase): self.assertIsInstance(res['groups'], list) self.assertIsNotNone(res['gmsgnum']) self.assertIsNotNone(res['newreplies']) + + def test_server_info(self): + r = requests.get(SERVER_INFO_URL) + r.raise_for_status() + info = r.json() + self.assertTrue('version' in info) + self.assertTrue('seafile-basic' in info['features']) diff --git a/tests/api/urls.py b/tests/api/urls.py index ba649e8a04..0e0181d172 100644 --- a/tests/api/urls.py +++ b/tests/api/urls.py @@ -30,3 +30,4 @@ S_F_URL = apiurl('/api2/s/f/') LIST_GROUP_AND_CONTACTS_URL = apiurl('/api2/groupandcontacts/') +SERVER_INFO_URL = apiurl('/api2/server-info/')