diff --git a/seahub/api2/endpoints/all_groups.py b/seahub/api2/endpoints/all_groups.py new file mode 100644 index 0000000000..ebb9a97ed7 --- /dev/null +++ b/seahub/api2/endpoints/all_groups.py @@ -0,0 +1,32 @@ +# 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 + + +class AllGroupsView(APIView): + authentication_classes = (TokenAuthentication, SessionAuthentication) + permission_classes = (IsAuthenticated,) + throttle_classes = (UserRateThrottle, ) + + def get(self, request): + """List all groups + """ + groups_list = ccnet_api.get_all_groups(-1, -1) + 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) diff --git a/seahub/settings.py b/seahub/settings.py index 0a1e97db4a..f108fb3d50 100644 --- a/seahub/settings.py +++ b/seahub/settings.py @@ -315,6 +315,9 @@ DISABLE_SYNC_WITH_ANY_FOLDER = False ENABLE_TERMS_AND_CONDITIONS = False +# Enable or disable sharing to all groups +ENABLE_SHARE_TO_ALL_GROUPS = False + # File preview FILE_PREVIEW_MAX_SIZE = 30 * 1024 * 1024 OFFICE_PREVIEW_MAX_SIZE = 2 * 1024 * 1024 @@ -700,4 +703,5 @@ CONSTANCE_CONFIG = { 'ENABLE_TWO_FACTOR_AUTH': (ENABLE_TWO_FACTOR_AUTH,''), 'TEXT_PREVIEW_EXT': (TEXT_PREVIEW_EXT, ''), + 'ENABLE_SHARE_TO_ALL_GROUPS': (ENABLE_SHARE_TO_ALL_GROUPS, ''), } diff --git a/seahub/templates/libraries.html b/seahub/templates/libraries.html index 6ded0e89b5..62d0ba57ee 100644 --- a/seahub/templates/libraries.html +++ b/seahub/templates/libraries.html @@ -290,7 +290,8 @@ app["pageOptions"] = { is_pro: {% if is_pro %} true {% else %} false {% endif %}, file_audit_enabled: {% if file_audit_enabled %} true {% else %} false {% endif %}, enable_repo_snapshot_label: {% if enable_repo_snapshot_label %} true {% else %} false {% endif %}, - cur_note: {% if request.cur_note %} {'id': '{{ request.cur_note.id }}'} {% else %} null {% endif %} + cur_note: {% if request.cur_note %} {'id': '{{ request.cur_note.id }}'} {% else %} null {% endif %}, + enable_share_to_all_groups: {% if enable_share_to_all_groups %} true {% else %} false {% endif %} }; app.ui = { currentDropdown: null, diff --git a/seahub/templates/sysadmin/settings.html b/seahub/templates/sysadmin/settings.html index aa4e246f68..2787f16c5e 100644 --- a/seahub/templates/sysadmin/settings.html +++ b/seahub/templates/sysadmin/settings.html @@ -69,6 +69,11 @@ {% include "snippets/web_settings_form.html" %} {% endwith %} + {% with type="checkbox" setting_display_name="ENABLE_SHARE_TO_ALL_GROUPS" setting_name="ENABLE_SHARE_TO_ALL_GROUPS" setting_val=config_dict.ENABLE_SHARE_TO_ALL_GROUPS %} + {% trans "Enable share library to all groups" as help_tip %} + {% include "snippets/web_settings_form.html" %} + {% endwith %} +

{% trans "Password" %}

