diff --git a/organize/personal/browser/favorite.py b/organize/personal/browser/favorite.py index 412cc42..c76ac82 100644 --- a/organize/personal/browser/favorite.py +++ b/organize/personal/browser/favorite.py @@ -24,11 +24,15 @@ from zope import component from zope.app.pagetemplate import ViewPageTemplateFile from zope.cachedescriptors.property import Lazy +import config +from cco.storage.common import Storage, getEngine from cybertools.browser.configurator import ViewConfigurator, MacroViewProperty from loops.browser.node import NodeView from loops.common import adapted from loops.organize.party import getPersonForUser +from loops.organize.personal.favorite import Favorites as FavAdapter from loops.organize.personal.interfaces import IFavorites +from loops.organize.personal.storage.favorite import Favorites from loops import util @@ -37,6 +41,24 @@ personal_macros = ViewPageTemplateFile('personal_macros.pt') class FavoriteView(NodeView): + containerName = 'favorites' + containerFactory = Favorites + + @Lazy + def useRecordsStorage(self): + return self.containerName in (self.globalOptions('cco.storage.records') or []) + + @Lazy + def recordsContainer(self): + schema = self.globalOptions('cco.storage.schema') or None + if schema is not None: + schema = schema[0] + storage = Storage(getEngine(config.dbengine, config.dbname, + config.dbuser, config.dbpassword, + host=config.dbhost, port=config.dbport), + schema=schema) + return storage.create(self.containerFactory) + @Lazy def item(self): return self @@ -47,6 +69,8 @@ class FavoriteView(NodeView): @Lazy def favorites(self): + if self.useRecordsStorage: + return FavAdapter(self.recordsContainer) records = self.loopsRoot.getRecordManager() if records is not None: storage = records.get('favorites') diff --git a/organize/personal/favorite.py b/organize/personal/favorite.py index 3b6afe1..e1d27a6 100644 --- a/organize/personal/favorite.py +++ b/organize/personal/favorite.py @@ -86,14 +86,16 @@ class Favorites(object): def reorder(self, uids): offset = 0 for idx, uid in enumerate(uids): - track = util.getObjectForUid(uid) + #track = util.getObjectForUid(uid) + track = util.getItem(uid, storage=self.context.storage) if track is not None: data = track.data order = data.get('order', 100) if order < idx or (order >= 100 and order < idx + 100): offset = 100 data['order'] = idx + offset - track.data = data + #track.data = data + self.context.setTrackData(track, data) class BaseFavorite(object): diff --git a/organize/tracking/storage/compat.py b/organize/tracking/storage/compat.py index e888ebb..20cb963 100644 --- a/organize/tracking/storage/compat.py +++ b/organize/tracking/storage/compat.py @@ -23,3 +23,11 @@ class Container(record.Container): def saveUserTrack(self, taskId, runId, userName, data): track = self.itemFactory(taskId, userName, data=data) return self.save(track) + + def setTrackData(self, track, data): + track.data = data + self.update(track) + + def removeTrack(self, track): + self.remove(track.trackId) + diff --git a/storage/tests/test_storage.py b/storage/tests/test_storage.py index 5c47ed4..6076aeb 100644 --- a/storage/tests/test_storage.py +++ b/storage/tests/test_storage.py @@ -47,13 +47,15 @@ class TestStorage(common.TestCase): def test_fav_010_add(self): favs = FavoritesAdapter(self.g.favorites) trackId = favs.add(self.g.resources['d002.txt'], self.g.johnC) + self.assertFalse(trackId is None) #print('*** add, result:', trackId) def test_fav_020_query(self): favs = FavoritesAdapter(self.g.favorites) uid = util.getUidForObject(self.g.johnC) result = list(self.g.favorites.query(userName=uid)) - #print('*** fav', list(favs.list(self.g.johnC))) + self.assertEqual(len(result), 2) + self.assertEqual(list(favs.list(self.g.johnC)), [u'21', u'23']) def test_zzz_tearDown(self): transaction.commit() diff --git a/util.py b/util.py index d38a2e3..edb1476 100644 --- a/util.py +++ b/util.py @@ -129,6 +129,12 @@ def reindex(obj, catalog=None): catalog.index_doc(int(getUidForObject(obj)), obj) +def getItem(uid, intIds=None, storage=None): + if storage is not None and '-' in uid: + return storage.getItem(uid) + return getObjectForUid(uid, intIds=intIds) + + def getObjectForUid(uid, intIds=None): if uid == '*': # wild card return '*' @@ -144,6 +150,8 @@ def getObjectForUid(uid, intIds=None): def getUidForObject(obj, intIds=None): if obj == '*': # wild card return '*' + if hasattr(obj, 'uid'): + return str(obj.uid) if intIds is None: intIds = component.getUtility(IIntIds) return str(intIds.queryId(obj))