Skip to content

Commit

Permalink
we now filter the items on the screenlet, so only certain content typ…
Browse files Browse the repository at this point in the history
…es are listed
  • Loading branch information
hvelarde committed Jul 19, 2012
1 parent f74d076 commit 9f74a8d
Show file tree
Hide file tree
Showing 7 changed files with 125 additions and 69 deletions.
4 changes: 4 additions & 0 deletions src/collective/cover/config.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# -*- coding: utf-8 -*-

PROJECTNAME = 'collective.cover'

DEFAULT_SEARCHABLE_CONTENT_TYPES = [
'Document', 'File', 'Image', 'Link', 'News Item',
]
58 changes: 28 additions & 30 deletions src/collective/cover/content.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,30 +4,25 @@

from Acquisition import aq_inner

from five import grok

from zope.annotation.interfaces import IAnnotations
from zope.app.container.interfaces import IObjectAddedEvent

from zope.component import getUtility
from zope.event import notify

from five import grok
from zope.app.container.interfaces import IObjectAddedEvent

from Products.CMFCore.utils import getToolByName
from Products.CMFPlone.interfaces import INonStructuralFolder

from plone.dexterity.events import EditBegunEvent
#from plone.dexterity.events import EditCancelledEvent
#from plone.dexterity.events import EditFinishedEvent
from plone.dexterity.utils import createContentInContainer
from plone.directives import dexterity, form

from plone.registry.interfaces import IRegistry

from plone.tiles.interfaces import ITileDataManager

from plone.uuid.interfaces import IUUIDGenerator

from Products.CMFPlone.interfaces import INonStructuralFolder

from Products.CMFCore.utils import getToolByName

from collective.cover.controlpanel import ICoverSettings
from collective.cover.utils import assign_tile_ids

Expand Down Expand Up @@ -181,14 +176,14 @@ def __call__(self):
layout = self.context.cover_layout

registry = getUtility(IRegistry)

settings = registry.forInterface(ICoverSettings)

settings.layouts[name] = unicode(layout)


return super(LayoutEdit, self).__call__()


class UpdateTileContent(grok.View):
grok.context(ICover)
grok.require('cmf.ModifyPortalContent')
Expand Down Expand Up @@ -219,6 +214,7 @@ def render(self):
# find out if this affects us in any way.
return tile_instance()


class UpdateListTileContent(grok.View):
grok.context(ICover)
grok.require('cmf.ModifyPortalContent')
Expand All @@ -231,19 +227,20 @@ def render(self):
uids = self.request.form.get('uids[]')
html = ""
if tile_type and tile_id and uids:
tile = self.context.restrictedTraverse(tile_type)
tile_instance = tile[tile_id]
try:
tile_instance.replace_with_objects(uids)
html = tile_instance()
except:
# XXX: Pass silently ?
pass
tile = self.context.restrictedTraverse(tile_type)
tile_instance = tile[tile_id]
try:
tile_instance.replace_with_objects(uids)
html = tile_instance()
except:
# XXX: Pass silently ?
pass

# XXX: Calling the tile will return the HTML with the headers, need to
# find out if this affects us in any way.
return html


class RemoveItemFromListTile(grok.View):
grok.context(ICover)
grok.require('cmf.ModifyPortalContent')
Expand All @@ -256,19 +253,20 @@ def render(self):
uid = self.request.form.get('uid')
html = ""
if tile_type and tile_id and uid:
tile = self.context.restrictedTraverse(tile_type)
tile_instance = tile[tile_id]
try:
tile_instance.remove_item(uid)
html = tile_instance()
except:
# XXX: Pass silently ?
pass
tile = self.context.restrictedTraverse(tile_type)
tile_instance = tile[tile_id]
try:
tile_instance.remove_item(uid)
html = tile_instance()
except:
# XXX: Pass silently ?
pass

# XXX: Calling the tile will return the HTML with the headers, need to
# find out if this affects us in any way.
return html


class DeleteTile(grok.View):
grok.context(ICover)
grok.require('cmf.ModifyPortalContent')
Expand Down
35 changes: 23 additions & 12 deletions src/collective/cover/controlpanel.py
Original file line number Diff line number Diff line change
@@ -1,39 +1,50 @@
# -*- coding: utf-8 -*-

from zope import schema

