From cb28ba74bcd7d1b54b73dfb56a79b6050552fc65 Mon Sep 17 00:00:00 2001 From: zhengxie Date: Thu, 1 Aug 2013 14:43:17 +0800 Subject: [PATCH] Refactor private share, and fixed a few bugs --- .../templates/repo/priv_shared_files.html | 4 +- seahub/share/views.py | 109 +++++++++++++++++- seahub/templates/shared_file_view.html | 4 +- .../templates/snippets/file_share_popup.html | 2 +- seahub/urls.py | 12 +- seahub/views/file.py | 98 ++-------------- 6 files changed, 122 insertions(+), 107 deletions(-) diff --git a/seahub/share/templates/repo/priv_shared_files.html b/seahub/share/templates/repo/priv_shared_files.html index c60c98aac8..80b175398f 100644 --- a/seahub/share/templates/repo/priv_shared_files.html +++ b/seahub/share/templates/repo/priv_shared_files.html @@ -43,7 +43,7 @@ {% endif %} -- {{e.from_user|email2nickname}} - Unshare + Unshare {% endfor %} {% endif %} @@ -71,7 +71,7 @@ {% endif %} {{e.repo.name}} {{e.to_user|email2nickname}} - Unshare + Unshare {% endfor %} {% endif %} diff --git a/seahub/share/views.py b/seahub/share/views.py index 4234fc6cb6..35f15eafdd 100644 --- a/seahub/share/views.py +++ b/seahub/share/views.py @@ -32,6 +32,7 @@ from seahub.auth.decorators import login_required from seahub.base.accounts import User from seahub.contacts.models import Contact from seahub.contacts.signals import mail_sended +from seahub.signals import share_file_to_user_successful from seahub.views import validate_owner, is_registered_user from seahub.utils import render_permission_error, string2list, render_error, \ gen_token, gen_shared_link, gen_dir_share_link, gen_file_share_link, \ @@ -527,6 +528,7 @@ def share_permission_admin(request): # return HttpResponseRedirect(next) +########## share link @login_required def get_shared_link(request): """ @@ -625,7 +627,6 @@ def send_shared_link(request): if not request.is_ajax() and not request.method == 'POST': raise Http404 - result = {} content_type = 'application/json; charset=utf-8' if not IS_EMAIL_CONFIGURED: @@ -672,16 +673,15 @@ def send_shared_link(request): def save_shared_link(request): """Save public share link to one's library. """ - username = request.user.username - token = request.POST.get('s_token', '') + token = request.GET.get('t', '') dst_repo_id = request.POST.get('dst_repo') - dst_path = request.POST.get('dst_path') + dst_path = request.POST.get('dst_path') try: fs = FileShare.objects.get(token=token) except FileShare.DoesNotExist: - assert False # todo + raise Http404 src_repo_id = fs.repo_id src_path = os.path.dirname(fs.path) @@ -696,9 +696,106 @@ def save_shared_link(request): next = request.META.get('HTTP_REFERER', None) if not next: - next = settings.SITE_ROOT + next = SITE_ROOT + return HttpResponseRedirect(next) + +########## private share +@require_POST +def gen_private_file_share(request, repo_id): + emails = request.POST.getlist('emails', '') + s_type = request.POST.get('s_type', '') + path = request.POST.get('path', '') + perm = request.POST.get('perm', 'r') + file_or_dir = os.path.basename(path.rstrip('/')) + username = request.user.username + + for email in [e.strip() for e in emails if e.strip()]: + if not is_registered_user(email): + messages.error(request, _('Failed to share to "%s", user not found.') % email) + continue + + if s_type == 'f': + pfds = PrivateFileDirShare.objects.add_read_only_priv_file_share( + username, email, repo_id, path) + elif s_type == 'd': + pfds = PrivateFileDirShare.objects.add_private_dir_share( + username, email, repo_id, path, perm) + else: + continue + + # send a signal when sharing file successful + share_file_to_user_successful.send(sender=None, priv_share_obj=pfds) + messages.success(request, _('Successfully shared %s.') % file_or_dir) + + next = request.META.get('HTTP_REFERER', None) + if not next: + next = SITE_ROOT + return HttpResponseRedirect(next) + +@login_required +def rm_private_file_share(request, token): + """Remove private file shares. + """ + try: + pfs = PrivateFileDirShare.objects.get_priv_file_dir_share_by_token(token) + except PrivateFileDirShare.DoesNotExist: + raise Http404 + + + from_user = pfs.from_user + to_user = pfs.to_user + repo_id = pfs.repo_id + path = pfs.path + file_or_dir = os.path.basename(path.rstrip('/')) + username = request.user.username + + if username == from_user or username == to_user: + pfs.delete() + messages.success(request, _('Successfully unshared "%s".') % file_or_dir) + else: + messages.error(request, _("You don't have permission to unshared %s.") % file_or_dir) + + next = request.META.get('HTTP_REFERER', None) + if not next: + next = SITE_ROOT return HttpResponseRedirect(next) +@login_required +def save_private_file_share(request, token): + """ + Save private share file to someone's library. + """ + username = request.user.username + try: + pfs = PrivateFileDirShare.objects.get_priv_file_dir_share_by_token(token) + except PrivateFileDirShare.DoesNotExist: + raise Http404 + + from_user = pfs.from_user + to_user = pfs.to_user + repo_id = pfs.repo_id + path = pfs.path + src_path = os.path.dirname(path) + obj_name = os.path.basename(path.rstrip('/')) + + if username == from_user or username == to_user: + dst_repo_id = request.POST.get('dst_repo') + dst_path = request.POST.get('dst_path') + + new_obj_name = check_filename_with_rename(dst_repo_id, dst_path, obj_name) + seafile_api.copy_file(repo_id, src_path, obj_name, + dst_repo_id, dst_path, new_obj_name, username) + + messages.success(request, _(u'Successfully saved.')) + + else: + messages.error(request, _("You don't have permission to save %s.") % obj_name) + + next = request.META.get('HTTP_REFERER', None) + if not next: + next = SITE_ROOT + return HttpResponseRedirect(next) + @login_required def user_share_list(request, id_or_email): """List sharing repos with ``to_email``. diff --git a/seahub/templates/shared_file_view.html b/seahub/templates/shared_file_view.html index 0935029f80..2d2400ffdf 100644 --- a/seahub/templates/shared_file_view.html +++ b/seahub/templates/shared_file_view.html @@ -28,7 +28,9 @@

