Logo Search packages:      
Sourcecode: zope-atcontenttypes version File versions


#  ATContentTypes http://sf.net/projects/collective/
#  Archetypes reimplementation of the CMF core types
#  Copyright (c) 2003-2004 AT Content Types development team
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  GNU General Public License for more details.
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

$Id: ATTopic.py,v 1.27 2004/10/08 16:23:16 tiran Exp $
__author__  = ''
__docformat__ = 'restructuredtext'

from Products.ATContentTypes.config import *

from types import ListType, TupleType, StringType

    from Products.LinguaPlone.public import registerType
    from Products.Archetypes.public import registerType

from Products.CMFCore import CMFCorePermissions
from Products.CMFCore.utils import getToolByName
from Products.CMFPlone.CatalogTool import CatalogTool
from AccessControl import ClassSecurityInfo
from Acquisition import aq_parent, aq_inner

from Products.ATContentTypes.types.ATContentType import ATCTFolder, updateActions
from Products.ATContentTypes.interfaces.IATTopic import IATTopic
from Products.ATContentTypes.types.criteria import CriterionRegistry
from Products.ATContentTypes.Permissions import ChangeTopics, AddTopics
from Products.ATContentTypes.types.schemata import ATTopicSchema
from Products.ATContentTypes.interfaces.IATTopic import IATTopicSearchCriterion, IATTopicSortCriterion

