mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-21 11:27:18 +00:00
[repo del] rewrite with ajax; [sysadmin] improved 'set_quota' & 'repo transfer'
This commit is contained in:
@@ -55,16 +55,7 @@
|
|||||||
location.href = $(this).data('url');
|
location.href = $(this).data('url');
|
||||||
});
|
});
|
||||||
|
|
||||||
$('.repo-delete-btn').click(function() {
|
{% include 'snippets/repo_del_js.html' %}
|
||||||
var btn_ct = $(this).parent(),
|
|
||||||
repo_id = btn_ct.data('id'),
|
|
||||||
repo_name = btn_ct.attr('data-name');
|
|
||||||
$(this).data('url', '{{ SITE_ROOT }}repo/remove/' + repo_id + '/?next={{ request.path }}').data('target', repo_name);
|
|
||||||
});
|
|
||||||
addConfirmTo($('.repo-delete-btn'), {
|
|
||||||
'title':'{% trans "Delete Library" %}',
|
|
||||||
'con':'{% trans "Are you sure you want to delete %s ?" %}'
|
|
||||||
});
|
|
||||||
|
|
||||||
$(".download-btn").click(function() {
|
$(".download-btn").click(function() {
|
||||||
var repo_id = $(this).parent().data('id');
|
var repo_id = $(this).parent().data('id');
|
||||||
|
26
seahub/templates/snippets/repo_del_js.html
Normal file
26
seahub/templates/snippets/repo_del_js.html
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
{% load i18n %}
|
||||||
|
$('.repo-delete-btn').click(function() {
|
||||||
|
var btn_ct = $(this).parent(),
|
||||||
|
repo_id = btn_ct.data('id'),
|
||||||
|
repo_name = btn_ct.attr('data-name');
|
||||||
|
var popup = {
|
||||||
|
'title': "{% trans "Delete Library" %}",
|
||||||
|
'con': "{% trans "Are you sure you want to delete %s ?" %}"
|
||||||
|
};
|
||||||
|
var con = popup['con'].replace('%s', '<span class="op-target">' + repo_name + '</span>');
|
||||||
|
$('#confirm-con').html('<h3>' + popup['title'] + '</h3><p>' + con + '</p>');
|
||||||
|
$('#confirm-popup').modal({appendTo:'#main'});
|
||||||
|
$('#simplemodal-container').css({'height':'auto'});
|
||||||
|
$('#confirm-yes').click(function() {
|
||||||
|
$.ajax({
|
||||||
|
url: '{{ SITE_ROOT }}ajax/repo/' + repo_id + '/remove/',
|
||||||
|
dataType: 'json',
|
||||||
|
success: function(data) {
|
||||||
|
$.modal.close();
|
||||||
|
btn_ct.parents('tr').remove();
|
||||||
|
feedback("{% trans "Delete succeeded." %}", 'success');
|
||||||
|
},
|
||||||
|
error: ajaxErrorHandler
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
10
seahub/templates/sysadmin/repo_transfer_form.html
Normal file
10
seahub/templates/sysadmin/repo_transfer_form.html
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{% load i18n %}
|
||||||
|
<form id="repo-transfer-form" method="post" action="{% url 'sys_repo_transfer' %}" class="simple-input-popup hide">{% csrf_token %}
|
||||||
|
<h3>{% trans "Transfer Library"%}</h3>
|
||||||
|
<p class="detail">{% trans "Transfer %(lib_name) to:"%}</p>
|
||||||
|
<input type="text" name="email" placeholder="{% trans "Email" %}" value="" class="long-input" /><br />
|
||||||
|
<input type="hidden" name="repo_id" value="" />
|
||||||
|
<p class="error hide"></p>
|
||||||
|
<input type="submit" value="{% trans "Submit" %}" class="submit" />
|
||||||
|
<button class="simplemodal-close">{% trans "Cancel" %}</button>
|
||||||
|
</form>
|
@@ -1,16 +1,14 @@
|
|||||||
{% load i18n%}
|
{% load i18n%}
|
||||||
addConfirmTo($('.repo-delete-btn'), {
|
|
||||||
'title':'{% trans "Delete Library" %}',
|
|
||||||
'con':'{% trans "Are you sure you want to delete %s ?" %}'
|
|
||||||
});
|
|
||||||
|
|
||||||
$('.repo-transfer-btn').click(function(){
|
$('.repo-transfer-btn').click(function(){
|
||||||
var repo_id = $(this).data('id'),
|
var btn_ct = $(this).parent(),
|
||||||
repo_name = $(this).data('name'),
|
repo_id = btn_ct.data('id'),
|
||||||
|
repo_name = btn_ct.attr('data-name'),
|
||||||
form = $('#repo-transfer-form');
|
form = $('#repo-transfer-form');
|
||||||
|
|
||||||
$('#repo-transfer-form input[name="repo_id"]').val(repo_id);
|
|
||||||
form.modal({appendTo:'#main'});
|
form.modal({appendTo:'#main'});
|
||||||
|
$('input[name="repo_id"]', form).val(repo_id);
|
||||||
|
var detail = $('.detail', form);
|
||||||
|
detail.html(detail.html().replace('%(lib_name)', repo_name));
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -18,9 +16,11 @@ $('#repo-transfer-form').submit(function() {
|
|||||||
var form = $(this),
|
var form = $(this),
|
||||||
form_id = form.attr('id'),
|
form_id = form.attr('id'),
|
||||||
email = $.trim(form.children('[name="email"]').val());
|
email = $.trim(form.children('[name="email"]').val());
|
||||||
|
|
||||||
if (!email) {
|
if (!email) {
|
||||||
apply_form_error(form_id, "{% trans "Email cannot be blank" %}");
|
apply_form_error(form_id, "{% trans "Email cannot be blank" %}");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
form.submit();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
{% include 'snippets/repo_del_js.html' %}
|
||||||
|
@@ -13,11 +13,10 @@
|
|||||||
<td style="font-size:11px;">{{ repo.id }}</td>
|
<td style="font-size:11px;">{{ repo.id }}</td>
|
||||||
<td><a href="{{ SITE_ROOT }}useradmin/info/{{ repo.owner }}/">{{ repo.owner}}</a></td>
|
<td><a href="{{ SITE_ROOT }}useradmin/info/{{ repo.owner }}/">{{ repo.owner}}</a></td>
|
||||||
<td>{{ repo.props.desc }}</td>
|
<td>{{ repo.props.desc }}</td>
|
||||||
<td>
|
<td data-id="{{ repo.props.id }}" data-name="{{ repo.props.name }}">
|
||||||
<a href="#" data-url="{{ SITE_ROOT }}repo/remove/{{ repo.props.id }}/?next={{ request.path }}" data-target="{{ repo.props.name }}" class="repo-delete-btn op">{% trans "Delete" %}</a>
|
<a href="#" class="repo-delete-btn op">{% trans "Delete" %}</a>
|
||||||
<a href="#" data-id="{{repo.id}}" data-name="{{repo.name}}" class="repo-transfer-btn op">{% trans "Transfer" %}</a>
|
<a href="#" data-id="{{repo.id}}" data-name="{{repo.name}}" class="repo-transfer-btn op">{% trans "Transfer" %}</a>
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</table>
|
</table>
|
||||||
|
@@ -10,28 +10,16 @@
|
|||||||
</ul>
|
</ul>
|
||||||
<button class="icon-search fright" id="search-repo-btn"> {% trans "Search" %}</button>
|
<button class="icon-search fright" id="search-repo-btn"> {% trans "Search" %}</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block main_panel %}
|
{% block main_panel %}
|
||||||
{% if repos %}
|
{% if repos %}
|
||||||
{% include "sysadmin/repoadmin_table.html" %}
|
{% include "sysadmin/repoadmin_table.html" %}
|
||||||
|
|
||||||
{% else %}
|
{% else %}
|
||||||
<p>{% trans "Empty" %}</p>
|
<p>{% trans "None" %}</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<form id="repo-transfer-form" method="post" action="{% url 'sys_repo_transfer' %}" class="simple-input-popup hide">{% csrf_token %}
|
{% include "sysadmin/repo_transfer_form.html" %}
|
||||||
<h3>{% trans "Transfer Library"%}</h3>
|
|
||||||
<label>{% trans "Email" %}</label><br />
|
|
||||||
<input type="text" name="email" value="" class="long-input"/><br />
|
|
||||||
<input type="hidden" name="repo_id" value="" />
|
|
||||||
|
|
||||||
<p class="error hide"></p>
|
|
||||||
<input type="submit" value="{% trans "Submit" %}" class="submit" />
|
|
||||||
<button class="simplemodal-close">{% trans "Cancel" %}</button>
|
|
||||||
</form>
|
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block extra_script %}
|
{% block extra_script %}
|
||||||
@@ -40,7 +28,6 @@ $('#search-repo-btn').click(function() {
|
|||||||
location.href = "{% url 'sys_repo_search' %}";
|
location.href = "{% url 'sys_repo_search' %}";
|
||||||
});
|
});
|
||||||
{% include "sysadmin/repoadmin_js.html" %}
|
{% include "sysadmin/repoadmin_js.html" %}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
@@ -45,20 +45,10 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
<p>{% trans "Empty" %}</p>
|
<p>{% trans "None" %}</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<form id="repo-transfer-form" method="post" action="{% url 'sys_repo_transfer' %}" class="simple-input-popup hide">{% csrf_token %}
|
{% include "sysadmin/repo_transfer_form.html" %}
|
||||||
<h3>{% trans "Transfer Library"%}</h3>
|
|
||||||
<label>{% trans "Email" %}</label><br />
|
|
||||||
<input type="text" name="email" value="" class="long-input"/><br />
|
|
||||||
<input type="hidden" name="repo_id" value="" />
|
|
||||||
|
|
||||||
<p class="error hide"></p>
|
|
||||||
<input type="submit" value="{% trans "Submit" %}" class="submit" />
|
|
||||||
<button class="simplemodal-close">{% trans "Cancel" %}</button>
|
|
||||||
</form>
|
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block extra_script %}
|
{% block extra_script %}
|
||||||
|
@@ -14,22 +14,11 @@
|
|||||||
<h3>{% trans "Result"%}</h3>
|
<h3>{% trans "Result"%}</h3>
|
||||||
{% if repos %}
|
{% if repos %}
|
||||||
{% include "sysadmin/repoadmin_table.html" %}
|
{% include "sysadmin/repoadmin_table.html" %}
|
||||||
|
|
||||||
{% else %}
|
{% else %}
|
||||||
<p>{% trans "No result" %}</p>
|
<p>{% trans "No result" %}</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<form id="repo-transfer-form" method="post" action="{% url 'sys_repo_transfer' %}" class="simple-input-popup hide">{% csrf_token %}
|
{% include "sysadmin/repo_transfer_form.html" %}
|
||||||
<h3>{% trans "Transfer Library"%}</h3>
|
|
||||||
<label>{% trans "Email" %}</label><br />
|
|
||||||
<input type="text" name="email" value="" class="long-input"/><br />
|
|
||||||
<input type="hidden" name="repo_id" value="" />
|
|
||||||
|
|
||||||
<p class="error hide"></p>
|
|
||||||
<input type="submit" value="{% trans "Submit" %}" class="submit" />
|
|
||||||
<button class="simplemodal-close">{% trans "Cancel" %}</button>
|
|
||||||
</form>
|
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block extra_script %}
|
{% block extra_script %}
|
||||||
@@ -44,6 +33,5 @@ $('#search-repo-form').submit(function() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
{% include "sysadmin/repoadmin_js.html" %}
|
{% include "sysadmin/repoadmin_js.html" %}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@@ -29,7 +29,7 @@
|
|||||||
{% else %}
|
{% else %}
|
||||||
<p>{{ quota_usage|filesizeformat }} {% if quota > 0 %}/ {{ quota|filesizeformat }} {% endif %}</p>
|
<p>{{ quota_usage|filesizeformat }} {% if quota > 0 %}/ {{ quota|filesizeformat }} {% endif %}</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<a href="#" class="set-quota">{% trans "Set Quota" %}</a>
|
<a href="#" id="set-quota">{% trans "Set Quota" %}</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -51,14 +51,14 @@
|
|||||||
<td><img src="{{MEDIA_URL}}img/sync-folder-20.png" title="{% trans "Read-Write" %}" alt="{% trans "directory icon" %}" /></td>
|
<td><img src="{{MEDIA_URL}}img/sync-folder-20.png" title="{% trans "Read-Write" %}" alt="{% trans "directory icon" %}" /></td>
|
||||||
<td><a href="{{ SITE_ROOT }}repo/{{ repo.props.id }}/">{{ repo.props.name }}</a></td>
|
<td><a href="{{ SITE_ROOT }}repo/{{ repo.props.id }}/">{{ repo.props.name }}</a></td>
|
||||||
<td>{{ repo.props.desc }}</td>
|
<td>{{ repo.props.desc }}</td>
|
||||||
<td>
|
<td data-id="{{ repo.props.id }}" data-name="{{ repo.props.name }}">
|
||||||
<a href="#" data-url="{{ SITE_ROOT }}repo/remove/{{ repo.props.id }}/?next={{ request.path }}" data-target="{{ repo.props.name }}" class="remove-user-repo op">{% trans "Delete" %}</a>
|
<a href="#" class="repo-delete-btn op">{% trans "Delete" %}</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</table>
|
</table>
|
||||||
{% else %}
|
{% else %}
|
||||||
<p>{% trans "Empty" %}</p>
|
<p>{% trans "None" %}</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<h3>{% trans "Shared" %}</h3>
|
<h3>{% trans "Shared" %}</h3>
|
||||||
@@ -81,13 +81,13 @@
|
|||||||
{% endfor %}
|
{% endfor %}
|
||||||
</table>
|
</table>
|
||||||
{% else %}
|
{% else %}
|
||||||
<p>{% trans "Empty" %}</p>
|
<p>{% trans "None" %}</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<form id="set-quota-form" method="post" class="hide">{% csrf_token %}
|
<form id="set-quota-form" method="post" class="simple-input-popup hide">{% csrf_token %}
|
||||||
<label>{% trans "Set user storage limit" %}</label><br />
|
<h3>{% trans "Set user storage limit" %}</h3>
|
||||||
<input type="hidden" name="email" value="{{ email }}" />
|
<input type="hidden" name="email" value="{{ email }}" />
|
||||||
<input type="text" name="quota" /> MB <br />
|
<input type="text" name="quota" /> MB
|
||||||
<p class="tip">{% trans "Tip: 0 means default limit" %}</p>
|
<p class="tip">{% trans "Tip: 0 means default limit" %}</p>
|
||||||
<p class="error hide"></p>
|
<p class="error hide"></p>
|
||||||
<input type="submit" value="{% trans "Submit" %}" class="submit" />
|
<input type="submit" value="{% trans "Submit" %}" class="submit" />
|
||||||
@@ -99,46 +99,48 @@
|
|||||||
{% block extra_script %}
|
{% block extra_script %}
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
|
||||||
$('.set-quota').click(function() {
|
$('#set-quota').click(function() {
|
||||||
$("#set-quota-form").modal({appendTo: "#main"});
|
$("#set-quota-form").modal({appendTo: "#main"});
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
$('#set-quota-form .submit').click(function() {
|
$('#set-quota-form .submit').click(function() {
|
||||||
var self = $(this);
|
var form = $('#set-quota-form'),
|
||||||
self.attr('disabled', 'disabled');
|
form_id = form.attr('id');
|
||||||
|
|
||||||
|
var quota = $('input[name="quota"]', form).val();
|
||||||
|
if (!$.trim(quota)) {
|
||||||
|
apply_form_error(form_id, "{% trans "Quota can't be empty" %}");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var sb_btn = $(this);
|
||||||
|
disable(sb_btn);
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: '{% url 'user_info' email %}',
|
url: '{% url 'user_set_quota' email %}',
|
||||||
type: 'POST',
|
type: 'POST',
|
||||||
dataType: 'json',
|
dataType: 'json',
|
||||||
cache: 'false',
|
cache: 'false',
|
||||||
beforeSend: prepareCSRFToken,
|
beforeSend: prepareCSRFToken,
|
||||||
data: {
|
data: {
|
||||||
'email': $('#set-quota-form input[name="email"]').val(),
|
'email': $('input[name="email"]', form).val(),
|
||||||
'quota': $('#set-quota-form input[name="quota"]').val()
|
'quota': quota
|
||||||
},
|
},
|
||||||
success: function(data) {
|
success: function(data) {
|
||||||
if (data['success']) {
|
|
||||||
location.reload(true);
|
location.reload(true);
|
||||||
} else {
|
|
||||||
apply_form_error('set-quota-form', data['error']);
|
|
||||||
self.removeAttr('disabled');
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
error: function(data, textStatus, jqXHR) {
|
error: function(xhr, textStatus, errorThrown) {
|
||||||
var errors = $.parseJSON(data.responseText);
|
if (xhr.responseText) {
|
||||||
$.each(errors, function(index, value) {
|
apply_form_error(form_id, $.parseJSON(xhr.responseText).error);
|
||||||
apply_form_error('set-quota-form', value[0]);
|
} else {
|
||||||
});
|
apply_form_error(form_id, "{% trans "Failed. Please check the network." %}");
|
||||||
self.removeAttr('disabled');
|
}
|
||||||
|
enable(sb_btn);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
addConfirmTo($('.remove-user-repo'), {
|
{% include 'snippets/repo_del_js.html' %}
|
||||||
'title':'{% trans "Delete Library" %}',
|
|
||||||
'con':'{% trans "Are you sure you want to delete %s ?" %}'
|
|
||||||
});
|
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@@ -20,7 +20,7 @@ from seahub.views.sysadmin import sys_repo_admin, sys_user_admin, user_search,\
|
|||||||
sys_group_admin, user_info, user_add, user_remove, user_make_admin, \
|
sys_group_admin, user_info, user_add, user_remove, user_make_admin, \
|
||||||
user_remove_admin, user_reset, user_activate, sys_publink_admin, \
|
user_remove_admin, user_reset, user_activate, sys_publink_admin, \
|
||||||
sys_repo_search, sys_repo_transfer, sys_list_orphan, user_deactivate, \
|
sys_repo_search, sys_repo_transfer, sys_list_orphan, user_deactivate, \
|
||||||
user_toggle_status, sys_ldap_user_admin
|
user_toggle_status, user_set_quota, sys_ldap_user_admin
|
||||||
from seahub.views.ajax import *
|
from seahub.views.ajax import *
|
||||||
|
|
||||||
# Uncomment the next two lines to enable the admin:
|
# Uncomment the next two lines to enable the admin:
|
||||||
@@ -76,7 +76,6 @@ urlpatterns = patterns('',
|
|||||||
url(r'^repo/recycle/(?P<repo_id>[-0-9a-f]{36})/$', repo_recycle_view, name='repo_recycle_view'),
|
url(r'^repo/recycle/(?P<repo_id>[-0-9a-f]{36})/$', repo_recycle_view, name='repo_recycle_view'),
|
||||||
url(r'^repo/snapshot/view/(?P<repo_id>[-0-9a-f]{36})/$', repo_view_snapshot, name='repo_view_snapshot'),
|
url(r'^repo/snapshot/view/(?P<repo_id>[-0-9a-f]{36})/$', repo_view_snapshot, name='repo_view_snapshot'),
|
||||||
url(r'^repo/history/changes/(?P<repo_id>[-0-9a-f]{36})/$', repo_history_changes, name='repo_history_changes'),
|
url(r'^repo/history/changes/(?P<repo_id>[-0-9a-f]{36})/$', repo_history_changes, name='repo_history_changes'),
|
||||||
(r'^repo/remove/(?P<repo_id>[-0-9a-f]{36})/$', repo_remove),
|
|
||||||
url(r'^repo/(?P<repo_id>[-0-9a-f]{36})/files/$', view_file, name="repo_view_file"),
|
url(r'^repo/(?P<repo_id>[-0-9a-f]{36})/files/$', view_file, name="repo_view_file"),
|
||||||
url(r'^repo/(?P<repo_id>[-0-9a-f]{36})/history/files/$', view_history_file, name="view_history_file"),
|
url(r'^repo/(?P<repo_id>[-0-9a-f]{36})/history/files/$', view_history_file, name="view_history_file"),
|
||||||
url(r'^repo/(?P<repo_id>[-0-9a-f]{36})/trash/files/$', view_trash_file, name="view_trash_file"),
|
url(r'^repo/(?P<repo_id>[-0-9a-f]{36})/trash/files/$', view_trash_file, name="view_trash_file"),
|
||||||
@@ -109,6 +108,8 @@ urlpatterns = patterns('',
|
|||||||
url(r'^modules/toggle/$', toggle_modules, name="toggle_modules"),
|
url(r'^modules/toggle/$', toggle_modules, name="toggle_modules"),
|
||||||
|
|
||||||
### Ajax ###
|
### Ajax ###
|
||||||
|
(r'^ajax/repo/(?P<repo_id>[-0-9a-f]{36})/remove/$', repo_remove),
|
||||||
|
|
||||||
url(r'^ajax/repo/(?P<repo_id>[-0-9a-f]{36})/dirents/$', get_dirents, name="get_dirents"),
|
url(r'^ajax/repo/(?P<repo_id>[-0-9a-f]{36})/dirents/$', get_dirents, name="get_dirents"),
|
||||||
url(r'^ajax/repo/(?P<repo_id>[-0-9a-f]{36})/dirents/delete/$', delete_dirents, name='delete_dirents'),
|
url(r'^ajax/repo/(?P<repo_id>[-0-9a-f]{36})/dirents/delete/$', delete_dirents, name='delete_dirents'),
|
||||||
url(r'^ajax/repo/(?P<repo_id>[-0-9a-f]{36})/dirents/move/$', mv_dirents, name='mv_dirents'),
|
url(r'^ajax/repo/(?P<repo_id>[-0-9a-f]{36})/dirents/move/$', mv_dirents, name='mv_dirents'),
|
||||||
@@ -172,6 +173,7 @@ urlpatterns = patterns('',
|
|||||||
url(r'^useradmin/activate/(?P<user_id>[^/]+)/$', user_activate, name='user_activate'),
|
url(r'^useradmin/activate/(?P<user_id>[^/]+)/$', user_activate, name='user_activate'),
|
||||||
url(r'^useradmin/deactivate/(?P<user_id>[^/]+)/$', user_deactivate, name='user_deactivate'),
|
url(r'^useradmin/deactivate/(?P<user_id>[^/]+)/$', user_deactivate, name='user_deactivate'),
|
||||||
url(r'^useradmin/toggle_status/(?P<user_id>[^/]+)/$', user_toggle_status, name='user_toggle_status'),
|
url(r'^useradmin/toggle_status/(?P<user_id>[^/]+)/$', user_toggle_status, name='user_toggle_status'),
|
||||||
|
url(r'^useradmin/(?P<email>[^/]+)/set_quota/$', user_set_quota, name='user_set_quota'),
|
||||||
|
|
||||||
url(r'^useradmin/password/reset/(?P<user_id>[^/]+)/$', user_reset, name='user_reset'),
|
url(r'^useradmin/password/reset/(?P<user_id>[^/]+)/$', user_reset, name='user_reset'),
|
||||||
|
|
||||||
|
@@ -873,55 +873,6 @@ def modify_token(request, repo_id):
|
|||||||
|
|
||||||
return HttpResponseRedirect(reverse('repo', args=[repo_id]))
|
return HttpResponseRedirect(reverse('repo', args=[repo_id]))
|
||||||
|
|
||||||
@login_required
|
|
||||||
def repo_remove(request, repo_id):
|
|
||||||
repo = get_repo(repo_id)
|
|
||||||
if not repo:
|
|
||||||
return render_error(request, _(u'Library does not exist'))
|
|
||||||
|
|
||||||
user = request.user.username
|
|
||||||
org, base_template = check_and_get_org_by_repo(repo_id, user)
|
|
||||||
if org:
|
|
||||||
# Remove repo in org context, only repo owner or org staff can
|
|
||||||
# perform this operation.
|
|
||||||
if request.user.is_staff or org.is_staff or \
|
|
||||||
is_org_repo_owner(org.org_id, repo_id, user):
|
|
||||||
# Must get related useres before remove the repo
|
|
||||||
usernames = get_related_users_by_org_repo(org.org_id, repo_id)
|
|
||||||
remove_repo(repo_id)
|
|
||||||
repo_deleted.send(sender=None,
|
|
||||||
org_id=org.org_id,
|
|
||||||
usernames=usernames,
|
|
||||||
repo_owner=user,
|
|
||||||
repo_id=repo_id,
|
|
||||||
repo_name=repo.name,
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
err_msg = _(u'Failed to remove library. Only staff or owner can perform this operation.')
|
|
||||||
messages.error(request, err_msg)
|
|
||||||
else:
|
|
||||||
# Remove repo in personal context, only repo owner or site staff can
|
|
||||||
# perform this operation.
|
|
||||||
if validate_owner(request, repo_id) or request.user.is_staff:
|
|
||||||
usernames = get_related_users_by_repo(repo_id)
|
|
||||||
remove_repo(repo_id)
|
|
||||||
repo_deleted.send(sender=None,
|
|
||||||
org_id=-1,
|
|
||||||
usernames=usernames,
|
|
||||||
repo_owner=user,
|
|
||||||
repo_id=repo_id,
|
|
||||||
repo_name=repo.name,
|
|
||||||
)
|
|
||||||
messages.success(request, _(u'Successfully deleted library "%s".') % repo.name)
|
|
||||||
else:
|
|
||||||
err_msg = _(u'Failed to remove library. Only staff or owner can perform this operation.')
|
|
||||||
messages.error(request, err_msg)
|
|
||||||
|
|
||||||
next = request.META.get('HTTP_REFERER', None)
|
|
||||||
if not next:
|
|
||||||
next = settings.SITE_ROOT
|
|
||||||
return HttpResponseRedirect(next)
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def myhome(request):
|
def myhome(request):
|
||||||
owned_repos = []
|
owned_repos = []
|
||||||
|
@@ -12,7 +12,9 @@ from django.utils.http import urlquote
|
|||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
|
|
||||||
import seaserv
|
import seaserv
|
||||||
from seaserv import seafile_api, seafserv_rpc
|
from seaserv import seafile_api, seafserv_rpc, \
|
||||||
|
get_related_users_by_repo, get_related_users_by_org_repo, \
|
||||||
|
is_org_repo_owner
|
||||||
from pysearpc import SearpcError
|
from pysearpc import SearpcError
|
||||||
|
|
||||||
from seahub.auth.decorators import login_required
|
from seahub.auth.decorators import login_required
|
||||||
@@ -21,11 +23,13 @@ from seahub.forms import RepoNewDirentForm, RepoRenameDirentForm
|
|||||||
from seahub.options.models import UserOptions, CryptoOptionNotSetError
|
from seahub.options.models import UserOptions, CryptoOptionNotSetError
|
||||||
from seahub.notifications.models import UserNotification
|
from seahub.notifications.models import UserNotification
|
||||||
from seahub.signals import upload_file_successful
|
from seahub.signals import upload_file_successful
|
||||||
from seahub.views import get_repo_dirents
|
from seahub.views import get_repo_dirents, validate_owner
|
||||||
from seahub.views.repo import get_nav_path, get_fileshare, get_dir_share_link, \
|
from seahub.views.repo import get_nav_path, get_fileshare, get_dir_share_link, \
|
||||||
get_uploadlink, get_dir_shared_upload_link
|
get_uploadlink, get_dir_shared_upload_link
|
||||||
import seahub.settings as settings
|
import seahub.settings as settings
|
||||||
from seahub.utils import check_filename_with_rename, EMPTY_SHA1, gen_block_get_url
|
from seahub.signals import repo_deleted
|
||||||
|
from seahub.utils import check_filename_with_rename, EMPTY_SHA1, gen_block_get_url, \
|
||||||
|
check_and_get_org_by_repo
|
||||||
from seahub.utils.star import star_file, unstar_file
|
from seahub.utils.star import star_file, unstar_file
|
||||||
|
|
||||||
# Get an instance of a logger
|
# Get an instance of a logger
|
||||||
@@ -1072,3 +1076,56 @@ def unseen_notices_count(request):
|
|||||||
result['count'] = count
|
result['count'] = count
|
||||||
return HttpResponse(json.dumps(result), content_type=content_type)
|
return HttpResponse(json.dumps(result), content_type=content_type)
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
def repo_remove(request, repo_id):
|
||||||
|
if not request.is_ajax():
|
||||||
|
raise Http404
|
||||||
|
|
||||||
|
content_type = 'application/json; charset=utf-8'
|
||||||
|
result = {}
|
||||||
|
|
||||||
|
repo = get_repo(repo_id)
|
||||||
|
if not repo:
|
||||||
|
result['error'] = _(u'Library does not exist')
|
||||||
|
return HttpResponse(json.dumps(result), status=400, content_type=content_type)
|
||||||
|
|
||||||
|
user = request.user.username
|
||||||
|
org, base_template = check_and_get_org_by_repo(repo_id, user)
|
||||||
|
if org:
|
||||||
|
# Remove repo in org context, only repo owner or org staff can
|
||||||
|
# perform this operation.
|
||||||
|
if request.user.is_staff or org.is_staff or \
|
||||||
|
is_org_repo_owner(org.org_id, repo_id, user):
|
||||||
|
# Must get related useres before remove the repo
|
||||||
|
usernames = get_related_users_by_org_repo(org.org_id, repo_id)
|
||||||
|
seafile_api.remove_repo(repo_id)
|
||||||
|
repo_deleted.send(sender=None,
|
||||||
|
org_id=org.org_id,
|
||||||
|
usernames=usernames,
|
||||||
|
repo_owner=user,
|
||||||
|
repo_id=repo_id,
|
||||||
|
repo_name=repo.name,
|
||||||
|
)
|
||||||
|
result['success'] = True
|
||||||
|
return HttpResponse(json.dumps(result), content_type=content_type)
|
||||||
|
else:
|
||||||
|
result['error'] = _(u'Permission denied.')
|
||||||
|
return HttpResponse(json.dumps(result), status=400, content_type=content_type)
|
||||||
|
else:
|
||||||
|
# Remove repo in personal context, only repo owner or site staff can
|
||||||
|
# perform this operation.
|
||||||
|
if validate_owner(request, repo_id) or request.user.is_staff:
|
||||||
|
usernames = get_related_users_by_repo(repo_id)
|
||||||
|
seafile_api.remove_repo(repo_id)
|
||||||
|
repo_deleted.send(sender=None,
|
||||||
|
org_id=-1,
|
||||||
|
usernames=usernames,
|
||||||
|
repo_owner=user,
|
||||||
|
repo_id=repo_id,
|
||||||
|
repo_name=repo.name,
|
||||||
|
)
|
||||||
|
result['success'] = True
|
||||||
|
return HttpResponse(json.dumps(result), content_type=content_type)
|
||||||
|
else:
|
||||||
|
result['error'] = _(u'Permission denied.')
|
||||||
|
return HttpResponse(json.dumps(result), status=400, content_type=content_type)
|
||||||
|
@@ -228,29 +228,6 @@ def sys_ldap_user_admin(request):
|
|||||||
@login_required
|
@login_required
|
||||||
@sys_staff_required
|
@sys_staff_required
|
||||||
def user_info(request, email):
|
def user_info(request, email):
|
||||||
if request.method == 'POST':
|
|
||||||
result = {}
|
|
||||||
content_type = 'application/json; charset=utf-8'
|
|
||||||
|
|
||||||
f = SetUserQuotaForm(request.POST)
|
|
||||||
if f.is_valid():
|
|
||||||
email = f.cleaned_data['email']
|
|
||||||
quota_mb = f.cleaned_data['quota']
|
|
||||||
quota = quota_mb * (1 << 20)
|
|
||||||
|
|
||||||
try:
|
|
||||||
seafile_api.set_user_quota(email, quota)
|
|
||||||
except:
|
|
||||||
result['error'] = _(u'Failed to set quota: internal error')
|
|
||||||
return HttpResponse(json.dumps(result), content_type=content_type)
|
|
||||||
|
|
||||||
result['success'] = True
|
|
||||||
return HttpResponse(json.dumps(result), content_type=content_type)
|
|
||||||
else:
|
|
||||||
result['error'] = str(f.errors.values()[0])
|
|
||||||
return HttpResponse(json.dumps(result), content_type=content_type)
|
|
||||||
|
|
||||||
owned_repos = []
|
|
||||||
|
|
||||||
owned_repos = seafile_api.get_owned_repo_list(email)
|
owned_repos = seafile_api.get_owned_repo_list(email)
|
||||||
|
|
||||||
@@ -292,6 +269,33 @@ def user_info(request, email):
|
|||||||
'nickname': nickname,
|
'nickname': nickname,
|
||||||
}, context_instance=RequestContext(request))
|
}, context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
@sys_staff_required
|
||||||
|
def user_set_quota(request, email):
|
||||||
|
if not request.is_ajax() or request.method != 'POST':
|
||||||
|
raise Http404
|
||||||
|
|
||||||
|
content_type = 'application/json; charset=utf-8'
|
||||||
|
result = {}
|
||||||
|
|
||||||
|
f = SetUserQuotaForm(request.POST)
|
||||||
|
if f.is_valid():
|
||||||
|
email = f.cleaned_data['email']
|
||||||
|
quota_mb = f.cleaned_data['quota']
|
||||||
|
quota = quota_mb * (1 << 20)
|
||||||
|
|
||||||
|
try:
|
||||||
|
seafile_api.set_user_quota(email, quota)
|
||||||
|
except:
|
||||||
|
result['error'] = _(u'Failed to set quota: internal error')
|
||||||
|
return HttpResponse(json.dumps(result), status=500, content_type=content_type)
|
||||||
|
|
||||||
|
result['success'] = True
|
||||||
|
return HttpResponse(json.dumps(result), content_type=content_type)
|
||||||
|
else:
|
||||||
|
result['error'] = str(f.errors.values()[0])
|
||||||
|
return HttpResponse(json.dumps(result), status=400, content_type=content_type)
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
@sys_staff_required
|
@sys_staff_required
|
||||||
def user_remove(request, user_id):
|
def user_remove(request, user_id):
|
||||||
|
Reference in New Issue
Block a user