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.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')

View file

@ -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):

View file

@ -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)

View file

@ -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()

View file

@ -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))