From 8e81bab3bf444fa62c074c6ea5eae63b61b45a9d Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Wed, 20 Dec 2023 15:39:10 +0100 Subject: [PATCH] access to SQL-based implementation of favorites record basically working --- organize/personal/favorite.py | 9 +++++++-- organize/personal/storage/favorite.py | 4 ++-- organize/tracking/storage/compat.py | 13 ++++++++++++- organize/tracking/storage/migration.py | 2 ++ storage/tests/test_storage.py | 7 ++++++- 5 files changed, 29 insertions(+), 6 deletions(-) diff --git a/organize/personal/favorite.py b/organize/personal/favorite.py index d1012ca..3b6afe1 100644 --- a/organize/personal/favorite.py +++ b/organize/personal/favorite.py @@ -23,6 +23,7 @@ A framework for storing personal favorites and settings. from zope.component import adapts from zope.interface import implements +from cybertools.util.date import date2TimeStamp from cybertools.tracking.btree import Track from cybertools.tracking.interfaces import ITrackingStorage from loops.organize.personal.interfaces import IFavorites, IFavorite @@ -50,7 +51,7 @@ class Favorites(object): return personUid = util.getUidForObject(person) if sortKey is None: - sortKey = lambda x: (x.data.get('order', 100), -x.timeStamp) + sortKey = lambda x: (x.data.get('order', 100), -date2TimeStamp(x.timeStamp)) for item in sorted(self.context.query(userName=personUid), key=sortKey): if type is not None: if item.type != type: @@ -95,7 +96,7 @@ class Favorites(object): track.data = data -class Favorite(Track): +class BaseFavorite(object): implements(IFavorite) @@ -106,6 +107,10 @@ class Favorite(Track): return self.data.get('type') or 'favorite' +class Favorite(BaseFavorite, Track): + pass + + def updateSortInfo(person, task, data): if person is not None: favorites = task.getLoopsRoot().getRecordManager().get('favorites') diff --git a/organize/personal/storage/favorite.py b/organize/personal/storage/favorite.py index 5e79aba..f1af16c 100644 --- a/organize/personal/storage/favorite.py +++ b/organize/personal/storage/favorite.py @@ -3,11 +3,11 @@ """SQL-based storage for personal favorites and settings.""" from cco.storage.common import registerContainerClass -from cco.storage.tracking import record +from loops.organize.personal.favorite import BaseFavorite from loops.organize.tracking.storage import compat -class Favorite(record.Track): +class Favorite(BaseFavorite, compat.Track): prefix = 'fav' diff --git a/organize/tracking/storage/compat.py b/organize/tracking/storage/compat.py index c42e7f8..e888ebb 100644 --- a/organize/tracking/storage/compat.py +++ b/organize/tracking/storage/compat.py @@ -9,6 +9,17 @@ used by code based on loops.organize.tracking. from cco.storage.tracking import record +class Track(record.Track): + + @property + def taskId(self): + return self.head.get('taskId') + + class Container(record.Container): - pass + itemFactory = Track + + def saveUserTrack(self, taskId, runId, userName, data): + track = self.itemFactory(taskId, userName, data=data) + return self.save(track) diff --git a/organize/tracking/storage/migration.py b/organize/tracking/storage/migration.py index e5bc8cd..9315ab6 100644 --- a/organize/tracking/storage/migration.py +++ b/organize/tracking/storage/migration.py @@ -3,6 +3,7 @@ """Tools for migration ZODB-/BTree-based tracks to SQL-base records.""" from datetime import datetime +import transaction import config from cco.storage.common import Storage, getEngine @@ -34,4 +35,5 @@ def migrate(loopsRoot, recFolderName, factory=record.Container): track = container.itemFactory(*head, trackId=int(id), timeStamp=ts, data=inTrack.data) container.upsert(track) + transaction.commit() diff --git a/storage/tests/test_storage.py b/storage/tests/test_storage.py index 257bd4b..632cfb5 100644 --- a/storage/tests/test_storage.py +++ b/storage/tests/test_storage.py @@ -16,6 +16,7 @@ from loops.organize.personal.storage.favorite import Favorites from loops.organize.tracking.storage.migration import migrate from loops.setup import addAndConfigureObject from loops.storage.tests import common +from loops import util class TestStorage(common.TestCase): @@ -45,10 +46,14 @@ 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) + print('*** add, result:', trackId) def test_fav_020_query(self): favs = FavoritesAdapter(self.g.favorites) - self.assertEqual('a'.upper(), 'A') + uid = util.getUidForObject(self.g.johnC) + result = list(self.g.favorites.query(userName=uid)) + print('*** fav', list(favs.list(self.g.johnC))) def test_zzz_tearDown(self): transaction.commit()