1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-24 04:48:03 +00:00

[sysadmin] add repo trash

This commit is contained in:
lian
2015-03-23 17:59:33 +08:00
parent 6cdb0acb7f
commit 840e8d544b
6 changed files with 183 additions and 0 deletions

View File

@@ -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_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 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_list_system' %}">{% trans "System" %}</a></li>
<li class="tabnav-tab"><a href="{% url 'sys_repo_trash' %}">{% trans "Trash" %}</a></li>
</ul> </ul>
</div> </div>

View File

@@ -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_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_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 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> </ul>
</div> </div>

View File

@@ -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 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_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_list_system' %}">{% trans "System" %}</a></li>
<li class="tabnav-tab"><a href="{% url 'sys_repo_trash' %}">{% trans "Trash" %}</a></li>
</ul> </ul>
</div> </div>

View 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 %}

View File

@@ -192,6 +192,10 @@ urlpatterns = patterns('',
url(r'^sys/seafadmin/$', sys_repo_admin, name='sys_repo_admin'), 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/orphan/$', sys_list_orphan, name='sys_list_orphan'),
url(r'^sys/seafadmin/system/$', sys_list_system, name='sys_list_system'), 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/search/$', sys_repo_search, name='sys_repo_search'),
url(r'^sys/seafadmin/transfer/$', sys_repo_transfer, name='sys_repo_transfer'), url(r'^sys/seafadmin/transfer/$', sys_repo_transfer, name='sys_repo_transfer'),
url(r'^sys/useradmin/$', sys_user_admin, name='sys_useradmin'), url(r'^sys/useradmin/$', sys_user_admin, name='sys_useradmin'),

View File

@@ -108,6 +108,106 @@ def sys_list_system(request):
'repos': repos, 'repos': repos,
}, context_instance=RequestContext(request)) }, 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): def list_repos_by_name_and_owner(repo_name, owner):
repos = [] repos = []
owned_repos = seafile_api.get_owned_repo_list(owner) owned_repos = seafile_api.get_owned_repo_list(owner)