mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-23 20:37:42 +00:00
[preivew-file] Check if can preview file before further operation
This commit is contained in:
@@ -1,8 +0,0 @@
|
|||||||
{% extends 'view_file_base.html' %}
|
|
||||||
{% load i18n %}
|
|
||||||
|
|
||||||
{% block extra_script %}{{ block.super }}
|
|
||||||
<script type="text/javascript">
|
|
||||||
$('#file-view').html('<div id="file-view-tip"><p>{% trans "This type of file cannot be viewed online." %}</p></div>');
|
|
||||||
</script>
|
|
||||||
{% endblock %}
|
|
@@ -57,7 +57,7 @@ from seahub.utils.ip import get_remote_ip
|
|||||||
from seahub.utils.file_types import (IMAGE, PDF, DOCUMENT, SPREADSHEET,
|
from seahub.utils.file_types import (IMAGE, PDF, DOCUMENT, SPREADSHEET,
|
||||||
MARKDOWN, TEXT, SF, OPENDOCUMENT)
|
MARKDOWN, TEXT, SF, OPENDOCUMENT)
|
||||||
from seahub.utils.star import is_file_starred
|
from seahub.utils.star import is_file_starred
|
||||||
from seahub.utils import HAS_OFFICE_CONVERTER
|
from seahub.utils import HAS_OFFICE_CONVERTER, FILEEXT_TYPE_MAP
|
||||||
|
|
||||||
if HAS_OFFICE_CONVERTER:
|
if HAS_OFFICE_CONVERTER:
|
||||||
from seahub.utils import (
|
from seahub.utils import (
|
||||||
@@ -286,6 +286,23 @@ def file_size_exceeds_preview_limit(file_size, file_type):
|
|||||||
else:
|
else:
|
||||||
return False, ''
|
return False, ''
|
||||||
|
|
||||||
|
def can_preview_file(file_name, file_size):
|
||||||
|
"""Check whether a file can be viewed online.
|
||||||
|
|
||||||
|
Returns (True, None) if file can be viewed online, otherwise
|
||||||
|
(False, erro_msg).
|
||||||
|
"""
|
||||||
|
file_type, file_ext = get_file_type_and_ext(file_name)
|
||||||
|
if file_ext in FILEEXT_TYPE_MAP: # check file extension
|
||||||
|
exceeds_limit, err_msg = file_size_exceeds_preview_limit(file_size,
|
||||||
|
file_type)
|
||||||
|
if exceeds_limit:
|
||||||
|
return (False, err_msg)
|
||||||
|
else:
|
||||||
|
return (True, None)
|
||||||
|
else:
|
||||||
|
return (False, "This type of file cannot be viewed online.")
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
@repo_passwd_set_required
|
@repo_passwd_set_required
|
||||||
def view_file(request, repo_id):
|
def view_file(request, repo_id):
|
||||||
@@ -339,11 +356,9 @@ def view_file(request, repo_id):
|
|||||||
'filetype': filetype}
|
'filetype': filetype}
|
||||||
|
|
||||||
fsize = get_file_size(repo.store_id, repo.version, obj_id)
|
fsize = get_file_size(repo.store_id, repo.version, obj_id)
|
||||||
|
can_preview, err_msg = can_preview_file(u_filename, fsize)
|
||||||
|
|
||||||
exceeds_limit, err_msg = file_size_exceeds_preview_limit(fsize, filetype)
|
if can_preview:
|
||||||
if exceeds_limit:
|
|
||||||
ret_dict['err'] = err_msg
|
|
||||||
else:
|
|
||||||
"""Choose different approach when dealing with different type of file."""
|
"""Choose different approach when dealing with different type of file."""
|
||||||
if is_textual_file(file_type=filetype):
|
if is_textual_file(file_type=filetype):
|
||||||
handle_textual_file(request, filetype, inner_path, ret_dict)
|
handle_textual_file(request, filetype, inner_path, ret_dict)
|
||||||
@@ -380,8 +395,11 @@ def view_file(request, repo_id):
|
|||||||
img_prev = posixpath.join(parent_dir, img_list[cur_img_index - 1])
|
img_prev = posixpath.join(parent_dir, img_list[cur_img_index - 1])
|
||||||
if cur_img_index != len(img_list) - 1:
|
if cur_img_index != len(img_list) - 1:
|
||||||
img_next = posixpath.join(parent_dir, img_list[cur_img_index + 1])
|
img_next = posixpath.join(parent_dir, img_list[cur_img_index + 1])
|
||||||
else:
|
|
||||||
pass
|
template = 'view_file_%s.html' % ret_dict['filetype'].lower()
|
||||||
|
else:
|
||||||
|
ret_dict['err'] = err_msg
|
||||||
|
template = 'view_file_base.html'
|
||||||
|
|
||||||
# generate file path navigator
|
# generate file path navigator
|
||||||
zipped = gen_path_link(path, repo.name)
|
zipped = gen_path_link(path, repo.name)
|
||||||
@@ -433,8 +451,6 @@ def view_file(request, repo_id):
|
|||||||
org_id = request.user.org.org_id
|
org_id = request.user.org.org_id
|
||||||
is_starred = is_file_starred(username, repo.id, path.encode('utf-8'), org_id)
|
is_starred = is_file_starred(username, repo.id, path.encode('utf-8'), org_id)
|
||||||
|
|
||||||
template = 'view_file_%s.html' % ret_dict['filetype'].lower()
|
|
||||||
|
|
||||||
office_preview_token = ret_dict.get('office_preview_token', '')
|
office_preview_token = ret_dict.get('office_preview_token', '')
|
||||||
|
|
||||||
return render_to_response(template, {
|
return render_to_response(template, {
|
||||||
@@ -648,10 +664,10 @@ def view_shared_file(request, token):
|
|||||||
ret_dict = {'err': '', 'file_content': '', 'encoding': '', 'file_enc': '',
|
ret_dict = {'err': '', 'file_content': '', 'encoding': '', 'file_enc': '',
|
||||||
'file_encoding_list': [], 'html_exists': False,
|
'file_encoding_list': [], 'html_exists': False,
|
||||||
'filetype': filetype}
|
'filetype': filetype}
|
||||||
exceeds_limit, err_msg = file_size_exceeds_preview_limit(file_size, filetype)
|
|
||||||
if exceeds_limit:
|
can_preview, err_msg = can_preview_file(filename, file_size)
|
||||||
ret_dict['err'] = err_msg
|
|
||||||
else:
|
if can_preview:
|
||||||
"""Choose different approach when dealing with different type of file."""
|
"""Choose different approach when dealing with different type of file."""
|
||||||
|
|
||||||
if is_textual_file(file_type=filetype):
|
if is_textual_file(file_type=filetype):
|
||||||
@@ -666,18 +682,20 @@ def view_shared_file(request, token):
|
|||||||
elif filetype == PDF:
|
elif filetype == PDF:
|
||||||
handle_pdf(inner_path, obj_id, fileext, ret_dict)
|
handle_pdf(inner_path, obj_id, fileext, ret_dict)
|
||||||
|
|
||||||
|
# send statistic messages
|
||||||
|
if ret_dict['filetype'] != 'Unknown':
|
||||||
|
try:
|
||||||
|
send_message('seahub.stats', 'file-view\t%s\t%s\t%s\t%s' % \
|
||||||
|
(repo.id, shared_by, obj_id, file_size))
|
||||||
|
except SearpcError, e:
|
||||||
|
logger.error('Error when sending file-view message: %s' % str(e))
|
||||||
|
else:
|
||||||
|
ret_dict['err'] = err_msg
|
||||||
|
|
||||||
# Increase file shared link view_cnt, this operation should be atomic
|
# Increase file shared link view_cnt, this operation should be atomic
|
||||||
fileshare.view_cnt = F('view_cnt') + 1
|
fileshare.view_cnt = F('view_cnt') + 1
|
||||||
fileshare.save()
|
fileshare.save()
|
||||||
|
|
||||||
# send statistic messages
|
|
||||||
if ret_dict['filetype'] != 'Unknown':
|
|
||||||
try:
|
|
||||||
send_message('seahub.stats', 'file-view\t%s\t%s\t%s\t%s' % \
|
|
||||||
(repo.id, shared_by, obj_id, file_size))
|
|
||||||
except SearpcError, e:
|
|
||||||
logger.error('Error when sending file-view message: %s' % str(e))
|
|
||||||
|
|
||||||
accessible_repos = get_unencry_rw_repos_by_user(request)
|
accessible_repos = get_unencry_rw_repos_by_user(request)
|
||||||
save_to_link = reverse('save_shared_link') + '?t=' + token
|
save_to_link = reverse('save_shared_link') + '?t=' + token
|
||||||
traffic_over_limit = user_traffic_over_limit(shared_by)
|
traffic_over_limit = user_traffic_over_limit(shared_by)
|
||||||
@@ -782,10 +800,10 @@ def view_file_via_shared_dir(request, token):
|
|||||||
ret_dict = {'err': '', 'file_content': '', 'encoding': '', 'file_enc': '',
|
ret_dict = {'err': '', 'file_content': '', 'encoding': '', 'file_enc': '',
|
||||||
'file_encoding_list': [], 'html_exists': False,
|
'file_encoding_list': [], 'html_exists': False,
|
||||||
'filetype': filetype}
|
'filetype': filetype}
|
||||||
exceeds_limit, err_msg = file_size_exceeds_preview_limit(file_size, filetype)
|
|
||||||
if exceeds_limit:
|
can_preview, err_msg = can_preview_file(filename, file_size)
|
||||||
ret_dict['err'] = err_msg
|
|
||||||
else:
|
if can_preview:
|
||||||
"""Choose different approach when dealing with different type of file."""
|
"""Choose different approach when dealing with different type of file."""
|
||||||
|
|
||||||
if is_textual_file(file_type=filetype):
|
if is_textual_file(file_type=filetype):
|
||||||
@@ -826,6 +844,8 @@ def view_file_via_shared_dir(request, token):
|
|||||||
(repo.id, shared_by, obj_id, file_size))
|
(repo.id, shared_by, obj_id, file_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))
|
||||||
|
else:
|
||||||
|
ret_dict['err'] = err_msg
|
||||||
|
|
||||||
traffic_over_limit = user_traffic_over_limit(shared_by)
|
traffic_over_limit = user_traffic_over_limit(shared_by)
|
||||||
|
|
||||||
@@ -1372,10 +1392,9 @@ def view_priv_shared_file(request, token):
|
|||||||
'file_encoding_list': [], 'html_exists': False,
|
'file_encoding_list': [], 'html_exists': False,
|
||||||
'filetype': filetype}
|
'filetype': filetype}
|
||||||
fsize = get_file_size(repo.store_id, repo.version, obj_id)
|
fsize = get_file_size(repo.store_id, repo.version, obj_id)
|
||||||
exceeds_limit, err_msg = file_size_exceeds_preview_limit(fsize, filetype)
|
can_preview, err_msg = can_preview_file(filename, fsize)
|
||||||
if exceeds_limit:
|
|
||||||
ret_dict['err'] = err_msg
|
if can_preview:
|
||||||
else:
|
|
||||||
"""Choose different approach when dealing with different type of file."""
|
"""Choose different approach when dealing with different type of file."""
|
||||||
|
|
||||||
if is_textual_file(file_type=filetype):
|
if is_textual_file(file_type=filetype):
|
||||||
@@ -1386,6 +1405,8 @@ def view_priv_shared_file(request, token):
|
|||||||
handle_spreadsheet(inner_path, obj_id, fileext, ret_dict)
|
handle_spreadsheet(inner_path, obj_id, fileext, ret_dict)
|
||||||
elif filetype == PDF:
|
elif filetype == PDF:
|
||||||
handle_pdf(inner_path, obj_id, fileext, ret_dict)
|
handle_pdf(inner_path, obj_id, fileext, ret_dict)
|
||||||
|
else:
|
||||||
|
ret_dict['err'] = err_msg
|
||||||
|
|
||||||
accessible_repos = get_unencry_rw_repos_by_user(request)
|
accessible_repos = get_unencry_rw_repos_by_user(request)
|
||||||
save_to_link = reverse('save_private_file_share', args=[pfs.token])
|
save_to_link = reverse('save_private_file_share', args=[pfs.token])
|
||||||
|
Reference in New Issue
Block a user