diff options
-rw-r--r-- | data/sugar.schemas.in | 14 | ||||
-rw-r--r-- | src/jarabe/desktop/activitieslist.py | 19 | ||||
-rw-r--r-- | src/jarabe/journal/journalactivity.py | 2 | ||||
-rw-r--r-- | src/jarabe/journal/model.py | 41 | ||||
-rw-r--r-- | src/jarabe/journal/volumestoolbar.py | 15 | ||||
-rw-r--r-- | src/jarabe/model/bundleregistry.py | 12 |
6 files changed, 74 insertions, 29 deletions
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 @@ </locale> </schema> + <schema> + <key>/schemas/desktop/sugar/protected_activities</key> + <applyto>/desktop/sugar/protected_activities</applyto> + <owner>sugar</owner> + <type>list</type> + <list_type>string</list_type> + <default>[]</default> + <locale name="C"> + <short>Bundle IDs of protected activities</short> + <long>Users will not be allowed to erase these + activities through the list view.</long> + </locale> + </schema> + </schemalist> </gconfschemafile> 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/journal/journalactivity.py b/src/jarabe/journal/journalactivity.py index af6ca69..657f03c 100644 --- a/src/jarabe/journal/journalactivity.py +++ b/src/jarabe/journal/journalactivity.py @@ -197,8 +197,6 @@ class JournalActivity(Window): def _key_press_event_cb(self, widget, event): keyname = gtk.gdk.keyval_name(event.keyval) - logging.info(keyname) - logging.info(event.state) if keyname == 'Escape': self.show_main_view() diff --git a/src/jarabe/journal/model.py b/src/jarabe/journal/model.py index 24f6140..8ba13d6 100644 --- a/src/jarabe/journal/model.py +++ b/src/jarabe/journal/model.py @@ -25,6 +25,7 @@ from stat import S_IFLNK, S_IFMT, S_IFDIR, S_IFREG import traceback import re import json +from gettext import gettext as _ import gobject import dbus @@ -319,7 +320,6 @@ class InplaceResultSet(BaseResultSet): entries = [] for file_path, stat, mtime_, metadata in files: if metadata is None: - # FIXME: the find should fetch metadata metadata = _get_file_metadata(file_path, stat) metadata['mountpoint'] = self._mount_point entries.append(metadata) @@ -389,22 +389,25 @@ class InplaceResultSet(BaseResultSet): if self._regex is not None and \ not self._regex.match(full_path): - return - - metadata_matched = False - metadata = _get_file_metadata_from_json(dir_path, entry, preview=False) - if metadata is not None: - for f in ['fulltext', 'title', 'description', 'tags']: - if f in metadata and self._regex.match(metadata[f]): - metadata_matched = True - break - if not metadata_matched: - return + filename = os.path.basename(full_path) + dir_path = os.path.dirname(full_path) + metadata = _get_file_metadata_from_json( \ + dir_path, filename, preview=False) + add_to_list = False + if metadata is not None: + for f in ['fulltext', 'title', + 'description', 'tags']: + if f in metadata and \ + self._regex.match(metadata[f]): + add_to_list = True + break + if not add_to_list: + return - if self._date_start is not None and self.st_mtime < self._date_start: + if self._date_start is not None and stat.st_mtime < self._date_start: return - if self._date_end is not None and self.st_mtime > self._date_end: + if self._date_end is not None and stat.st_mtime > self._date_end: return if self._mime_types: @@ -641,11 +644,13 @@ def _write_entry_on_external_device(metadata, file_path): raise ValueError('Entries without a file cannot be copied to ' 'removable devices') - file_name = _get_file_name(metadata['title'], metadata['mime_type']) + if metadata['title'] == '': + metadata['title'] = _('Untitled') + file_name = get_file_name(metadata['title'], metadata['mime_type']) destination_path = os.path.join(metadata['mountpoint'], file_name) if destination_path != file_path: - file_name = _get_unique_file_name(metadata['mountpoint'], file_name) + file_name = get_unique_file_name(metadata['mountpoint'], file_name) destination_path = os.path.join(metadata['mountpoint'], file_name) clean_name, extension_ = os.path.splitext(file_name) metadata['title'] = clean_name @@ -705,7 +710,7 @@ def _write_entry_on_external_device(metadata, file_path): return object_id -def _get_file_name(title, mime_type): +def get_file_name(title, mime_type): file_name = title mime_extension = mime.get_primary_extension(mime_type) @@ -729,7 +734,7 @@ def _get_file_name(title, mime_type): return file_name -def _get_unique_file_name(mount_point, file_name): +def get_unique_file_name(mount_point, file_name): if os.path.exists(os.path.join(mount_point, file_name)): i = 1 name, extension = os.path.splitext(file_name) diff --git a/src/jarabe/journal/volumestoolbar.py b/src/jarabe/journal/volumestoolbar.py index 99f1725..9a49cdf 100644 --- a/src/jarabe/journal/volumestoolbar.py +++ b/src/jarabe/journal/volumestoolbar.py @@ -56,8 +56,9 @@ def _convert_entries(root): - entries that do not have an associated file are not converted. - - when done we write the file converted to the old metadat - directory, that we do not convert several times + - if an entry has no title we set it to Untitled and rename + the file accordingly, taking care of creating a unique + filename """ try: @@ -109,6 +110,16 @@ def _convert_entries(root): if not os.path.exists(os.path.join(root, filename)): continue + if metadata['title'] == '': + metadata['title'] = _('Untitled') + fn = model.get_file_name(metadata['title'], + metadata['mime_type']) + new_filename = model.get_unique_file_name(root, fn) + metadata['filename'] = new_filename + os.rename(os.path.join(root, filename), + os.path.join(root, new_filename)) + filename = new_filename + preview_path = os.path.join(root, _JOURNAL_0_METADATA_DIR, 'preview', uid) if os.path.exists(preview_path): 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: |