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)