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