Example #1
0
    def queryCatalog(self, limit):
        """
        """
        querybuilder = QueryBuilder(self, self.request)
        if not hasattr(self.data, 'sort_on'):
            self.data.sort_on = 'effective'
        if not hasattr(self.data, 'sort_order'):
            self.data.sort_order = False
        if not hasattr(self.data, 'sort_folderorder'):
            self.data.sort_folderorder = False

        sort_order = 'descending' if self.data.sort_order else 'ascending'
        sort_on = self.data.sort_on

        if self.data.sort_folderorder:
            sort_on = 'getObjPositionInParent'

        query = list(self.data.query)

        if ICollection.providedBy(self.context):
            query += self.context.query and self.context.query or []
            parent = aq_parent(aq_inner(self.context))
            if ICollection.providedBy(parent):
                query += parent.query and parent.query or []
        return querybuilder(query=query,
                            sort_on=sort_on,
                            sort_order=sort_order,
                            limit=limit)
Example #2
0
    def results(self,
                batch=True,
                b_start=0,
                b_size=None,
                inherit=False,
                extra=[]):
        querybuilder = QueryBuilder(self, self.REQUEST)
        sort_order = 'reverse' if self.sort_reversed else 'ascending'
        if not b_size:
            b_size = self.item_count
        query = isinstance(self.query, list) and deepcopy(self.query) or []
        if inherit:
            parent = aq_parent(self)
            if ICollection.providedBy(parent):
                query += parent.query and deepcopy(parent.query) or []
                inparent = aq_parent(self)
                if ICollection.providedBy(inparent):
                    query += inparent.query and deepcopy(inparent.query) or []
        query = query + extra

        res = querybuilder(query=query,
                           batch=batch,
                           b_start=b_start,
                           b_size=b_size,
                           sort_on=self.sort_on,
                           sort_order=sort_order,
                           limit=self.limit)
        return res
Example #3
0
 def editCarouselLink(self):
     provider = self.collection()
     if provider is not None:
         if ICollection.providedBy(provider):
             return provider.absolute_url() + '/edit'
         return provider.absolute_url() + '/criterion_edit_form'
     return None
 def getCriteriaKeys(self):
     li = []
     if IATTopic.providedBy(self.context) or ICollection.providedBy(self.context) or IDXCollection.providedBy(self.context):
         criteria = IListBaseQueryCriteria(self.context)()
         for criterion in [a['i'] for a in criteria]:
             li.append(self.name+'.'+criterion)
     return li
 def _set_collection(self):
     if ICollection.providedBy(self.context) or \
        (HAS_PAC and pac_ICollection.providedBy(self.context)):
         return self.context
     else:
         collection = getCurrentCollection(self.context)
         return collection
 def contentsMethod(self):
     context = aq_inner(self.context)
     if IATTopic.providedBy(context) or ICollection.providedBy(context):
         contentsMethod = context.queryCatalog
     else:
         contentsMethod = context.getFolderContents
     return contentsMethod
    def get_items(self):
        context = aq_inner(self.context)
        res = ""
        if IATFolder.providedBy(context) or \
                IATBTreeFolder.providedBy(context):
            res = self.context.getFolderContents(
                contentFilter={
                    'sort_on': 'getObjPositionInParent',
                    'portal_type': self.settings.allowed_types,
                    'limit': self.settings.limit
                })
        elif IATTopic.providedBy(context):
            if self.settings.limit and self.settings.limit > 0:
                res = context.queryCatalog(
                    batch=True,
                    b_size=self.settings.limit,
                    portal_type=self.settings.allowed_types,
                )
            else:
                res = context.queryCatalog(
                    portal_type=self.settings.allowed_types,
                    limit=self.settings.limit)
        elif ICollection.providedBy(context):
            query = queryparser.parseFormquery(context, context.getRawQuery())
            query['portal_type'] = self.settings.allowed_types
            query['limit'] = self.settings.limit
            if self.settings.limit and self.settings.limit > 0:
                res = context.queryCatalog(batch=True,
                                           b_size=self.settings.limit)
            else:
                res = context.queryCatalog(query)

        return res
