def get_items(self, field='target'): target_object = self.get_target_object(field) if ICollection.providedBy(target_object): return [x for x in target_object.queryCatalog(batch=False)] elif IDexterityContainer.providedBy(target_object): # Folder Contents listing = aq_inner(target_object).restrictedTraverse( '@@folderListing', None) if listing is None: return [] _ = listing(batch=False) # Exclude default page _id = target_object.getDefaultPage() if _id: _ = [x for x in _ if _id != x.getId()] # If the box for hiding items that are excluded # from navigation is checked, filter them out. if self.get_valid_value('exclude_navigation'): _ = [x for x in _ if not x.exclude_from_nav] return _
def query(self, start, limit, contentFilter): """ Make catalog query for the folder listing. @param start: First index to query @param limit: maximum number of items in the batch @param contentFilter: portal_catalog filtering dictionary with index -> value pairs. @return: Products.CMFPlone.PloneBatch.Batch object """ # Batch size b_size = limit # We use different query method, depending on # whether we do listing for topic or folder if IATTopic.providedBy(self.context) or ICollection.providedBy(self.context): # ATTopic like content # Call Products.ATContentTypes.content.topic.ATTopic.queryCatalog() # method # This method handles b_start internally and # grabs it from HTTPRequest object return self.context.queryCatalog(contentFilter) else: # Folder or Large Folder like content # Call CMFPlone(/skins/plone_scripts/getFolderContents Python # script This method handles b_start parameter internally and grabs # it from the request object return self.context.getFolderContents(contentFilter, batch=True, b_size=b_size)
def query(self, start, limit, contentFilter): """ Make catalog query for the folder listing. @param start: First index to query @param limit: maximum number of items in the batch @param contentFilter: portal_catalog filtering dictionary with index -> value pairs. @return: Products.CMFPlone.PloneBatch.Batch object """ # Batch size b_size = limit # We use different query method, depending on # whether we do listing for topic or folder if IATTopic.providedBy(self.context) or ICollection.providedBy( self.context): # ATTopic like content # Call Products.ATContentTypes.content.topic.ATTopic.queryCatalog() # method # This method handles b_start internally and # grabs it from HTTPRequest object return self.context.queryCatalog(contentFilter) else: # Folder or Large Folder like content # Call CMFPlone(/skins/plone_scripts/getFolderContents Python # script This method handles b_start parameter internally and grabs # it from the request object return self.context.getFolderContents(contentFilter, batch=True, b_size=b_size)
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 query(self): """ Make catalog query for the folder listing. """ if ICollection.providedBy(self.context): return self.context.queryCatalog(batch=False) elif IFolderish.providedBy(self.context): return self.context.getFolderContents(batch=False)
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 target(self): target = getattr(self.context, 'target', None) if target and hasattr(target, 'to_object'): target_object = target.to_object if ICollection.providedBy(target_object): return target_object
def getContents(self): if ICollection.providedBy(self.context): self.contents = [ x.getObject() for x in self.context.queryCatalog({'portal_type': 'Image'}) ] else: self.contents = self.context.listFolderContents( contentFilter={'portal_type': 'Image'})
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)
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
def query(self, obj=None): """ Listing der Ordnerinhalte oder Ergebnisse der Kollektion """ if obj: query_context = obj else: query_context = self.context if ICollection.providedBy(query_context): return query_context.queryCatalog(batch=False) elif IFolderish.providedBy(query_context): return query_context.getFolderContents(batch=False)
def _set_query_base_search(self): """ """ query = {} form = self.request.form base_search_uid = form.get("base_search_uid", "").strip() if base_search_uid: element = uuidsToObjects(uuids=base_search_uid) if element and ICollection.providedBy(element[0]): collection = element[0] query = parseFormquery(collection, collection.query) elif element: self.context = element[0] return query
def test_collection_is_migrated(self): from plone.app.contenttypes.migration.migration import\ CollectionMigrator from plone.app.contenttypes.interfaces import ICollection if 'Collection' in self.portal.portal_types.keys(): self.portal.invokeFactory('Collection', 'collection') at_collection = self.portal['collection'] applyProfile(self.portal, 'plone.app.contenttypes:default') migrator = self.get_migrator(at_collection, CollectionMigrator) migrator.migrate() dx_collection = self.portal['collection'] self.assertTrue(ICollection.providedBy(dx_collection)) self.assertTrue(at_collection is not dx_collection)
def get_local_press_releases(self): """ Looks in the current folder for Collection objects and then queries them for items. """ items = [] for child in self.context.values(): if ICollection.providedBy(child): items = self.results( child, batch=False, sort_on='Date', brains=True) return items
def parent_object(self): tag_root = self.tag_root if hasattr(tag_root, 'getDefaultPage'): default_page_id = tag_root.getDefaultPage() if default_page_id in tag_root.objectIds(): default_page = tag_root[default_page_id] if ICollection.providedBy(default_page): return default_page return tag_root
def test_collection_is_migrated(self): try: from plone.app.collection.collection import Collection except ImportError: pass else: from plone.app.contenttypes.migration.migration import \ CollectionMigrator from plone.app.contenttypes.interfaces import ICollection at_collection = self.createATCTobject(Collection, 'collection') migrator = self.get_migrator(at_collection, CollectionMigrator) migrator.migrate() new_collection = self.portal['collection'] self.assertTrue(ICollection.providedBy(new_collection)) self.assertTrue(at_collection is not new_collection)
def results(self, batch=True, b_start=0, b_size=None, sort_on=None, limit=None, brains=False, custom_query=None): if not b_size: b_size = self.item_count if not sort_on: sort_on = self.sort_on if not limit: limit = self.limit # Get all results collections = [ collection for collection in self.listFolderContents() if ICollection.providedBy(collection) ] uuids = set() results = [] for collection in collections: collection_results = collection.results(batch=False, b_start=0, b_size=limit, sort_on=sort_on, limit=limit, brains=brains, custom_query=custom_query) for result in collection_results: # Ensure we get each result only once if result.uuid() not in uuids: uuids.add(result.uuid()) results.append(result) # Order the results and limit it if sort_on: results.sort(key=lambda o: getattr(o, sort_on, None), reverse=self.sort_reversed) if limit: results = results[:limit] # Batch the results results = Batch(results, size=b_size, start=b_start) return results
def SerializeToJson(context): result = { '@context': 'http://www.w3.org/ns/hydra/context.jsonld', '@id': context.absolute_url(), '@type': context.portal_type, 'parent': { '@id': aq_parent(aq_inner(context)).absolute_url(), 'title': aq_parent(aq_inner(context)).title, 'description': aq_parent(aq_inner(context)).description } } if IFolderish.providedBy(context): result['member'] = [ { '@id': member.absolute_url(), 'title': member.title, 'description': member.description } for member in context.objectValues() ] if HAS_PLONE_APP_CONTENTTYPES: # Conditional import in order to avoid a hard dependency on p.a.ct from plone.app.contenttypes.interfaces import ICollection if ICollection.providedBy(context): portal = getSite() result['member'] = [ { '@id': '{0}/{1}'.format( portal.absolute_url(), '/'.join(member.getPhysicalPath()) ), 'title': member.title, 'description': member.description } for member in context.results() ] for schema in iterSchemata(context): for field_name, field in getFields(schema).items(): value = lookup_field_serializer(context, field)() result[json_compatible(field_name)] = value return result
def get_items(self, tags): parent_object = self.parent_object path = '/'.join(self.tag_root.getPhysicalPath()) if tags: if ICollection.providedBy(parent_object): return parent_object.results(batch=False, custom_query={'Tags': tags}) else: return self.portal_catalog.searchResults({ 'Tags': tags, 'path': path }) return []
def SerializeToJson(context): result = { '@context': 'http://www.w3.org/ns/hydra/context.jsonld', '@id': context.absolute_url(), '@type': context.portal_type, 'parent': { '@id': aq_parent(aq_inner(context)).absolute_url(), 'title': aq_parent(aq_inner(context)).title, 'description': aq_parent(aq_inner(context)).description } } if IFolderish.providedBy(context): result['member'] = [ { '@id': member.absolute_url(), 'title': member.title, 'description': member.description } for member_id, member in context.objectItems() ] if ICollection.providedBy(context): portal = getSite() result['member'] = [ { '@id': '{0}/{1}'.format( portal.absolute_url(), '/'.join(member.getPhysicalPath()) ), 'title': member.title, 'description': member.description } for member in context.results() ] for title, schema_object in get_object_schema(context): value = getattr(context, title, None) if value is not None: # RichText if isinstance(schema_object, RichText): result[title] = value.output # DateTime elif isinstance(schema_object, Datetime): # Return DateTime in ISO-8601 format. See # https://pypi.python.org/pypi/DateTime/3.0 and # http://www.w3.org/TR/NOTE-datetime for details. # XXX: We might want to change that in the future. result[title] = value().ISO8601() # Tuple elif isinstance(value, tuple): result[title] = list(value) # List elif isinstance(value, list): result[title] = value # String elif isinstance(value, str): result[title] = value # Unicode elif isinstance(value, unicode): result[title] = value # Image elif isinstance(value, NamedBlobImage): result[title] = '{0}/@@images/{1}'.format( context.absolute_url(), title ) # File elif isinstance(value, NamedBlobFile): result[title] = '{0}/{1}'.format( context.absolute_url(), value.filename ) else: result[title] = str(value) # Operations # result["operation"] = [ # { # "@type": "CreateResourceOperation", # "name": "Create Resource", # "method": "POST", # "expects": { # "supportedProperty": [ # { # "@type": "PropertyValueSpecification", # "hydra:property": "id", # "hydra:required": "true", # "readOnlyValue": "true" # }, # { # "@type": "PropertyValueSpecification", # "hydra:property": "title", # "hydra:required": "true", # "readOnlyValue": "false" # }, # ], # } # }, # { # "@type": "ReplaceResourceOperation", # "name": "Update Resource", # "method": "PUT", # }, # { # "@type": "DeleteResourceOperation", # "name": "Delete Resource", # "method": "DELETE", # } # ] if getattr(context, 'request', False): if context.request.get('append_json_to_hyperlinks', False): result = append_json_to_links(result) return json.dumps(result, indent=2, sort_keys=True)
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.assertTrue(ICollection.providedBy(new_object))
def test_and_filter_type(self): self.assertEqual(len(self.collection.results()), 3) result = get_filter_items(self.collection_uid, 'Subject', cache_enabled=False) self.assertEqual(len(result), 4) self.assertEqual(get_data_by_val(result, 'all')['count'], 3) self.assertEqual(get_data_by_val(result, 'all')['selected'], True) self.assertEqual(get_data_by_val(result, u'Süper')['count'], 2) self.assertEqual(get_data_by_val(result, u'Evänt')['count'], 1) self.assertEqual(get_data_by_val(result, u'Dokumänt')['count'], 2) # Test url self.assertEqual(qs(result, u'Süper'), {'Subject': u'Süper'}) catalog_results = ICollection(self.collection).results( batch=False, brains=True, custom_query=make_query(qs(result, u'Süper'))) self.assertEqual(len(catalog_results), 2) result = get_filter_items(self.collection_uid, 'Subject', request_params={'Subject': u'Süper'}, filter_type="and", cache_enabled=False) self.assertEqual(len(result), 4) self.assertEqual(get_data_by_val(result, 'all')['count'], 3) # TODO: I'm not sure these counts are correct. It should represent how many results you will get if you click so should be smaller than this # but I guess you need to turn on narrow down for that? self.assertEqual(get_data_by_val(result, u'Süper')['count'], 2) self.assertEqual(get_data_by_val(result, u'Evänt')['count'], 1) self.assertEqual(get_data_by_val(result, u'Dokumänt')['count'], 2) self.assertEqual(get_data_by_val(result, u'Süper')['selected'], True) self.assertEqual(qs(result, u'Süper'), {}) self.assertEqual(qs(result, u'Dokumänt'), { 'Subject_op': 'and', 'Subject': [u'Süper', u'Dokumänt'] }) self.assertEqual(qs(result, u'Evänt'), { 'Subject_op': 'and', 'Subject': [u'Süper', u'Evänt'] }) # Narrow down by 2 catalog_results = ICollection(self.collection).results( batch=False, brains=True, custom_query=make_query(qs(result, u'Dokumänt'))) self.assertEqual(len(catalog_results), 1) result = get_filter_items( self.collection_uid, 'Subject', request_params={'Subject': [u'Süper', u'Dokumänt']}, filter_type="and", cache_enabled=False) self.assertEqual(len(result), 4) self.assertEqual(get_data_by_val(result, 'all')['count'], 3) self.assertEqual(get_data_by_val(result, u'Süper')['count'], 2) self.assertEqual(get_data_by_val(result, u'Evänt')['count'], 1) self.assertEqual(get_data_by_val(result, u'Dokumänt')['count'], 2) self.assertEqual(get_data_by_val(result, u'Süper')['selected'], True) self.assertEqual( get_data_by_val(result, u'Dokumänt')['selected'], True) self.assertEqual(qs(result, u'Süper'), {'Subject': u'Dokumänt'}) self.assertEqual(qs(result, u'Dokumänt'), {'Subject': u'Süper'}) self.assertEqual(qs(result, u'Evänt'), { 'Subject': [u'Süper', u'Dokumänt', u'Evänt'], 'Subject_op': 'and' }) # Clicking on Event we should get 0 results as none will be in common catalog_results = ICollection(self.collection).results( batch=False, brains=True, custom_query=make_query(qs(result, u'Evänt'))) self.assertEqual(len(catalog_results), 0)
def add_to_parent(self): return ICollection.providedBy(self.context)
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_and_filter_type(self): self.assertEqual(len(self.collection.results()), 3) result = get_filter_items(self.collection_uid, "Subject", cache_enabled=False) self.assertEqual(len(result), 4) self.assertEqual(get_data_by_val(result, "all")["count"], 3) self.assertEqual(get_data_by_val(result, "all")["selected"], True) self.assertEqual(get_data_by_val(result, u"Süper")["count"], 2) self.assertEqual(get_data_by_val(result, u"Evänt")["count"], 1) self.assertEqual(get_data_by_val(result, u"Dokumänt")["count"], 2) # Test url self.assertEqual(qs(result, u"Süper"), {"Subject": u"Süper"}) catalog_results = ICollection(self.collection).results( batch=False, brains=True, custom_query=make_query(qs(result, u"Süper"))) self.assertEqual(len(catalog_results), 2) result = get_filter_items( self.collection_uid, "Subject", request_params={"Subject": u"Süper"}, filter_type="and", cache_enabled=False, ) self.assertEqual(len(result), 4) self.assertEqual(get_data_by_val(result, "all")["count"], 3) # TODO: I'm not sure these counts are correct. It should represent how many results you will get if you click # so should be smaller than this but I guess you need to turn on narrow down for that? self.assertEqual(get_data_by_val(result, u"Süper")["count"], 2) self.assertEqual(get_data_by_val(result, u"Evänt")["count"], 1) self.assertEqual(get_data_by_val(result, u"Dokumänt")["count"], 2) self.assertEqual(get_data_by_val(result, u"Süper")["selected"], True) self.assertEqual(qs(result, u"Süper"), {}) self.assertEqual( qs(result, u"Dokumänt"), { "Subject_op": "and", "Subject": [u"Süper", u"Dokumänt"] }, ) self.assertEqual(qs(result, u"Evänt"), { "Subject_op": "and", "Subject": [u"Süper", u"Evänt"] }) # Narrow down by 2 catalog_results = ICollection(self.collection).results( batch=False, brains=True, custom_query=make_query(qs(result, u"Dokumänt"))) self.assertEqual(len(catalog_results), 1) result = get_filter_items( self.collection_uid, "Subject", request_params={"Subject": [u"Süper", u"Dokumänt"]}, filter_type="and", cache_enabled=False, ) self.assertEqual(len(result), 4) self.assertEqual(get_data_by_val(result, "all")["count"], 3) self.assertEqual(get_data_by_val(result, u"Süper")["count"], 2) self.assertEqual(get_data_by_val(result, u"Evänt")["count"], 1) self.assertEqual(get_data_by_val(result, u"Dokumänt")["count"], 2) self.assertEqual(get_data_by_val(result, u"Süper")["selected"], True) self.assertEqual( get_data_by_val(result, u"Dokumänt")["selected"], True) self.assertEqual(qs(result, u"Süper"), {"Subject": u"Dokumänt"}) self.assertEqual(qs(result, u"Dokumänt"), {"Subject": u"Süper"}) self.assertEqual( qs(result, u"Evänt"), { "Subject": [u"Süper", u"Dokumänt", u"Evänt"], "Subject_op": "and" }, ) # Clicking on Event we should get 0 results as none will be in common catalog_results = ICollection(self.collection).results( batch=False, brains=True, custom_query=make_query(qs(result, u"Evänt"))) self.assertEqual(len(catalog_results), 0)
def test_adding(self): self.folder.invokeFactory("Collection", "collection1") p1 = self.folder["collection1"] self.assertTrue(ICollection.providedBy(p1))
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 getCriteria(self): if IATTopic.providedBy(self.context) or ICollection.providedBy(self.context) or IDXCollection.providedBy(self.context): return IListBaseQueryCriteria(self.context)() return []
def getCriteria(self): if IATTopic.providedBy(self.context) or ICollection.providedBy( self.context) or IDXCollection.providedBy(self.context): return IListBaseQueryCriteria(self.context)() return []