1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-16 07:08:55 +00:00

Refactor private share, and fixed a few bugs

This commit is contained in:
zhengxie
2013-08-01 14:43:17 +08:00
parent 3336d02ecc
commit cb28ba74bc
6 changed files with 122 additions and 107 deletions

View File

@@ -43,7 +43,7 @@
{% endif %} {% endif %}
<td>--</td> <td>--</td>
<td>{{e.from_user|email2nickname}}</td> <td>{{e.from_user|email2nickname}}</td>
<td><a href="{% url 'rm_private_file_share' e.repo_id %}?from={{e.from_user|urlencode}}&to={{e.to_user|urlencode}}&p={{e.path|urlencode}}" class="op">Unshare</a></td> <td><a href="{% url 'rm_private_file_share' e.token %}" class="op">Unshare</a></td>
</tr> </tr>
{% endfor %} {% endfor %}
{% endif %} {% endif %}
@@ -71,7 +71,7 @@
{% endif %} {% endif %}
<td><a href="{% url 'repo' e.repo_id %}">{{e.repo.name}}</a></td> <td><a href="{% url 'repo' e.repo_id %}">{{e.repo.name}}</a></td>
<td>{{e.to_user|email2nickname}}</td> <td>{{e.to_user|email2nickname}}</td>
<td><a href="{% url 'rm_private_file_share' e.repo_id %}?from={{e.from_user|urlencode}}&to={{e.to_user|urlencode}}&p={{e.path|urlencode}}" class="op">Unshare</a></td> <td><a href="{% url 'rm_private_file_share' e.token %}" class="op">Unshare</a></td>
</tr> </tr>
{% endfor %} {% endfor %}
{% endif %} {% endif %}

View File

@@ -32,6 +32,7 @@ from seahub.auth.decorators import login_required
from seahub.base.accounts import User from seahub.base.accounts import User
from seahub.contacts.models import Contact from seahub.contacts.models import Contact
from seahub.contacts.signals import mail_sended 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.views import validate_owner, is_registered_user
from seahub.utils import render_permission_error, string2list, render_error, \ from seahub.utils import render_permission_error, string2list, render_error, \
gen_token, gen_shared_link, gen_dir_share_link, gen_file_share_link, \ 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) # return HttpResponseRedirect(next)
########## share link
@login_required @login_required
def get_shared_link(request): def get_shared_link(request):
""" """
@@ -625,7 +627,6 @@ def send_shared_link(request):
if not request.is_ajax() and not request.method == 'POST': if not request.is_ajax() and not request.method == 'POST':
raise Http404 raise Http404
result = {}
content_type = 'application/json; charset=utf-8' content_type = 'application/json; charset=utf-8'
if not IS_EMAIL_CONFIGURED: if not IS_EMAIL_CONFIGURED:
@@ -672,16 +673,15 @@ def send_shared_link(request):
def save_shared_link(request): def save_shared_link(request):
"""Save public share link to one's library. """Save public share link to one's library.
""" """
username = request.user.username username = request.user.username
token = request.POST.get('s_token', '') token = request.GET.get('t', '')
dst_repo_id = request.POST.get('dst_repo') dst_repo_id = request.POST.get('dst_repo')
dst_path = request.POST.get('dst_path') dst_path = request.POST.get('dst_path')
try: try:
fs = FileShare.objects.get(token=token) fs = FileShare.objects.get(token=token)
except FileShare.DoesNotExist: except FileShare.DoesNotExist:
assert False # todo raise Http404
src_repo_id = fs.repo_id src_repo_id = fs.repo_id
src_path = os.path.dirname(fs.path) src_path = os.path.dirname(fs.path)
@@ -696,9 +696,106 @@ def save_shared_link(request):
next = request.META.get('HTTP_REFERER', None) next = request.META.get('HTTP_REFERER', None)
if not next: 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) 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 @login_required
def user_share_list(request, id_or_email): def user_share_list(request, id_or_email):
"""List sharing repos with ``to_email``. """List sharing repos with ``to_email``.

View File

@@ -28,7 +28,9 @@
</p> </p>
{% if request.user.is_authenticated and request.user.username != shared_by %} {% if request.user.is_authenticated and request.user.username != shared_by %}
<button data="{{save_to_link}}" id="save">{% trans "Save to..."%}</button> {% if save_to_link %}
<button data="{{save_to_link}}" id="save">{% trans "Save to..."%}</button>
{% endif %}
{% endif %} {% endif %}
<button data="{{ SITE_ROOT }}repo/{{ repo.id }}/{{ obj_id }}/?file_name={{ file_name|urlencode }}&op=download&t={{ shared_token }}&p={{path|urlencode}}" id="download">{% trans "Download" %}</button> <button data="{{ SITE_ROOT }}repo/{{ repo.id }}/{{ obj_id }}/?file_name={{ file_name|urlencode }}&op=download&t={{ shared_token }}&p={{path|urlencode}}" id="download">{% trans "Download" %}</button>
</div> </div>

View File

@@ -8,7 +8,7 @@
</ul> </ul>
<div id="private-share"> <div id="private-share">
<form id="private-share-form" method="post" action="{% url 'private_file_share' repo.id %}">{% csrf_token %} <form id="private-share-form" method="post" action="{% url 'gen_private_file_share' repo.id %}">{% csrf_token %}
<select name="emails" class="w100" multiple="multiple"></select> <select name="emails" class="w100" multiple="multiple"></select>
<input type="hidden" name="repo_id" value="" /> <input type="hidden" name="repo_id" value="" />
<input type="hidden" name="s_type" value="" /> <input type="hidden" name="s_type" value="" />

View File