Example #8
0
        def walk(items, result, parent):
            for item in items:
                collection = []
                if COLLECTION and IContentListingObject.providedBy(item):
                    item = item.getObject()
                elif IATTopic.providedBy(item):
                    collection = item.queryCatalog(b_size=100, full_objects=True)
                elif COLLECTION and ICollection.providedBy(item):
                    collection = item.getQuery()

                if collection:
                    result[item.title_or_id()] = []
                    walk(collection, result, item.title_or_id())
                else:
                    # add only published items
                    if wft.getInfoFor(item, "review_state") != "published":
                        IStatusMessage(self.request).\
                        add(_(u'Some of the items in your list are private. '
                               'They were not included in the wizard - '
                               'MailChimp supports only published content.'),
                            type='error')
                        continue

                    result[parent].append({'uid': IUUID(item),
                                           'title': item.title_or_id()})
            return result
    def get_items(self):
        context = aq_inner(self.context)
        if IATFolder.providedBy(context) or \
                IATBTreeFolder.providedBy(context):
            res = self.context.getFolderContents(
                contentFilter={
                    'sort_on': 'getObjPositionInParent',
                    'portal_type': self.settings.allowed_types,
                    'limit': self.settings.limit
                }
            )
        elif IATTopic.providedBy(context):
            if self.settings.limit and self.settings.limit > 0:
                res = context.queryCatalog(batch=True,
                                           b_size=self.settings.limit,
                                           portal_type=
                                           self.settings.allowed_types,
                                           )
            else:
                res = context.queryCatalog(
                    portal_type=self.settings.allowed_types,
                    limit=self.settings.limit
                )
        elif ICollection.providedBy(context):
            query = queryparser.parseFormquery(
                context, context.getRawQuery())
            query['portal_type'] = self.settings.allowed_types
            query['limit'] = self.settings.limit
            if self.settings.limit and self.settings.limit > 0:
                res = context.queryCatalog(batch=True,
                                           b_size=self.settings.limit)
            else:
                res = context.queryCatalog(query)

        return res
Example #10
0
        def walk(items, result, parent):
            for item in items:
                collection = []
                if COLLECTION and IContentListingObject.providedBy(item):
                    item = item.getObject()
                elif IATTopic.providedBy(item):
                    collection = item.queryCatalog(b_size=100,
                                                   full_objects=True)
                elif COLLECTION and ICollection.providedBy(item):
                    collection = item.getQuery()

                if collection:
                    result[item.title_or_id()] = []
                    walk(collection, result, item.title_or_id())
                else:
                    # add only published items
                    if wft.getInfoFor(item, "review_state") != "published":
                        IStatusMessage(self.request).\
                        add(_(u'Some of the items in your list are private. '
                               'They were not included in the wizard - '
                               'MailChimp supports only published content.'),
                            type='error')
                        continue

                    result[parent].append({
                        'uid': IUUID(item),
                        'title': item.title_or_id()
                    })
            return result
