mirror of
https://github.com/haiwen/seahub.git
synced 2025-08-30 21:50:59 +00:00
Merge pull request #1968 from haiwen/groups-for-repo-share
add api for getting groups that user can share repo to
This commit is contained in:
commit
14f143fe47
@ -1,37 +0,0 @@
|
|||||||
# Copyright (c) 2011-2016 Seafile Ltd.
|
|
||||||
from rest_framework.authentication import SessionAuthentication
|
|
||||||
from rest_framework.permissions import IsAuthenticated
|
|
||||||
from rest_framework.response import Response
|
|
||||||
from rest_framework.views import APIView
|
|
||||||
|
|
||||||
from seaserv import ccnet_api
|
|
||||||
|
|
||||||
from seahub.api2.authentication import TokenAuthentication
|
|
||||||
from seahub.api2.throttling import UserRateThrottle
|
|
||||||
from seahub.api2.endpoints.groups import get_group_info
|
|
||||||
from seahub.avatar.settings import GROUP_AVATAR_DEFAULT_SIZE
|
|
||||||
|
|
||||||
from constance import config
|
|
||||||
|
|
||||||
|
|
||||||
class AllGroupsView(APIView):
|
|
||||||
authentication_classes = (TokenAuthentication, SessionAuthentication)
|
|
||||||
permission_classes = (IsAuthenticated,)
|
|
||||||
throttle_classes = (UserRateThrottle, )
|
|
||||||
|
|
||||||
def get(self, request):
|
|
||||||
"""List all groups
|
|
||||||
"""
|
|
||||||
if config.ENABLE_SHARE_TO_ALL_GROUPS:
|
|
||||||
groups_list = ccnet_api.get_all_groups(-1, -1)
|
|
||||||
else:
|
|
||||||
return Response([])
|
|
||||||
try:
|
|
||||||
avatar_size = int(request.GET.get('avatar_size',
|
|
||||||
GROUP_AVATAR_DEFAULT_SIZE))
|
|
||||||
except ValueError:
|
|
||||||
avatar_size = GROUP_AVATAR_DEFAULT_SIZE
|
|
||||||
|
|
||||||
groups = [get_group_info(request, g.id, avatar_size)
|
|
||||||
for g in groups_list]
|
|
||||||
return Response(groups)
|
|
59
seahub/api2/endpoints/shareable_groups.py
Normal file
59
seahub/api2/endpoints/shareable_groups.py
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
# Copyright (c) 2011-2016 Seafile Ltd.
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
from rest_framework.authentication import SessionAuthentication
|
||||||
|
from rest_framework.permissions import IsAuthenticated
|
||||||
|
from rest_framework.response import Response
|
||||||
|
from rest_framework.views import APIView
|
||||||
|
|
||||||
|
from seaserv import ccnet_api
|
||||||
|
|
||||||
|
from seahub.utils import is_org_context
|
||||||
|
from seahub.api2.authentication import TokenAuthentication
|
||||||
|
from seahub.api2.throttling import UserRateThrottle
|
||||||
|
from seahub.api2.endpoints.groups import get_group_info
|
||||||
|
from seahub.avatar.settings import GROUP_AVATAR_DEFAULT_SIZE
|
||||||
|
|
||||||
|
from constance import config
|
||||||
|
|
||||||
|
try:
|
||||||
|
current_path = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
seafile_conf_dir = os.path.join(current_path, \
|
||||||
|
'../../../../../conf')
|
||||||
|
sys.path.append(seafile_conf_dir)
|
||||||
|
from seahub_custom_functions import custom_get_groups
|
||||||
|
CUSTOM_GET_GROUPS = True
|
||||||
|
except ImportError as e:
|
||||||
|
CUSTOM_GET_GROUPS = False
|
||||||
|
|
||||||
|
class ShareableGroups(APIView):
|
||||||
|
authentication_classes = (TokenAuthentication, SessionAuthentication)
|
||||||
|
permission_classes = (IsAuthenticated,)
|
||||||
|
throttle_classes = (UserRateThrottle, )
|
||||||
|
|
||||||
|
def get(self, request):
|
||||||
|
""" List groups that user can share a library to.
|
||||||
|
"""
|
||||||
|
if config.ENABLE_SHARE_TO_ALL_GROUPS:
|
||||||
|
if CUSTOM_GET_GROUPS:
|
||||||
|
groups = custom_get_groups(request)
|
||||||
|
else:
|
||||||
|
groups = ccnet_api.get_all_groups(-1, -1)
|
||||||
|
else:
|
||||||
|
username = request.user.username
|
||||||
|
if is_org_context(request):
|
||||||
|
org_id = request.user.org.org_id
|
||||||
|
groups = ccnet_api.get_org_groups_by_user(org_id, username)
|
||||||
|
else:
|
||||||
|
groups = ccnet_api.get_groups(username)
|
||||||
|
|
||||||
|
try:
|
||||||
|
avatar_size = int(request.GET.get('avatar_size',
|
||||||
|
GROUP_AVATAR_DEFAULT_SIZE))
|
||||||
|
except ValueError:
|
||||||
|
avatar_size = GROUP_AVATAR_DEFAULT_SIZE
|
||||||
|
|
||||||
|
result = [get_group_info(request, g.id, avatar_size)
|
||||||
|
for g in groups]
|
||||||
|
|
||||||
|
return Response(result)
|
@ -20,7 +20,7 @@ from seahub.views.wiki import personal_wiki, personal_wiki_pages, \
|
|||||||
personal_wiki_create, personal_wiki_page_new, personal_wiki_page_edit, \
|
personal_wiki_create, personal_wiki_page_new, personal_wiki_page_edit, \
|
||||||
personal_wiki_page_delete, personal_wiki_use_lib
|
personal_wiki_page_delete, personal_wiki_use_lib
|
||||||
from seahub.api2.endpoints.groups import Groups, Group
|
from seahub.api2.endpoints.groups import Groups, Group
|
||||||
from seahub.api2.endpoints.all_groups import AllGroupsView
|
from seahub.api2.endpoints.shareable_groups import ShareableGroups
|
||||||
from seahub.api2.endpoints.group_libraries import GroupLibraries, GroupLibrary
|
from seahub.api2.endpoints.group_libraries import GroupLibraries, GroupLibrary
|
||||||
from seahub.api2.endpoints.group_members import GroupMembers, GroupMembersBulk, GroupMember
|
from seahub.api2.endpoints.group_members import GroupMembers, GroupMembersBulk, GroupMember
|
||||||
from seahub.api2.endpoints.search_group import SearchGroup
|
from seahub.api2.endpoints.search_group import SearchGroup
|
||||||
@ -210,8 +210,9 @@ urlpatterns = patterns(
|
|||||||
url(r'^api/v2.1/user/$', User.as_view(), name="api-v2.1-user"),
|
url(r'^api/v2.1/user/$', User.as_view(), name="api-v2.1-user"),
|
||||||
|
|
||||||
## user::groups
|
## user::groups
|
||||||
|
url(r'^api/v2.1/shareable-groups/$', ShareableGroups.as_view(), name='api-v2.1-shareable-groups'),
|
||||||
|
|
||||||
url(r'^api/v2.1/groups/$', Groups.as_view(), name='api-v2.1-groups'),
|
url(r'^api/v2.1/groups/$', Groups.as_view(), name='api-v2.1-groups'),
|
||||||
url(r'^api/v2.1/groups/all/$', AllGroupsView.as_view(), name='api-v2.1-all-groups'),
|
|
||||||
url(r'^api/v2.1/groups/(?P<group_id>\d+)/$', Group.as_view(), name='api-v2.1-group'),
|
url(r'^api/v2.1/groups/(?P<group_id>\d+)/$', Group.as_view(), name='api-v2.1-group'),
|
||||||
|
|
||||||
url(r'^api/v2.1/groups/(?P<group_id>\d+)/libraries/$', GroupLibraries.as_view(), name='api-v2.1-group-libraries'),
|
url(r'^api/v2.1/groups/(?P<group_id>\d+)/libraries/$', GroupLibraries.as_view(), name='api-v2.1-group-libraries'),
|
||||||
|
@ -677,7 +677,7 @@ define([
|
|||||||
if (app.pageOptions.enable_share_to_all_groups) {
|
if (app.pageOptions.enable_share_to_all_groups) {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: Common.getUrl({
|
url: Common.getUrl({
|
||||||
name: 'all_groups'
|
name: 'shareable_groups'
|
||||||
}),
|
}),
|
||||||
type: 'GET',
|
type: 'GET',
|
||||||
dataType: 'json',
|
dataType: 'json',
|
||||||
|
@ -143,7 +143,7 @@ define([
|
|||||||
|
|
||||||
// Group
|
// Group
|
||||||
case 'groups': return siteRoot + 'api/v2.1/groups/';
|
case 'groups': return siteRoot + 'api/v2.1/groups/';
|
||||||
case 'all_groups': return siteRoot + 'api/v2.1/groups/all/';
|
case 'shareable_groups': return siteRoot + 'api/v2.1/shareable-groups/';
|
||||||
case 'search_group': return siteRoot + 'api/v2.1/search-group/';
|
case 'search_group': return siteRoot + 'api/v2.1/search-group/';
|
||||||
case 'group': return siteRoot + 'api/v2.1/groups/' + options.group_id + '/';
|
case 'group': return siteRoot + 'api/v2.1/groups/' + options.group_id + '/';
|
||||||
case 'group_members': return siteRoot + 'api/v2.1/groups/' + options.group_id + '/members/';
|
case 'group_members': return siteRoot + 'api/v2.1/groups/' + options.group_id + '/members/';
|
||||||
|
@ -1,36 +0,0 @@
|
|||||||
# Copyright (c) 2011-2016 Seafile Ltd.
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
import json
|
|
||||||
|
|
||||||
from django.core.urlresolvers import reverse
|
|
||||||
|
|
||||||
from seahub.test_utils import BaseTestCase
|
|
||||||
|
|
||||||
from constance import config
|
|
||||||
|
|
||||||
|
|
||||||
class GroupsShareTest(BaseTestCase):
|
|
||||||
def test_can_get(self):
|
|
||||||
config.ENABLE_SHARE_TO_ALL_GROUPS = 1
|
|
||||||
self.login_as(self.admin)
|
|
||||||
self.admin_group = self.create_group(group_name='test_group',
|
|
||||||
username=self.admin.username)
|
|
||||||
self.logout()
|
|
||||||
self.login_as(self.user)
|
|
||||||
resp = [group["name"] for group in
|
|
||||||
json.loads(self.client.get(reverse('api-v2.1-all-groups')).content)]
|
|
||||||
self.assertIn('test_group', resp)
|
|
||||||
self.clear_cache()
|
|
||||||
|
|
||||||
def test_can_get_with_disable_config(self):
|
|
||||||
config.ENABLE_SHARE_TO_ALL_GROUPS = 0
|
|
||||||
self.login_as(self.admin)
|
|
||||||
self.admin_group = self.create_group(group_name='test_disable_config',
|
|
||||||
username=self.admin.username)
|
|
||||||
resp = json.loads(self.client.get(reverse('api-v2.1-all-groups')).content)
|
|
||||||
self.assertEqual([], resp)
|
|
||||||
self.clear_cache()
|
|
||||||
|
|
||||||
def tearDown(self):
|
|
||||||
self.remove_group(self.admin_group.id)
|
|
||||||
|
|
59
tests/api/endpoints/test_shareable_groups.py
Normal file
59
tests/api/endpoints/test_shareable_groups.py
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
# Copyright (c) 2011-2016 Seafile Ltd.
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
import json
|
||||||
|
from django.core.urlresolvers import reverse
|
||||||
|
from seahub.test_utils import BaseTestCase
|
||||||
|
from tests.common.utils import randstring
|
||||||
|
from constance import config
|
||||||
|
|
||||||
|
|
||||||
|
class ShareableGroupsTest(BaseTestCase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
self.login_as(self.user)
|
||||||
|
self.group_id = self.group.id
|
||||||
|
self.group_name = self.group.group_name
|
||||||
|
self.admin_user = self.admin.username
|
||||||
|
|
||||||
|
self.url = reverse('api-v2.1-shareable-groups')
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
self.remove_group()
|
||||||
|
self.remove_repo()
|
||||||
|
|
||||||
|
def test_can_get(self):
|
||||||
|
|
||||||
|
config.ENABLE_SHARE_TO_ALL_GROUPS = 1
|
||||||
|
|
||||||
|
admin_group_name = randstring(10)
|
||||||
|
admin_group = self.create_group(group_name=admin_group_name,
|
||||||
|
username=self.admin_user)
|
||||||
|
|
||||||
|
resp = self.client.get(self.url)
|
||||||
|
self.assertEqual(200, resp.status_code)
|
||||||
|
json_resp = json.loads(resp.content)
|
||||||
|
group_names = [g["name"] for g in json_resp]
|
||||||
|
self.assertIn(admin_group_name, group_names)
|
||||||
|
self.assertIn(self.group.group_name, group_names)
|
||||||
|
|
||||||
|
|
||||||
|
self.remove_group(admin_group.group_id)
|
||||||
|
self.clear_cache()
|
||||||
|
|
||||||
|
def test_can_get_with_disable_config(self):
|
||||||
|
|
||||||
|
config.ENABLE_SHARE_TO_ALL_GROUPS = 0
|
||||||
|
|
||||||
|
admin_group_name = randstring(10)
|
||||||
|
admin_group = self.create_group(group_name=admin_group_name,
|
||||||
|
username=self.admin_user)
|
||||||
|
|
||||||
|
resp = self.client.get(self.url)
|
||||||
|
self.assertEqual(200, resp.status_code)
|
||||||
|
json_resp = json.loads(resp.content)
|
||||||
|
group_names = [g["name"] for g in json_resp]
|
||||||
|
self.assertIn(self.group.group_name, group_names)
|
||||||
|
self.assertNotIn(admin_group_name, group_names)
|
||||||
|
|
||||||
|
self.remove_group(admin_group.group_id)
|
||||||
|
self.clear_cache()
|
Loading…
Reference in New Issue
Block a user