From 30c82c588b9740681cf85cc696a43c611db04c5c Mon Sep 17 00:00:00 2001 From: Simon Schampijer Date: Mon, 13 Dec 2010 18:17:41 +0000 Subject: Protected Activities Support #10415 Backport from SL #2087 (Martin Abente) Activities deletion causes troubles during classes. Teachers from Paraguay and Uruguay asked for a mechanism to protect activities from being easily deleted. This patch provides a mechanism that uses a gconf value to determine which activities will not contain the erase option at the list view palette. The gconf value contains a list of activities bundle indentifiers. --- diff --git a/data/sugar.schemas.in b/data/sugar.schemas.in index 454375a..cf234a1 100644 --- a/data/sugar.schemas.in +++ b/data/sugar.schemas.in @@ -285,5 +285,19 @@ + + /schemas/desktop/sugar/protected_activities + /desktop/sugar/protected_activities + sugar + list + string + [] + + Bundle IDs of protected activities + Users will not be allowed to erase these + activities through the list view. + + + diff --git a/src/jarabe/desktop/activitieslist.py b/src/jarabe/desktop/activitieslist.py index 4ced829..a8332f0 100644 --- a/src/jarabe/desktop/activitieslist.py +++ b/src/jarabe/desktop/activitieslist.py @@ -375,13 +375,7 @@ class ActivityListPalette(ActivityPalette): self.menu.append(self._favorite_item) self._favorite_item.show() - menu_item = MenuItem(_('Erase'), 'list-remove') - menu_item.connect('activate', self.__erase_activate_cb) - self.menu.append(menu_item) - menu_item.show() - - if not os.access(activity_info.get_path(), os.W_OK): - menu_item.props.sensitive = False + self._add_erase_option(registry, activity_info) registry = bundleregistry.get_registry() self._activity_changed_sid = registry.connect('bundle_changed', @@ -390,6 +384,17 @@ class ActivityListPalette(ActivityPalette): self.connect('destroy', self.__destroy_cb) + def _add_erase_option(self, registry, activity_info): + menu_item = MenuItem(_('Erase'), 'list-remove') + menu_item.connect('activate', self.__erase_activate_cb) + self.menu.append(menu_item) + menu_item.show() + + if not os.access(activity_info.get_path(), os.W_OK) or \ + registry.is_activity_protected(self._bundle_id): + menu_item.props.sensitive = False + + def __destroy_cb(self, palette): self.disconnect(self._activity_changed_sid) diff --git a/src/jarabe/model/bundleregistry.py b/src/jarabe/model/bundleregistry.py index d48c071..924c18f 100644 --- a/src/jarabe/model/bundleregistry.py +++ b/src/jarabe/model/bundleregistry.py @@ -20,6 +20,7 @@ import logging import traceback import sys +import gconf import gobject import gio import simplejson @@ -63,6 +64,14 @@ class BundleRegistry(gobject.GObject): self._last_defaults_mtime = -1 self._favorite_bundles = {} + client = gconf.client_get_default() + self._protected_activities = client.get_list( + '/desktop/sugar/protected_activities', + gconf.VALUE_STRING) + + if self._protected_activities is None: + self._protected_activities = [] + try: self._load_favorites() except Exception: @@ -275,6 +284,9 @@ class BundleRegistry(gobject.GObject): key = self._get_favorite_key(bundle_id, version) return key in self._favorite_bundles + def is_activity_protected(self, bundle_id): + return bundle_id in self._protected_activities + def set_bundle_position(self, bundle_id, version, x, y): key = self._get_favorite_key(bundle_id, version) if key not in self._favorite_bundles: -- cgit v0.9.1