Skip to content

Commit

Permalink
Add fragment tile for plone.app.mosaic
Browse files Browse the repository at this point in the history
  • Loading branch information
datakurre committed Aug 11, 2015
1 parent da591f0 commit 1427047
Show file tree
Hide file tree
Showing 4 changed files with 135 additions and 0 deletions.
27 changes: 27 additions & 0 deletions src/collective/themefragments/configure.zcml
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:genericsetup="http://namespaces.zope.org/genericsetup"
xmlns:browser="http://namespaces.zope.org/browser"
xmlns:plone="http://namespaces.plone.org/plone"
xmlns:zcml="http://namespaces.zope.org/zcml"
xmlns:i18n="http://namespaces.zope.org/i18n"
i18n_domain="collective.themefragments">

<!-- Theme traverser -->
Expand All @@ -12,4 +16,27 @@
permission="zope.Public"
/>

<!-- Tile -->
<plone:tile
name="collective.themefragments.fragment"
title="Theme fragment tile"
description="Displays selected fragment from the current theme"
for="*"
schema=".tiles.IFragmentTile"
class=".tiles.FragmentTile"
permission="zope2.View"
add_permission="cmf.ModifyPortalContent"
zcml:condition="installed plone.tiles"
/>

<!-- Profile -->
<genericsetup:registerProfile
name="default"
title="Theme fragment tile"
description="Add theme fragment tile for Plone Mosaic"
directory="profiles/default"
provides="Products.GenericSetup.interfaces.EXTENSION"
i18n:attributes="title description"
zcml:condition="installed plone.app.mosaic"
/>
</configure>
7 changes: 7 additions & 0 deletions src/collective/themefragments/profiles/default/metadata.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?xml version="1.0"?>
<metadata>
<version>1</version>
<dependencies>
<dependency>profile-plone.app.tiles:default</dependency>
</dependencies>
</metadata>
37 changes: 37 additions & 0 deletions src/collective/themefragments/profiles/default/registry.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?xml version="1.0"?>
<registry>
<!-- Legacy tile registration -->
<record name="plone.app.tiles">
<field type="plone.registry.field.List">
<title>Tiles</title>
<value_type type="plone.registry.field.TextLine" />
</field>
<value purge="false">
<element>collective.themefragment.fragment</element>
</value>
</record>

<!-- Mosaic tile registration -->
<records prefix="plone.app.mosaic.app_tiles.collective_themefragments_fragment"
interface="plone.app.mosaic.interfaces.ITile">
<value key="name">collective.themefragments.fragment</value>
<value key="label">Theme fragment</value>
<value key="category">advanced</value>
<value key="tile_type">app</value>
<value key="default_value"/>
<value key="read_only">false</value>
<value key="settings">true</value>
<value key="favorite">false</value>
<value key="rich_text">false</value>
<value key="weight">100</value>
</records>

<record name="plone.app.mosaic.app_tiles.collective.themefragments_fragment.available_actions">
<field type="plone.registry.field.List">
<title>Available actions for the theme fragment tile</title>
<value_type type="plone.registry.field.TextLine" />
</field>
<value>
</value>
</record>
</registry>
64 changes: 64 additions & 0 deletions src/collective/themefragments/tiles.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
# -*- coding: utf-8 -*-
from collective.themefragments.interfaces import FRAGMENTS_DIRECTORY
from collective.themefragments.traversal import ThemeFragment
from os.path import splitext
from plone.app.theming.interfaces import THEME_RESOURCE_NAME
from plone.app.theming.utils import getCurrentTheme
from plone.app.theming.utils import isThemeEnabled
from plone.resource.utils import queryResourceDirectory
from plone.supermodel import model
from plone.tiles import Tile
from zope import schema
from zope.globalrequest import getRequest
from zope.interface import provider
from zope.schema.interfaces import IContextSourceBinder
from zope.schema.vocabulary import SimpleTerm
from zope.schema.vocabulary import SimpleVocabulary

from zope.i18nmessageid import MessageFactory
_ = MessageFactory('collective.themefragments')


@provider(IContextSourceBinder)
def themeFragments(context):
request = getRequest()

if not isThemeEnabled(request):
return SimpleVocabulary([])

currentTheme = getCurrentTheme()
if currentTheme is None:
return SimpleVocabulary([])

themeDirectory = queryResourceDirectory(THEME_RESOURCE_NAME, currentTheme)
if themeDirectory is None:
return SimpleVocabulary([])

if not themeDirectory.isDirectory(FRAGMENTS_DIRECTORY):
return SimpleVocabulary([])

fragments = [splitext(filename)[0] for filename
in themeDirectory[FRAGMENTS_DIRECTORY].listDirectory()
if splitext(filename)[-1] == '.pt'
and themeDirectory[FRAGMENTS_DIRECTORY].isFile(filename)]

return SimpleVocabulary(map(SimpleTerm, fragments))


class IFragmentTile(model.Schema):
fragment = schema.Choice(
title=_(u'Fragment'),
source=themeFragments
)


class FragmentTile(Tile):
"""A tile that displays a theme fragment"""

def update(self):
self.index = ThemeFragment(
self.context, self.request)[self.data['fragment'].encode('utf-8')]

def __call__(self):
self.update()
return u'<html><body>{0:s}</body></html>'.format(self.index())

0 comments on commit 1427047

Please sign in to comment.