[Sugar-devel] [PATCH v5 sugar] Downgrading activities not allowed. (#2164)
anubhav at seeta.in
anubhav at seeta.in
Fri Oct 22 15:41:18 EDT 2010
Downgrading an activity is now made possible. When a .xo file of a version older
than the currently installed version is clicked, a downgrading option is made
available, by popping up of a confirmation alert. Depending upton the choice
selected you can downgrade the activity.
Co-authored-by: Anubhav Aggarwal <anubhav at seeta.in>, Shanjit Singh Jajmann <shanjit at seeta.in>
---
v1 -> v2. Named according to the nomenclature suggested,inline function used
,signal emission condition revised,global variables removed.
v2 -> v3. Taking care of all calling of misc.resume.
v3 -> v4. Changes in the copyright of the new file
v4 -> v5. showing the alert in the same window as the journal
src/jarabe/journal/journalactivity.py | 1 +
src/jarabe/journal/misc.py | 56 ++++++++++++++++++++++++++------
src/jarabe/model/bundleregistry.py | 7 +++-
3 files changed, 51 insertions(+), 13 deletions(-)
diff --git a/src/jarabe/journal/journalactivity.py b/src/jarabe/journal/journalactivity.py
index 44cc018..8ab6a2e 100644
--- a/src/jarabe/journal/journalactivity.py
+++ b/src/jarabe/journal/journalactivity.py
@@ -106,6 +106,7 @@ class JournalActivity(Window):
def __init__(self):
logging.debug("STARTUP: Loading the journal")
Window.__init__(self)
+ misc.get_journal_window(self)
self.set_title(_('Journal'))
diff --git a/src/jarabe/journal/misc.py b/src/jarabe/journal/misc.py
index 32a2847..b8d8d3a 100644
--- a/src/jarabe/journal/misc.py
+++ b/src/jarabe/journal/misc.py
@@ -27,8 +27,10 @@ from sugar.activity import activityfactory
from sugar.activity.activityhandle import ActivityHandle
from sugar.graphics.icon import get_icon_file_name
from sugar.graphics.xocolor import XoColor
+from sugar.graphics.alert import ConfirmationAlert
from sugar import mime
from sugar.bundle.activitybundle import ActivityBundle
+from sugar.bundle.bundle import AlreadyInstalledException
from sugar.bundle.contentbundle import ContentBundle
from sugar import util
@@ -148,8 +150,9 @@ def get_activities(metadata):
return activities
-def resume(metadata, bundle_id=None):
+def resume(metadata, bundle_id=None, force_to_downgrade=False):
registry = bundleregistry.get_registry()
+ version_downgrade = False
if is_activity_bundle(metadata) and bundle_id is None:
@@ -159,19 +162,26 @@ def resume(metadata, bundle_id=None):
bundle = ActivityBundle(file_path)
if not registry.is_installed(bundle):
logging.debug('Installing activity bundle')
- registry.install(bundle)
+ if not force_to_downgrade:
+ try:
+ registry.install(bundle)
+ except AlreadyInstalledException:
+ older_version_clicked(metadata)
+ version_downgrade = True
+ if force_to_downgrade:
+ registry.install(bundle, force_downgrade=True)
else:
logging.debug('Upgrading activity bundle')
registry.upgrade(bundle)
-
- logging.debug('activityfactory.creating bundle with id %r',
- bundle.get_bundle_id())
- installed_bundle = registry.get_bundle(bundle.get_bundle_id())
- if installed_bundle:
- launch(installed_bundle)
- else:
- logging.error('Bundle %r is not installed.',
- bundle.get_bundle_id())
+ if not version_downgrade:
+ logging.debug('activityfactory.creating bundle with id %r',
+ bundle.get_bundle_id())
+ installed_bundle = registry.get_bundle(bundle.get_bundle_id())
+ if installed_bundle:
+ launch(installed_bundle)
+ else:
+ logging.error('Bundle %r is not installed.',
+ bundle.get_bundle_id())
elif is_content_bundle(metadata) and bundle_id is None:
@@ -239,6 +249,30 @@ def launch(bundle, activity_id=None, object_id=None, uri=None, color=None,
object_id=object_id, uri=uri, invited=invited)
activityfactory.create(bundle, activity_handle)
+def get_journal_window(journal_window_instance):
+ VersionAlert.journal_window = journal_window_instance
+
+class VersionAlert():
+ journal_window = None
+
+def older_version_clicked(metadata):
+ alert = ConfirmationAlert()
+ alert.props.title = _('Newer Version Found')
+ alert.props.msg = _('Newer version of the chosen activity is available \
+ do you still want to continue with the installation? \
+ If Yes click Ok and the activity icon of the older \
+ .xo file in the Journal')
+ alert.connect('response', downgrade_alert_response_cb, metadata)
+ VersionAlert.journal_window.add_alert(alert)
+ alert.show()
+
+def downgrade_alert_response_cb(alert, response_id, metadata):
+ if response_id is gtk.RESPONSE_OK:
+ VersionAlert.journal_window.remove_alert(alert)
+ resume(metadata, force_to_downgrade=True)
+ elif response_id is gtk.RESPONSE_CANCEL:
+ VersionAlert.journal_window.remove_alert(alert)
+
def is_activity_bundle(metadata):
mime_type = metadata.get('mime_type', '')
return mime_type == ActivityBundle.MIME_TYPE or \
diff --git a/src/jarabe/model/bundleregistry.py b/src/jarabe/model/bundleregistry.py
index 699e339..06a1d3a 100644
--- a/src/jarabe/model/bundleregistry.py
+++ b/src/jarabe/model/bundleregistry.py
@@ -373,14 +373,17 @@ class BundleRegistry(gobject.GObject):
return True
return False
- def install(self, bundle, uid=None):
+ def install(self, bundle, uid=None, force_downgrade=False):
activities_path = env.get_user_activities_path()
for installed_bundle in self._bundles:
if bundle.get_bundle_id() == installed_bundle.get_bundle_id() and \
bundle.get_activity_version() <= \
installed_bundle.get_activity_version():
- raise AlreadyInstalledException
+ if not force_downgrade:
+ raise AlreadyInstalledException
+ if force_downgrade:
+ self.uninstall(installed_bundle, force=True)
elif bundle.get_bundle_id() == installed_bundle.get_bundle_id():
self.uninstall(installed_bundle, force=True)
--
1.7.0.4
More information about the Sugar-devel
mailing list