Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--data/sugar.schemas.in14
-rw-r--r--src/jarabe/desktop/activitieslist.py19
-rw-r--r--src/jarabe/journal/journalactivity.py2
-rw-r--r--src/jarabe/journal/model.py41
-rw-r--r--src/jarabe/journal/volumestoolbar.py15
-rw-r--r--src/jarabe/model/bundleregistry.py12
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: