diff --git a/media/scripts/app/views/myhome-shared-repos.js b/media/scripts/app/views/myhome-shared-repos.js index 7d36f8de86..adb641f6d3 100644 --- a/media/scripts/app/views/myhome-shared-repos.js +++ b/media/scripts/app/views/myhome-shared-repos.js @@ -13,11 +13,11 @@ define([ initialize: function(options) { this.$tabs = $('#repo-tabs'); - this.$table = this.$('#repos-shared-to-me table'); + this.$table = $('#repos-shared-to-me table'); this.$tableHead = $('thead', this.$table); this.$tableBody = $('tbody', this.$table); this.$loadingTip = $('.loading-tip', this.$tabs); - this.$emptyTip = $('.empty-tips', this.tabs); + this.$emptyTip = $('#repos-shared-to-me .empty-tips'); this.repos = new RepoCollection({type: 'shared'}); this.listenTo(this.repos, 'add', this.addOne); @@ -25,7 +25,7 @@ define([ }, addOne: function(repo, collection, options) { - var view = new SharedRepoView({model: repo}); + var view = new SharedRepoView({model: repo, collection: this.repos}); if (options.prepend) { this.$tableBody.prepend(view.render().el); } else { @@ -69,7 +69,6 @@ define([ $('#shared-lib-tab', this.$tabs).parent().removeClass('ui-state-active'); }, - }); return SharedReposView; diff --git a/media/scripts/app/views/shared-repo.js b/media/scripts/app/views/shared-repo.js index 676843f173..e17054517d 100644 --- a/media/scripts/app/views/shared-repo.js +++ b/media/scripts/app/views/shared-repo.js @@ -15,12 +15,33 @@ define([ events: { 'mouseenter': 'showAction', 'mouseleave': 'hideAction', - 'click .repo-delete-btn': 'delete', - 'click .repo-share-btn': 'share' + 'click .unshare-btn': 'removeShare' }, initialize: function() { - this.listenTo(this.model, 'destroy', this.remove); + }, + + removeShare: function(e) { + var _this = this, + after_leave_success = function(data) { + Common.feedback(gettext('Success'), 'success', Common.SUCCESS_TIMOUT); + _this.$el.remove(); + _this.collection.remove(_this.model, {silent: true}); + if (_this.collection.length == 0) { + $('#repos-shared-to-me table').hide(); + $('#repos-shared-to-me .empty-tips').show(); + }; + }; + + Common.ajaxGet({ + 'get_url': Common.getUrl({name: 'ajax_repo_remove_share'}), + 'data': { + 'repo_id': this.model.get('id'), + 'from': this.model.get('owner'), + 'share_type': this.model.get('share_type') + }, + 'after_op_success': after_leave_success + }); }, render: function() { @@ -37,8 +58,6 @@ define([ this.$el.removeClass('hl'); this.$el.find('.op-icon').addClass('vh'); }, - - }); return SharedRepoView; diff --git a/media/scripts/common.js b/media/scripts/common.js index f8dc903d17..421f5e60e9 100644 --- a/media/scripts/common.js +++ b/media/scripts/common.js @@ -78,6 +78,8 @@ define([ case 'cancel_cp': return siteRoot + 'ajax/cancel_cp/'; case 'get_shared_link': return ''; case 'get_shared_upload_link': return ''; + + case 'ajax_repo_remove_share': return siteRoot + 'share/ajax/repo_remove_share/'; } }, @@ -188,6 +190,36 @@ define([ } }, + ajaxGet: function(params) { + var _this = this, + get_url = params.get_url, + data = params.data, + after_op_error, + after_op_success = params.after_op_success; + + if (params.hasOwnProperty('after_op_error')) { + after_op_error = params.after_op_error; + } else { + after_op_error = function(xhr, textStatus, errorThrown) { + var err; + if (xhr.responseText) { + err = $.parseJSON(xhr.responseText).error; + } else { + err = gettext("Failed. Please check the network."); + } + _this.feedback(err, 'error', _this.ERROR_TIMEOUT); + } + }; + $.ajax({ + url: get_url, + cache: false, + dataType: 'json', + data: data, + success: function(data) {after_op_success(data);}, + error: after_op_error + }); + }, + ajaxPost: function(params) { var form = params.form, post_url = params.post_url, @@ -212,7 +244,7 @@ define([ if (xhr.responseText) { err = $.parseJSON(xhr.responseText).error; } else { - err = getText("Failed. Please check the network."); + err = gettext("Failed. Please check the network."); } this.feedback(err); this.enableButton(submit_btn); diff --git a/seahub/api2/views.py b/seahub/api2/views.py index 9bb18bd97d..882d15bee6 100644 --- a/seahub/api2/views.py +++ b/seahub/api2/views.py @@ -574,6 +574,7 @@ class Repos(APIView): "size":r.size, "encrypted":r.encrypted, "permission": r.user_perm, + "share_type": r.share_type, } if r.encrypted: repo["enc_version"] = r.enc_version diff --git a/seahub/share/urls.py b/seahub/share/urls.py index ff72cf62d8..889ddc004c 100644 --- a/seahub/share/urls.py +++ b/seahub/share/urls.py @@ -32,5 +32,6 @@ urlpatterns = patterns('', # url('^remove/(?P[^/]{24,24})/$', remove_anonymous_share, name='remove_anonymous_share'), # url('^(?P[^/]{24})/$', anonymous_share_confirm, name='anonymous_share_confirm'), - + + url(r'^ajax/repo_remove_share/$', ajax_repo_remove_share, name='ajax_repo_remove_share'), ) diff --git a/seahub/share/views.py b/seahub/share/views.py index e5568cfa06..873efca3bc 100644 --- a/seahub/share/views.py +++ b/seahub/share/views.py @@ -19,7 +19,7 @@ from django.utils.html import escape import seaserv from seaserv import seafile_api from seaserv import ccnet_threaded_rpc, is_org_group, \ - get_org_id_by_group, del_org_group_repo + get_org_id_by_group, del_org_group_repo, unset_inner_pub_repo from pysearpc import SearpcError from seahub.share.forms import RepoShareForm, FileLinkShareForm, \ @@ -288,6 +288,92 @@ def share_repo(request): return HttpResponseRedirect(next) +@login_required_ajax +def ajax_repo_remove_share(request): + """ + Remove repo share if this repo is shared to user/group/public + """ + + repo_id = request.GET.get('repo_id', None) + share_type = request.GET.get('share_type', None) + content_type = 'application/json; charset=utf-8' + + if not seafile_api.get_repo(repo_id): + return HttpResponse(json.dumps({'error': _(u'Library does not exist')}), status=400, + content_type=content_type) + + username = request.user.username + + if share_type == 'personal': + + from_email = request.GET.get('from', None) + if not is_valid_username(from_email): + return HttpResponse(json.dumps({'error': _(u'Invalid argument')}), status=400, + content_type=content_type) + + if is_org_context(request): + org_id = request.user.org.org_id + org_remove_share(org_id, repo_id, from_email, username) + else: + seaserv.remove_share(repo_id, from_email, username) + return HttpResponse(json.dumps({'success': True}), status=200, + content_type=content_type) + + elif share_type == 'group': + + from_email = request.GET.get('from', None) + if not is_valid_username(from_email): + return HttpResponse(json.dumps({'error': _(u'Invalid argument')}), status=400, + content_type=content_type) + + group_id = request.GET.get('group_id', None) + group = seaserv.get_group(group_id) + if not group: + return HttpResponse(json.dumps({'error': _(u"Group does not exist")}), status=400, + content_type=content_type) + + if seaserv.check_group_staff(group_id, username) or \ + seafile_api.is_repo_owner(username, repo_id): + if is_org_group(group_id): + org_id = get_org_id_by_group(group_id) + del_org_group_repo(repo_id, org_id, group_id) + else: + seafile_api.unset_group_repo(repo_id, group_id, from_email) + return HttpResponse(json.dumps({'success': True}), status=200, + content_type=content_type) + else: + return HttpResponse(json.dumps({'error': _(u'Permission denied')}), status=400, + content_type=content_type) + + elif share_type == 'public': + + if is_org_context(request): + + org_repo_owner = seafile_api.get_org_repo_owner(repo_id) + is_org_repo_owner = True if org_repo_owner == username else False + if request.user.org.is_staff or is_org_repo_owner: + org_id = request.user.org.org_id + seaserv.seafserv_threaded_rpc.unset_org_inner_pub_repo(org_id, + repo_id) + return HttpResponse(json.dumps({'success': True}), status=200, + content_type=content_type) + else: + return HttpResponse(json.dumps({'error': _(u'Permission denied')}), status=400, + content_type=content_type) + + else: + if seafile_api.is_repo_owner(username, repo_id) or \ + request.user.is_staff: + unset_inner_pub_repo(repo_id) + return HttpResponse(json.dumps({'success': True}), status=200, + content_type=content_type) + else: + return HttpResponse(json.dumps({'error': _(u'Permission denied')}), status=400, + content_type=content_type) + else: + return HttpResponse(json.dumps({'error': _(u'Invalid argument')}), status=400, + content_type=content_type) + @login_required def repo_remove_share(request): """ diff --git a/seahub/templates/js/shared-repo.html b/seahub/templates/js/shared-repo.html index 8da0553ab3..2d195b13db 100644 --- a/seahub/templates/js/shared-repo.html +++ b/seahub/templates/js/shared-repo.html @@ -1,18 +1,19 @@ {% load i18n %} - <% if (encrypted) { %> - directory icon - <% } else { %> - directory icon - <% } %> + <% if (encrypted) { %> + {% trans + <% } else { %> + <% if (permission == 'rw') { %> + {% trans + <% } else { %> + {% trans + <% } %> + <% } %> <%- name %> <%- desc %> <%- mtime_relative %> - +<%- owner %> -
- - -
+ diff --git a/seahub/templates/myhome.html b/seahub/templates/myhome.html index be50bedb64..a33dfef617 100644 --- a/seahub/templates/myhome.html +++ b/seahub/templates/myhome.html @@ -113,7 +113,7 @@ -
+
@@ -127,6 +127,9 @@
+
+

{% trans "No library is shared to you" %}

+
{% trans 'Loading...' %}