{% if request.user.is_authenticated and request.user.username != shared_by %} - + {% if save_to_link %} + + {% endif %} {% endif %} diff --git a/seahub/templates/snippets/file_share_popup.html b/seahub/templates/snippets/file_share_popup.html index a0225037b0..f478df794c 100644 --- a/seahub/templates/snippets/file_share_popup.html +++ b/seahub/templates/snippets/file_share_popup.html @@ -8,7 +8,7 @@
-
{% csrf_token %} + {% csrf_token %} diff --git a/seahub/urls.py b/seahub/urls.py index ac46fdb0d1..905fae79c9 100644 --- a/seahub/urls.py +++ b/seahub/urls.py @@ -5,13 +5,13 @@ from django.conf import settings from seahub.views import * from seahub.views.file import view_file, view_history_file, view_trash_file,\ view_snapshot_file, file_edit, view_shared_file, view_file_via_shared_dir,\ - text_diff, private_file_share, rm_private_file_share, \ - save_private_file_share, view_priv_shared_file + text_diff, view_priv_shared_file from seahub.views.repo import repo, repo_history_view from notifications.views import notification_list from group.views import group_list from message.views import user_msg_list -from share.views import user_share_list +from share.views import user_share_list, gen_private_file_share, \ + rm_private_file_share, save_private_file_share from seahub.views.wiki import personal_wiki, personal_wiki_pages, \ personal_wiki_create, personal_wiki_page_new, personal_wiki_page_edit, \ personal_wiki_page_delete @@ -78,15 +78,15 @@ urlpatterns = patterns('', url(r'^repo/(?P[-0-9a-f]{36})/trash/files/$', view_trash_file, name="view_trash_file"), url(r'^repo/(?P[-0-9a-f]{36})/snapshot/files/$', view_snapshot_file, name="view_snapshot_file"), url(r'^repo/(?P[-0-9a-f]{36})/file/edit/$', file_edit, name='file_edit'), - url(r'^repo/(?P[-0-9a-f]{36})/privshare/$', private_file_share, name='private_file_share'), - url(r'^repo/(?P[-0-9a-f]{36})/privshare/remove/$', rm_private_file_share, name='rm_private_file_share'), - url(r'^repo/(?P[-0-9a-f]{36})/privshare/save/$', save_private_file_share, name='save_private_file_share'), + url(r'^repo/(?P[-0-9a-f]{36})/privshare/$', gen_private_file_share, name='gen_private_file_share'), url(r'^repo/(?P[-0-9a-f]{36})/(?P[0-9a-f]{40})/$', repo_access_file, name='repo_access_file'), (r'^repo/save_settings$', repo_save_settings), url(r'^repo/create_sub_repo/$', create_sub_repo, name='create_sub_repo'), ### share file/dir ### url(r'^s/f/(?P[a-f0-9]{10})/$', view_priv_shared_file, name="view_priv_shared_file"), + url(r'^s/f/(?P[a-f0-9]{10})/rm/$', rm_private_file_share, name="rm_private_file_share"), + url(r'^s/f/(?P[a-f0-9]{10})/save/$', save_private_file_share, name='save_private_file_share'), url(r'^f/(?P[a-f0-9]{10})/$', view_shared_file, name='view_shared_file'), url(r'^d/(?P[a-f0-9]{10})/$', view_shared_dir, name='view_shared_dir'), url(r'^d/(?P[a-f0-9]{10})/files/$', view_file_via_shared_dir, name='view_file_via_shared_dir'), diff --git a/seahub/views/file.py b/seahub/views/file.py index 6276c0a417..a733fd34c7 100644 --- a/seahub/views/file.py +++ b/seahub/views/file.py @@ -35,7 +35,6 @@ from pysearpc import SearpcError from seahub.auth.decorators import login_required from seahub.base.decorators import repo_passwd_set_required from seahub.contacts.models import Contact -from seahub.signals import share_file_to_user_successful from seahub.share.models import FileShare, PrivateFileDirShare from seahub.wiki.utils import get_wiki_dirent from seahub.wiki.models import WikiDoesNotExist, WikiPageMissing @@ -628,7 +627,10 @@ def view_shared_file(request, token): (repo.id, shared_by, obj_id, obj_size)) except SearpcError, e: logger.error('Error when sending file-view message: %s' % str(e)) - + + accessible_repos = get_unencry_rw_repos_by_user(request.user.username) + save_to_link = reverse('save_shared_link') + '?t=' + token + return render_to_response('shared_file_view.html', { 'repo': repo, 'obj_id': obj_id, @@ -647,6 +649,8 @@ def view_shared_file(request, token): 'html_detail': ret_dict.get('html_detail', {}), 'filetype': ret_dict['filetype'], 'use_pdfjs':USE_PDFJS, + 'accessible_repos': accessible_repos, + 'save_to_link': save_to_link, }, context_instance=RequestContext(request)) def view_file_via_shared_dir(request, token): @@ -1042,93 +1046,6 @@ def office_convert_query_page_num(request): return HttpResponse(json.dumps(ret), content_type=content_type) ###### private file/dir shares -@require_POST -def private_file_share(request, repo_id): - emails = request.POST.getlist('emails', '') - s_type = request.POST.get('s_type', '') - path = request.POST.get('path', '') - perm = request.POST.get('perm', 'r') - file_or_dir = os.path.basename(path.rstrip('/')) - username = request.user.username - - for email in [e.strip() for e in emails if e.strip()]: - if not is_registered_user(email): - messages.error(request, _('Failed to share to "%s", user not found.') % email) - continue - - if s_type == 'f': - pfds = PrivateFileDirShare.objects.add_read_only_priv_file_share( - username, email, repo_id, path) - elif s_type == 'd': - pfds = PrivateFileDirShare.objects.add_private_dir_share( - username, email, repo_id, path, perm) - else: - continue - - # send a signal when sharing file successful - share_file_to_user_successful.send(sender=None, priv_share_obj=pfds) - messages.success(request, _('Successfully shared %s.') % file_or_dir) - - next = request.META.get('HTTP_REFERER', None) - if not next: - next = SITE_ROOT - return HttpResponseRedirect(next) - -@login_required -def rm_private_file_share(request, repo_id): - """Remove private file shares. - """ - from_user = request.GET.get('from', '') - to_user = request.GET.get('to', '') - path = request.GET.get('p') - file_or_dir = os.path.basename(path.rstrip('/')) - username = request.user.username - - if username == from_user or username == to_user: - - PrivateFileDirShare.objects.delete_private_file_dir_share( - from_user, to_user, repo_id, path) - messages.success(request, _('Successfully unshared "%s".') % file_or_dir) - else: - messages.error(request, _("You don't have permission to unshared %s.") % file_or_dir) - - next = request.META.get('HTTP_REFERER', None) - if not next: - next = SITE_ROOT - return HttpResponseRedirect(next) - - -@login_required -def save_private_file_share(request, repo_id): - """ - Save private share file to someone's library. - """ - - username = request.user.username - from_user = request.GET.get('from', '') - to_user = request.GET.get('to', '') - path = request.GET.get('p', '') - src_path = os.path.dirname(path) - obj_name = os.path.basename(path.rstrip('/')) - - if username == from_user or username == to_user: - dst_repo_id = request.POST.get('dst_repo') - dst_path = request.POST.get('dst_path') - - new_obj_name = check_filename_with_rename(dst_repo_id, dst_path, obj_name) - seafile_api.copy_file(repo_id, src_path, obj_name, - dst_repo_id, dst_path, new_obj_name, username) - - messages.success(request, _(u'Successfully saved.')) - - else: - messages.error(request, _("You don't have permission to save %s.") % obj_name) - - next = request.META.get('HTTP_REFERER', None) - if not next: - next = SITE_ROOT - return HttpResponseRedirect(next) - @login_required def view_priv_shared_file(request, token): """View private shared file. @@ -1179,8 +1096,7 @@ def view_priv_shared_file(request, token): handle_pdf(inner_path, obj_id, fileext, ret_dict) accessible_repos = get_unencry_rw_repos_by_user(username) - save_to_link = reverse('save_private_file_share', args=[repo.id]) + \ - '?from=' + pfs.from_user + '&to=' + pfs.to_user + '&p=' + pfs.path + save_to_link = reverse('save_private_file_share', args=[pfs.token]) return render_to_response('shared_file_view.html', { 'repo': repo,