Changeset 3555 in products for quintagroup.portlet.collection/trunk/quintagroup/portlet
- Timestamp:
- Sep 14, 2012 9:59:30 AM (12 years ago)
- Location:
- quintagroup.portlet.collection/trunk/quintagroup/portlet/collection
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
quintagroup.portlet.collection/trunk/quintagroup/portlet/collection/collection.py
r2740 r3555 1 import random 1 from zope.interface import implements 2 2 3 from zope.interface import implements4 from zope.component import getMultiAdapter5 6 from plone.portlets.interfaces import IPortletDataProvider7 3 from plone.portlet.collection import collection as base 8 4 … … 10 6 from zope.formlib import form 11 7 12 from plone.memoize.instance import memoize13 from plone.memoize import ram14 from plone.memoize.compress import xhtml_compress15 16 8 from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile 17 from plone.app.vocabularies.catalog import SearchableTextSourceBinder18 9 from zope.schema import ValidationError 19 10 from plone.app.form.widgets.uberselectionwidget import UberSelectionWidget 20 11 21 from Products.ATContentTypes.interface import IATTopic22 from Products.CMFPlone.PloneBatch import Batch23 12 from plone.portlet.collection.collection import ICollectionPortlet 24 13 25 14 from quintagroup.portlet.collection import MessageFactory as _ 26 15 27 MIN_BATCH_SIZE , MAX_BATCHSIZE = 1, 30 16 MIN_BATCH_SIZE, MAX_BATCHSIZE = 1, 30 17 28 18 29 19 class NotValidBatchSizeValue(ValidationError): … … 32 22 """ 33 23 24 34 25 def validate_batch_size(value): 35 26 if MIN_BATCH_SIZE <= value <= MAX_BATCHSIZE: 36 27 return True 37 28 raise NotValidBatchSizeValue(value) 29 38 30 39 31 class IQCollectionPortlet(ICollectionPortlet): … … 42 34 """ 43 35 44 item_attributes = schema.List(title=_(u"Attributes to display"), 45 description=_(u"description_attributes", default=u"Select attributes to show for collection item."), 46 required=False, 47 default=[u"Title", u"Description"], 48 value_type=schema.Choice(vocabulary='quintagroup.portlet.collection.vocabularies.PortletAttributesVocabulary')) 36 item_attributes = schema.List( 37 title=_(u"Attributes to display"), 38 description=_(u"description_attributes", 39 default=u"Select attributes to show for collection " 40 "item."), 41 required=False, 42 default=[u"Title", u"Description"], 43 value_type=schema.Choice(vocabulary='quintagroup.portlet.collection.\ 44 vocabularies.PortletAttributesVocabulary')) 49 45 50 styling = schema.Choice(title=_(u"Portlet style"), 51 description=_(u"description_styling", default=u"Choose a css style for the porlet."), 52 required=False, 53 default=u"", 54 vocabulary='quintagroup.portlet.collection.vocabularies.PortletCSSVocabulary') 46 styling = schema.Choice( 47 title=_(u"Portlet style"), 48 description=_(u"description_styling", 49 default=u"Choose a css style for the porlet."), 50 required=False, 51 default=u"", 52 vocabulary='quintagroup.portlet.collection.\ 53 vocabularies.PortletCSSVocabulary') 55 54 55 show_item_more = schema.Bool( 56 title=_(u"Show more... link for collection items"), 57 description=_(u"If enabled, a more... link will appear in the bottom " 58 "of the each collection item, linking to the " 59 "corresponding item."), 60 required=True, 61 default=True) 56 62 57 show_item_more = schema.Bool(title=_(u"Show more... link for collection items"), 58 description=_(u"If enabled, a more... link will appear in the bottom of the each collection item, " 59 "linking to the corresponding item."), 60 required=True, 61 default=True) 63 link_title = schema.Bool( 64 title=_(u"Link title"), 65 description=_(u"If enabled, title will be shown as link to " 66 "corresponding object."), 67 required=True, 68 default=True) 62 69 63 link_title = schema.Bool(title=_(u"Link title"), 64 description=_(u"If enabled, title will be shown as link to corresponding object. "), 65 required=True, 66 default=True) 70 allow_batching = schema.Bool( 71 title=_(u"Allow batching"), 72 description=_(u"If enabled, items will be split into pages."), 73 required=False, 74 default=False) 67 75 68 allow_batching = schema.Bool(title=_(u"Allow batching"), 69 description=_(u"If enabled, items will be split into pages."), 70 required=False, 71 default=False) 76 batch_size = schema.Int( 77 title=_(u"Batch size"), 78 description=_("Amount of items per page (if not set 3 items will be " 79 "displayed as default)."), 80 required=False, 81 default=3, 82 constraint=validate_batch_size) 72 83 73 batch_size = schema.Int(title=_(u"Batch size"),74 description=_("Amount of items per page"75 "(if not set 3 items will be displayed as default)."),76 required=False,77 default=3,78 constraint=validate_batch_size)79 84 80 85 class Assignment(base.Assignment): … … 97 102 link_title=True, allow_batching=False, batch_size=3): 98 103 99 super(Assignment, self).__init__(header=header, 100 target_collection=target_collection, limit=limit, 101 random=random, show_more=show_more, show_dates=show_dates) 104 super(Assignment, self).__init__(header=header, random=random, 105 target_collection=target_collection, 106 limit=limit, show_more=show_more, 107 show_dates=show_dates) 102 108 103 109 if len(item_attributes) > 0: … … 115 121 """ 116 122 return self.header 123 117 124 118 125 class Renderer(base.Renderer): … … 146 153 return self.items_listing(portlet_items=self.results()) 147 154 155 148 156 class AddForm(base.AddForm): 149 157 """Portlet add form. … … 158 166 159 167 label = _(u"Add Collection Portlet") 160 description = _(u"This portlet display a listing of items from a Collection.") 168 description = _( 169 u"This portlet display a listing of items from a Collection.") 161 170 162 171 def create(self, data): 163 172 return Assignment(**data) 173 164 174 165 175 class EditForm(base.EditForm): … … 174 184 175 185 label = _(u"Edit Collection Portlet") 176 description = _(u"This portlet display a listing of items from a Collection.") 186 description = _( 187 u"This portlet display a listing of items from a Collection.") -
quintagroup.portlet.collection/trunk/quintagroup/portlet/collection/tests/test_portlet.py
r3554 r3555 16 16 from Products.CMFCore.utils import getToolByName 17 17 18 18 19 class TestQPortletCollection(TestCase): 19 20 def afterSetUp(self): … … 21 22 22 23 def testPortletTypeRegistered(self): 23 portlet = getUtility(IPortletType, name='quintagroup.portlet.collection.Collection') 24 self.assertEquals(portlet.addview, 'quintagroup.portlet.collection.Collection') 24 portlet = getUtility( 25 IPortletType, name='quintagroup.portlet.collection.Collection') 26 self.assertEquals( 27 portlet.addview, 'quintagroup.portlet.collection.Collection') 25 28 26 29 def testInterfaces(self): … … 30 33 31 34 def testInvokeAddview(self): 32 portlet = getUtility(IPortletType, name='quintagroup.portlet.collection.Collection') 33 mapping = self.portal.restrictedTraverse('++contextportlets++plone.leftcolumn') 35 portlet = getUtility( 36 IPortletType, name='quintagroup.portlet.collection.Collection') 37 mapping = self.portal.restrictedTraverse( 38 '++contextportlets++plone.leftcolumn') 34 39 for m in mapping.keys(): 35 40 del mapping[m] 36 41 addview = mapping.restrictedTraverse('+/' + portlet.addview) 37 42 38 addview.createAndAdd(data={'header' 43 addview.createAndAdd(data={'header': u"test title"}) 39 44 40 45 self.assertEquals(len(mapping), 1) … … 53 58 request = self.folder.REQUEST 54 59 view = self.folder.restrictedTraverse('@@plone') 55 manager = getUtility(IPortletManager, name='plone.rightcolumn', context=self.portal) 60 manager = getUtility( 61 IPortletManager, name='plone.rightcolumn', context=self.portal) 56 62 assignment = collection.Assignment(header=u"title") 57 63 58 renderer = getMultiAdapter((context, request, view, manager, assignment), IPortletRenderer) 64 renderer = getMultiAdapter( 65 (context, request, view, manager, assignment), IPortletRenderer) 59 66 self.failUnless(isinstance(renderer, collection.Renderer)) 67 60 68 61 69 class TestQPortletCollectionRenderer(TestCase): … … 64 72 self.setRoles(('Manager',)) 65 73 self.pages = self._createType(self.folder, 'Topic', 'pages') 66 crit = self.folder.pages.addCriterion('portal_type', 'ATSimpleStringCriterion') 74 crit = self.folder.pages.addCriterion( 75 'portal_type', 'ATSimpleStringCriterion') 67 76 crit.setValue('Document') 68 77 69 def renderer(self, context=None, request=None, view=None, manager=None, assignment=None): 78 def renderer(self, context=None, request=None, view=None, manager=None, 79 assignment=None): 70 80 context = context or self.folder 71 81 request = request or self.folder.REQUEST 72 82 view = view or self.folder.restrictedTraverse('@@plone') 73 manager = manager or getUtility(IPortletManager, name='plone.rightcolumn', context=self.portal) 83 manager = manager or getUtility( 84 IPortletManager, name='plone.rightcolumn', context=self.portal) 74 85 assignment = assignment or collection.Assignment(header=u"title") 75 86 76 return getMultiAdapter((context, request, view, manager, assignment), IPortletRenderer) 87 return getMultiAdapter((context, request, view, manager, assignment), 88 IPortletRenderer) 77 89 78 90 def _createType(self, context, portal_type, id, **kwargs): … … 92 104 Cover problem in #9184 93 105 """ 94 r = self.renderer(context=self.portal, 95 assignment=collection.Assignment(header=u"title", 96 target_collection=u"/events")) 97 r = r.__of__(self.folder) 106 r = self.renderer( 107 context=self.portal, 108 assignment=collection.Assignment(header=u"title", 109 target_collection=u"/events")) 110 r = r.__of__(self.folder) 98 111 self.assertEqual(r.collection().id, 'events') 99 112 100 113 def test_portletStyle(self): 101 114 renderer = self.renderer(context=self.portal, 102 assignment=collection.Assignment(header=u"title", 103 styling="TestClass")) 115 assignment=collection.Assignment( 116 header=u"title", 117 styling="TestClass")) 104 118 renderer = renderer.__of__(self.folder) 105 119 renderer.update() … … 110 124 page = self._createType(self.folder, 'Document', 'page') 111 125 page.update(title="Test Page", description="Test description") 126 target_collection = '/Members/test_user_1_/pages' 112 127 renderer = self.renderer(context=self.portal, 113 assignment=collection.Assignment(header=u"title", 114 item_attributes=[u'Title'], 115 target_collection='/Members/test_user_1_/pages')) 128 assignment=collection.Assignment( 129 header=u"title", 130 item_attributes=[u'Title'], 131 target_collection=target_collection)) 116 132 renderer = renderer.__of__(self.folder) 117 133 renderer.update() 118 134 self.failUnless('Test Page' in renderer.render()) 119 135 self.failUnless('Test description' not in renderer.render()) 136 120 137 121 138 class TestQPortletCollectionQuery(TestCase): … … 138 155 return obj 139 156 140 141 def renderer(self, context=None, request=None, view=None, manager=None,assignment=None):157 def renderer(self, context=None, request=None, view=None, manager=None, 158 assignment=None): 142 159 context = context or self.folder 143 160 request = request or self.folder.REQUEST 144 161 view = view or self.folder.restrictedTraverse('@@plone') 145 manager = manager or getUtility(IPortletManager, name='plone.leftcolumn', context=self.portal) 162 manager = manager or getUtility( 163 IPortletManager, name='plone.leftcolumn', context=self.portal) 146 164 assignment = assignment 147 return getMultiAdapter((context, request, view, manager, assignment), IPortletRenderer) 165 return getMultiAdapter((context, request, view, manager, assignment), 166 IPortletRenderer) 148 167 149 168 def testSimpleQuery(self): 150 169 # set up our collection to search for Folders 151 crit = self.folder.collection.addCriterion('portal_type', 'ATSimpleStringCriterion') 170 crit = self.folder.collection.addCriterion( 171 'portal_type', 'ATSimpleStringCriterion') 152 172 crit.setValue('Folder') 153 173 154 174 # add a few folders 155 175 for i in range(6): 156 self.folder.invokeFactory('Folder', 'folder_%s' %i)157 getattr(self.folder, 'folder_%s' %i).reindexObject()176 self.folder.invokeFactory('Folder', 'folder_%s' % i) 177 getattr(self.folder, 'folder_%s' % i).reindexObject() 158 178 159 179 # the folders are returned by the topic … … 163 183 164 184 mapping = PortletAssignmentMapping() 165 request = self.folder.REQUEST 166 mapping['foo'] = collection.Assignment(header=u"title", target_collection='/Members/test_user_1_/collection') 167 collectionrenderer = self.renderer(context=None, request=None, view=None, manager=None, assignment=mapping['foo']) 185 t_collection = '/Members/test_user_1_/collection' 186 mapping['foo'] = collection.Assignment(header=u"title", 187 target_collection=t_collection) 188 collectionrenderer = self.renderer(context=None, request=None, 189 view=None, manager=None, 190 assignment=mapping['foo']) 168 191 169 192 # we want the portlet to return us the same results as the collection 170 self.assertEquals(collection_num_items, len(collectionrenderer.results())) 193 self.assertEquals( 194 collection_num_items, len(collectionrenderer.results())) 171 195 172 196 def testRandomQuery(self): … … 185 209 # set up our portlet renderer 186 210 mapping = PortletAssignmentMapping() 187 request = self.folder.REQUEST211 t_collection = '/Members/test_user_1_/collection' 188 212 mapping['foo'] = collection.Assignment(header=u"title", 189 213 random=True, 190 target_collection='/Members/test_user_1_/collection') 191 collectionrenderer = self.renderer(context=None, request=None, view=None, manager=None, assignment=mapping['foo']) 214 target_collection=t_collection) 215 collectionrenderer = self.renderer(context=None, request=None, 216 view=None, manager=None, 217 assignment=mapping['foo']) 192 218 193 219 # add some folders 194 220 for i in range(6): 195 self.folder.invokeFactory('Folder', 'folder_%s' %i)196 getattr(self.folder, 'folder_%s' %i).reindexObject()221 self.folder.invokeFactory('Folder', 'folder_%s' % i) 222 getattr(self.folder, 'folder_%s' % i).reindexObject() 197 223 198 224 # collection with no criteria -- should return empty list, without error … … 204 230 global collection_was_called 205 231 collection_was_called = False 232 206 233 def mark_collection_called(**kw): 207 234 global collection_was_called … … 214 241 215 242 # collection with simple criterion -- should return 1 (random) folder 216 crit = self.folder.collection.addCriterion('portal_type', 'ATSimpleStringCriterion') 243 crit = self.folder.collection.addCriterion( 244 'portal_type', 'ATSimpleStringCriterion') 217 245 crit.setValue('Folder') 218 246 self.assertEqual(len(collectionrenderer.results()), 1) … … 220 248 221 249 # collection with multiple criteria -- should behave similarly 222 crit = self.folder.collection.addCriterion('Creator', 'ATSimpleStringCriterion') 250 crit = self.folder.collection.addCriterion( 251 'Creator', 'ATSimpleStringCriterion') 223 252 crit.setValue('test_user_1_') 224 253 collectionrenderer.results() -
quintagroup.portlet.collection/trunk/quintagroup/portlet/collection/utils.py
r1572 r3555 1 1 """Somme utility functions for common use""" 2 2 from Products.CMFCore.utils import getToolByName 3 3 4 4 5 def getStylesVocabulary(context): … … 13 14 value_list = [] 14 15 for line in dropdown_list: 15 values = filter(lambda x: x.strip(), line.split('|', 1))16 values = filter(lambda x: x.strip(), line.split('|', 1)) 16 17 if len(values) == 0: 17 18 continue -
quintagroup.portlet.collection/trunk/quintagroup/portlet/collection/vocabularies.py
r3539 r3555 1 1 try: 2 from zope.schema.interfaces import IVocabularyFactory 2 from zope.schema import interfaces 3 IVocabularyFactory = interfaces.IVocabularyFactory 3 4 except ImportError: 4 5 from zope.app.schema.vocabulary import IVocabularyFactory … … 12 13 13 14 PORTLET_CSS_STYLES = ( 14 15 15 (u"class1", _(u"Class1")), 16 (u"class2", _(u"Class2")), 16 17 ) 17 18 18 19 PORTLET_ATTRIBUTES_TO_SHOW = ( 19 20 20 (u"Title", _(u"Title")), 21 (u"Description", _(u"Description")), 21 22 ) 23 22 24 23 25 class PortletCSSVocabulary(object): 24 26 implements(IVocabularyFactory) 25 26 27 27 28 def __call__(self, context): … … 49 50 PortletCSSVocabulary = PortletCSSVocabulary() 50 51 52 51 53 class PortletAttributesVocabulary(object): 52 54 implements(IVocabularyFactory) 53 55 54 def __call__(self, context): 55 items = [SimpleTerm(value, value, title) for value, title in PORTLET_ATTRIBUTES_TO_SHOW] 56 return SimpleVocabulary(items) 56 def __call__(self, context): 57 items = [SimpleTerm(value, value, title) for value, 58 title in PORTLET_ATTRIBUTES_TO_SHOW] 59 return SimpleVocabulary(items) 57 60 58 61 PortletAttributesVocabulary = PortletAttributesVocabulary() 59
Note: See TracChangeset
for help on using the changeset viewer.