1
0
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:
xiez
2017-08-11 13:32:12 +08:00
committed by GitHub
10 changed files with 132 additions and 12 deletions

View 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)

View File

@@ -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, ''),
}

View File

@@ -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,

View File

@@ -70,6 +70,14 @@
{% 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>
{% with type="checkbox" setting_name="USER_STRONG_PASSWORD_REQUIRED" setting_val=config_dict.USER_STRONG_PASSWORD_REQUIRED %}

View File

@@ -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
@@ -195,6 +196,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<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/bulk/$', GroupMembersBulk.as_view(), name='api-v2.1-group-members-bulk'),

View File

@@ -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

View File

@@ -1960,6 +1960,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:

View File

@@ -639,17 +639,60 @@ 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 += '<option value="' + groups[i].id + '" data-index="' + i + '">' + groups[i].name + '</option>';
var groups = [];
var prepareGroupsSelector = function() {
var g_opts = '';
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) {
var err_msg;

View File

@@ -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/';

View 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)