Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Silbe <sascha@silbe.org>2009-06-22 00:29:56 (GMT)
committer Sascha Silbe <sascha@silbe.org>2009-06-22 00:29:56 (GMT)
commitd0d34d896d81f84354acb85f244c49bf9f178534 (patch)
tree6f4a1370c47038e87bd08a42cbb733404f586817
parentcd7debb52a563c7fe2d51ef80ce6bad19c6f484d (diff)
prototype take 1: add version_id / vid everywhere
-rw-r--r--src/sugar/activity/activity.py10
-rw-r--r--src/sugar/activity/activityfactory.py12
-rw-r--r--src/sugar/activity/activityhandle.py20
-rw-r--r--src/sugar/activity/main.py5
-rw-r--r--src/sugar/datastore/datastore.py39
-rw-r--r--src/sugar/datastore/dbus_helpers.py41
-rw-r--r--src/sugar/graphics/objectchooser.py9
7 files changed, 67 insertions, 69 deletions
diff --git a/src/sugar/activity/activity.py b/src/sugar/activity/activity.py
index 9809928..f3a4eb0 100644
--- a/src/sugar/activity/activity.py
+++ b/src/sugar/activity/activity.py
@@ -501,7 +501,7 @@ class Activity(Window, gtk.Container):
share_scope = SCOPE_PRIVATE
if handle.object_id:
- self._jobject = datastore.get(handle.object_id)
+ self._jobject = datastore.get(handle.object_id, handle.version_id)
self.set_title(self._jobject.metadata['title'])
if self._jobject.metadata.has_key('share-scope'):
@@ -691,7 +691,7 @@ class Activity(Window, gtk.Container):
"""
raise NotImplementedError
- def __save_cb(self):
+ def __save_cb(self, object_id, version_id):
logging.debug('Activity.__save_cb')
self._updating_jobject = False
if self._quit_requested:
@@ -771,7 +771,7 @@ class Activity(Window, gtk.Container):
logging.debug('Cannot save, no journal object.')
return
- logging.debug('Activity.save: %r' % self._jobject.object_id)
+ logging.debug('Activity.save: (%r,%r)' % (self._jobject.object_id, self._jobject.version_id))
if self._updating_jobject:
logging.info('Activity.save: still processing a previous request.')
@@ -815,9 +815,10 @@ class Activity(Window, gtk.Container):
Activities should not override this method. Instead, like save() do any
copy work that needs to be done in write_file()
"""
- logging.debug('Activity.copy: %r' % self._jobject.object_id)
+ logging.debug('Activity.copy: (%r,%r)' % (self._jobject.object_id, self._jobject.version_id))
self.save()
self._jobject.object_id = None
+ self._jobject.version_id = None
def __privacy_changed_cb(self, shared_activity, param_spec):
if shared_activity.props.private:
@@ -1056,6 +1057,7 @@ def get_activity_root():
else:
raise RuntimeError("No SUGAR_ACTIVITY_ROOT set.")
+# SS: TODO: optionally pass version_id
def show_object_in_journal(object_id):
bus = dbus.SessionBus()
obj = bus.get_object(J_DBUS_SERVICE, J_DBUS_PATH)
diff --git a/src/sugar/activity/activityfactory.py b/src/sugar/activity/activityfactory.py
index e218a7c..566455c 100644
--- a/src/sugar/activity/activityfactory.py
+++ b/src/sugar/activity/activityfactory.py
@@ -123,7 +123,7 @@ def get_environment(activity):
return environ
-def get_command(activity, activity_id=None, object_id=None, uri=None):
+def get_command(activity, activity_id=None, object_id=None, version_id=None, uri=None):
if not activity_id:
activity_id = create_activity_id()
@@ -133,6 +133,8 @@ def get_command(activity, activity_id=None, object_id=None, uri=None):
if object_id is not None:
command.extend(['-o', object_id])
+ if version_id is not None:
+ command.extend(['-r', version_id])
if uri is not None:
command.extend(['-u', uri])
@@ -251,6 +253,7 @@ class ActivityCreationHandler(gobject.GObject):
(log_path, log_file) = open_log_file(self._bundle)
command = get_command(self._bundle, self._handle.activity_id,
self._handle.object_id,
+ self._handle.version_id,
self._handle.uri)
if not self._use_rainbow:
@@ -320,6 +323,7 @@ class ActivityCreationHandler(gobject.GObject):
if count > 1:
logging.debug("Multiple objects has the same activity_id.")
self._handle.object_id = jobjects[0]['uid']
+ self._handle.version_id = jobjects[0]['vid']
self._launch_activity()
def _find_object_error_handler(self, err):
@@ -337,7 +341,7 @@ def create_with_uri(bundle, uri):
activity_handle = ActivityHandle(uri=uri)
return ActivityCreationHandler(bundle, activity_handle)
-def create_with_object_id(bundle, object_id):
- """Create a new activity and pass the object id as handle."""
- activity_handle = ActivityHandle(object_id=object_id)
+def create_with_object_id(bundle, object_id, version_id):
+ """Create a new activity and pass both the object id and the version id as handle."""
+ activity_handle = ActivityHandle(object_id=object_id, version_id=version_id)
return ActivityCreationHandler(bundle, activity_handle)
diff --git a/src/sugar/activity/activityhandle.py b/src/sugar/activity/activityhandle.py
index f255fd5..83645d0 100644
--- a/src/sugar/activity/activityhandle.py
+++ b/src/sugar/activity/activityhandle.py
@@ -22,24 +22,21 @@ STABLE.
class ActivityHandle(object):
"""Data structure storing simple activity metadata"""
def __init__(
- self, activity_id=None, object_id=None, uri=None
+ self, activity_id=None, object_id=None, version_id=None, uri=None
):
"""Initialise the handle from activity_id
activity_id -- unique id for the activity to be
created
object_id -- identity of the journal object
- associated with the activity. It was used by
- the journal prototype implementation, might
- change when we do the real one.
-
+ associated with the activity.
+ version_id -- the exact version of the journal
+ object.
+
When you resume an activity from the journal
- the object_id will be passed in. It's optional
- since new activities does not have an
+ the object_id and version_id will be passed in.
+ It's optional since new activities do not have an
associated object (yet).
-
- XXX Not clear how this relates to the activity
- id yet, i.e. not sure we really need both. TBF
uri -- URI associated with the activity. Used when
opening an external file or resource in the
activity, rather than a journal object
@@ -48,6 +45,7 @@ class ActivityHandle(object):
"""
self.activity_id = activity_id
self.object_id = object_id
+ self.version_id = version_id
self.uri = uri
def get_dict(self):
@@ -55,6 +53,7 @@ class ActivityHandle(object):
result = { 'activity_id' : self.activity_id }
if self.object_id:
result['object_id'] = self.object_id
+ result['version_id'] = self.version_id
if self.uri:
result['uri'] = self.uri
@@ -65,6 +64,7 @@ def create_from_dict(handle_dict):
result = ActivityHandle(
handle_dict['activity_id'],
object_id = handle_dict.get('object_id'),
+ version_id = handle_dict.get('version_id'),
uri = handle_dict.get('uri'),
)
return result
diff --git a/src/sugar/activity/main.py b/src/sugar/activity/main.py
index 721595c..f894118 100644
--- a/src/sugar/activity/main.py
+++ b/src/sugar/activity/main.py
@@ -62,6 +62,8 @@ def main():
help="identifier of the activity instance")
parser.add_option("-o", "--object-id", dest="object_id",
help="identifier of the associated datastore object")
+ parser.add_option("-r", "--version-id", dest="version_id",
+ help="version of the associated datastore object")
parser.add_option("-u", "--uri", dest="uri",
help="URI to load")
parser.add_option('-s', '--single-process', dest='single_process',
@@ -109,7 +111,8 @@ def main():
activity_constructor = getattr(module, class_name)
activity_handle = activityhandle.ActivityHandle(
activity_id=options.activity_id,
- object_id=options.object_id, uri=options.uri)
+ object_id=options.object_id, version_id=options.version_id,
+ uri=options.uri)
if options.single_process is True:
sessionbus = dbus.SessionBus()
diff --git a/src/sugar/datastore/datastore.py b/src/sugar/datastore/datastore.py
index 80d5936..87eedd2 100644
--- a/src/sugar/datastore/datastore.py
+++ b/src/sugar/datastore/datastore.py
@@ -81,8 +81,9 @@ class DSMetadata(gobject.GObject):
return default
class DSObject(object):
- def __init__(self, object_id, metadata=None, file_path=None):
+ def __init__(self, object_id, version_id, metadata=None, file_path=None):
self.object_id = object_id
+ self.version_id = version_id
self._metadata = metadata
self._file_path = file_path
self._destroyed = False
@@ -90,7 +91,7 @@ class DSObject(object):
def get_metadata(self):
if self._metadata is None and not self.object_id is None:
- metadata = DSMetadata(dbus_helpers.get_properties(self.object_id))
+ metadata = DSMetadata(dbus_helpers.get_properties(self.object_id, self.version_id))
self._metadata = metadata
return self._metadata
@@ -102,7 +103,7 @@ class DSObject(object):
def get_file_path(self, fetch=True):
if fetch and self._file_path is None and not self.object_id is None:
- self.set_file_path(dbus_helpers.get_filename(self.object_id))
+ self.set_file_path(dbus_helpers.get_filename(self.object_id, self.version_id))
self._owns_file = True
return self._file_path
@@ -136,11 +137,11 @@ class DSObject(object):
def copy(self):
return DSObject(None, self._metadata.copy(), self._file_path)
-def get(object_id):
+def get(object_id, version_id):
logging.debug('datastore.get')
- metadata = dbus_helpers.get_properties(object_id)
+ metadata = dbus_helpers.get_properties(object_id, version_id)
- ds_object = DSObject(object_id, DSMetadata(metadata), None)
+ ds_object = DSObject(object_id, version_id, DSMetadata(metadata), None)
# TODO: register the object for updates
return ds_object
@@ -148,7 +149,7 @@ def create():
metadata = DSMetadata()
metadata['mtime'] = datetime.now().isoformat()
metadata['timestamp'] = int(time.time())
- return DSObject(object_id=None, metadata=metadata, file_path=None)
+ return DSObject(object_id=None, version_id=None, metadata=metadata, file_path=None)
def write(ds_object, update_mtime=True, transfer_ownership=False,
reply_handler=None, error_handler=None, timeout=-1):
@@ -167,7 +168,7 @@ def write(ds_object, update_mtime=True, transfer_ownership=False,
# FIXME: this func will be sync for creates regardless of the handlers
# supplied. This is very bad API, need to decide what to do here.
if ds_object.object_id:
- dbus_helpers.update(ds_object.object_id,
+ dbus_helpers.update(ds_object.object_id, ds_object.version_id,
properties,
file_path,
transfer_ownership,
@@ -178,16 +179,17 @@ def write(ds_object, update_mtime=True, transfer_ownership=False,
if reply_handler or error_handler:
logging.warning('datastore.write() cannot currently be called' \
'async for creates, see ticket 3071')
- ds_object.object_id = dbus_helpers.create(properties,
+ (ds_object.object_id, ds_object.version_id) = dbus_helpers.create(properties,
file_path,
transfer_ownership)
ds_object.metadata['uid'] = ds_object.object_id
+ ds_object.metadata['vid'] = ds_object.version_id
# TODO: register the object for updates
- logging.debug('Written object %s to the datastore.' % ds_object.object_id)
+ logging.debug('Written object (%s,%s) to the datastore.' % (ds_object.object_id, ds_object.version_id))
-def delete(object_id):
+def delete(object_id, version_id):
logging.debug('datastore.delete')
- dbus_helpers.delete(object_id)
+ dbus_helpers.delete(object_id, version_id)
def find(query, sorting=None, limit=None, offset=None, properties=None,
reply_handler=None, error_handler=None):
@@ -210,9 +212,11 @@ def find(query, sorting=None, limit=None, offset=None, properties=None,
objects = []
for props in props_list:
object_id = props['uid']
+ version_id = props['vid']
del props['uid']
+ del props['vid']
- ds_object = DSObject(object_id, DSMetadata(props), None)
+ ds_object = DSObject(object_id, version_id, DSMetadata(props), None)
objects.append(ds_object)
return objects, total_count
@@ -238,15 +242,6 @@ def copy(jobject, mount_point):
write(new_jobject)
-def mount(uri, options, timeout=-1):
- return dbus_helpers.mount(uri, options, timeout=timeout)
-
-def unmount(mount_point_id):
- dbus_helpers.unmount(mount_point_id)
-
-def mounts():
- return dbus_helpers.mounts()
-
def complete_indexing():
return dbus_helpers.complete_indexing()
diff --git a/src/sugar/datastore/dbus_helpers.py b/src/sugar/datastore/dbus_helpers.py
index 9115382..1fafb0f 100644
--- a/src/sugar/datastore/dbus_helpers.py
+++ b/src/sugar/datastore/dbus_helpers.py
@@ -42,39 +42,39 @@ def _get_data_store():
return _data_store
def create(properties, filename, transfer_ownership=False):
- object_id = _get_data_store().create(dbus.Dictionary(properties), filename,
+ (object_id, version_id) = _get_data_store().create(dbus.Dictionary(properties), filename,
transfer_ownership)
- logging.debug('dbus_helpers.create: ' + object_id)
+ logging.debug('dbus_helpers.create: (%r,%r)' % (object_id, version_id))
return object_id
-def update(uid, properties, filename, transfer_ownership=False,
+def update(uid, vid, properties, filename, transfer_ownership=False,
reply_handler=None, error_handler=None, timeout=-1):
debug_props = properties.copy()
if debug_props.has_key("preview"):
debug_props["preview"] = "<omitted>"
- logging.debug('dbus_helpers.update: %s, %s, %s, %s' %
- (uid, filename, debug_props, transfer_ownership))
+ logging.debug('dbus_helpers.update: %s, %s, %s, %s, %s' %
+ (uid, vid, filename, debug_props, transfer_ownership))
if reply_handler and error_handler:
- _get_data_store().update(uid, dbus.Dictionary(properties), filename,
+ return _get_data_store().update(uid, vid, dbus.Dictionary(properties), filename,
transfer_ownership,
reply_handler=reply_handler,
error_handler=error_handler,
timeout=timeout)
else:
- _get_data_store().update(uid, dbus.Dictionary(properties),
+ return _get_data_store().update(uid, vid, dbus.Dictionary(properties),
filename, transfer_ownership)
-def delete(uid):
- logging.debug('dbus_helpers.delete: %r' % uid)
- _get_data_store().delete(uid)
+def delete(uid, vid):
+ logging.debug('dbus_helpers.delete: (%r, %r)' % (uid, vid))
+ _get_data_store().delete(uid, vid)
-def get_properties(uid):
- logging.debug('dbus_helpers.get_properties: %s' % uid)
- return _get_data_store().get_properties(uid, byte_arrays=True)
+def get_properties(uid, vid):
+ logging.debug('dbus_helpers.get_properties: (%r, %r)' % (uid, vid))
+ return _get_data_store().get_properties(uid, vid, byte_arrays=True)
-def get_filename(uid):
- filename = _get_data_store().get_filename(uid)
- logging.debug('dbus_helpers.get_filename: %s, %s' % (uid, filename))
+def get_filename(uid, vid):
+ filename = _get_data_store().get_filename(uid, vid)
+ logging.debug('dbus_helpers.get_filename: %s, %s, %s' % (uid, vid, filename))
return filename
def find(query, properties, reply_handler, error_handler):
@@ -86,15 +86,6 @@ def find(query, properties, reply_handler, error_handler):
else:
return _get_data_store().find(query, properties, byte_arrays=True)
-def mount(uri, options, timeout=-1):
- return _get_data_store().mount(uri, options, timeout=timeout)
-
-def unmount(mount_point_id):
- _get_data_store().unmount(mount_point_id)
-
-def mounts():
- return _get_data_store().mounts()
-
def get_unique_values(key):
return _get_data_store().get_uniquevaluesfor(
key, dbus.Dictionary({}, signature='ss'))
diff --git a/src/sugar/graphics/objectchooser.py b/src/sugar/graphics/objectchooser.py
index fb3703d..a53478d 100644
--- a/src/sugar/graphics/objectchooser.py
+++ b/src/sugar/graphics/objectchooser.py
@@ -52,6 +52,7 @@ class ObjectChooser(object):
self._parent_xid = parent_xid
self._main_loop = None
self._object_id = None
+ self._version_id = None
self._bus = None
self._chooser_id = None
self._response_code = gtk.RESPONSE_NONE
@@ -59,6 +60,7 @@ class ObjectChooser(object):
def run(self):
self._object_id = None
+ self._version_id = None
self._main_loop = gobject.MainLoop()
@@ -96,7 +98,7 @@ class ObjectChooser(object):
if self._object_id is None:
return None
else:
- return datastore.get(self._object_id)
+ return datastore.get(self._object_id, self._version_id)
def destroy(self):
self._cleanup()
@@ -107,12 +109,13 @@ class ObjectChooser(object):
self._main_loop = None
self._bus = None
- def __chooser_response_cb(self, chooser_id, object_id):
+ def __chooser_response_cb(self, chooser_id, object_id, version_id):
if chooser_id != self._chooser_id:
return
- logging.debug('ObjectChooser.__chooser_response_cb: %r' % object_id)
+ logging.debug('ObjectChooser.__chooser_response_cb: (%r,%r)' % (object_id, version_id))
self._response_code = gtk.RESPONSE_ACCEPT
self._object_id = object_id
+ self._version_id = version_id
self._cleanup()
def __chooser_cancelled_cb(self, chooser_id):