#from z3c.form.browser.textlines import TextLinesFieldWidget
from zope.interface import Interface

from plone.app.registry.browser import controlpanel
#from z3c.form.browser.textlines import TextLinesFieldWidget

from collective.cover import _
from collective.cover.config import DEFAULT_SEARCHABLE_CONTENT_TYPES


class ICoverSettings(Interface):
"""
Interface for the control panel form.
""" Interface for the control panel form.
"""

layouts = schema.Dict(
title=_(u'Layouts'),
key_type=schema.TextLine(title=_(u'Name')),
value_type=schema.TextLine(title=_(u'Layout')),)
title=_(u"Layouts"),
required=True,
key_type=schema.TextLine(title=_(u'Name')),
value_type=schema.TextLine(title=_(u'Layout')),
readonly=True, # FIXME: we have no widget for this field yet
)

searchable_content_types = schema.List(
title=_(u"Searchable Content Types"),
description=_(u"Only objects of these content types will be searched "
"on the screenlet."),
required=False,
default=DEFAULT_SEARCHABLE_CONTENT_TYPES,
# we are going to list only the main content types in the widget
value_type=schema.Choice(vocabulary=u'collective.cover.UserFriendlyTypes'),
)


class CoverSettingsEditForm(controlpanel.RegistryEditForm):
schema = ICoverSettings
label = _(u'cover Settings')
label = _(u'Cover Settings')
description = _(u'Settings for the collective.cover package')

#def updateFields(self):
#super(CoverSettingsEditForm, self).updateFields()
#self.fields['layouts'].widgetFactory = TextLinesFieldWidget

#def updateWidgets(self):
#super(CoverSettingsEditForm, self).updateWidgets()
#self.widgets['layouts'].rows = 8
#self.widgets['layouts'].style = u'width: 30%;'
def updateWidgets(self):
super(CoverSettingsEditForm, self).updateWidgets()
self.widgets['searchable_content_types'].style = u'min-width: 200px;'


class CoverSettingsControlPanel(controlpanel.ControlPanelFormWrapper):
Expand Down
1 change: 1 addition & 0 deletions src/collective/cover/interfaces.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-

from zope.interface import Interface

Expand Down
36 changes: 20 additions & 16 deletions src/collective/cover/screenlets.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,20 @@
# -*- coding: utf-8 -*-
from zope.component import getMultiAdapter

from zope.component import getMultiAdapter, getUtility
from zope.interface import Interface
from zope.schema.vocabulary import SimpleTerm
from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile

from five import grok
from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile

from plone.registry.interfaces import IRegistry

from plone.app.layout.navigation.navtree import buildFolderTree

from Products.CMFCore.utils import getToolByName

from Products.CMFPlone.browser.navtree import SitemapNavtreeStrategy

from collective.cover import _
from collective.cover.controlpanel import ICoverSettings

grok.templatedir("screenlets_templates")

Expand Down Expand Up @@ -70,8 +72,9 @@ def update(self):
portal_state = getMultiAdapter((self.context, self.request),
name=u'plone_portal_state')
portal = portal_state.portal()
query_tree = {'sort_on': 'getObjPositionInParent',
'sort_order': 'asc', 'is_default_page': False}
query_tree = {'sort_on': 'getObjPositionInParent',
'sort_order': 'asc',
'is_default_page': False}
strategy.rootPath = '/Plone'
data = buildFolderTree(portal,
obj=portal,
Expand All @@ -80,32 +83,33 @@ def update(self):
result = data.get('children', [])
self.level = 1
self.children = result

def render(self):
template = self.list_template
if self.tab == 'content-tree':
return self.tree_template(children=self.children,
level=1)
return self.tree_template(children=self.children, level=1)
return self.list_template()

def search(self, query=None, limit=None, uids=None):
catalog = getToolByName(self.context, 'portal_catalog')
registry = getUtility(IRegistry)
settings = registry.forInterface(ICoverSettings)
searchable_types = settings.searchable_content_types

def search(self, query=None, limit=None, portal_type=None, uids=None):
pc = getToolByName(self.context, "portal_catalog")
catalog_query = {}
catalog_query['portal_type'] = searchable_types

if query:
catalog_query = {'SearchableText': query}
if limit:
catalog_query['sort_limit'] = limit
if portal_type:
catalog_query['portal_type'] = portal_type
if uids:
catalog_query['UID'] = uids
results = pc(**catalog_query)

results = catalog(**catalog_query)
return results

def getTermByBrain(self, brain, real_value=True):
portal_tool = getToolByName(self.context, "portal_url")
self.portal_path = portal_tool.getPortalPath()
value = brain.getPath()[len(self.portal_path):]
return SimpleTerm(value, token=brain.getPath(), title=brain.Title)

24 changes: 16 additions & 8 deletions src/collective/cover/tests/test_vocabularies.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,20 +17,20 @@ def setUp(self):
self.portal = self.layer['portal']

def test_layouts_vocabulary(self):
name = 'collective.cover.AvailableLayouts'
util = queryUtility(IVocabularyFactory, name)
self.assertTrue(util is not None)
layouts = util(self.portal)
name = u'collective.cover.AvailableLayouts'
vocabulary = queryUtility(IVocabularyFactory, name)
self.assertTrue(vocabulary is not None)
layouts = vocabulary(self.portal)
self.assertEqual(len(layouts), 3)
self.assertTrue(u'Layout A' in layouts)
self.assertTrue(u'Layout B' in layouts)
self.assertTrue(u'Layout C' in layouts)

def test_tiles_vocabulary(self):
name = 'collective.cover.AvailableTiles'
util = queryUtility(IVocabularyFactory, name)
self.assertTrue(util is not None)
tiles = util(self.portal)
name = u'collective.cover.AvailableTiles'
vocabulary = queryUtility(IVocabularyFactory, name)
self.assertTrue(vocabulary is not None)
tiles = vocabulary(self.portal)
self.assertEqual(len(tiles), 8)
self.assertTrue(u'collective.cover.basic' in tiles)
self.assertTrue(u'collective.cover.carousel' in tiles)
Expand All @@ -40,3 +40,11 @@ def test_tiles_vocabulary(self):
self.assertTrue(u'collective.cover.link' in tiles)
self.assertTrue(u'collective.cover.list' in tiles)
self.assertTrue(u'collective.cover.richtext' in tiles)

def test_user_friendly_types_vocabulary(self):
name = u'collective.cover.UserFriendlyTypes'
vocabulary = queryUtility(IVocabularyFactory, name)
self.assertTrue(vocabulary is not None)
friendly_types = vocabulary(self.portal)
self.assertTrue(len(friendly_types) > 0)
self.assertTrue(u'collective.cover.content' not in friendly_types)
36 changes: 33 additions & 3 deletions src/collective/cover/vocabularies.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
# -*- coding: utf-8 -*-

from five import grok
from Acquisition import aq_get

from zope.component import getUtility

from zope.schema.interfaces import IVocabularyFactory
from zope.schema.vocabulary import SimpleTerm
from zope.schema.vocabulary import SimpleVocabulary
from zope.schema.vocabulary import SimpleTerm, SimpleVocabulary
from zope.site.hooks import getSite
from zope.i18n import translate

from Products.CMFCore.utils import getToolByName

from five import grok
from plone.registry.interfaces import IRegistry

from collective.cover.controlpanel import ICoverSettings
Expand Down Expand Up @@ -42,3 +46,29 @@ def __call__(self, context):

grok.global_utility(AvailableTilesVocabulary,
name=u'collective.cover.AvailableTiles')


class UserFriendlyTypesVocabulary(object):
""" Customized version of plone.app.vocabularies.UserFriendlyTypes; we
don't want covers to be listed.
"""
grok.implements(IVocabularyFactory)

def __call__(self, context):
site = getSite()
ptool = getToolByName(site, 'plone_utils', None)
ttool = getToolByName(site, 'portal_types', None)
if ptool is None or ttool is None:
return SimpleVocabulary([])

request = aq_get(ttool, 'REQUEST', None)
items = [(translate(ttool[t].Title(), context=request), t)
for t in ptool.getUserFriendlyTypes()]
items.sort()
items = [SimpleTerm(i[1], i[1], i[0]) for i in items
if i[1] != u'collective.cover.content']
return SimpleVocabulary(items)


grok.global_utility(UserFriendlyTypesVocabulary,
name=u'collective.cover.UserFriendlyTypes')

0 comments on commit 9f74a8d

Please sign in to comment.