mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-24 12:58:34 +00:00
[sysadmin] add repo trash
This commit is contained in:
@@ -14,6 +14,7 @@
|
||||
<li class="tabnav-tab"><a href="{% url 'sys_repo_admin' %}">{% trans "All" %}</a></li>
|
||||
<li class="tabnav-tab tabnav-tab-cur"><a href="{% url 'sys_list_orphan' %}">{% trans "Orphan" %}</a></li>
|
||||
<li class="tabnav-tab"><a href="{% url 'sys_list_system' %}">{% trans "System" %}</a></li>
|
||||
<li class="tabnav-tab"><a href="{% url 'sys_repo_trash' %}">{% trans "Trash" %}</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
|
@@ -14,6 +14,7 @@
|
||||
<li class="tabnav-tab"><a href="{% url 'sys_repo_admin' %}">{% trans "All" %}</a></li>
|
||||
<li class="tabnav-tab"><a href="{% url 'sys_list_orphan' %}">{% trans "Orphan" %}</a></li>
|
||||
<li class="tabnav-tab tabnav-tab-cur"><a href="{% url 'sys_list_system' %}">{% trans "System" %}</a></li>
|
||||
<li class="tabnav-tab"><a href="{% url 'sys_repo_trash' %}">{% trans "Trash" %}</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
|
@@ -14,6 +14,7 @@
|
||||
<li class="tabnav-tab tabnav-tab-cur"><a href="{% url 'sys_repo_admin' %}">{% trans "All" %}</a></li>
|
||||
<li class="tabnav-tab"><a href="{% url 'sys_list_orphan' %}">{% trans "Orphan" %}</a></li>
|
||||
<li class="tabnav-tab"><a href="{% url 'sys_list_system' %}">{% trans "System" %}</a></li>
|
||||
<li class="tabnav-tab"><a href="{% url 'sys_repo_trash' %}">{% trans "Trash" %}</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
|
76
seahub/templates/sysadmin/sys_repo_trash.html
Normal file
76
seahub/templates/sysadmin/sys_repo_trash.html
Normal file
@@ -0,0 +1,76 @@
|
||||
{% extends "sysadmin/base.html" %}
|
||||
{% load i18n %}
|
||||
{% block cur_repo %}tab-cur{% endblock %}
|
||||
|
||||
{% block left_panel %}{{block.super}}
|
||||
<form action="{% url 'sys_repo_trash' %}" method="get" class="side-search-form">
|
||||
<input type="text" name="name" class="input" value="{{ search_owner }}" placeholder="{% trans "Search libraries by owner..." %}" />
|
||||
</form>
|
||||
{% endblock %}
|
||||
|
||||
{% block right_panel %}
|
||||
<div class="tabnav">
|
||||
<ul class="tabnav-tabs">
|
||||
<li class="tabnav-tab"><a href="{% url 'sys_repo_admin' %}">{% trans "All" %}</a></li>
|
||||
<li class="tabnav-tab"><a href="{% url 'sys_list_orphan' %}">{% trans "Orphan" %}</a></li>
|
||||
<li class="tabnav-tab"><a href="{% url 'sys_list_system' %}">{% trans "System" %}</a></li>
|
||||
<li class="tabnav-tab tabnav-tab-cur"><a href="{% url 'sys_repo_trash' %}">{% trans "Trash" %}</a></li>
|
||||
</ul>
|
||||
<div class="fright">
|
||||
<button id="repo-trash-clear" data-url="{% url 'sys_repo_trash_clear' %}?owner={% if search_owner %}{{search_owner}}{% endif %}" data-target="{{ search_owner }}"><span class="vam">{% trans "Clear Trash" %}</span></button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if repos %}
|
||||
<table class="repo-list">
|
||||
<tr>
|
||||
<th width="30%">{% trans "Name" %}</th>
|
||||
<th width="50%">{% trans "Owner" %}</th>
|
||||
<th width="20%">{% trans "Operations" %}</th>
|
||||
</tr>
|
||||
{% for repo in repos %}
|
||||
<tr>
|
||||
<td>{{ repo.repo_name }}</td>
|
||||
<td><a href="{% url 'user_info' repo.owner_id %}">{{ repo.owner_id }}</a></td>
|
||||
<td>
|
||||
<a href="#" class="repo-delete-btn op vh" data-url="{% url 'sys_repo_trash_remove' repo.repo_id %}" data-target="{{ repo.repo_name }}">{% trans "Delete" %}</a>
|
||||
<a href="#" class="repo-restore-btn op vh" data-url="{% url 'sys_repo_trash_restore' repo.repo_id %}" data-target="{{ repo.repo_name }}">{% trans "Restore" %}</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
{% if not search_owner %}
|
||||
{% include "snippets/admin_paginator.html" %}
|
||||
{% endif %}
|
||||
|
||||
{% else %}
|
||||
<div class="empty-tips">
|
||||
<h2 class="alc">{% trans "No library deleted yet" %}</h2>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block extra_script %}
|
||||
<script type="text/javascript">
|
||||
{% if search_owner %}
|
||||
addConfirmTo($('#repo-trash-clear'), {
|
||||
'title':"{% trans 'Delete Library By Owner' %}",
|
||||
'con':"{% trans "Are you sure you want to delete all %s's libraries?" %}"
|
||||
});
|
||||
{% else %}
|
||||
addConfirmTo($('#repo-trash-clear'), {
|
||||
'title':"{% trans 'Clear Trash' %}",
|
||||
'con':"{% trans "Are you sure you want to clear trash?" %}"
|
||||
});
|
||||
{% endif %}
|
||||
addConfirmTo($('.repo-restore-btn'), {
|
||||
'title':"{% trans 'Restore Library' %}",
|
||||
'con':"{% trans "Are you sure you want to restore %s?" %}"
|
||||
});
|
||||
addConfirmTo($('.repo-delete-btn'), {
|
||||
'title':"{% trans 'Delete Library' %}",
|
||||
'con':"{% trans "Are you sure you want to delete %s completely?" %}"
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
@@ -192,6 +192,10 @@ urlpatterns = patterns('',
|
||||
url(r'^sys/seafadmin/$', sys_repo_admin, name='sys_repo_admin'),
|
||||
url(r'^sys/seafadmin/orphan/$', sys_list_orphan, name='sys_list_orphan'),
|
||||
url(r'^sys/seafadmin/system/$', sys_list_system, name='sys_list_system'),
|
||||
url(r'^sys/seafadmin/repo-trash/$', sys_repo_trash, name='sys_repo_trash'),
|
||||
url(r'^sys/seafadmin/repo-trash/clear/$', sys_repo_trash_clear, name="sys_repo_trash_clear"),
|
||||
url(r'^sys/seafadmin/repo-trash/(?P<repo_id>[-0-9a-f]{36})/remove/$', sys_repo_trash_remove, name="sys_repo_trash_remove"),
|
||||
url(r'^sys/seafadmin/repo-trash/(?P<repo_id>[-0-9a-f]{36})/restore/$', sys_repo_trash_restore, name="sys_repo_trash_restore"),
|
||||
url(r'^sys/seafadmin/search/$', sys_repo_search, name='sys_repo_search'),
|
||||
url(r'^sys/seafadmin/transfer/$', sys_repo_transfer, name='sys_repo_transfer'),
|
||||
url(r'^sys/useradmin/$', sys_user_admin, name='sys_useradmin'),
|
||||
|
@@ -108,6 +108,106 @@ def sys_list_system(request):
|
||||
'repos': repos,
|
||||
}, context_instance=RequestContext(request))
|
||||
|
||||
@login_required
|
||||
@sys_staff_required
|
||||
def sys_repo_trash(request):
|
||||
""" List deleted repos (by owner) """
|
||||
|
||||
search_owner = request.GET.get('name', '')
|
||||
if search_owner:
|
||||
if is_valid_username(search_owner):
|
||||
repos = seafserv_threaded_rpc.get_trash_repos_by_owner(search_owner)
|
||||
return render_to_response(
|
||||
'sysadmin/sys_repo_trash.html', {
|
||||
'repos': repos,
|
||||
'search_owner': search_owner,
|
||||
}, context_instance=RequestContext(request))
|
||||
else:
|
||||
messages.error(request, _(u'Invalid username'))
|
||||
return HttpResponseRedirect(reverse('sys_repo_trash'))
|
||||
|
||||
try:
|
||||
current_page = int(request.GET.get('page', '1'))
|
||||
per_page = int(request.GET.get('per_page', '25'))
|
||||
except ValueError:
|
||||
current_page = 1
|
||||
per_page = 25
|
||||
|
||||
repos_all = seafserv_threaded_rpc.get_trash_repo_list(per_page * (current_page -1),
|
||||
per_page + 1)
|
||||
repos = repos_all[:per_page]
|
||||
if len(repos_all) == per_page + 1:
|
||||
page_next = True
|
||||
else:
|
||||
page_next = False
|
||||
|
||||
return render_to_response(
|
||||
'sysadmin/sys_repo_trash.html', {
|
||||
'repos': repos,
|
||||
'current_page': current_page,
|
||||
'prev_page': current_page-1,
|
||||
'next_page': current_page+1,
|
||||
'per_page': per_page,
|
||||
'page_next': page_next,
|
||||
}, context_instance=RequestContext(request))
|
||||
|
||||
@login_required
|
||||
@sys_staff_required
|
||||
def sys_repo_trash_restore(request, repo_id):
|
||||
"""Restore deleted repo by id"""
|
||||
|
||||
referer = request.META.get('HTTP_REFERER', None)
|
||||
next = reverse('sys_repo_trash') if referer is None else referer
|
||||
|
||||
try:
|
||||
seafserv_threaded_rpc.restore_repo_from_trash(repo_id)
|
||||
messages.success(request, _(u'Success'))
|
||||
except SearpcError, e:
|
||||
logger.error(e)
|
||||
messages.error(request, _(u'Failed'))
|
||||
|
||||
return HttpResponseRedirect(next)
|
||||
|
||||
@login_required
|
||||
@sys_staff_required
|
||||
def sys_repo_trash_remove(request, repo_id):
|
||||
"""Remove deleted repo by id"""
|
||||
|
||||
referer = request.META.get('HTTP_REFERER', None)
|
||||
next = reverse('sys_repo_trash') if referer is None else referer
|
||||
|
||||
try:
|
||||
seafserv_threaded_rpc.del_repo_from_trash(repo_id)
|
||||
messages.success(request, _(u'Success'))
|
||||
except SearpcError, e:
|
||||
logger.error(e)
|
||||
messages.error(request, _(u'Failed'))
|
||||
|
||||
return HttpResponseRedirect(next)
|
||||
|
||||
@login_required
|
||||
@sys_staff_required
|
||||
def sys_repo_trash_clear(request):
|
||||
"""Clear repo trash (by owner)"""
|
||||
|
||||
next = reverse('sys_repo_trash')
|
||||
owner = request.GET.get('owner', '')
|
||||
try:
|
||||
if owner:
|
||||
if is_valid_username(owner):
|
||||
seafserv_threaded_rpc.empty_repo_trash_by_owner(owner)
|
||||
else:
|
||||
messages.error(request, _(u'Invalid username'))
|
||||
return HttpResponseRedirect(next)
|
||||
else:
|
||||
seafserv_threaded_rpc.empty_repo_trash()
|
||||
except SearpcError, e:
|
||||
logger.error(e)
|
||||
messages.error(request, _(u'Failed'))
|
||||
|
||||
messages.success(request, _(u'Success'))
|
||||
return HttpResponseRedirect(next)
|
||||
|
||||
def list_repos_by_name_and_owner(repo_name, owner):
|
||||
repos = []
|
||||
owned_repos = seafile_api.get_owned_repo_list(owner)
|
||||
|
Reference in New Issue
Block a user