Example #11
0
 def editCarouselLink(self):
     provider = self.collection()
     if provider is not None:
         if ICollection.providedBy(provider):
             return provider.absolute_url() + '/edit'
         return provider.absolute_url() + '/criterion_edit_form'
     return None
    def __call__(self, context, **query):
        ctool = getToolByName(context, 'portal_faceted', None)
        if ctool:
            search = ctool.search
        else:
            logger.debug('portal_faceted not present, using portal_catalog')
            ctool = getToolByName(context, 'portal_catalog')
            search = ctool.searchResults

        # Also get query from Topic
        buildQuery = getattr(context, 'buildQuery', None)
        newquery = buildQuery and buildQuery() or {}
        formquery = None

        # Get query from Collection
        if HAS_PAT:
            if PACI.ICollection.providedBy(context):
                infos = ICollection_behavior(context)
                sort_order = ('descending'
                              if infos.sort_reversed
                              else 'ascending')
                sort_on = infos.sort_on
                formquery = infos.query

        if ICollection.providedBy(context):
            getRawQuery = getattr(context, 'getRawQuery', lambda: [])
            formquery = getRawQuery()

            getSortOn = getattr(context, 'getSort_on', lambda: None)
            sort_on = getSortOn()

            if sort_on:
                getSortReversed = getattr(
                    context, 'getSort_reversed', lambda: None)
                sort_order = getSortReversed()
                if sort_order:
                    sort_order = 'descending'
                else:
                    sort_order = 'ascending'
            else:
                sort_order = None

        if formquery is not None:
            newquery = parseFormquery(context, formquery, sort_on, sort_order)

        if not isinstance(newquery, dict):
            newquery = {}

        # Avoid mixing sorting params from faceted and collection
        if 'sort_on' not in query:
            query.pop('sort_order', None)

        if 'sort_on' in query and 'sort_order' not in query:
            newquery.pop('sort_order', None)

        newquery.update(query)

        notify(QueryWillBeExecutedEvent(context, newquery))
        return search(**newquery)
    def __call__(self, context, **query):
        ctool = getToolByName(context, 'portal_faceted', None)
        if ctool:
            search = ctool.search
        else:
            logger.debug('portal_faceted not present, using portal_catalog')
            ctool = getToolByName(context, 'portal_catalog')
            search = ctool.searchResults

        # Also get query from Topic
        buildQuery = getattr(context, 'buildQuery', None)
        newquery = buildQuery and buildQuery() or {}
        formquery = None

        # Get query from Collection
        if HAS_PAT:
            if PACI.ICollection.providedBy(context):
                infos = ICollection_behavior(context)
                sort_order = ('descending'
                              if infos.sort_reversed
                              else 'ascending')
                sort_on = infos.sort_on
                formquery = infos.query

        if ICollection.providedBy(context):
            getRawQuery = getattr(context, 'getRawQuery', lambda: [])
            formquery = getRawQuery()

            getSortOn = getattr(context, 'getSort_on', lambda: None)
            sort_on = getSortOn()

            if sort_on:
                getSortReversed = getattr(
                    context, 'getSort_reversed', lambda: None)
                sort_order = getSortReversed()
                if sort_order:
                    sort_order = 'descending'
                else:
                    sort_order = 'ascending'
            else:
                sort_order = None

        if formquery is not None:
            newquery = parseFormquery(context, formquery, sort_on, sort_order)

        if not isinstance(newquery, dict):
            newquery = {}

        # Avoid mixing sorting params from faceted and collection
        if 'sort_on' not in query:
            query.pop('sort_order', None)

        if 'sort_on' in query and 'sort_order' not in query:
            newquery.pop('sort_order', None)

        newquery.update(query)

        notify(QueryWillBeExecutedEvent(context, newquery))
        return search(**newquery)
 def available(self):
     # only show on collection/topic
     if not self.context.restrictedTraverse('@@iscalendarlayout')():
         return False
     if ICollection.providedBy(self.context):
         return True
     if IATTopic.providedBy(self.context):
         return True
     return False
Example #15
0
 def edit_collection(self):
     provider = self.collection()
     smanager = SecurityManagement.getSecurityManager()
     allowed = smanager.checkPermission(ChangeTopics, provider)
     if allowed:
         provider = self.collection()
         if provider is not None:
             if ICollection.providedBy(provider):
                 return provider.absolute_url() + '/edit'
             return provider.absolute_url() + '/criterion_edit_form'
     return None
Example #16
0
 def edit_collection(self):
     provider = self.collection()
     smanager = SecurityManagement.getSecurityManager()
     allowed = smanager.checkPermission(ChangeTopics, provider)
     if allowed:
         provider = self.collection()
         if provider is not None:
             if ICollection.providedBy(provider):
                 return provider.absolute_url() + '/edit'
             return provider.absolute_url() + '/criterion_edit_form'
     return None
Example #17
0
def get_collection_query(obj):
    """ return collection's query params
    """

    if IATTopic.providedBy(obj):
        # old style collection
        return obj.buildQuery()

    if ICollection.providedBy(obj):
        # new style collection
        return parse_new_collection_query(obj)
Example #18
0
    def results(self, batch=True, b_start=0, b_size=None, inherit=False, extra=[]):
        querybuilder = QueryBuilder(self, self.REQUEST)
        sort_order = 'reverse' if self.sort_reversed else 'ascending'
        if not b_size:
            b_size = self.item_count
        query = isinstance(self.query, list) and deepcopy(self.query) or []
        if inherit:
            parent = aq_parent(self)
            if ICollection.providedBy(parent):
                query += parent.query and deepcopy(parent.query) or []
                inparent = aq_parent(self)
                if ICollection.providedBy(inparent):
                    query += inparent.query and deepcopy(inparent.query) or []
        query = query + extra

        res = querybuilder(
            query=query,
            batch=batch, b_start=b_start, b_size=b_size,
            sort_on=self.sort_on, sort_order=sort_order,
            limit=self.limit)
        return res
