mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-20 02:48:51 +00:00
Merge pull request #1743 from haiwen/master-sharing-groups
[ share-repo ] can share repo to any groups
This commit is contained in:
32
seahub/api2/endpoints/all_groups.py
Normal file
32
seahub/api2/endpoints/all_groups.py
Normal file
@@ -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)
|
@@ -315,6 +315,9 @@ DISABLE_SYNC_WITH_ANY_FOLDER = False
|
|||||||
|
|
||||||
ENABLE_TERMS_AND_CONDITIONS = False
|
ENABLE_TERMS_AND_CONDITIONS = False
|
||||||
|
|
||||||
|
# Enable or disable sharing to all groups
|
||||||
|
ENABLE_SHARE_TO_ALL_GROUPS = False
|
||||||
|
|
||||||
# File preview
|
# File preview
|
||||||
FILE_PREVIEW_MAX_SIZE = 30 * 1024 * 1024
|
FILE_PREVIEW_MAX_SIZE = 30 * 1024 * 1024
|
||||||
OFFICE_PREVIEW_MAX_SIZE = 2 * 1024 * 1024
|
OFFICE_PREVIEW_MAX_SIZE = 2 * 1024 * 1024
|
||||||
@@ -700,4 +703,5 @@ CONSTANCE_CONFIG = {
|
|||||||
'ENABLE_TWO_FACTOR_AUTH': (ENABLE_TWO_FACTOR_AUTH,''),
|
'ENABLE_TWO_FACTOR_AUTH': (ENABLE_TWO_FACTOR_AUTH,''),
|
||||||
|
|
||||||
'TEXT_PREVIEW_EXT': (TEXT_PREVIEW_EXT, ''),
|
'TEXT_PREVIEW_EXT': (TEXT_PREVIEW_EXT, ''),
|
||||||
|
'ENABLE_SHARE_TO_ALL_GROUPS': (ENABLE_SHARE_TO_ALL_GROUPS, ''),
|
||||||
}
|
}
|
||||||
|
@@ -290,7 +290,8 @@ app["pageOptions"] = {
|
|||||||
is_pro: {% if is_pro %} true {% else %} false {% endif %},
|
is_pro: {% if is_pro %} true {% else %} false {% endif %},
|
||||||
file_audit_enabled: {% if file_audit_enabled %} 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 %},
|
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 = {
|
app.ui = {
|
||||||
currentDropdown: null,
|
currentDropdown: null,
|
||||||
|
@@ -70,6 +70,14 @@
|
|||||||
{% endwith %}
|
{% endwith %}
|
||||||
|
|
||||||
|
|
||||||
|
<h4>{% trans "Groups" %}</h4>
|
||||||
|
|
||||||
|
{% 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 users to share libraries to any groups in the system." as help_tip %}
|
||||||
|
{% include "snippets/web_settings_form.html" %}
|
||||||
|
{% endwith %}
|
||||||
|
|
||||||
|
|
||||||
<h4>{% trans "Password" %}</h4>
|
<h4>{% trans "Password" %}</h4>
|
||||||
|
|
||||||
{% with type="checkbox" setting_name="USER_STRONG_PASSWORD_REQUIRED" setting_val=config_dict.USER_STRONG_PASSWORD_REQUIRED %}
|
{% with type="checkbox" setting_name="USER_STRONG_PASSWORD_REQUIRED" setting_val=config_dict.USER_STRONG_PASSWORD_REQUIRED %}
|
||||||
|
@@ -19,6 +19,7 @@ from seahub.views.sysadmin import *
|
|||||||
from seahub.views.ajax import *
|
from seahub.views.ajax import *
|
||||||
from seahub.views.sso import *
|
from seahub.views.sso import *
|
||||||
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.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
|
||||||
from seahub.api2.endpoints.share_links import ShareLinks, ShareLink
|
from seahub.api2.endpoints.share_links import ShareLinks, ShareLink
|
||||||
@@ -195,6 +196,7 @@ urlpatterns = patterns(
|
|||||||
|
|
||||||
## user::groups
|
## user::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+)/members/$', GroupMembers.as_view(), name='api-v2.1-group-members'),
|
url(r'^api/v2.1/groups/(?P<group_id>\d+)/members/$', GroupMembers.as_view(), name='api-v2.1-group-members'),
|
||||||
url(r'^api/v2.1/groups/(?P<group_id>\d+)/members/bulk/$', GroupMembersBulk.as_view(), name='api-v2.1-group-members-bulk'),
|
url(r'^api/v2.1/groups/(?P<group_id>\d+)/members/bulk/$', GroupMembersBulk.as_view(), name='api-v2.1-group-members-bulk'),
|
||||||
|
@@ -774,7 +774,8 @@ def libraries(request):
|
|||||||
'can_add_pub_repo': can_add_pub_repo,
|
'can_add_pub_repo': can_add_pub_repo,
|
||||||
'joined_groups': joined_groups,
|
'joined_groups': joined_groups,
|
||||||
'library_templates': LIBRARY_TEMPLATES.keys() if \
|
'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))
|
}, context_instance=RequestContext(request))
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
|
@@ -1960,6 +1960,7 @@ def sys_settings(request):
|
|||||||
'USER_PASSWORD_STRENGTH_LEVEL', 'SHARE_LINK_PASSWORD_MIN_LENGTH',
|
'USER_PASSWORD_STRENGTH_LEVEL', 'SHARE_LINK_PASSWORD_MIN_LENGTH',
|
||||||
'ENABLE_USER_CREATE_ORG_REPO', 'FORCE_PASSWORD_CHANGE',
|
'ENABLE_USER_CREATE_ORG_REPO', 'FORCE_PASSWORD_CHANGE',
|
||||||
'LOGIN_ATTEMPT_LIMIT', 'FREEZE_USER_ON_LOGIN_FAILED',
|
'LOGIN_ATTEMPT_LIMIT', 'FREEZE_USER_ON_LOGIN_FAILED',
|
||||||
|
'ENABLE_SHARE_TO_ALL_GROUPS'
|
||||||
]
|
]
|
||||||
|
|
||||||
if HAS_TWO_FACTOR_AUTH:
|
if HAS_TWO_FACTOR_AUTH:
|
||||||
|
@@ -639,17 +639,60 @@ define([
|
|||||||
$add_item.after(new_item.el);
|
$add_item.after(new_item.el);
|
||||||
});
|
});
|
||||||
|
|
||||||
var groups = app.pageOptions.groups || [];
|
var groups = [];
|
||||||
var g_opts = '';
|
var prepareGroupsSelector = function() {
|
||||||
for (var i = 0, len = groups.length; i < len; i++) {
|
var g_opts = '';
|
||||||
g_opts += '<option value="' + groups[i].id + '" data-index="' + i + '">' + groups[i].name + '</option>';
|
for (var i = 0, len = groups.length; i < len; i++) {
|
||||||
|
g_opts += '<option value="' + groups[i].id + '" data-index="' + i + '">' + groups[i].name + '</option>';
|
||||||
|
}
|
||||||
|
$('[name="groups"]', $add_item).html(g_opts).select2({
|
||||||
|
placeholder: gettext("Select groups"),
|
||||||
|
escapeMarkup: function(m) { return m; }
|
||||||
|
});
|
||||||
|
};
|
||||||
|
if (app.pageOptions.enable_share_to_all_groups) {
|
||||||
|
$.ajax({
|
||||||
|
url: Common.getUrl({
|
||||||
|
name: 'all_groups'
|
||||||
|
}),
|
||||||
|
type: 'GET',
|
||||||
|
dataType: 'json',
|
||||||
|
cache: false,
|
||||||
|
success: function(data){
|
||||||
|
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);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
error: function(xhr, textStatus, errorThrown) {
|
||||||
|
var pre_msg = gettext("Failed to fetch groups:");
|
||||||
|
var err_msg;
|
||||||
|
if (xhr.responseText) {
|
||||||
|
if (xhr.status == 403) {
|
||||||
|
err_msg = gettext("Permission error");
|
||||||
|
} else {
|
||||||
|
err_msg = xhr.responseJSON.error_msg ? xhr.responseJSON.error_msg : gettext('Error');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
err_msg = gettext('Please check the network.');
|
||||||
|
}
|
||||||
|
$('.error', $panel).html(pre_msg + ' ' + err_msg).show();
|
||||||
|
},
|
||||||
|
complete: function() {
|
||||||
|
prepareGroupsSelector();
|
||||||
|
$table.removeClass('hide');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
groups = app.pageOptions.groups || [];
|
||||||
|
prepareGroupsSelector();
|
||||||
|
$table.removeClass('hide');
|
||||||
}
|
}
|
||||||
$('[name="groups"]', $add_item).html(g_opts).select2({
|
|
||||||
placeholder: gettext("Select groups"),
|
|
||||||
escapeMarkup: function(m) { return m; }
|
|
||||||
});
|
|
||||||
|
|
||||||
$table.removeClass('hide');
|
|
||||||
},
|
},
|
||||||
error: function(xhr, textStatus, errorThrown) {
|
error: function(xhr, textStatus, errorThrown) {
|
||||||
var err_msg;
|
var err_msg;
|
||||||
|
@@ -142,6 +142,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 '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/';
|
||||||
|
27
tests/api/endpoints/test_all_groups.py
Normal file
27
tests/api/endpoints/test_all_groups.py
Normal file
@@ -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)
|
Reference in New Issue
Block a user