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.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')
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
8
util.py
8
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))
|
||||
|
|
Loading…
Add table
Reference in a new issue