diff --git a/media/css/seahub.css b/media/css/seahub.css
index 4cf8123fcd..2ce782e749 100644
--- a/media/css/seahub.css
+++ b/media/css/seahub.css
@@ -1694,14 +1694,17 @@ textarea:-moz-placeholder {/* for FF */
}
#events-loading,
#notices-loading,
+#trash-more-loading,
#activities-more,
#events-more,
+#trash-more-btn,
#notices-more-btn {
text-align:center;
width:100%;
}
#activities-more,
#events-more,
+#trash-more-btn,
#notices-more-btn {
color:#777;
padding:.5em 0;
@@ -1710,10 +1713,14 @@ textarea:-moz-placeholder {/* for FF */
}
#activities-more:hover,
#events-more:hover,
+#trash-more-btn:hover,
#notices-more-btn:hover {
color:#000;
background:#dfdfdf;
}
+#trash-more {
+ margin-top: 20px;
+}
#notices-more {
margin-top: -20px;
}
diff --git a/seahub/templates/dir_recycle_view.html b/seahub/templates/dir_recycle_view.html
deleted file mode 100644
index 02ac46de69..0000000000
--- a/seahub/templates/dir_recycle_view.html
+++ /dev/null
@@ -1,99 +0,0 @@
-{% extends base_template %}
-
-{% load seahub_tags avatar_tags i18n %}
-{% load url from future %}
-
-{% block main_panel %}
-
{% blocktrans %}{{dir_name}} Trash{% endblocktrans %}
-
-
- {% trans "Current path: " %}
- {% if not show_recycle_root %}
- {{dir_name}}
- {% for name, link in zipped %}
- {% if not forloop.last %}
- / {{ name }}
- {% else %}
- / {{ name }}
- {% endif %}
- {% endfor %}
-
- {% else %}
- {{dir_name}}
- {% endif %}
-
-
- {% if show_recycle_root %}
-
-
- {% if days != 7 %}
- {% trans "a week" %} /
- {% else %}
- {% trans "a week" %} /
- {% endif %}
- {% if days != 30 %}
- {% trans "a month" %} /
- {% else %}
- {% trans "a month" %} /
- {% endif %}
- {% if days != 0 %}
- {% trans "all" %}
- {% else %}
- {% trans "all" %}
- {% endif %}
-
-
- {% endif %}
-
-
-
-
- |
- {% trans "Name" %} |
- {% trans "Delete Time" %} |
- {% trans "Size" %} |
- {% trans "Operations" %} |
-
-
- {% for dirent in dir_list %}
-
-  |
- {% if show_recycle_root %}
- {{ dirent.obj_name }} |
- {{ dirent.delete_time|translate_seahub_time }} |
- |
- {% trans "Restore" %} |
- {% else %}
- {{ dirent.obj_name }} |
- |
- |
- |
- {% endif %}
-
- {% endfor %}
-
- {% for dirent in file_list %}
-
-  |
- {% if show_recycle_root %}
- {{ dirent.obj_name }} |
- {{ dirent.delete_time|translate_seahub_time }} |
- {{ dirent.file_size|filesizeformat }} |
- {% trans "Restore" %} |
- {% else %}
- {{ dirent.props.obj_name }} |
- |
- {{ dirent.file_size|filesizeformat }} |
- |
- {% endif %}
-
- {% endfor %}
-
-{% endblock %}
-
-{% block extra_script %}
-
-{% endblock %}
diff --git a/seahub/templates/repo_dir_recycle_view.html b/seahub/templates/repo_dir_recycle_view.html
new file mode 100644
index 0000000000..f072b583af
--- /dev/null
+++ b/seahub/templates/repo_dir_recycle_view.html
@@ -0,0 +1,202 @@
+{% extends base_template %}
+
+{% load seahub_tags avatar_tags i18n %}
+{% load url from future %}
+
+{% block main_panel %}
+{% blocktrans %}{{repo_dir_name}} Trash{% endblocktrans %}
+
+
+ {% trans "Current path: " %}
+ {% if not show_recycle_root %}
+ {{repo_dir_name}}
+ {% for name, link in zipped %}
+ {% if not forloop.last %}
+ / {{ name }}
+ {% else %}
+ / {{ name }}
+ {% endif %}
+ {% endfor %}
+ {% else %}
+ {{repo_dir_name}}
+ {% endif %}
+
+
+ {% if enable_clean %}
+
+
+
+ {% endif %}
+
+
+
+
+{% if trash_more %}
+
+{% endif %}
+
+{% if enable_clean %}
+
+{% endif %}
+{% endblock %}
+
+{% block extra_script %}
+
+{% endblock %}
diff --git a/seahub/templates/repo_recycle_view.html b/seahub/templates/repo_recycle_view.html
deleted file mode 100644
index 004f059615..0000000000
--- a/seahub/templates/repo_recycle_view.html
+++ /dev/null
@@ -1,125 +0,0 @@
-{% extends base_template %}
-
-{% load seahub_tags avatar_tags i18n %}
-{% load url from future %}
-
-{% block main_panel %}
-{% blocktrans with repo_name=repo.props.name %}{{repo_name}} Trash{% endblocktrans %}
-
-
- {% trans "Current path: " %}
- {% if not show_recycle_root %}
- {{repo.name}}
- {% for name, link in zipped %}
- {% if not forloop.last %}
- / {{ name }}
- {% else %}
- / {{ name }}
- {% endif %}
- {% endfor %}
-
- {% else %}
- {{repo.name}}
- {% endif %}
-
-
- {% if show_recycle_root %}
-
-
- {% if days != 7 %}
- {% trans "a week" %} /
- {% else %}
- {% trans "a week" %} /
- {% endif %}
- {% if days != 30 %}
- {% trans "a month" %} /
- {% else %}
- {% trans "a month" %} /
- {% endif %}
- {% if days != 0 %}
- {% trans "all" %}
- {% else %}
- {% trans "all" %}
- {% endif %}
-
- {% if enable_clean %}
-
- {% endif %}
-
- {% endif %}
-
-
-
-
- |
- {% trans "Name" %} |
- {% trans "Delete Time" %} |
- {% trans "Size" %} |
- {% trans "Operations" %} |
-
-
- {% for dirent in dir_list %}
-
-  |
- {% if show_recycle_root %}
- {{ dirent.obj_name }} |
- {{ dirent.delete_time|translate_seahub_time }} |
- |
- {% trans "Restore" %} |
- {% else %}
- {{ dirent.obj_name }} |
- |
- |
- |
- {% endif %}
-
- {% endfor %}
-
- {% for dirent in file_list %}
-
-  |
- {% if show_recycle_root %}
- {{ dirent.obj_name }} |
- {{ dirent.delete_time|translate_seahub_time }} |
- {{ dirent.file_size|filesizeformat }} |
- {% trans "Restore" %} |
- {% else %}
- {{ dirent.props.obj_name }} |
- |
- {{ dirent.file_size|filesizeformat }} |
- |
- {% endif %}
-
- {% endfor %}
-
-
-{% if enable_clean and show_recycle_root %}
-
-{% endif %}
-{% endblock %}
-
-{% block extra_script %}
-
-{% endblock %}
diff --git a/seahub/templates/snippets/repo_dir_trash_tr.html b/seahub/templates/snippets/repo_dir_trash_tr.html
new file mode 100644
index 0000000000..efac13b48e
--- /dev/null
+++ b/seahub/templates/snippets/repo_dir_trash_tr.html
@@ -0,0 +1,35 @@
+{% load seahub_tags i18n %}
+
+{% for dirent in dir_entries %}
+{% if dirent.is_dir %}
+
+  |
+ {% if show_recycle_root %}
+ {{ dirent.obj_name }} |
+ {{ dirent.delete_time|translate_seahub_time }} |
+ |
+ {% trans "Restore" %} |
+ {% else %}
+ {{ dirent.obj_name }} |
+ |
+ |
+ |
+ {% endif %}
+
+{% else %}
+
+  |
+ {% if show_recycle_root %}
+ {{ dirent.obj_name }} |
+ {{ dirent.delete_time|translate_seahub_time }} |
+ {{ dirent.file_size|filesizeformat }} |
+ {% trans "Restore" %} |
+ {% else %}
+ {{ dirent.props.obj_name }} |
+ |
+ {{ dirent.file_size|filesizeformat }} |
+ |
+ {% endif %}
+
+{% endif %}
+{% endfor %}
diff --git a/seahub/templates/view_trash_file.html b/seahub/templates/view_trash_file.html
index 8b21602e76..4bec1c7a80 100644
--- a/seahub/templates/view_trash_file.html
+++ b/seahub/templates/view_trash_file.html
@@ -9,6 +9,6 @@
{% block file_path %}
{% trans "Current Path: "%}
{% for name, link in zipped %}
- {% if not forloop.last %} {{ name }} / {% else %} {{ name }} {% endif %}
+ {% if not forloop.last %} {{ name }} / {% else %} {{ name }} {% endif %}
{% endfor %}
{% endblock %}
diff --git a/seahub/urls.py b/seahub/urls.py
index 93606f1c37..3d3fa680b9 100644
--- a/seahub/urls.py
+++ b/seahub/urls.py
@@ -177,6 +177,8 @@ urlpatterns = patterns(
url(r'^ajax/repo/(?P[-0-9a-f]{36})/set-user-folder-perm/$', set_user_folder_perm, name='set_user_folder_perm'),
url(r'^ajax/repo/(?P[-0-9a-f]{36})/set-group-folder-perm/$', set_group_folder_perm, name='set_group_folder_perm'),
+ url(r'^ajax/(?P[-0-9a-f]{36})/repo-dir/recycle/more/$', ajax_repo_dir_recycle_more, name='ajax_repo_dir_recycle_more'),
+
url(r'^_templates/(?P.*)$', underscore_template, name="underscore_template"),
## ajax lib
diff --git a/seahub/views/__init__.py b/seahub/views/__init__.py
index 4bb85d4a1c..7ec44cfba9 100644
--- a/seahub/views/__init__.py
+++ b/seahub/views/__init__.py
@@ -427,30 +427,28 @@ def render_recycle_root(request, repo_id):
if not repo:
raise Http404
- days = show_delete_days(request)
-
+ scan_stat = request.GET.get('scan_stat', None)
try:
- deleted_entries = seafserv_threaded_rpc.get_deleted(repo_id, days)
+ deleted_entries = seafile_api.get_deleted(repo_id, 0, '/', scan_stat)
except SearpcError as e:
logger.error(e)
- messages.error(request, _('Internal server error'))
referer = request.META.get('HTTP_REFERER', None)
next = settings.SITE_ROOT if referer is None else referer
return HttpResponseRedirect(next)
- dir_list = []
- file_list = []
+ new_scan_stat = deleted_entries[-1].scan_stat
+ trash_more = True if new_scan_stat is not None else False
+
+ deleted_entries = deleted_entries[0:-1]
for dirent in deleted_entries:
if stat.S_ISDIR(dirent.mode):
- dir_list.append(dirent)
+ dirent.is_dir = True
else:
- file_list.append(dirent)
+ dirent.is_dir = False
# Entries sort by deletion time in descending order.
- dir_list.sort(lambda x, y : cmp(y.delete_time,
- x.delete_time))
- file_list.sort(lambda x, y : cmp(y.delete_time,
- x.delete_time))
+ deleted_entries.sort(lambda x, y : cmp(y.delete_time,
+ x.delete_time))
username = request.user.username
if is_org_context(request):
@@ -463,12 +461,13 @@ def render_recycle_root(request, repo_id):
if is_repo_owner:
enable_clean = True
- return render_to_response('repo_recycle_view.html', {
+ return render_to_response('repo_dir_recycle_view.html', {
'show_recycle_root': True,
'repo': repo,
- 'dir_list': dir_list,
- 'file_list': file_list,
- 'days': days,
+ 'repo_dir_name': repo.name,
+ 'dir_entries': deleted_entries,
+ 'scan_stat': new_scan_stat,
+ 'trash_more': trash_more,
'enable_clean': enable_clean,
}, context_instance=RequestContext(request))
@@ -491,7 +490,6 @@ def render_recycle_dir(request, repo_id, commit_id):
commit = seafserv_threaded_rpc.get_commit(repo.id, repo.version, commit_id)
except SearpcError as e:
logger.error(e)
- messages.error(request, _('Internal server error'))
referer = request.META.get('HTTP_REFERER', None)
next = settings.SITE_ROOT if referer is None else referer
return HttpResponseRedirect(next)
@@ -500,33 +498,25 @@ def render_recycle_dir(request, repo_id, commit_id):
raise Http404
zipped = gen_path_link(path, '')
- file_list, dir_list, dirent_more = get_repo_dirents(request, repo, commit,
- basedir + path)
- days = show_delete_days(request)
+ dir_entries = seafile_api.list_dir_by_commit_and_path(commit.repo_id,
+ commit.id, basedir+path,
+ -1, -1)
+ for dirent in dir_entries:
+ if stat.S_ISDIR(dirent.mode):
+ dirent.is_dir = True
+ else:
+ dirent.is_dir = False
- username = request.user.username
- if is_org_context(request):
- repo_owner = seafile_api.get_org_repo_owner(repo.id)
- else:
- repo_owner = seafile_api.get_repo_owner(repo.id)
- is_repo_owner = True if repo_owner == username else False
-
- enable_clean = False
- if is_repo_owner:
- enable_clean = True
-
- return render_to_response('repo_recycle_view.html', {
+ return render_to_response('repo_dir_recycle_view.html', {
'show_recycle_root': False,
'repo': repo,
+ 'repo_dir_name': repo.name,
'zipped': zipped,
- 'dir_list': dir_list,
- 'file_list': file_list,
+ 'dir_entries': dir_entries,
'commit_id': commit_id,
'basedir': basedir,
'path': path,
- 'days': days,
- 'enable_clean': enable_clean,
}, context_instance=RequestContext(request))
def render_dir_recycle_root(request, repo_id, dir_path):
@@ -534,40 +524,36 @@ def render_dir_recycle_root(request, repo_id, dir_path):
if not repo:
raise Http404
- days = show_delete_days(request)
-
+ scan_stat = request.GET.get('scan_stat', None)
try:
- deleted_entries = seafserv_threaded_rpc.get_deleted(repo_id,
- days,
- dir_path)
+ deleted_entries = seafile_api.get_deleted(repo_id, 0, dir_path, scan_stat)
except SearpcError as e:
logger.error(e)
- messages.error(request, _('Internal server error'))
referer = request.META.get('HTTP_REFERER', None)
next = settings.SITE_ROOT if referer is None else referer
return HttpResponseRedirect(next)
- dir_list = []
- file_list = []
+ new_scan_stat = deleted_entries[-1].scan_stat
+ trash_more = True if new_scan_stat is not None else False
+
+ deleted_entries = deleted_entries[0:-1]
for dirent in deleted_entries:
if stat.S_ISDIR(dirent.mode):
- dir_list.append(dirent)
+ dirent.is_dir = True
else:
- file_list.append(dirent)
+ dirent.is_dir = False
# Entries sort by deletion time in descending order.
- dir_list.sort(lambda x, y : cmp(y.delete_time,
- x.delete_time))
- file_list.sort(lambda x, y : cmp(y.delete_time,
- x.delete_time))
+ deleted_entries.sort(lambda x, y : cmp(y.delete_time,
+ x.delete_time))
- return render_to_response('dir_recycle_view.html', {
+ return render_to_response('repo_dir_recycle_view.html', {
'show_recycle_root': True,
'repo': repo,
- 'dir_list': dir_list,
- 'file_list': file_list,
- 'days': days,
- 'dir_name': os.path.basename(dir_path.rstrip('/')),
+ 'repo_dir_name': os.path.basename(dir_path.rstrip('/')),
+ 'dir_entries': deleted_entries,
+ 'scan_stat': new_scan_stat,
+ 'trash_more': trash_more,
'dir_path': dir_path,
}, context_instance=RequestContext(request))
@@ -590,7 +576,6 @@ def render_dir_recycle_dir(request, repo_id, commit_id, dir_path):
commit = seafserv_threaded_rpc.get_commit(repo.id, repo.version, commit_id)
except SearpcError as e:
logger.error(e)
- messages.error(request, _('Internal server error'))
referer = request.META.get('HTTP_REFERER', None)
next = settings.SITE_ROOT if referer is None else referer
return HttpResponseRedirect(next)
@@ -599,22 +584,24 @@ def render_dir_recycle_dir(request, repo_id, commit_id, dir_path):
raise Http404
zipped = gen_path_link(path, '')
- file_list, dir_list, dirent_more = get_repo_dirents(request, repo, commit,
- basedir + path)
+ dir_entries = seafile_api.list_dir_by_commit_and_path(commit.repo_id,
+ commit.id, basedir+path,
+ -1, -1)
+ for dirent in dir_entries:
+ if stat.S_ISDIR(dirent.mode):
+ dirent.is_dir = True
+ else:
+ dirent.is_dir = False
- days = show_delete_days(request)
-
- return render_to_response('dir_recycle_view.html', {
+ return render_to_response('repo_dir_recycle_view.html', {
'show_recycle_root': False,
'repo': repo,
+ 'repo_dir_name': os.path.basename(dir_path.rstrip('/')),
'zipped': zipped,
- 'dir_list': dir_list,
- 'file_list': file_list,
+ 'dir_entries': dir_entries,
'commit_id': commit_id,
'basedir': basedir,
'path': path,
- 'days': days,
- 'dir_name': os.path.basename(dir_path.rstrip('/')),
'dir_path': dir_path,
}, context_instance=RequestContext(request))
@@ -1624,11 +1611,11 @@ def repo_revert_dir(request, repo_id):
url = reverse('repo', args=[repo_id]) + ('?p=%s' % urllib2.quote(parent_dir.encode('utf-8')))
if ret == 1:
- root_url = reverse('repo', args=[repo_id]) + u'?p=/'
+ root_url = reverse('view_common_lib_dir', args=[repo_id, '/'])
msg = _(u'Successfully revert %(path)s to root directory.') % {"path": escape(path.lstrip('/')), "url": root_url}
messages.success(request, msg, extra_tags='safe')
else:
- dir_view_url = reverse('repo', args=[repo_id]) + u'?p=' + urllib2.quote(path.encode('utf-8'))
+ dir_view_url = reverse('view_common_lib_dir', args=[repo_id, urllib2.quote(path.strip('/').encode('utf-8'))])
msg = _(u'Successfully revert %(path)s') % {"url": dir_view_url, "path": escape(path.lstrip('/'))}
messages.success(request, msg, extra_tags='safe')
return HttpResponseRedirect(url)
diff --git a/seahub/views/ajax.py b/seahub/views/ajax.py
index bd882062be..e32fab949b 100644
--- a/seahub/views/ajax.py
+++ b/seahub/views/ajax.py
@@ -50,7 +50,7 @@ from seahub.group.views import is_group_staff
import seahub.settings as settings
from seahub.settings import ENABLE_THUMBNAIL, THUMBNAIL_ROOT, \
THUMBNAIL_DEFAULT_SIZE, ENABLE_SUB_LIBRARY, ENABLE_REPO_HISTORY_SETTING, \
- ENABLE_FOLDER_PERM, SHOW_TRAFFIC
+ ENABLE_FOLDER_PERM, SHOW_TRAFFIC, MEDIA_URL
from constance import config
from seahub.utils import check_filename_with_rename, EMPTY_SHA1, \
gen_block_get_url, TRAFFIC_STATS_ENABLED, get_user_traffic_stat,\
@@ -2724,3 +2724,69 @@ def ajax_unset_inner_pub_repo(request, repo_id):
except SearpcError:
return HttpResponse(json.dumps({"error": _('Internal server error')}),
status=500, content_type=content_type)
+
+@login_required_ajax
+def ajax_repo_dir_recycle_more(request, repo_id):
+ """
+ List 'more' repo/dir trash.
+ """
+ result = {}
+ content_type = 'application/json; charset=utf-8'
+
+ repo = seafile_api.get_repo(repo_id)
+ if not repo:
+ err_msg = 'Library %s not found.' % repo_id
+ return HttpResponse(json.dumps({'error': err_msg}),
+ status=404, content_type=content_type)
+
+ path = request.GET.get('path', '/')
+ path = '/' if path == '' else path
+ if check_folder_permission(request, repo_id, path) != 'rw':
+ err_msg = 'Permission denied.'
+ return HttpResponse(json.dumps({'error': err_msg}),
+ status=403, content_type=content_type)
+
+ scan_stat = request.GET.get('scan_stat', None)
+ try:
+ deleted_entries = seafile_api.get_deleted(repo_id, 0, path, scan_stat)
+ except SearpcError as e:
+ logger.error(e)
+ result['error'] = 'Internal server error'
+ return HttpResponse(json.dumps(result), status=500,
+ content_type=content_type)
+
+ new_scan_stat = deleted_entries[-1].scan_stat
+ trash_more = True if new_scan_stat is not None else False
+
+ more_entries_html = ''
+ # since there will always have one 'deleted_entry' to tell scan_stat,
+ # so if len of deleted_entries = 1, means have not get any trash dir/file
+ # if len of deleted_entries > 1,
+ # means have get trash dir/file from current scanned commits
+ if len(deleted_entries) > 1:
+ deleted_entries = deleted_entries[0:-1]
+ for dirent in deleted_entries:
+ if stat.S_ISDIR(dirent.mode):
+ dirent.is_dir = True
+ else:
+ dirent.is_dir = False
+
+ # Entries sort by deletion time in descending order.
+ deleted_entries.sort(lambda x, y : cmp(y.delete_time,
+ x.delete_time))
+ ctx = {
+ 'show_recycle_root': True,
+ 'repo': repo,
+ 'dir_entries': deleted_entries,
+ 'MEDIA_URL': MEDIA_URL
+ }
+
+ more_entries_html = render_to_string("snippets/repo_dir_trash_tr.html", ctx)
+
+ result = {
+ 'html': more_entries_html,
+ 'trash_more': trash_more,
+ 'new_scan_stat': new_scan_stat,
+ }
+
+ return HttpResponse(json.dumps(result), content_type=content_type)
diff --git a/seahub/views/file.py b/seahub/views/file.py
index 5625547fd3..be620e6dc1 100644
--- a/seahub/views/file.py
+++ b/seahub/views/file.py
@@ -680,9 +680,7 @@ def view_trash_file(request, repo_id):
basedir = request.GET.get('base', '')
if not basedir:
raise Http404
- days = show_delete_days(request)
ret_dict['basedir'] = basedir
- ret_dict['days'] = days
# generate file path navigator
path = ret_dict['path']