use SQL-based storage (cco.storage) for favorites

This commit is contained in:
Helmut Merz 2024-01-03 11:09:50 +01:00
parent 1cd9908afe
commit 380d7e7b59
5 changed files with 47 additions and 3 deletions

View file

@ -24,11 +24,15 @@ from zope import component
from zope.app.pagetemplate import ViewPageTemplateFile from zope.app.pagetemplate import ViewPageTemplateFile
from zope.cachedescriptors.property import Lazy from zope.cachedescriptors.property import Lazy
import config
from cco.storage.common import Storage, getEngine
from cybertools.browser.configurator import ViewConfigurator, MacroViewProperty from cybertools.browser.configurator import ViewConfigurator, MacroViewProperty
from loops.browser.node import NodeView from loops.browser.node import NodeView
from loops.common import adapted from loops.common import adapted
from loops.organize.party import getPersonForUser 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.interfaces import IFavorites
from loops.organize.personal.storage.favorite import Favorites
from loops import util from loops import util
@ -37,6 +41,24 @@ personal_macros = ViewPageTemplateFile('personal_macros.pt')
class FavoriteView(NodeView): 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 @Lazy
def item(self): def item(self):
return self return self
@ -47,6 +69,8 @@ class FavoriteView(NodeView):
@Lazy @Lazy
def favorites(self): def favorites(self):
if self.useRecordsStorage:
return FavAdapter(self.recordsContainer)
records = self.loopsRoot.getRecordManager() records = self.loopsRoot.getRecordManager()
if records is not None: if records is not None:
storage = records.get('favorites') storage = records.get('favorites')

View file

@ -86,14 +86,16 @@ class Favorites(object):
def reorder(self, uids): def reorder(self, uids):
offset = 0 offset = 0
for idx, uid in enumerate(uids): 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: if track is not None:
data = track.data data = track.data
order = data.get('order', 100) order = data.get('order', 100)
if order < idx or (order >= 100 and order < idx + 100): if order < idx or (order >= 100 and order < idx + 100):
offset = 100 offset = 100
data['order'] = idx + offset data['order'] = idx + offset
track.data = data #track.data = data
self.context.setTrackData(track, data)
class BaseFavorite(object): class BaseFavorite(object):

View file

@ -23,3 +23,11 @@ class Container(record.Container):
def saveUserTrack(self, taskId, runId, userName, data): def saveUserTrack(self, taskId, runId, userName, data):
track = self.itemFactory(taskId, userName, data=data) track = self.itemFactory(taskId, userName, data=data)
return self.save(track) return self.save(track)
def setTrackData(self, track, data):
track.data = data
self.update(track)
def removeTrack(self, track):
self.remove(track.trackId)

View file

@ -47,13 +47,15 @@ class TestStorage(common.TestCase):
def test_fav_010_add(self): def test_fav_010_add(self):
favs = FavoritesAdapter(self.g.favorites) favs = FavoritesAdapter(self.g.favorites)
trackId = favs.add(self.g.resources['d002.txt'], self.g.johnC) trackId = favs.add(self.g.resources['d002.txt'], self.g.johnC)
self.assertFalse(trackId is None)
#print('*** add, result:', trackId) #print('*** add, result:', trackId)
def test_fav_020_query(self): def test_fav_020_query(self):
favs = FavoritesAdapter(self.g.favorites) favs = FavoritesAdapter(self.g.favorites)
uid = util.getUidForObject(self.g.johnC) uid = util.getUidForObject(self.g.johnC)
result = list(self.g.favorites.query(userName=uid)) 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): def test_zzz_tearDown(self):
transaction.commit() transaction.commit()

View file

@ -129,6 +129,12 @@ def reindex(obj, catalog=None):
catalog.index_doc(int(getUidForObject(obj)), obj) 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): def getObjectForUid(uid, intIds=None):
if uid == '*': # wild card if uid == '*': # wild card
return '*' return '*'
@ -144,6 +150,8 @@ def getObjectForUid(uid, intIds=None):
def getUidForObject(obj, intIds=None): def getUidForObject(obj, intIds=None):
if obj == '*': # wild card if obj == '*': # wild card
return '*' return '*'
if hasattr(obj, 'uid'):
return str(obj.uid)
if intIds is None: if intIds is None:
intIds = component.getUtility(IIntIds) intIds = component.getUtility(IIntIds)
return str(intIds.queryId(obj)) return str(intIds.queryId(obj))