diff --git a/organize/personal/__init__.py b/organize/personal/__init__.py index 4bc90fb..dc55066 100644 --- a/organize/personal/__init__.py +++ b/organize/personal/__init__.py @@ -1,4 +1 @@ -""" -$Id$ -""" - +# package loops.organize.personal diff --git a/organize/personal/storage/__init__.py b/organize/personal/storage/__init__.py new file mode 100644 index 0000000..90fe717 --- /dev/null +++ b/organize/personal/storage/__init__.py @@ -0,0 +1,2 @@ +# package loops.organize.personal.storage + diff --git a/organize/personal/storage/favorite.py b/organize/personal/storage/favorite.py new file mode 100644 index 0000000..dcb77a2 --- /dev/null +++ b/organize/personal/storage/favorite.py @@ -0,0 +1,20 @@ +# loops.organize.personal.storage.favorite + +"""SQL-based storage for personal favorites and settings.""" + +from cco.storage.common import registerContainerClass +from cco.storage.tracking import record + + +class Favorite(record.Track): + + prefix = 'fav' + + +@registerContainerClass +class Favorites(record.Container): + + itemFactory = Favorite + tableName = 'favorites' + insertOnChange = False + diff --git a/organize/tracking/browser.py b/organize/tracking/browser.py index d7439bc..391cd90 100644 --- a/organize/tracking/browser.py +++ b/organize/tracking/browser.py @@ -98,7 +98,7 @@ class BaseTrackView(TrackView): def getMetadataTarget(self, key): value = self.metadata.get(key) - if isinstance(value, int) or value.isdigit(): + if value is not None and (isinstance(value, int) or value.isdigit()): obj = util.getObjectForUid(value) if obj is not None: url = ('%s/@@SelectedManagementView.html' % diff --git a/organize/tracking/storage/__init__.py b/organize/tracking/storage/__init__.py new file mode 100644 index 0000000..ff95f03 --- /dev/null +++ b/organize/tracking/storage/__init__.py @@ -0,0 +1 @@ +# package loops.organize.tracking.storage diff --git a/organize/tracking/storage/migration.py b/organize/tracking/storage/migration.py new file mode 100644 index 0000000..e5bc8cd --- /dev/null +++ b/organize/tracking/storage/migration.py @@ -0,0 +1,37 @@ +# loops.organize.tracking.storage.migration + +"""Tools for migration ZODB-/BTree-based tracks to SQL-base records.""" + +from datetime import datetime + +import config +from cco.storage.common import Storage, getEngine +from cco.storage.tracking import record +from loops.config.base import LoopsOptions + + +def migrate(loopsRoot, recFolderName, factory=record.Container): + rf = loopsRoot.getRecordManager().get(recFolderName) + if rf is None: + print('*** ERROR: folder %r not found!' % recFolderName) + return + options = LoopsOptions(loopsRoot) + print('*** database:', config.dbname, config.dbuser, config.dbpassword) + schema = options('cco.storage.schema') or None + if schema is not None: + schema = schema[0] + print('*** schema:', schema) + storage = Storage(getEngine(config.dbengine, config.dbname, + config.dbuser, config.dbpassword, + host=config.dbhost, port=config.dbport), + schema=schema) + container = storage.create(factory) + for id, inTrack in rf.items(): + ts = datetime.fromtimestamp(inTrack.timeStamp) + print('*** in:', id, inTrack) + head = [inTrack.metadata[k] for k in container.itemFactory.headFields] + print('*** out:', head, ts) + track = container.itemFactory(*head, trackId=int(id), + timeStamp=ts, data=inTrack.data) + container.upsert(track) +