mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-17 15:53:28 +00:00
Refactor private share, and fixed a few bugs
This commit is contained in:
@@ -43,7 +43,7 @@
|
||||
{% endif %}
|
||||
<td>--</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>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
@@ -71,7 +71,7 @@
|
||||
{% endif %}
|
||||
<td><a href="{% url 'repo' e.repo_id %}">{{e.repo.name}}</a></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>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
|
@@ -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``.
|
||||
|
@@ -28,7 +28,9 @@
|
||||
</p>
|
||||
|
||||
{% 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 %}
|
||||
<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>
|
||||
|
@@ -8,7 +8,7 @@
|
||||
</ul>
|
||||
|
||||
<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>
|
||||
<input type="hidden" name="repo_id" value="" />
|
||||
<input type="hidden" name="s_type" value="" />
|
||||
|
@@ -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<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})/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/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})/privshare/$', gen_private_file_share, name='gen_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'),
|
||||
(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<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'^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'),
|
||||
|
@@ -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,
|
||||
|
Reference in New Issue
Block a user