mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-07 01:41:39 +00:00
show/delete shared repo
This commit is contained in:
@@ -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;
|
||||
|
@@ -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;
|
||||
|
@@ -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);
|
||||
|
@@ -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
|
||||
|
@@ -33,4 +33,5 @@ urlpatterns = patterns('',
|
||||
# url('^remove/(?P<token>[^/]{24,24})/$', remove_anonymous_share, name='remove_anonymous_share'),
|
||||
# url('^(?P<token>[^/]{24})/$', anonymous_share_confirm, name='anonymous_share_confirm'),
|
||||
|
||||
url(r'^ajax/repo_remove_share/$', ajax_repo_remove_share, name='ajax_repo_remove_share'),
|
||||
)
|
||||
|
@@ -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):
|
||||
"""
|
||||
|
@@ -1,18 +1,19 @@
|
||||
{% load i18n %}
|
||||
<td>
|
||||
<% if (encrypted) { %>
|
||||
<img src="{{ MEDIA_URL }}img/sync-folder-encrypt-20.png" title="{% trans 'Read-Write' %}" alt="directory icon" />
|
||||
<% } else { %>
|
||||
<img src="{{ MEDIA_URL }}img/sync-folder-20.png" title="Read-Write" alt="directory icon" />
|
||||
<% } %>
|
||||
<% if (encrypted) { %>
|
||||
<img src="{{MEDIA_URL}}img/sync-folder-encrypt-20.png" title="{% trans "Read-Write" %}" alt="{% trans "directory icon" %}" />
|
||||
<% } else { %>
|
||||
<% if (permission == 'rw') { %>
|
||||
<img src="{{MEDIA_URL}}img/sync-folder-20.png?t=1387267140" title="{% trans "Read-Write" %}" alt="{% trans "directory icon" %}" />
|
||||
<% } else { %>
|
||||
<img src="{{MEDIA_URL}}img/folder-no-write-20.png?t=1387267140" title="{% trans "Read-Only" %}" alt="{% trans "directory icon" %}" />
|
||||
<% } %>
|
||||
<% } %>
|
||||
</td>
|
||||
<td><a href="#shared-libs/lib/<%= id %>"><%- name %></a></td>
|
||||
<td><%- desc %></td>
|
||||
<td><%- mtime_relative %></td>
|
||||
<td></td>
|
||||
<td><%- owner %></td>
|
||||
<td>
|
||||
<div>
|
||||
<img src="{{ MEDIA_URL }}img/share_20.png" alt="" class="repo-share-btn op-icon vh" title="Share" />
|
||||
<img src="{{ MEDIA_URL }}img/rm.png" class="repo-delete-btn op-icon vh" title="Delete" />
|
||||
</div>
|
||||
<span class="icon-trash unshare-btn op-icon vh" title="{% trans "Leave Share" %}"></span>
|
||||
</td>
|
||||
|
@@ -113,7 +113,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="repos-shared-to-me" class="hide">
|
||||
<div id="repos-shared-to-me">
|
||||
<table class="hide">
|
||||
<thead>
|
||||
<tr>
|
||||
@@ -127,6 +127,9 @@
|
||||
</thead>
|
||||
<tbody></tbody>
|
||||
</table>
|
||||
<div class="empty-tips hide">
|
||||
<h2 class="alc">{% trans "No library is shared to you" %}</h2>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<img class="loading-tip" src="{{MEDIA_URL}}img/loading-icon.gif" alt="{% trans 'Loading...' %}" />
|
||||
|
Reference in New Issue
Block a user