[1572] | 1 | import random |
---|
| 2 | |
---|
| 3 | from zope.interface import implements |
---|
| 4 | from zope.component import getMultiAdapter |
---|
| 5 | |
---|
| 6 | from plone.portlets.interfaces import IPortletDataProvider |
---|
| 7 | from plone.portlet.collection import collection as base |
---|
| 8 | |
---|
| 9 | from zope import schema |
---|
| 10 | from zope.formlib import form |
---|
| 11 | |
---|
| 12 | from plone.memoize.instance import memoize |
---|
| 13 | from plone.memoize import ram |
---|
| 14 | from plone.memoize.compress import xhtml_compress |
---|
| 15 | |
---|
| 16 | from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile |
---|
| 17 | from plone.app.vocabularies.catalog import SearchableTextSourceBinder |
---|
| 18 | from plone.app.form.widgets.uberselectionwidget import UberSelectionWidget |
---|
| 19 | |
---|
| 20 | from Products.ATContentTypes.interface import IATTopic |
---|
| 21 | from plone.portlet.collection.collection import ICollectionPortlet |
---|
| 22 | |
---|
| 23 | from quintagroup.portlet.collection import MessageFactory as _ |
---|
| 24 | |
---|
| 25 | class IQCollectionPortlet(ICollectionPortlet): |
---|
| 26 | """A portlet which based on plone.portlet.collection and |
---|
| 27 | adds more functionalities. |
---|
| 28 | """ |
---|
| 29 | |
---|
| 30 | item_attributes = schema.List(title=_(u"Attributes to display"), |
---|
| 31 | description=_(u"description_attributes", default=u"Select attributes to show for collection item."), |
---|
| 32 | required=False, |
---|
| 33 | default=[u"Title", u"Description"], |
---|
| 34 | value_type=schema.Choice(vocabulary='quintagroup.portlet.collection.vocabularies.PortletAttributesVocabulary')) |
---|
| 35 | |
---|
| 36 | styling = schema.Choice(title=_(u"Portlet style"), |
---|
| 37 | description=_(u"description_styling", default=u"Choose a css style for the porlet."), |
---|
| 38 | required=False, |
---|
| 39 | default=u"", |
---|
| 40 | vocabulary='quintagroup.portlet.collection.vocabularies.PortletCSSVocabulary') |
---|
| 41 | |
---|
| 42 | |
---|
| 43 | show_item_more = schema.Bool(title=_(u"Show more... link for collection items."), |
---|
| 44 | description=_(u"If enabled, a more... link will appear in the bottom of the each collection item, " |
---|
| 45 | "linking to the corresponding item."), |
---|
| 46 | required=True, |
---|
| 47 | default=True) |
---|
| 48 | |
---|
| 49 | link_title = schema.Bool(title=_(u"Link title."), |
---|
| 50 | description=_(u"If enabled, title will be shown as link to corresponding object. "), |
---|
| 51 | required=True, |
---|
| 52 | default=True) |
---|
| 53 | |
---|
| 54 | class Assignment(base.Assignment): |
---|
| 55 | """ |
---|
| 56 | Portlet assignment. |
---|
| 57 | This is what is actually managed through the portlets UI and associated |
---|
| 58 | with columns. |
---|
| 59 | """ |
---|
| 60 | |
---|
| 61 | implements(IQCollectionPortlet) |
---|
| 62 | |
---|
| 63 | item_attributes = [u"Title", u"Description"] |
---|
| 64 | styling = u"" |
---|
| 65 | show_item_more = False |
---|
| 66 | link_title = True |
---|
| 67 | |
---|
| 68 | def __init__(self, header=u"", target_collection=None, limit=None, |
---|
| 69 | random=False, show_more=True, show_dates=False, |
---|
| 70 | item_attributes=[], styling=u"", show_item_more=False, link_title=True): |
---|
| 71 | |
---|
| 72 | super(Assignment, self).__init__(header=header, |
---|
| 73 | target_collection=target_collection, limit=limit, |
---|
| 74 | random=random, show_more=show_more, show_dates=show_dates) |
---|
| 75 | |
---|
| 76 | if len(item_attributes) > 0: |
---|
| 77 | self.item_attributes = item_attributes |
---|
| 78 | self.styling = styling |
---|
| 79 | self.show_item_more = show_item_more |
---|
| 80 | self.link_title = link_title |
---|
| 81 | |
---|
| 82 | @property |
---|
| 83 | def title(self): |
---|
| 84 | """This property is used to give the title of the portlet in the |
---|
| 85 | "manage portlets" screen. Here, we use the title that the user gave. |
---|
| 86 | """ |
---|
| 87 | return self.header |
---|
| 88 | |
---|
| 89 | |
---|
| 90 | class Renderer(base.Renderer): |
---|
| 91 | """Portlet renderer. |
---|
| 92 | |
---|
| 93 | This is registered in configure.zcml. The referenced page template is |
---|
| 94 | rendered, and the implicit variable 'view' will refer to an instance |
---|
| 95 | of this class. Other methods can be added and referenced in the template. |
---|
| 96 | """ |
---|
| 97 | |
---|
| 98 | render = ViewPageTemplateFile('collection.pt') |
---|
| 99 | |
---|
| 100 | def showProperty(self, name): |
---|
| 101 | return name in self.data.item_attributes |
---|
| 102 | |
---|
| 103 | |
---|
| 104 | class AddForm(base.AddForm): |
---|
| 105 | """Portlet add form. |
---|
| 106 | |
---|
| 107 | This is registered in configure.zcml. The form_fields variable tells |
---|
| 108 | zope.formlib which fields to display. The create() method actually |
---|
| 109 | constructs the assignment that is being added. |
---|
| 110 | """ |
---|
| 111 | form_fields = form.Fields(IQCollectionPortlet) |
---|
| 112 | form_fields['target_collection'].custom_widget = UberSelectionWidget |
---|
| 113 | |
---|
| 114 | label = _(u"Add Collection Portlet") |
---|
| 115 | description = _(u"This portlet display a listing of items from a Collection.") |
---|
| 116 | |
---|
| 117 | def create(self, data): |
---|
| 118 | return Assignment(**data) |
---|
| 119 | |
---|
| 120 | class EditForm(base.EditForm): |
---|
| 121 | """Portlet edit form. |
---|
| 122 | |
---|
| 123 | This is registered with configure.zcml. The form_fields variable tells |
---|
| 124 | zope.formlib which fields to display. |
---|
| 125 | """ |
---|
| 126 | |
---|
| 127 | form_fields = form.Fields(IQCollectionPortlet) |
---|
| 128 | form_fields['target_collection'].custom_widget = UberSelectionWidget |
---|
| 129 | |
---|
| 130 | label = _(u"Edit Collection Portlet") |
---|
| 131 | description = _(u"This portlet display a listing of items from a Collection.") |
---|