Example #19
0
    def getCollection(self, item):
        col = item.getCollection()
        if item.limit > 0:
            if HAS_COLLECTIONS and ICollection.providedBy(col) or \
                    HAS_PAC and IDXCollection.providedBy(col):
                results = col.queryCatalog(b_size=item.limit)
            else:
                results = col.queryCatalog(sort_limit=item.limit)[:item.limit]
        else:
            results = col.queryCatalog()

        return results
Example #20
0
    def getCollection(self, item):
        col = item.getCollection()
        if item.limit > 0:
            if HAS_COLLECTIONS and ICollection.providedBy(col) or \
                    HAS_PAC and IDXCollection.providedBy(col):
                results = col.queryCatalog(b_size=item.limit)
            else:
                results = col.queryCatalog(sort_limit=item.limit)[:item.limit]
        else:
            results = col.queryCatalog()

        return results
Example #21
0
    def results(self, provider):
        results = []
        if provider is not None:
            # by default we assume that only Collections are addable
            # as a carousel provider

            # It doesn't make sense to show *all* objects from a collection
            # - some of them might return hundreeds of objects
            if ICollection.providedBy(provider):
                res = provider.results(b_size=7)
                return res
            return provider.queryCatalog()[:7]
        return results
Example #22
0
    def results(self, provider):
        results = []
        if provider is not None:
            # by default we assume that only Collections are addable
            # as a carousel provider

            # It doesn't make sense to show *all* objects from a collection
            # - some of them might return hundreeds of objects
            if ICollection.providedBy(provider):
                res = provider.results(b_size=7)
                return res
            return provider.queryCatalog()[:7]
        return results
Example #23
0
    def queryCatalog(self, limit):
        """
        """
        querybuilder = QueryBuilder(self, self.request)
        if not hasattr(self.data, 'sort_on'):
            self.data.sort_on = 'effective'
        if not hasattr(self.data, 'sort_reversed'):
            self.data.sort_reversed = False

        sort_order = 'descending' if self.data.sort_reversed else 'ascending'
        sort_on = self.data.sort_on

        query = list(self.data.query)

        if ICollection.providedBy(self.context):
            query += self.context.query and self.context.query or []
            parent = aq_parent(aq_inner(self.context))
            if ICollection.providedBy(parent):
                query += parent.query and parent.query or []
        return querybuilder(query=query,
                            sort_on=sort_on,
                            sort_order=sort_order,
                            limit=limit)
def _render_cachekey(fun, self):
    context = aq_inner(self.context)
    if not self.updated:
        self.update()

    if self.calendar.getUseSession():
        raise ram.DontCache()
    else:
        portal_state = getMultiAdapter((context, self.request),
                                       name=u'plone_portal_state')
        key = StringIO()
        print >> key, [k.encode('utf-8') for k in self.data.kw]
        print >> key, self.data.review_state
        print >> key, self.data.name
        print >> key, portal_state.navigation_root_url()
        print >> key, cache.get_language(context, self.request)
        print >> key, self.calendar.getFirstWeekDay()

        year, month = self.getYearAndMonthToDisplay()
        print >> key, year
        print >> key, month
        navigation_root_path = self.root()
        start = DateTime('%s/%s/1' % (year, month))
        end = DateTime('%s/%s/1 23:59:59' % self.getNextMonth(year, month)) - 1

        catalog = getToolByName(context, 'portal_catalog')

        self.options = {}
        if navigation_root_path:
            root_content = self.context.restrictedTraverse(
                navigation_root_path)
            if IATTopic.providedBy(root_content):
                self.options = root_content.buildQuery()
            elif ICollection.providedBy(root_content):
                self.options = parseFormquery(
                    root_content,
                    root_content.getField('query').getRaw(root_content))
            print >> key, root_content.modified()

        self.options['start'] = {'query': end, 'range': 'max'}
        self.options['end'] = {'query': start, 'range': 'min'}

        _define_search_options(self, self.options)
        brains = catalog(**self.options)

        for brain in brains:
            add_cachekey(key, brain)

        return key.getvalue()
    def getEventsForCalendar(self):
        navigation_root_path = self.root()

        self.options = {}
        if navigation_root_path:
            root_content = self.rootTopic()
            if root_content:
                if IATTopic.providedBy(root_content):
                    self.options = root_content.buildQuery()
                elif ICollection.providedBy(root_content):
                    self.options = parseFormquery(root_content, root_content.getField('query').getRaw(root_content))

        _define_search_options(self, self.options)
        weeks = self._get_calendar_structure()
        return weeks