@@ -5,13 +5,13 @@ from django.conf import settings
from seahub.views import * from seahub.views import *
from seahub.views.file import view_file, view_history_file, view_trash_file,\ 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,\ view_snapshot_file, file_edit, view_shared_file, view_file_via_shared_dir,\
text_diff, private_file_share, rm_private_file_share, \ text_diff, view_priv_shared_file
save_private_file_share, view_priv_shared_file
from seahub.views.repo import repo, repo_history_view from seahub.views.repo import repo, repo_history_view
from notifications.views import notification_list from notifications.views import notification_list
from group.views import group_list from group.views import group_list
from message.views import user_msg_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, \ from seahub.views.wiki import personal_wiki, personal_wiki_pages, \
personal_wiki_create, personal_wiki_page_new, personal_wiki_page_edit, \ personal_wiki_create, personal_wiki_page_new, personal_wiki_page_edit, \
personal_wiki_page_delete personal_wiki_page_delete
@@ -78,15 +78,15 @@ urlpatterns = patterns('',
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"),
url(r'^repo/(?P<repo_id>[-0-9a-f]{36})/snapshot/files/$', view_snapshot_file, name="view_snapshot_file"), url(r'^repo/(?P<repo_id>[-0-9a-f]{36})/snapshot/files/$', view_snapshot_file, name="view_snapshot_file"),
url(r'^repo/(?P<repo_id>[-0-9a-f]{36})/file/edit/$', file_edit, name='file_edit'), url(r'^repo/(?P<repo_id>[-0-9a-f]{36})/file/edit/$', file_edit, name='file_edit'),
url(r'^repo/(?P<repo_id>[-0-9a-f]{36})/privshare/$', private_file_share, name='private_file_share'), url(r'^repo/(?P<repo_id>[-0-9a-f]{36})/privshare/$', gen_private_file_share, name='gen_private_file_share'),
url(r'^repo/(?P<repo_id>[-0-9a-f]{36})/privshare/remove/$', rm_private_file_share, name='rm_private_file_share'),
url(r'^repo/(?P<repo_id>[-0-9a-f]{36})/privshare/save/$', save_private_file_share, name='save_private_file_share'),
url(r'^repo/(?P<repo_id>[-0-9a-f]{36})/(?P<obj_id>[0-9a-f]{40})/$', repo_access_file, name='repo_access_file'), url(r'^repo/(?P<repo_id>[-0-9a-f]{36})/(?P<obj_id>[0-9a-f]{40})/$', repo_access_file, name='repo_access_file'),
(r'^repo/save_settings$', repo_save_settings), (r'^repo/save_settings$', repo_save_settings),
url(r'^repo/create_sub_repo/$', create_sub_repo, name='create_sub_repo'), url(r'^repo/create_sub_repo/$', create_sub_repo, name='create_sub_repo'),
### share file/dir ### ### share file/dir ###
url(r'^s/f/(?P<token>[a-f0-9]{10})/$', view_priv_shared_file, name="view_priv_shared_file"), url(r'^s/f/(?P<token>[a-f0-9]{10})/$', view_priv_shared_file, name="view_priv_shared_file"),
url(r'^s/f/(?P<token>[a-f0-9]{10})/rm/$', rm_private_file_share, name="rm_private_file_share"),
url(r'^s/f/(?P<token>[a-f0-9]{10})/save/$', save_private_file_share, name='save_private_file_share'),
url(r'^f/(?P<token>[a-f0-9]{10})/$', view_shared_file, name='view_shared_file'), url(r'^f/(?P<token>[a-f0-9]{10})/$', view_shared_file, name='view_shared_file'),
url(r'^d/(?P<token>[a-f0-9]{10})/$', view_shared_dir, name='view_shared_dir'), url(r'^d/(?P<token>[a-f0-9]{10})/$', view_shared_dir, name='view_shared_dir'),
url(r'^d/(?P<token>[a-f0-9]{10})/files/$', view_file_via_shared_dir, name='view_file_via_shared_dir'), url(r'^d/(?P<token>[a-f0-9]{10})/files/$', view_file_via_shared_dir, name='view_file_via_shared_dir'),

View File

@@ -35,7 +35,6 @@ from pysearpc import SearpcError
from seahub.auth.decorators import login_required from seahub.auth.decorators import login_required
from seahub.base.decorators import repo_passwd_set_required from seahub.base.decorators import repo_passwd_set_required
from seahub.contacts.models import Contact from seahub.contacts.models import Contact
from seahub.signals import share_file_to_user_successful
from seahub.share.models import FileShare, PrivateFileDirShare from seahub.share.models import FileShare, PrivateFileDirShare
from seahub.wiki.utils import get_wiki_dirent from seahub.wiki.utils import get_wiki_dirent
from seahub.wiki.models import WikiDoesNotExist, WikiPageMissing 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)) (repo.id, shared_by, obj_id, obj_size))
except SearpcError, e: except SearpcError, e:
logger.error('Error when sending file-view message: %s' % str(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', { return render_to_response('shared_file_view.html', {
'repo': repo, 'repo': repo,
'obj_id': obj_id, 'obj_id': obj_id,
@@ -647,6 +649,8 @@ def view_shared_file(request, token):
'html_detail': ret_dict.get('html_detail', {}), 'html_detail': ret_dict.get('html_detail', {}),
'filetype': ret_dict['filetype'], 'filetype': ret_dict['filetype'],
'use_pdfjs':USE_PDFJS, 'use_pdfjs':USE_PDFJS,
'accessible_repos': accessible_repos,
'save_to_link': save_to_link,
}, context_instance=RequestContext(request)) }, context_instance=RequestContext(request))
def view_file_via_shared_dir(request, token): 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) return HttpResponse(json.dumps(ret), content_type=content_type)
###### private file/dir shares ###### 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 @login_required
def view_priv_shared_file(request, token): def view_priv_shared_file(request, token):
"""View private shared file. """View private shared file.
@@ -1179,8 +1096,7 @@ def view_priv_shared_file(request, token):
handle_pdf(inner_path, obj_id, fileext, ret_dict) handle_pdf(inner_path, obj_id, fileext, ret_dict)
accessible_repos = get_unencry_rw_repos_by_user(username) accessible_repos = get_unencry_rw_repos_by_user(username)
save_to_link = reverse('save_private_file_share', args=[repo.id]) + \ save_to_link = reverse('save_private_file_share', args=[pfs.token])
'?from=' + pfs.from_user + '&to=' + pfs.to_user + '&p=' + pfs.path
return render_to_response('shared_file_view.html', { return render_to_response('shared_file_view.html', {
'repo': repo, 'repo': repo,