Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGonzalo Odiard <godiard@gmail.com>2013-03-18 20:28:51 (GMT)
committer Gonzalo Odiard <godiard@gmail.com>2013-03-18 20:28:51 (GMT)
commit985a44390c9d0a870b2c17d23fa14ddb0c8e6fb6 (patch)
treeb806f09d14f66ef8ef6a1545c7a7b5f3f923cf99
parente71f326f4fde9ba88d9c1991a1b1520e55f71161 (diff)
Upload metadata and preview
The filepicker is modified to create two files more, one with the preview, and another with the metadata as a json dump. The activity upload the 3 files, and the server put all the info in the new object created in the journal. One downside in this implementation is webkit show a message "3 files selected", while the user selected one. Signed-off-by: Gonzalo Odiard <gonzalo@laptop.org>
-rw-r--r--activity.py8
-rw-r--r--filepicker.py16
-rw-r--r--server.py68
3 files changed, 62 insertions, 30 deletions
diff --git a/activity.py b/activity.py
index 532e457..d840365 100644
--- a/activity.py
+++ b/activity.py
@@ -24,6 +24,7 @@ from gi.repository import WebKit
import telepathy
import dbus
+import os.path
from sugar3.activity import activity
from sugar3.activity.widgets import ActivityToolbarButton
@@ -201,9 +202,12 @@ class JournalShare(activity.Activity):
picker = FilePicker(self)
chosen = picker.run()
picker.destroy()
-
if chosen:
- request.select_files([chosen])
+ logging.error('CHOSEN %s', chosen)
+ tmp_dir = os.path.dirname(chosen)
+ preview_file = os.path.join(tmp_dir, 'preview')
+ metadata_file = os.path.join(tmp_dir, 'metadata')
+ request.select_files([chosen, preview_file, metadata_file])
elif hasattr(request, 'cancel'):
# WebKit2 only
request.cancel()
diff --git a/filepicker.py b/filepicker.py
index 65ac464..8921f03 100644
--- a/filepicker.py
+++ b/filepicker.py
@@ -18,6 +18,7 @@ import logging
import os
import tempfile
import shutil
+import json
from gi.repository import Gtk
@@ -58,6 +59,21 @@ class FilePicker(ObjectChooser):
os.rename(jobject.file_path, _file)
+ # create a file with the preview...
+ _preview_file = open(os.path.join(tmp_dir, 'preview'), 'w')
+ _preview_file.write(jobject.metadata['preview'])
+ _preview_file.close()
+
+ # and another with the metadata
+ _metadata_file = open(os.path.join(tmp_dir, 'metadata'),
+ 'w')
+ metadata = {}
+ for key in jobject.metadata.keys():
+ if key not in ('object_id', 'preview', 'progress'):
+ metadata[key] = jobject.metadata[key]
+ _metadata_file.write(json.dumps(metadata))
+ _metadata_file.close()
+
global _temp_dirs_to_clean
_temp_dirs_to_clean.append(tmp_dir)
diff --git a/server.py b/server.py
index 80046fd..4c58265 100644
--- a/server.py
+++ b/server.py
@@ -19,7 +19,7 @@ import sys
import logging
import json
import cgi
-import magic
+import dbus
from gi.repository import Gio
from sugar3 import network
@@ -103,8 +103,6 @@ def parse_multipart(fp, pdict):
line = headers['content-disposition']
if not line:
continue
- else:
- logging.error('CONTENT DISPOSITION %s', line)
key, params = cgi.parse_header(line)
if key != 'form-data':
continue
@@ -112,14 +110,20 @@ def parse_multipart(fp, pdict):
name = params['name']
else:
continue
- if 'filename' in params:
- filenamesdict[name] = params['filename']
if name in partdict:
partdict[name].append(data)
else:
partdict[name] = [data]
+ if 'filename' in params:
+ filename = params['filename']
+
+ if name in filenamesdict:
+ filenamesdict[name].append(filename)
+ else:
+ filenamesdict[name] = [filename]
+
return partdict, filenamesdict
@@ -143,32 +147,41 @@ class JournalHTTPRequestHandler(network.ChunkedGlibHTTPRequestHandler):
return None
ctype, pdict = cgi.parse_header(ctype)
file_fields, filenames = parse_multipart(self.rfile, pdict)
- file_content = file_fields['journal_item'][0]
- logging.error('CONTENT %s', file_content)
- file_name = filenames['journal_item']
- logging.error('NAME %s', file_name)
- # save to the journal
- new_dsobject = datastore.create()
- file_path = os.path.join(self.server.activity_root, 'instance',
- file_name)
- f = open(file_path, 'w')
- try:
- f.write(file_content)
- finally:
- f.close()
+
+ i = 0
+ preview_content = None
+ metadata_content = None
+ for file_name in filenames['journal_item']:
+ if file_name == 'preview':
+ preview_content = file_fields['journal_item'][i]
+ elif file_name == 'metadata':
+ metadata_content = file_fields['journal_item'][i]
+ else:
+ file_content = file_fields['journal_item'][i]
+ # save to the journal
+ new_dsobject = datastore.create()
+ file_path = os.path.join(self.server.activity_root,
+ 'instance', file_name)
+ f = open(file_path, 'w')
+ try:
+ f.write(file_content)
+ finally:
+ f.close()
+ i = i + 1
+
#Set the file_path in the datastore.
new_dsobject.set_file_path(file_path)
- new_dsobject.metadata['title'] = file_name
- # get mime type
- m = magic.open(magic.MAGIC_MIME)
- m.load()
- mime_type = m.file(file_path)
- if mime_type.find(';') > 0:
- # can be 'application/ogg; charset=binary'
- mime_type = mime_type[:mime_type.find(';')]
- new_dsobject.metadata['mime_type'] = mime_type
+ if metadata_content is not None:
+ metadata = json.loads(metadata_content)
+ for key in metadata.keys():
+ new_dsobject.metadata[key] = metadata[key]
+ if preview_content is not None and preview_content != '':
+ new_dsobject.metadata['preview'] = \
+ dbus.ByteArray(preview_content)
+
# mark as favorite
new_dsobject.metadata['keep'] = '1'
+
datastore.write(new_dsobject)
#redirect to index.html page
self.send_response(301)
@@ -270,7 +283,6 @@ class JournalManager():
self.dsobjects, self._nobjects = datastore.find({'keep': '1'})
results = []
for dsobj in self.dsobjects:
- logging.error(dir(dsobj))
title = ''
desc = ''
comment = []