[Sugar-devel] [PATCH] Downgrading activities not allowed. (#2164)
shanjit at seeta.in
shanjit at seeta.in
Mon Oct 11 15:45:34 EDT 2010
From: Shanjit Singh Jajmann <shanjit at seeta.in>
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.
---
src/jarabe/journal/journalactivity.py | 31 +++++++++++++++++++--
src/jarabe/journal/listview.py | 7 ++++++-
src/jarabe/journal/misc.py | 56 ++++++++++++++++++++++++---------
src/jarabe/model/bundleregistry.py | 18 +++++++---
4 files changed, 91 insertions(+), 26 deletions(-)
mode change 100644 => 100755 src/jarabe/journal/journalactivity.py
mode change 100644 => 100755 src/jarabe/journal/misc.py
mode change 100644 => 100755 src/jarabe/model/bundleregistry.py
diff --git a/src/jarabe/journal/journalactivity.py b/src/jarabe/journal/journalactivity.py
old mode 100644
new mode 100755
index 44cc018..5f9d708
--- a/src/jarabe/journal/journalactivity.py
+++ b/src/jarabe/journal/journalactivity.py
@@ -28,6 +28,7 @@ import os
from sugar.graphics.window import Window
from sugar.graphics.alert import ErrorAlert
+from sugar.graphics.alert import ConfirmationAlert
from sugar.bundle.bundle import ZipExtractException, RegistrationException
from sugar import env
@@ -128,7 +129,7 @@ class JournalActivity(Window):
self.connect('window-state-event', self.__window_state_event_cb)
self.connect('key-press-event', self._key_press_event_cb)
self.connect('focus-in-event', self._focus_in_event_cb)
-
+
model.created.connect(self.__model_created_cb)
model.updated.connect(self.__model_updated_cb)
model.deleted.connect(self.__model_deleted_cb)
@@ -136,7 +137,6 @@ class JournalActivity(Window):
self._dbus_service = JournalActivityDBusService(self)
self.iconify()
-
self._critical_space_alert = None
self._check_available_space()
@@ -145,7 +145,30 @@ class JournalActivity(Window):
alert.connect('response', self.__alert_response_cb)
self.add_alert(alert)
alert.show()
-
+
+ def __activity_alert1_cb(self):
+ if misc.check_previous_install() == 1 and misc.return_checked()==0:
+ alert1 = ConfirmationAlert()
+ logging.debug('value of misc is %d', misc.check_previous_install())
+ alert1.props.title=_('Previous Version Found')
+ alert1.props.msg = _('A previous version of an installed activity was found. Are you sure you want to continue with installation ? If Yes click Ok and the activity icon of the older .xo file in the Journal')
+ alert1.connect('response', self.__alert1_response_cb)
+ self.add_alert(alert1)
+ alert1.show()
+
+ def __alert1_response_cb(self, alert1, response_id):
+ if response_id is gtk.RESPONSE_OK:
+ logging.debug('value of checked initial %d', misc.return_checked())
+ logging.debug('Installing previous version')
+ self.remove_alert(alert1)
+ misc.checked = 1
+ logging.debug('value of checked final %d', misc.return_checked())
+
+ elif response_id is gtk.RESPONSE_CANCEL:
+ logging.debug('Cancelled by user')
+ self.remove_alert(alert1)
+
def __alert_response_cb(self, alert, response_id):
self.remove_alert(alert)
@@ -166,6 +189,8 @@ class JournalActivity(Window):
self._list_view = ListView()
self._list_view.connect('detail-clicked', self.__detail_clicked_cb)
self._list_view.connect('clear-clicked', self.__clear_clicked_cb)
+ self._list_view.connect('icon-clicked', self.__icon_clicked_cb)
+ logging.debug('icon clicked in main')
self._main_view.pack_start(self._list_view)
self._list_view.show()
@@ -195,7 +220,11 @@ class JournalActivity(Window):
keyname = gtk.gdk.keyval_name(event.keyval)
if keyname == 'Escape':
self.show_main_view()
-
+
+ def __icon_clicked_cb(self):
+ logging.debug('value of misc is %d', misc.check_previous_install())
+ self.__activity_alert1_cb()
+
def __detail_clicked_cb(self, list_view, object_id):
self._show_secondary_view(object_id)
diff --git a/src/jarabe/journal/listview.py b/src/jarabe/journal/listview.py
index 3d6281a..4e59ed3 100644
--- a/src/jarabe/journal/listview.py
+++ b/src/jarabe/journal/listview.py
@@ -466,8 +466,12 @@ class ListView(BaseListView):
__gsignals__ = {
'detail-clicked': (gobject.SIGNAL_RUN_FIRST,
gobject.TYPE_NONE,
- ([object]))
+ ([object])),
+ 'icon-clicked': (gobject.SIGNAL_RUN_FIRST,
+ gobject.TYPE_NONE,
+ ([]))
}
+
def __init__(self):
BaseListView.__init__(self)
@@ -527,6 +531,11 @@ class ListView(BaseListView):
row = self.tree_view.get_model()[path]
metadata = model.get(row[ListModel.COLUMN_UID])
misc.resume(metadata)
+ self.emit('icon-clicked')
def __cell_title_edited_cb(self, cell, path, new_text):
row = self._model[path]
diff --git a/src/jarabe/journal/misc.py b/src/jarabe/journal/misc.py
old mode 100644
new mode 100755
index 32a2847..2b550b9
--- a/src/jarabe/journal/misc.py
+++ b/src/jarabe/journal/misc.py
@@ -31,12 +31,16 @@ from sugar import mime
from sugar.bundle.activitybundle import ActivityBundle
from sugar.bundle.contentbundle import ContentBundle
from sugar import util
+from sugar.bundle.bundle import AlreadyInstalledException
from jarabe.view import launcher
from jarabe.model import bundleregistry, shell
from jarabe.journal.journalentrybundle import JournalEntryBundle
from jarabe.journal import model
+checker = 0
+checked = 0
+
def _get_icon_for_mime(mime_type):
generic_types = mime.get_all_generic_types()
for generic_type in generic_types:
@@ -148,31 +152,53 @@ def get_activities(metadata):
return activities
+def check_previous_install():
+ return checker
+
+def change_checked(a):
+ checked = a
+
+def return_checked():
+ return checked
+
def resume(metadata, bundle_id=None):
registry = bundleregistry.get_registry()
-
+ global checker
+ global checked
if is_activity_bundle(metadata) and bundle_id is None:
- logging.debug('Creating activity bundle')
-
+ logging.debug('Creating activity bundle %d', checker)
+
file_path = model.get_file(metadata['uid'])
bundle = ActivityBundle(file_path)
- if not registry.is_installed(bundle):
+
+ if (not registry.is_installed(bundle)) and checked==0 :
logging.debug('Installing activity bundle')
- registry.install(bundle)
- else:
+ try:
+ registry.install(bundle,force_downgrade=False)
+ except AlreadyInstalledException :
+ checker = 1
+
+ elif (not registry.is_installed(bundle)) and checked==1:
+ registry.install(bundle,force_downgrade=True)
+ logging.debug('installed older version')
+ checker = 0
+ checked = 0
+
+ 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.',
+
+ if checker == 0 :
+ 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:
logging.debug('Creating content bundle')
diff --git a/src/jarabe/model/bundleregistry.py b/src/jarabe/model/bundleregistry.py
old mode 100644
new mode 100755
index 699e339..28f0ca3
--- a/src/jarabe/model/bundleregistry.py
+++ b/src/jarabe/model/bundleregistry.py
@@ -53,6 +53,7 @@ class BundleRegistry(gobject.GObject):
self._mime_defaults = self._load_mime_defaults()
self._bundles = []
+ self.check_previous_install = 0
# hold a reference to the monitors so they don't get disposed
self._gio_monitors = []
@@ -373,14 +374,19 @@ 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 bundle.get_bundle_id() == installed_bundle.get_bundle_id() and bundle.get_activity_version() <= installed_bundle.get_activity_version():
+ if not force_downgrade :
+ raise AlreadyInstalledException
+
+ if force_downgrade :
+ logging.debug('uninstalling previous')
+ self.uninstall(installed_bundle, force=True)
+
elif bundle.get_bundle_id() == installed_bundle.get_bundle_id():
self.uninstall(installed_bundle, force=True)
--
1.7.2.2
More information about the Sugar-devel
mailing list