diff options
author | Gonzalo Odiard <godiard@gmail.com> | 2013-03-18 20:28:51 (GMT) |
---|---|---|
committer | Gonzalo Odiard <godiard@gmail.com> | 2013-03-18 20:28:51 (GMT) |
commit | 985a44390c9d0a870b2c17d23fa14ddb0c8e6fb6 (patch) | |
tree | b806f09d14f66ef8ef6a1545c7a7b5f3f923cf99 | |
parent | e71f326f4fde9ba88d9c1991a1b1520e55f71161 (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.py | 8 | ||||
-rw-r--r-- | filepicker.py | 16 | ||||
-rw-r--r-- | server.py | 68 |
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) @@ -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 = [] |