use SQL-based storage (cco.storage) for favorites
This commit is contained in:
parent
1cd9908afe
commit
380d7e7b59
5 changed files with 47 additions and 3 deletions
|
@ -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')
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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()
|
||||||
|
|
8
util.py
8
util.py
|
@ -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))
|
||||||
|
|
Loading…
Add table
Reference in a new issue