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 ;
|