diff --git a/seahub/urls.py b/seahub/urls.py index 96ebf6702f..dc64d6c956 100644 --- a/seahub/urls.py +++ b/seahub/urls.py @@ -19,6 +19,7 @@ from seahub.views.sysadmin import * from seahub.views.ajax import * from seahub.views.sso import * from seahub.api2.endpoints.groups import Groups, Group +from seahub.api2.endpoints.all_groups import AllGroupsView from seahub.api2.endpoints.group_members import GroupMembers, GroupMembersBulk, GroupMember from seahub.api2.endpoints.search_group import SearchGroup from seahub.api2.endpoints.share_links import ShareLinks, ShareLink @@ -194,6 +195,7 @@ urlpatterns = patterns( ## user::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\d+)/$', Group.as_view(), name='api-v2.1-group'), url(r'^api/v2.1/groups/(?P\d+)/members/$', GroupMembers.as_view(), name='api-v2.1-group-members'), url(r'^api/v2.1/groups/(?P\d+)/members/bulk/$', GroupMembersBulk.as_view(), name='api-v2.1-group-members-bulk'), diff --git a/seahub/views/__init__.py b/seahub/views/__init__.py index ef4fcd3107..00569eecae 100644 --- a/seahub/views/__init__.py +++ b/seahub/views/__init__.py @@ -774,7 +774,8 @@ def libraries(request): 'can_add_pub_repo': can_add_pub_repo, 'joined_groups': joined_groups, 'library_templates': LIBRARY_TEMPLATES.keys() if \ - isinstance(LIBRARY_TEMPLATES, dict) else [] + isinstance(LIBRARY_TEMPLATES, dict) else [], + 'enable_share_to_all_groups': config.ENABLE_SHARE_TO_ALL_GROUPS }, context_instance=RequestContext(request)) @login_required diff --git a/seahub/views/sysadmin.py b/seahub/views/sysadmin.py index 3677e43bcd..9888b6ba5f 100644 --- a/seahub/views/sysadmin.py +++ b/seahub/views/sysadmin.py @@ -1939,6 +1939,7 @@ def sys_settings(request): 'USER_PASSWORD_STRENGTH_LEVEL', 'SHARE_LINK_PASSWORD_MIN_LENGTH', 'ENABLE_USER_CREATE_ORG_REPO', 'FORCE_PASSWORD_CHANGE', 'LOGIN_ATTEMPT_LIMIT', 'FREEZE_USER_ON_LOGIN_FAILED', + 'ENABLE_SHARE_TO_ALL_GROUPS' ] if HAS_TWO_FACTOR_AUTH: diff --git a/static/scripts/app/views/share.js b/static/scripts/app/views/share.js index 011ee4d47e..dcff2d6dbc 100644 --- a/static/scripts/app/views/share.js +++ b/static/scripts/app/views/share.js @@ -638,16 +638,54 @@ define([ }); $add_item.after(new_item.el); }); - - var groups = app.pageOptions.groups || []; - var g_opts = ''; - for (var i = 0, len = groups.length; i < len; i++) { - g_opts += ''; + if (app.pageOptions.enable_share_to_all_groups){ + $.ajax({ + url: Common.getUrl({ + name: 'all_groups' + }), + type: 'GET', + dataType: 'json', + cache: false, + success: function(data){ + var groups = []; + for (var i = 0, len = data.length; i < len; i++) { + groups.push({ + 'id': data[i].id, + 'name': data[i].name + }); + } + groups.sort(function(a, b) { + return Common.compareTwoWord(a.name, b.name); + }); + var g_opts = ''; + for (var i = 0, len = groups.length; i < len; i++) { + g_opts += ''; + } + $('[name="groups"]', $add_item).html(g_opts).select2({ + placeholder: gettext("Select groups"), + escapeMarkup: function(m) { return m; } + }) + }, + error: function(xhr, textStatus, errorThrown) { + var g_opts = ''; + $('[name="groups"]', $add_item).html(g_opts).select2({ + placeholder: gettext("Please check network"), + }); + var $submitBtn = $('[type="submit"]', $add_item); + Common.disableButton($submitBtn); + } + }); + } else { + var groups = app.pageOptions.groups || []; + var g_opts = ''; + for (var i = 0, len = groups.length; i < len; i++) { + g_opts += ''; + } + $('[name="groups"]', $add_item).html(g_opts).select2({ + placeholder: gettext("Select groups"), + escapeMarkup: function(m) { return m; } + }); } - $('[name="groups"]', $add_item).html(g_opts).select2({ - placeholder: gettext("Select groups"), - escapeMarkup: function(m) { return m; } - }); $table.removeClass('hide'); }, diff --git a/static/scripts/common.js b/static/scripts/common.js index 1597747ae5..7b1db6a956 100644 --- a/static/scripts/common.js +++ b/static/scripts/common.js @@ -142,6 +142,7 @@ define([ // Group case 'groups': return siteRoot + 'api/v2.1/groups/'; + case 'all_groups': return siteRoot + 'api/v2.1/groups/all/'; case 'search_group': return siteRoot + 'api/v2.1/search-group/'; case 'group': return siteRoot + 'api/v2.1/groups/' + options.group_id + '/'; case 'group_members': return siteRoot + 'api/v2.1/groups/' + options.group_id + '/members/'; diff --git a/tests/api/endpoints/test_all_groups.py b/tests/api/endpoints/test_all_groups.py new file mode 100644 index 0000000000..19f1c514e9 --- /dev/null +++ b/tests/api/endpoints/test_all_groups.py @@ -0,0 +1,27 @@ +# Copyright (c) 2011-2016 Seafile Ltd. +# -*- coding: utf-8 -*- +import json +from mock import patch + +from django.core.urlresolvers import reverse + +from seahub.test_utils import BaseTestCase + + +class GroupsShareTest(BaseTestCase): + + @patch('seahub.api2.endpoints.groups_share.config') + def test_can_get(self, mock_settings): + mock_settings.ENABLE_SHARE_ANY_GROUPS.return_value = True + self.logout() + self.login_as(self.admin) + self.admin_group = self.create_group(group_name='onetoone', + 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('onetoone', resp) + + def tearDown(self): + self.remove_group(self.admin_group.id)