Example #26
0
    def results(self, provider):
        results = []
        if provider is not None:
            # by default we assume that only Collections are addable
            # as a carousel provider

            # It doesn't make sense to show *all* objects from a collection
            # - some of them might return hundreeds of objects
            registry = getUtility(IRegistry)
            carousel_viewlet_max_size = registry.forInterface(
                ICarouselSettings, False).carousel_viewlet_max_size or 7
            if ICollection.providedBy(provider):
                res = provider.results(b_size=carousel_viewlet_max_size)
                return res
            return provider.queryCatalog()[:carousel_viewlet_max_size]
        return results
Example #27
0
    def results(self, provider):
        results = []
        if provider is not None:
            # by default we assume that only Collections are addable
            # as a carousel provider

            # It doesn't make sense to show *all* objects from a collection
            # - some of them might return hundreeds of objects
            registry = getUtility(IRegistry)
            carousel_viewlet_max_size = registry.forInterface(
                ICarouselSettings, False).carousel_viewlet_max_size or 7
            if ICollection.providedBy(provider):
                res = provider.results(b_size=carousel_viewlet_max_size)
                return res
            return provider.queryCatalog()[:carousel_viewlet_max_size]
        return results
def _render_cachekey(fun, self):
    context = aq_inner(self.context)
    if not self.updated:
        self.update()

    if self.calendar.getUseSession():
        raise ram.DontCache()
    else:
        portal_state = getMultiAdapter(
            (context, self.request), name=u'plone_portal_state')
        key = StringIO()
        print >> key, [k.encode('utf-8') for k in self.data.kw]
        print >> key, self.data.review_state
        print >> key, self.data.name
        print >> key, portal_state.navigation_root_url()
        print >> key, cache.get_language(context, self.request)
        print >> key, self.calendar.getFirstWeekDay()

        year, month = self.getYearAndMonthToDisplay()
        print >> key, year
        print >> key, month
        navigation_root_path = self.root()
        start = DateTime('%s/%s/1' % (year, month))
        end = DateTime('%s/%s/1 23:59:59' % self.getNextMonth(year, month)) - 1

        catalog = getToolByName(context, 'portal_catalog')

        self.options = {}
        if navigation_root_path:
            root_content = self.context.restrictedTraverse(navigation_root_path)
            if IATTopic.providedBy(root_content):
                self.options = root_content.buildQuery()
            elif ICollection.providedBy(root_content):
                self.options = parseFormquery(root_content,
                                              root_content.getField('query').getRaw(root_content))
            print >> key, root_content.modified()

        self.options['start'] = {'query': end, 'range': 'max'}
        self.options['end'] = {'query': start, 'range': 'min'}

        _define_search_options(self, self.options)
        brains = catalog(**self.options)

        for brain in brains:
            add_cachekey(key, brain)

        return key.getvalue()
    def getEventsForCalendar(self):
        navigation_root_path = self.root()

        self.options = {}
        if navigation_root_path:
            root_content = self.rootTopic()
            if root_content:
                if IATTopic.providedBy(root_content):
                    self.options = root_content.buildQuery()
                elif ICollection.providedBy(root_content):
                    self.options = parseFormquery(
                        root_content,
                        root_content.getField('query').getRaw(root_content))

        _define_search_options(self, self.options)
        weeks = self._get_calendar_structure()
        return weeks
Example #30
0
    def __call__(self):
        layout = self.context.getLayout()

        #danger of infinite recursion
        if layout in recursive_views and (IATTopic.providedBy(self.context) or ICollection.providedBy(self.context)):
            view = self.context.restrictedTraverse('folder_listing')
        else:
            view = self.context.restrictedTraverse(layout)

        self.request['ajax_load'] = "1"

        html = view()

        filtered = filterById(html,'content-core',newclass='template_' + layout)

        if filtered:
            return filtered

        # old styles views
        return filterById(html,'content',newclass='template_' + layout)
    def contents(self):
        """ Get the contents of the folder/collection.
        """

        context = aq_inner(self.context)
        settings = NoticeboardSettings(context)
        display_types = [x for x in settings.display_types]
        display_types.append(settings.note_type)
        display_types = list(set(display_types))
        if IATTopic.providedBy(context):
            # handle old collections
            items = context.queryCatalog(portal_types=display_types)
        elif ICollection.providedBy(context):
            # handle new collections
            items = context.results(batch=False, brains=False)
        else:
            # handle folders
            items = context.getFolderContents(full_objects=True,
                        contentFilter={"portal_type":display_types,
                                       "sort_on":"sortable_title"})
        return items
