Add a "Catalog" criteria for collections

This commit is contained in:
Frédéric Péters 2011-06-30 12:58:49 +02:00
parent 86ad2536dc
commit 2d8bda45fb
9 changed files with 180 additions and 5 deletions

View File

@ -33,5 +33,4 @@ setup(name='themis.utils',
[z3c.autoinclude.plugin]
target = plone
""",
paster_plugins=["ZopeSkel"],
)

View File

@ -12,4 +12,6 @@ themis.utils.egg-info/paster_plugins.txt
themis.utils.egg-info/requires.txt
themis.utils.egg-info/top_level.txt
themis/utils/__init__.py
themis/utils/config.py
themis/utils/criteria.py
themis/utils/tests.py

View File

@ -1,4 +1,29 @@
# -*- extra stuff goes here -*-
from Products.CMFCore.utils import ContentInit
from Products.Archetypes.atapi import process_types
from Products.Archetypes.atapi import listTypes
PROJECTNAME = 'themis.utils'
# poke registration
from themis.utils import criteria
def initialize(context):
"""Initializer called when used as a Zope 2 product."""
# process our custom types
listOfTypes = listTypes(PROJECTNAME)
content_types, constructors, ftis = process_types(
listOfTypes,
PROJECTNAME)
allTypes = zip(content_types, constructors)
for atype, constructor in allTypes:
kind = "%s: %s" % (PROJECTNAME, atype.archetype_name)
ContentInit(
kind,
content_types = (atype,),
permission = 'themis.utils: Add criteria',
extra_constructors = (constructor,),
).initialize(context)

7
themis/utils/config.py Normal file
View File

@ -0,0 +1,7 @@
import pkg_resources
try:
ZOPE2_VERSION = pkg_resources.get_distribution('Zope2').version
except pkg_resources.DistributionNotFound:
ZOPE2_VERSION = 0.0

View File

@ -14,6 +14,5 @@
description="Installs the themis.utils package"
provides="Products.GenericSetup.interfaces.EXTENSION"
/>
<!-- -*- extra stuff goes here -*- -->
</configure>

100
themis/utils/criteria.py Normal file
View File

@ -0,0 +1,100 @@
from zope.interface import implements
from Products.CMFCore.permissions import View
from Products.CMFCore.utils import getToolByName
from AccessControl import ClassSecurityInfo
from Products.Archetypes.atapi import Schema
from Products.Archetypes.atapi import StringField
from Products.Archetypes.atapi import StringWidget
from Products.Archetypes.atapi import registerType
from Products.ATContentTypes.criteria import _criterionRegistry
from Products.ATContentTypes.criteria import ALL_INDICES
from Products.ATContentTypes.permission import ChangeTopics
from Products.ATContentTypes.criteria.base import ATBaseCriterion
from Products.ATContentTypes.criteria.schemata import ATBaseCriterionSchema
from Products.ATContentTypes.interfaces import IATTopicSearchCriterion
from zope.i18nmessageid import MessageFactory
from themis.utils import PROJECTNAME
from themis.utils.config import ZOPE2_VERSION
_ = MessageFactory('themis.utils')
CatalogCriterionSchema = ATBaseCriterionSchema + Schema((
StringField('key',
required=1,
mode="rw",
write_permission=ChangeTopics,
accessor="Key",
mutator="setKey",
default="",
widget=StringWidget(
label=_(u'label_criteria_key', default=u'Catalog Key'),
description=_(u'help_criteria_key', default=u'Catalog Key to match to content')
),
),
StringField('value',
required=1,
mode="rw",
write_permission=ChangeTopics,
accessor="Value",
mutator="setValue",
default="",
widget=StringWidget(
label=_(u'label_criteria_value', default=u'Catalog Value'),
description=_(u'help_criteria_value', default=u'Catalog Value to match to content')
),
),
))
class CatalogCriterion(ATBaseCriterion):
if ZOPE2_VERSION >= 2.12:
implements(IATTopicSearchCriterion)
else:
__implements__ = ATBaseCriterion.__implements__ + (IATTopicSearchCriterion, )
security = ClassSecurityInfo()
schema = CatalogCriterionSchema
meta_type = 'CatalogCriterion'
archetype_name = 'Catalog criterion'
shortDesc = 'Catalog property'
security.declareProtected(View, 'getCriteriaItems')
def getCriteriaItems(self):
field = self.Field()
key_name = self.Key()
value_name = self.Value()
if value_name == 'True':
value_name = True
elif value_name == 'False':
value_name = False
return ((key_name, value_name),)
def register(criterion, indices):
if isinstance(indices, basestring):
indices = (indices,)
indices = tuple(indices)
if indices == ():
indices = ALL_INDICES
registerType(criterion, PROJECTNAME)
crit_id = criterion.meta_type
_criterionRegistry[crit_id] = criterion
_criterionRegistry.portaltypes[criterion.portal_type] = criterion
_criterionRegistry.criterion2index[crit_id] = indices
for index in indices:
value = _criterionRegistry.index2criterion.get(index, ())
_criterionRegistry.index2criterion[index] = value + (crit_id,)
register(CatalogCriterion, ALL_INDICES)

View File

@ -0,0 +1,13 @@
<?xml version="1.0"?>
<atcttool xmlns:i18n="http://xml.zope.org/namespaces/i18n">
<topic_indexes i18n:domain="collective.membercriterion">
<index name="Catalog" description="The catalog bla bla bla"
enabled="True" friendlyName="Friendly Catalog"
i18n:attributes="description; friendlyName">
<criteria>ATSelectionCriterion</criteria>
<criteria>ATSimpleStringCriterion</criteria>
<criteria>ATListCriterion</criteria>
<criteria>CatalogCriterion</criteria>
</index>
</topic_indexes>
</atcttool>

View File

@ -0,0 +1,4 @@
<?xml version="1.0"?>
<object name="portal_types" meta_type="Plone Types Tool">
<object name="CatalogCriterion" meta_type="Factory-based Type Information"/>
</object>

View File

@ -0,0 +1,26 @@
<?xml version="1.0"?>
<object name="CatalogCriterion" meta_type="Factory-based Type Information"
i18n:domain="plone" xmlns:i18n="http://xml.zope.org/namespaces/i18n">
<property name="title" i18n:translate="">Member Data Criterion</property>
<property name="description" i18n:translate="">A catalog criterion</property>
<property name="content_icon">document_icon.gif</property>
<property name="content_meta_type">CatalogCriterion</property>
<property name="product">themis.utils</property>
<property name="factory">addCatalogCriterion</property>
<property name="immediate_view">base_edit</property>
<property name="global_allow">False</property>
<property name="filter_content_types">False</property>
<property name="allowed_content_types"/>
<property name="allow_discussion">False</property>
<alias from="edit" to="base_edit"/>
<action title="View" action_id="view" category="object" condition_expr=""
url_expr="string:${object_url}/base_view" visible="True"
i18n:attributes="title">
<permission value="View"/>
</action>
<action title="Edit" action_id="edit" category="object" condition_expr=""
url_expr="string:${object_url}/base_edit" visible="True"
i18n:attributes="title">
<permission value="Modify portal content"/>
</action>
</object>