00048 class ATTopic(ATCTFolder):
    """A topic folder"""

    schema         =  ATTopicSchema

    content_icon   = 'topic_icon.gif'
    meta_type      = 'ATTopic'
    archetype_name = 'AT Topic'
    immediate_view = 'atct_topic_view'
    default_view   = 'atct_topic_view'
    suppl_views    = ()
    newTypeFor     = ('Topic', 'Portal Topic')
    typeDescription= ("A topic is a pre-defined search, showing all "
                      "items matching\n criteria you specify. "
                      "Topics may also contain sub-topics.")
    typeDescMsgId  = 'description_edit_topic'
    assocMimetypes = ()
    assocFileExt   = ()
    cmf_edit_kws   = ()

    filter_content_types  = 1
    allowed_content_types = ()

    use_folder_tabs = 0

    __implements__ = ATCTFolder.__implements__, IATTopic

    security       = ClassSecurityInfo()
    actions = updateActions(ATCTFolder,
        'id'          : 'view',
        'name'        : 'View',
        'action'      : 'string:${folder_url}/',
        'permissions' : (CMFCorePermissions.View,)
        'id'          : 'edit',
        'name'        : 'Edit',
        'action'      : 'string:${object_url}/base_edit',
        'permissions' : (ChangeTopics,)
        'id'          : 'criteria',
        'name'        : 'Criteria',
        'action'      : 'string:${folder_url}/criterion_edit_form',
        'permissions' : (ChangeTopics,)
        'id'          : 'subtopics',
        'name'        : 'Subtopics',
        'action'      : 'string:${folder_url}/topic_subtopics_form',
        'permissions' : (ChangeTopics,)

    security.declareProtected(ChangeTopics, 'validateAddCriterion')
00106     def validateAddCriterion(self, indexId, criteriaType):
        """Is criteriaType acceptable criteria for indexId
        return criteriaType in self.criteriaByIndexId(indexId)

    security.declareProtected(ChangeTopics, 'criteriaByIndexId')
    def criteriaByIndexId(self, indexId):
        catalog_tool = getToolByName(self, CatalogTool.id)
        indexObj = catalog_tool.Indexes[indexId]
        results = CriterionRegistry.criteriaByIndex(indexObj.meta_type)
        return results

    security.declareProtected(ChangeTopics, 'listCriteriaTypes')
00119     def listCriteriaTypes(self):
        """List available criteria types as dict
        return [ {'name': ctype,
                 for ctype in self.listCriteriaMetaTypes() ]

    security.declareProtected(ChangeTopics, 'listCriteriaMetaTypes')
00127     def listCriteriaMetaTypes(self):
        """List available criteria
        val = CriterionRegistry.listTypes()
        return val

    security.declareProtected(ChangeTopics, 'listSearchCriteriaTypes')
00135     def listSearchCriteriaTypes(self):
        """List available search criteria types as dict
        return [ {'name': ctype,
                 for ctype in self.listSearchCriteriaMetaTypes() ]

    security.declareProtected(ChangeTopics, 'listSearchCriteriaMetaTypes')
00143     def listSearchCriteriaMetaTypes(self):
        """List available search criteria
        val = CriterionRegistry.listSearchTypes()
        return val

    security.declareProtected(ChangeTopics, 'listSortCriteriaTypes')
00151     def listSortCriteriaTypes(self):
        """List available sort criteria types as dict
        return [ {'name': ctype,
                 for ctype in self.listSortCriteriaMetaTypes() ]

    security.declareProtected(ChangeTopics, 'listSortCriteriaMetaTypes')
00159     def listSortCriteriaMetaTypes(self):
        """List available sort criteria
        val = CriterionRegistry.listSortTypes()
        return val

    security.declareProtected(ChangeTopics, 'listCriteria')
00167     def listCriteria(self):
        """Return a list of our criteria objects.
        val = self.objectValues(self.listCriteriaMetaTypes())
        return val

    security.declareProtected(ChangeTopics, 'listSearchCriteria')
00175     def listSearchCriteria(self):
        """Return a list of our search criteria objects.
        return [val for val in self.listCriteria() if

    security.declareProtected(ChangeTopics, 'hasSortCriteria')
00182     def hasSortCriterion(self):
        """Tells if a sort criterai is already setup.
        return not self.getSortCriterion() is None

    security.declareProtected(ChangeTopics, 'getSortCriterion')
00188     def getSortCriterion(self):
        """Return the Sort criterion if setup.
        for criterion in self.listCriteria():
            if IATTopicSortCriterion.isImplementedBy(criterion):
                return criterion
        return None

    security.declareProtected(ChangeTopics, 'removeSortCriterion')
00197     def removeSortCriterion( self):
        """remove the Sort criterion.
        if self.hasSortCriterion():

    security.declareProtected(ChangeTopics, 'setSortCriterion')
00204     def setSortCriterion( self, field, reversed):
        """Set the Sort criterion.
        self.addCriterion(field, 'ATSortCriterion')

    security.declareProtected(ChangeTopics, 'listIndicesByCriterion')
00212     def listIndicesByCriterion(self, criterion):
        return CriterionRegistry.indicesByCriterion(criterion)

    security.declareProtected(ChangeTopics, 'listFields')
00218     def listFields(self):
        """Return a list of fields from portal_catalog.
        pcatalog = getToolByName( self, 'portal_catalog' )
        available = pcatalog.indexes()
        val = [ field
                 for field in available
        return val

    security.declareProtected(ChangeTopics, 'listAvailableFields')
00230     def listAvailableFields(self):
        """Return a list of available fields for new criteria.
        current   = [ crit.Field() for crit in self.listCriteria() ]
        val = [ field
                 for field in self.listFields()
                 if field not in current
        return val

    security.declareProtected(ChangeTopics, 'listSubtopics')
00241     def listSubtopics(self):
        """Return a list of our subtopics.
        val = self.objectValues(self.meta_type)
        return val

    security.declareProtected(CMFCorePermissions.View, 'buildQuery')
00249     def buildQuery(self):
        """Construct a catalog query using our criterion objects.
        result = {}
        criteria = self.listCriteria()
        if not criteria:
            # no criteria found
            return None

        if self.getAcquireCriteria():
                # Tracker 290 asks to allow combinations, like this:
                # parent = aq_parent(self)
                parent = aq_parent(aq_inner(self))
            except AttributeError: # oh well, can't find parent, or it isn't a Topic.
        for criterion in criteria:
            for key, value in criterion.getCriteriaItems():
                result[key] = value
        return result

    security.declareProtected(CMFCorePermissions.View, 'queryCatalog')
00273     def queryCatalog(self, REQUEST=None, **kw):
        """Invoke the catalog using our criteria to augment any passed
            in query before calling the catalog.
        q = self.buildQuery()
        if q is None:
            # empty query - do not show anything
            return []
        pcatalog = getToolByName(self, 'portal_catalog')
        limit = self.getLimitNumber()
        max_items = self.getItemCount()
        if limit and self.hasSortCriterion():
            # Sort limit helps Zope 2.6.1+ to do a faster query
            # sorting when sort is involved
            # See: http://zope.org/Members/Caseman/ZCatalog_for_2.6.1
            kw.setdefault('sort_limit', max_items)
        results = pcatalog.searchResults(REQUEST, **kw)
        if limit:
            return results[:max_items]
        return results

    security.declareProtected(ChangeTopics, 'addCriterion')
00296     def addCriterion(self, field, criterion_type):
        """Add a new search criterion.
        newid = 'crit__%s' % field
        ct    = CriterionRegistry[criterion_type]
        crit  = ct(newid, field)

        self._setObject( newid, crit )

    security.declareProtected(ChangeTopics, 'deleteCriterion')
00306     def deleteCriterion(self, criterion_id):
        """Delete selected criterion.
        if type(criterion_id) is StringType:
        elif type(criterion_id) in (ListType, TupleType):
            for cid in criterion_id:

    security.declareProtected(CMFCorePermissions.View, 'getCriterion')
00316     def getCriterion(self, criterion_id):
        """Get the criterion object.
            return self._getOb('crit__%s' % criterion_id)
        except AttributeError:
            return self._getOb(criterion_id)

    security.declareProtected(AddTopics, 'addSubtopic')
00325     def addSubtopic(self, id):
        """Add a new subtopic.
        ti = self.getTypeInfo()
        ti.constructInstance(self, id)
        return self._getOb( id )

00333     def synContentValues(self):
        """Getter for syndacation support
        syn_tool = getToolByName(self, 'portal_syndication')
        limit = syn_tool.getMaxItems(self)
        brains = self.queryCatalog(sort_limit=limit)[:limit]
        return [brain.getObject() for brain in brains]


def modify_fti(fti):
    """Remove folderlisting action
    actions = []
    for action in fti['actions']:
        if action['id'] != 'folderlisting':
    fti['actions'] = tuple(actions)

Generated by  Doxygen 1.6.0   Back to index