Example #32
0
 def items(self):
     sdata = []
     if IATTopic.providedBy(self.context):
         sdata = [a
                  for a in self.context.queryCatalog()
                  if a.portal_type in ['libertic_event']]
     if ICollection.providedBy(self.context):
         sdata = [a
                  for a in self.context.results(batch=False,
                                                brains=True)
                  if a.portal_type in ['libertic_event']]
     if IDatabase.providedBy(self.context):
         catalog = getToolByName(self.context, 'portal_catalog')
         query = {
             'portal_type': 'libertic_event',
             'review_state': 'published',
             'path':  {
                 'query' : '/'.join(self.context.getPhysicalPath()),
             },
         }
         sdata = catalog.searchResults(**query)
     return sdata
Example #33
0
    def contents(self):
        """ Get the contents of the folder/collection.
        """

        context = aq_inner(self.context)
        settings = NoticeboardSettings(context)
        display_types = [x for x in settings.display_types]
        display_types.append(settings.note_type)
        display_types = list(set(display_types))
        if IATTopic.providedBy(context):
            # handle old collections
            items = context.queryCatalog(portal_types=display_types)
        elif ICollection.providedBy(context):
            # handle new collections
            items = context.results(batch=False, brains=False)
        else:
            # handle folders
            items = context.getFolderContents(full_objects=True,
                                              contentFilter={
                                                  "portal_type": display_types,
                                                  "sort_on": "sortable_title"
                                              })
        return items
def _is_collection(context):
    return IATTopic.providedBy(context) or \
        ICollection.providedBy(context)
Example #35
0
def is_collection(obj):
    return IATTopic.providedBy(obj) or ICollection.providedBy(obj)
 def is_collection(self):
     ctx = self.default_context
     return ICollection and ICollection.providedBy(ctx) or False
Example #37
0
def is_collection(obj):
    """ return true if given obj is a plone collection
    """
    return IATTopic.providedBy(obj) or ICollection.providedBy(obj)
 def test_adding(self):
     self.folder.invokeFactory('Collection',
                               'collection1')
     p1 = self.folder['collection1']
     self.failUnless(ICollection.providedBy(p1))
Example #39
0
 def is_collection(self):
     ctx = self.default_context
     return ICollection and ICollection.providedBy(ctx) or False
 def test_factory(self):
     fti = queryUtility(IDexterityFTI, name='Collection')
     factory = fti.factory
     new_object = createObject(factory)
     self.assertTrue(ICollection.providedBy(new_object))
def is_collection(obj):
    """ return true if given obj is a plone collection
    """
    return IATTopic.providedBy(obj) or \
        ICollection.providedBy(obj) or \
        IOldCollection.providedBy(obj)
 def test_adding(self):
     self.folder.invokeFactory('Collection', 'collection1')
     p1 = self.folder['collection1']
     self.assertTrue(ICollection.providedBy(p1))
 def test_factory(self):
     fti = queryUtility(IDexterityFTI,
                        name='Collection')
     factory = fti.factory
     new_object = createObject(factory)
     self.failUnless(ICollection.providedBy(new_object))
 def rootTopic(self):
     topic = self.context.restrictedTraverse(self.root())
     if IATTopic.providedBy(topic) or ICollection.providedBy(topic):
         return topic
     return None
 def getCriteria(self):
     if IATTopic.providedBy(self.context) or ICollection.providedBy(self.context) or IDXCollection.providedBy(self.context):
         return IListBaseQueryCriteria(self.context)()
     return []
Example #46
0
 def getCriteria(self):
     if IATTopic.providedBy(self.context) or ICollection.providedBy(
             self.context) or IDXCollection.providedBy(self.context):
         return IListBaseQueryCriteria(self.context)()
     return []
 def rootTopic(self):
     topic = self.context.restrictedTraverse(self.root())
     if IATTopic.providedBy(topic) or ICollection.providedBy(topic):
         return topic
     return None