diff --git a/seahub/templates/js/templates.html b/seahub/templates/js/templates.html index ca56ec196a..6e7d92c1d8 100644 --- a/seahub/templates/js/templates.html +++ b/seahub/templates/js/templates.html @@ -714,7 +714,7 @@
- <% if (dirent.is_img || dirent.is_video) { %> + <% if (dirent.is_img || dirent.is_xmind || dirent.is_video) { %> <% if (dirent.encoded_thumbnail_src) { %> <% } else { %> diff --git a/seahub/templates/view_file_image.html b/seahub/templates/view_file_image.html index f8a0dc25cf..05dd746b9e 100644 --- a/seahub/templates/view_file_image.html +++ b/seahub/templates/view_file_image.html @@ -32,7 +32,11 @@ $(this).attr('src', '{{ raw_path|escapejs }}'); }) {% else %} - $('#image-view').attr('src', '{{ raw_path|escapejs }}'); + {% if xmind_image_src %} + $('#image-view').attr('src', '{{ SITE_ROOT }}{{ xmind_image_src|escapejs }}'); + {% else %} + $('#image-view').attr('src', '{{ raw_path|escapejs }}'); + {% endif %} {% endif %} {% include 'snippets/image_file_view_js.html' %} diff --git a/seahub/thumbnail/utils.py b/seahub/thumbnail/utils.py index 0f0c0a7ee9..17c7109338 100644 --- a/seahub/thumbnail/utils.py +++ b/seahub/thumbnail/utils.py @@ -6,20 +6,22 @@ import tempfile import urllib2 import logging from StringIO import StringIO +import zipfile from PIL import Image from seaserv import get_file_id_by_path, get_repo, get_file_size, \ seafile_api from seahub.utils import gen_inner_file_get_url, get_file_type_and_ext -from seahub.utils.file_types import VIDEO +from seahub.utils.file_types import VIDEO, XMIND from seahub.settings import THUMBNAIL_IMAGE_SIZE_LIMIT, \ THUMBNAIL_EXTENSION, THUMBNAIL_ROOT, THUMBNAIL_IMAGE_ORIGINAL_SIZE_LIMIT,\ ENABLE_VIDEO_THUMBNAIL, THUMBNAIL_VIDEO_FRAME_TIME - # Get an instance of a logger logger = logging.getLogger(__name__) +XMIND_IMAGE_SIZE = 1024 + if ENABLE_VIDEO_THUMBNAIL: try: from moviepy.editor import VideoFileClip @@ -117,6 +119,9 @@ def generate_thumbnail(request, repo_id, size, path): else: return (False, 400) + if filetype == XMIND: + return extract_xmind_image(repo_id, path, size) + # image thumbnails if file_size > THUMBNAIL_IMAGE_SIZE_LIMIT * 1024**2: return (False, 400) @@ -184,3 +189,27 @@ def _create_thumbnail_common(fp, thumbnail_file, size): image.thumbnail((size, size), Image.ANTIALIAS) image.save(thumbnail_file, THUMBNAIL_EXTENSION) return (True, 200) + +def extract_xmind_image(repo_id, path, size=XMIND_IMAGE_SIZE): + + # get inner path + file_name = os.path.basename(path) + file_id = seafile_api.get_file_id_by_path(repo_id, path) + fileserver_token = seafile_api.get_fileserver_access_token(repo_id, + file_id, 'view', '') + inner_path = gen_inner_file_get_url(fileserver_token, file_name) + + # extract xmind image + xmind_file = urllib2.urlopen(inner_path) + xmind_file_str = StringIO(xmind_file.read()) + xmind_zip_file = zipfile.ZipFile(xmind_file_str, 'r') + extracted_xmind_image = xmind_zip_file.read('Thumbnails/thumbnail.png') + extracted_xmind_image_str = StringIO(extracted_xmind_image) + + # save origin xmind image to thumbnail folder + thumbnail_dir = os.path.join(THUMBNAIL_ROOT, str(size)) + if not os.path.exists(thumbnail_dir): + os.makedirs(thumbnail_dir) + local_xmind_image = os.path.join(thumbnail_dir, file_id) + + return _create_thumbnail_common(extracted_xmind_image_str, local_xmind_image, size) diff --git a/seahub/utils/__init__.py b/seahub/utils/__init__.py index 14c2182a80..d1b052f82a 100644 --- a/seahub/utils/__init__.py +++ b/seahub/utils/__init__.py @@ -106,6 +106,7 @@ PREVIEW_FILEEXT = { VIDEO: ('mp4', 'ogv', 'webm', 'mov'), AUDIO: ('mp3', 'oga', 'ogg'), '3D': ('stl', 'obj'), + XMIND: ('xmind',), } def gen_fileext_type_map(): diff --git a/seahub/utils/file_types.py b/seahub/utils/file_types.py index cb4ad7ef63..efe96302c1 100644 --- a/seahub/utils/file_types.py +++ b/seahub/utils/file_types.py @@ -9,3 +9,4 @@ VIDEO = 'Video' AUDIO = 'Audio' SPREADSHEET = 'SpreadSheet' DRAW = 'Draw' +XMIND = 'XMind' diff --git a/seahub/views/ajax.py b/seahub/views/ajax.py index 1757fc5189..51cc563779 100644 --- a/seahub/views/ajax.py +++ b/seahub/views/ajax.py @@ -45,7 +45,7 @@ from seahub.utils import check_filename_with_rename, EMPTY_SHA1, \ gen_file_upload_url, is_org_context, is_pro_version, normalize_dir_path, \ FILEEXT_TYPE_MAP from seahub.utils.star import get_dir_starred_files -from seahub.utils.file_types import IMAGE, VIDEO +from seahub.utils.file_types import IMAGE, VIDEO, XMIND from seahub.utils.file_op import check_file_lock, ONLINE_OFFICE_LOCK_OWNER from seahub.utils.repo import get_locked_files_by_dir, get_repo_owner, \ repo_has_been_shared_out @@ -385,7 +385,10 @@ def list_lib_dir(request, repo_id): if file_type == VIDEO and ENABLE_VIDEO_THUMBNAIL: f_['is_video'] = True - if file_type == IMAGE or \ + if file_type == XMIND: + f_['is_xmind'] = True + + if file_type in (IMAGE, XMIND) or \ file_type == VIDEO and ENABLE_VIDEO_THUMBNAIL: # if thumbnail has already been created, return its src. # Then web browser will use this src to get thumbnail instead of diff --git a/seahub/views/file.py b/seahub/views/file.py index 5fa8c215a1..5e936bdf80 100644 --- a/seahub/views/file.py +++ b/seahub/views/file.py @@ -59,7 +59,7 @@ from seahub.utils import render_error, is_org_context, \ from seahub.utils.ip import get_remote_ip from seahub.utils.timeutils import utc_to_local from seahub.utils.file_types import (IMAGE, PDF, SVG, - DOCUMENT, SPREADSHEET, AUDIO, MARKDOWN, TEXT, VIDEO, DRAW) + DOCUMENT, SPREADSHEET, AUDIO, MARKDOWN, TEXT, VIDEO, DRAW, XMIND) from seahub.utils.star import is_file_starred from seahub.utils.http import json_response, \ BadRequestException, RequestForbbiddenException @@ -69,6 +69,8 @@ from seahub.views import check_folder_permission, \ get_unencry_rw_repos_by_user from seahub.utils.repo import is_repo_owner from seahub.group.utils import is_group_member +from seahub.thumbnail.utils import extract_xmind_image, get_thumbnail_src, \ + XMIND_IMAGE_SIZE, THUMBNAIL_ROOT from seahub.constants import HASH_URLS @@ -644,6 +646,22 @@ def view_lib_file(request, repo_id, path): else: return render(request, template, return_dict) + elif filetype == XMIND: + + xmind_dir = os.path.join(THUMBNAIL_ROOT, str(XMIND_IMAGE_SIZE)) + xmind_image = os.path.join(xmind_dir, file_id) + if not os.path.exists(xmind_image): + try: + extract_xmind_image(repo_id, path) + return_dict['xmind_image_src'] = get_thumbnail_src(repo_id, + XMIND_IMAGE_SIZE, path) + except Exception as e: + logger.error(e) + error_msg = _(u'Unable to view file') + return_dict['err'] = error_msg + + return render(request, 'view_file_image.html', return_dict) + elif filetype == IMAGE: if file_size > FILE_PREVIEW_MAX_SIZE: error_msg = _(u'File size surpasses %s, can not be opened online.') % \ @@ -928,7 +946,6 @@ def _download_file_from_share_link(request, fileshare): """ next = request.META.get('HTTP_REFERER', settings.SITE_ROOT) - username = request.user.username repo = get_repo(fileshare.repo_id) if not repo: raise Http404 diff --git a/static/scripts/app/views/dir.js b/static/scripts/app/views/dir.js index e5f3491461..cd6e69f73f 100644 --- a/static/scripts/app/views/dir.js +++ b/static/scripts/app/views/dir.js @@ -359,7 +359,7 @@ define([ var items = this.dir.filter(function(dirent) { // 'dirent' is a model - return (dirent.get('is_img') || dirent.get('is_video')) && !dirent.get('encoded_thumbnail_src'); + return (dirent.get('is_img') || dirent.get('is_xmind') || dirent.get('is_video')) && !dirent.get('encoded_thumbnail_src'); }); if (items.length == 0) { return ;