diff --git a/last_commit.txt b/last_commit.txt index 6b06aae6c4..200c935dfb 100644 --- a/last_commit.txt +++ b/last_commit.txt @@ -1,30 +1,226 @@ -Repository: Products.CMFPlone +Repository: plone.api Branch: refs/heads/master -Date: 2024-02-21T16:47:10+01:00 -Author: Philip Bauer (pbauer) -Commit: https://github.com/plone/Products.CMFPlone/commit/255adbbcc6a19a9dcdc3b01c4496403d3badf4cf +Date: 2023-11-07T16:34:26+01:00 +Author: Georg Bernhard (gogobd) +Commit: https://github.com/plone/plone.api/commit/4197534d322203dac447e379c0aaf2c54dd4223a -plone.app.iterate permissions now use rolemap. See https://github.com/plone/plone.app.iterate/pull/120 +Implementation (without test) Files changed: -M Products/CMFPlone/tests/testSiteAdminRole.py +M src/plone/api/content.py -b'diff --git a/Products/CMFPlone/tests/testSiteAdminRole.py b/Products/CMFPlone/tests/testSiteAdminRole.py\nindex 64ba35671d..836c9c2992 100644\n--- a/Products/CMFPlone/tests/testSiteAdminRole.py\n+++ b/Products/CMFPlone/tests/testSiteAdminRole.py\n@@ -174,7 +174,7 @@ def testExpectedPermissions(self):\n pass\n else:\n expected.update(\n- {"iterate : Check in content": 1, "iterate : Check out content": 1}\n+ {"iterate : Check in content": 0, "iterate : Check out content": 0}\n )\n \n site = self.portal\n' +b"diff --git a/src/plone/api/content.py b/src/plone/api/content.py\nindex f85790ee..69143496 100644\n--- a/src/plone/api/content.py\n+++ b/src/plone/api/content.py\n@@ -652,4 +652,7 @@ def find(context=None, depth=None, **kwargs):\n if not valid_indexes:\n return []\n \n- return catalog(**query)\n+ if kwargs.get('unrestricted'):\n+ return catalog.unrestrictedSearchResults(**query)\n+ else:\n+ return catalog(**query)\n" -Repository: Products.CMFPlone +Repository: plone.api Branch: refs/heads/master -Date: 2024-02-21T16:47:25+01:00 -Author: Philip Bauer (pbauer) -Commit: https://github.com/plone/Products.CMFPlone/commit/72df6707ff2ff6fef986103b2b0ae77b2ed903cc +Date: 2023-11-07T16:42:20+01:00 +Author: Georg Bernhard (gogobd) +Commit: https://github.com/plone/plone.api/commit/77316c29a15cd14f75e396a2e1fe624a581393bc -add changenote +Adding documentation for unrestricted find Files changed: -A news/3907.bugfix +M docs/content.md -b'diff --git a/news/3907.bugfix b/news/3907.bugfix\nnew file mode 100644\nindex 0000000000..4a9c0e1fe2\n--- /dev/null\n+++ b/news/3907.bugfix\n@@ -0,0 +1,3 @@\n+Adapt tests after plone.app.iterate permissions use rolemap.xml\n+See https://github.com/plone/plone.app.iterate/pull/120\n+[pbauer]\n' +b"diff --git a/docs/content.md b/docs/content.md\nindex 5228dd2a..4b3e4acf 100644\n--- a/docs/content.md\n+++ b/docs/content.md\n@@ -195,6 +195,21 @@ documents = api.content.find(\n %\n % self.assertGreater(len(documents), 0)\n \n+Find all Documents, and use unrestrictedSearchResults:\n+\n+```python\n+from plone import api\n+documents = api.content.find(\n+ context=api.portal.get(),\n+ portal_type='Document',\n+ unrestricted=True,\n+)\n+```\n+\n+% invisible-code-block: python\n+%\n+% self.assertGreater(len(documents), 0)\n+\n More information about how to use the catalog may be found in the\n [Plone Documentation](https://5.docs.plone.org/develop/plone/searching_and_indexing/index.html).\n \n" + +Repository: plone.api + + +Branch: refs/heads/master +Date: 2023-11-07T16:48:28+01:00 +Author: Georg Bernhard (gogobd) +Commit: https://github.com/plone/plone.api/commit/d8b09ef50a99bf7157dafb5cf2dcb6842b7aca62 + +Adding news entry for unrestricted find + +Files changed: +A news/312.implementation + +b'diff --git a/news/312.implementation b/news/312.implementation\nnew file mode 100644\nindex 00000000..227d93ea\n--- /dev/null\n+++ b/news/312.implementation\n@@ -0,0 +1 @@\n+Implemented unrestricted find.\n\\ No newline at end of file\n' + +Repository: plone.api + + +Branch: refs/heads/master +Date: 2023-11-07T16:50:51+01:00 +Author: Georg Bernhard (gogobd) +Commit: https://github.com/plone/plone.api/commit/39747f413be2d42dab484d338f169be27058eb4f + +Adding basic test for unrestricted find + +Files changed: +M src/plone/api/tests/test_content.py + +b'diff --git a/src/plone/api/tests/test_content.py b/src/plone/api/tests/test_content.py\nindex 7123667c..7738a328 100644\n--- a/src/plone/api/tests/test_content.py\n+++ b/src/plone/api/tests/test_content.py\n@@ -912,6 +912,13 @@ def test_find(self):\n documents = api.content.find(portal_type="Document")\n self.assertEqual(len(documents), 2)\n \n+ def test_find(self):\n+ """Test the finding of content in various ways."""\n+\n+ # Find documents\n+ documents = api.content.find(portal_type="Document", unrestricted=True)\n+ self.assertEqual(len(documents), 2)\n+\n def test_find_empty_query(self):\n """Make sure an empty query yields no results"""\n \n' + +Repository: plone.api + + +Branch: refs/heads/master +Date: 2023-11-07T16:55:54+01:00 +Author: Georg Bernhard (gogobd) +Commit: https://github.com/plone/plone.api/commit/60bd67d3b01c1dd2d745516e55be780bf1e1fd5d + +Fixing black for unrestricted find + +Files changed: +M src/plone/api/content.py + +b'diff --git a/src/plone/api/content.py b/src/plone/api/content.py\nindex 69143496..a3da980b 100644\n--- a/src/plone/api/content.py\n+++ b/src/plone/api/content.py\n@@ -652,7 +652,7 @@ def find(context=None, depth=None, **kwargs):\n if not valid_indexes:\n return []\n \n- if kwargs.get(\'unrestricted\'):\n+ if kwargs.get("unrestricted"):\n return catalog.unrestrictedSearchResults(**query)\n else:\n return catalog(**query)\n' + +Repository: plone.api + + +Branch: refs/heads/master +Date: 2023-11-08T10:12:10+01:00 +Author: Georg Bernhard (gogobd) +Commit: https://github.com/plone/plone.api/commit/15432c5db4e2972bb0dcf73d9d7040899d931230 + +Accepting various suggestions, thanks every 01. + +Files changed: +M docs/content.md +M news/312.implementation +M src/plone/api/content.py +M src/plone/api/tests/test_content.py + +b'diff --git a/docs/content.md b/docs/content.md\nindex 4b3e4acf..6417a233 100644\n--- a/docs/content.md\n+++ b/docs/content.md\n@@ -195,13 +195,13 @@ documents = api.content.find(\n %\n % self.assertGreater(len(documents), 0)\n \n-Find all Documents, and use unrestrictedSearchResults:\n+Find all `Document` content types, and use unrestricted search results:\n \n ```python\n from plone import api\n documents = api.content.find(\n context=api.portal.get(),\n- portal_type=\'Document\',\n+ portal_type="Document",\n unrestricted=True,\n )\n ```\ndiff --git a/news/312.implementation b/news/312.implementation\nindex 227d93ea..c7c660d9 100644\n--- a/news/312.implementation\n+++ b/news/312.implementation\n@@ -1 +1 @@\n-Implemented unrestricted find.\n\\ No newline at end of file\n+Implemented unrestricted find of content types. @gogobd\n\\ No newline at end of file\ndiff --git a/src/plone/api/content.py b/src/plone/api/content.py\nindex a3da980b..ac431917 100644\n--- a/src/plone/api/content.py\n+++ b/src/plone/api/content.py\n@@ -599,12 +599,13 @@ def _parse_object_provides_query(query):\n return result\n \n \n-def find(context=None, depth=None, **kwargs):\n+def find(context=None, depth=None, untestricted=False, **kwargs):\n """Find content in the portal.\n \n :param context: Context for the search\n :type obj: Content object\n :param depth: How far in the content tree we want to search from context\n+ :param unrestricted: Boolean, use unrestrictedSearchResults if True\n :type obj: Content object\n :returns: Catalog brains\n :rtype: List\ndiff --git a/src/plone/api/tests/test_content.py b/src/plone/api/tests/test_content.py\nindex 7738a328..1673f82e 100644\n--- a/src/plone/api/tests/test_content.py\n+++ b/src/plone/api/tests/test_content.py\n@@ -912,8 +912,8 @@ def test_find(self):\n documents = api.content.find(portal_type="Document")\n self.assertEqual(len(documents), 2)\n \n- def test_find(self):\n- """Test the finding of content in various ways."""\n+ def test_untrestricted_find(self):\n+ """Test the finding of content in with unrestricted search."""\n \n # Find documents\n documents = api.content.find(portal_type="Document", unrestricted=True)\n' + +Repository: plone.api + + +Branch: refs/heads/master +Date: 2023-11-08T10:13:45+01:00 +Author: Georg Bernhard (gogobd) +Commit: https://github.com/plone/plone.api/commit/df59eaf36563423ed25acc01a064fbac1a4c32c6 + +unrestricted is an explicit keyword now + +Files changed: +M src/plone/api/content.py + +b'diff --git a/src/plone/api/content.py b/src/plone/api/content.py\nindex ac431917..d51928c9 100644\n--- a/src/plone/api/content.py\n+++ b/src/plone/api/content.py\n@@ -653,7 +653,7 @@ def find(context=None, depth=None, untestricted=False, **kwargs):\n if not valid_indexes:\n return []\n \n- if kwargs.get("unrestricted"):\n+ if unrestricted:\n return catalog.unrestrictedSearchResults(**query)\n else:\n return catalog(**query)\n' + +Repository: plone.api + + +Branch: refs/heads/master +Date: 2023-11-08T10:20:52+01:00 +Author: Georg Bernhard (gogobd) +Commit: https://github.com/plone/plone.api/commit/fd1578f15cebe98bc3f7d9ad2ede47db805f5ff7 + +Typo + +Files changed: +M src/plone/api/content.py + +b'diff --git a/src/plone/api/content.py b/src/plone/api/content.py\nindex d51928c9..2e8b74e4 100644\n--- a/src/plone/api/content.py\n+++ b/src/plone/api/content.py\n@@ -599,7 +599,7 @@ def _parse_object_provides_query(query):\n return result\n \n \n-def find(context=None, depth=None, untestricted=False, **kwargs):\n+def find(context=None, depth=None, unrestricted=False, **kwargs):\n """Find content in the portal.\n \n :param context: Context for the search\n' + +Repository: plone.api + + +Branch: refs/heads/master +Date: 2024-02-19T13:10:54+01:00 +Author: Georg Bernhard (gogobd) +Commit: https://github.com/plone/plone.api/commit/5783c42849cc59c7c9b2f0c68001525199e46ef7 + +Rename + +Files changed: +A news/312.feature +D news/312.implementation + +b'diff --git a/news/312.implementation b/news/312.feature\nsimilarity index 100%\nrename from news/312.implementation\nrename to news/312.feature\n' + +Repository: plone.api + + +Branch: refs/heads/master +Date: 2024-02-20T23:23:00+01:00 +Author: Georg Bernhard (gogobd) +Commit: https://github.com/plone/plone.api/commit/5101fdcb5b0633a4894c8ea24bcbe4f3fb0ee2c9 + +Log out for unrestricted search test + +Files changed: +M src/plone/api/tests/test_content.py + +b'diff --git a/src/plone/api/tests/test_content.py b/src/plone/api/tests/test_content.py\nindex 1673f82e..eecb6846 100644\n--- a/src/plone/api/tests/test_content.py\n+++ b/src/plone/api/tests/test_content.py\n@@ -915,10 +915,18 @@ def test_find(self):\n def test_untrestricted_find(self):\n """Test the finding of content in with unrestricted search."""\n \n- # Find documents\n+ # Search as Anonymous user\n+ from plone.app.testing import logout\n+ logout()\n+\n+ # Find documents (unrestricted)\n documents = api.content.find(portal_type="Document", unrestricted=True)\n self.assertEqual(len(documents), 2)\n \n+ # Find documents (restricted)\n+ documents = api.content.find(portal_type="Document")\n+ self.assertEqual(len(documents), 0)\n+\n def test_find_empty_query(self):\n """Make sure an empty query yields no results"""\n \n' + +Repository: plone.api + + +Branch: refs/heads/master +Date: 2024-02-20T23:25:57+01:00 +Author: Georg Bernhard (gogobd) +Commit: https://github.com/plone/plone.api/commit/969c6536a57c6ae498a0b63c45bbf665a78d5525 + +Black + +Files changed: +M src/plone/api/tests/test_content.py + +b'diff --git a/src/plone/api/tests/test_content.py b/src/plone/api/tests/test_content.py\nindex eecb6846..bea68c10 100644\n--- a/src/plone/api/tests/test_content.py\n+++ b/src/plone/api/tests/test_content.py\n@@ -917,6 +917,7 @@ def test_untrestricted_find(self):\n \n # Search as Anonymous user\n from plone.app.testing import logout\n+\n logout()\n \n # Find documents (unrestricted)\n' + +Repository: plone.api + + +Branch: refs/heads/master +Date: 2024-02-20T23:41:16+01:00 +Author: Georg Bernhard (gogobd) +Commit: https://github.com/plone/plone.api/commit/cc704006018a2d852b6227148c8753c39242912b + +Fixing linting for two files I never touched + +Files changed: +M src/plone/api/relation.py +M src/plone/api/tests/test_content.py + +b'diff --git a/src/plone/api/relation.py b/src/plone/api/relation.py\nindex 60df78ef..5540d4ca 100644\n--- a/src/plone/api/relation.py\n+++ b/src/plone/api/relation.py\n@@ -2,6 +2,7 @@\n \n Heavily inspired by collective.relationhelpers.\n """\n+\n from AccessControl.SecurityManagement import getSecurityManager\n from collections import defaultdict\n from plone.api.exc import InvalidParameterError\ndiff --git a/src/plone/api/tests/test_content.py b/src/plone/api/tests/test_content.py\nindex bea68c10..637b1c64 100644\n--- a/src/plone/api/tests/test_content.py\n+++ b/src/plone/api/tests/test_content.py\n@@ -1,4 +1,5 @@\n """Tests for plone.api.content."""\n+\n from Acquisition import aq_base\n from OFS.CopySupport import CopyError\n from OFS.event import ObjectWillBeMovedEvent\n' + +Repository: plone.api + + +Branch: refs/heads/master +Date: 2024-02-21T08:54:09+01:00 +Author: Georg Bernhard (gogobd) +Commit: https://github.com/plone/plone.api/commit/0b0984d617723c039a64fdaf5bbc4e5a2c1c82bc + +Merge branch 'master' into issue_312 + +Files changed: +M CHANGES.rst +M requirements-docs.txt +M setup.py +M src/plone/api/content.py +M src/plone/api/portal.py +M src/plone/api/tests/test_portal.py +D news/520.documentation + +b'diff --git a/CHANGES.rst b/CHANGES.rst\nindex dd1b19fc..f2737aac 100644\n--- a/CHANGES.rst\n+++ b/CHANGES.rst\n@@ -8,6 +8,33 @@ Changelog\n \n .. towncrier release notes start\n \n+2.0.9 (2024-02-12)\n+------------------\n+\n+Internal:\n+\n+\n+- Improved efficiency of view retrieval by deferring availability checks to error handling. @samriddhi99 (#479)\n+\n+\n+2.0.8 (2023-12-14)\n+------------------\n+\n+Bug fixes:\n+\n+\n+- Fix `api.portal.translate` usage with country-specific language codes [@ericof] (#524)\n+\n+\n+2.0.7 (2023-11-30)\n+------------------\n+\n+Documentation:\n+\n+\n+- Use the preferred `git switch -c` command. See https://www.infoq.com/news/2019/08/git-2-23-switch-restore/. @stevepiercy (#520)\n+\n+\n 2.0.6 (2023-11-03)\n ------------------\n \ndiff --git a/news/520.documentation b/news/520.documentation\ndeleted file mode 100644\nindex 5a5d8ca6..00000000\n--- a/news/520.documentation\n+++ /dev/null\n@@ -1 +0,0 @@\n-Use the preferred `git switch -c` command. See https://www.infoq.com/news/2019/08/git-2-23-switch-restore/. @stevepiercy\ndiff --git a/requirements-docs.txt b/requirements-docs.txt\nindex 9923bd9f..8038479c 100644\n--- a/requirements-docs.txt\n+++ b/requirements-docs.txt\n@@ -1,4 +1,20 @@\n+docutils<0.17,>=0.15 # sphinx-book-theme 0.2.0 has requirement docutils<0.17,>=0.15\n Sphinx<5,>=3 # sphinx-book-theme 0.3.3 has requirement sphinx<5,>=3\n-sphinx-book-theme<=0.3.99\n+lesscpy\n+linkify-it-py\n myst-parser\n sphinx-autobuild\n+pydata-sphinx-theme<=0.8.99\n+sphinx-book-theme==0.3.3\n+sphinx-copybutton\n+sphinx-sitemap\n+sphinx-togglebutton\n+sphinxcontrib-spelling\n+sphinxext-opengraph\n+sphinxcontrib-applehelp==1.0.4 # https://github.com/plone/documentation/issues/1604\n+sphinxcontrib-devhelp==1.0.2 # https://github.com/plone/documentation/issues/1604\n+sphinxcontrib-htmlhelp==2.0.1 # https://github.com/plone/documentation/issues/1604\n+sphinxcontrib-qthelp==1.0.3 # https://github.com/plone/documentation/issues/1604\n+sphinxcontrib-serializinghtml==1.1.5 # https://github.com/plone/documentation/issues/1604\n+sphinxcontrib-video\n+vale==2.30.0\ndiff --git a/setup.py b/setup.py\nindex 9a797213..73f00ba3 100644\n--- a/setup.py\n+++ b/setup.py\n@@ -12,7 +12,7 @@ def read(*rnames):\n read("README.md") + "\\n\\n" + read("CHANGES.rst") + "\\n\\n" + read("LICENSE")\n )\n \n-version = "2.0.7.dev0"\n+version = "2.0.10.dev0"\n \n setup(\n name="plone.api",\ndiff --git a/src/plone/api/content.py b/src/plone/api/content.py\nindex 2e8b74e4..6be66dec 100644\n--- a/src/plone/api/content.py\n+++ b/src/plone/api/content.py\n@@ -11,6 +11,7 @@\n from plone.uuid.interfaces import IUUID\n from Products.CMFCore.DynamicType import DynamicType\n from Products.CMFCore.WorkflowCore import WorkflowException\n+from zope.component import ComponentLookupError\n from zope.component import getMultiAdapter\n from zope.component import getSiteManager\n from zope.container.interfaces import INameChooser\n@@ -523,26 +524,29 @@ def get_view(name=None, context=None, request=None):\n # available, because the __init__ of said view will contain\n # errors in client code.\n \n- # Get all available views...\n- sm = getSiteManager()\n- available_views = sm.adapters.lookupAll(\n- required=(providedBy(context), providedBy(request)),\n- provided=Interface,\n- )\n- # and get their names.\n- available_view_names = [view[0] for view in available_views]\n-\n- # Raise an error if the requested view is not available.\n- if name not in available_view_names:\n- raise InvalidParameterError(\n- "Cannot find a view with name \'{name}\'.\\n"\n- "Available views are:\\n"\n- "{views}".format(\n- name=name,\n- views="\\n".join(sorted(available_view_names)),\n- ),\n+ try:\n+ return getMultiAdapter((context, request), name=name)\n+ except ComponentLookupError:\n+ # Getting all available views\n+ sm = getSiteManager()\n+ available_views = sm.adapters.lookupAll(\n+ required=(providedBy(context), providedBy(request)),\n+ provided=Interface,\n )\n- return getMultiAdapter((context, request), name=name)\n+\n+ # Check if the requested view is available\n+ # by getting the names of all available views\n+ available_view_names = [view[0] for view in available_views]\n+ if name not in available_view_names:\n+ # Raise an error if the requested view is not available.\n+ raise InvalidParameterError(\n+ "Cannot find a view with name \'{name}\'.\\n"\n+ "Available views are:\\n"\n+ "{views}".format(\n+ name=name,\n+ views="\\n".join(sorted(available_view_names)),\n+ ),\n+ )\n \n \n @required_parameters("obj")\ndiff --git a/src/plone/api/portal.py b/src/plone/api/portal.py\nindex adef18d9..1aec4997 100644\n--- a/src/plone/api/portal.py\n+++ b/src/plone/api/portal.py\n@@ -19,6 +19,7 @@\n from zope.interface.interfaces import IInterface\n \n import datetime as dtime\n+import re\n \n \n logger = getLogger("plone.api.portal")\n@@ -419,6 +420,8 @@ def translate(msgid, domain="plone", lang=None):\n :Example: :ref:`portal-translate-example`\n """\n translation_service = get_tool("translation_service")\n+ if lang and re.match(r"\\D{2}-\\D{2}", lang):\n+ lang = f"{lang[:2]}_{lang[-2:].upper()}"\n query = {\n "msgid": msgid,\n "domain": domain,\ndiff --git a/src/plone/api/tests/test_portal.py b/src/plone/api/tests/test_portal.py\nindex 83f19886..a467ba1a 100644\n--- a/src/plone/api/tests/test_portal.py\n+++ b/src/plone/api/tests/test_portal.py\n@@ -886,3 +886,20 @@ def test_translate(self):\n ),\n "Avril",\n )\n+\n+ def test_translate_with_country_codes(self):\n+ """Test translation."""\n+ self.assertEqual(\n+ portal.translate(\n+ "Page",\n+ lang="pt-br",\n+ ),\n+ "P\xc3\xa1gina",\n+ )\n+ self.assertEqual(\n+ portal.translate(\n+ "Page",\n+ lang="pt_BR",\n+ ),\n+ "P\xc3\xa1gina",\n+ )\n' + +Repository: plone.api + + +Branch: refs/heads/master +Date: 2024-02-21T16:56:31+01:00 +Author: Maurits van Rees (mauritsvanrees) +Commit: https://github.com/plone/plone.api/commit/7d36c5a5e685692af7d7e589b25536a8ab09dcb3 + +Merge pull request #522 from plone/issue_312 + +Issue 312: unrestricted find + +Files changed: +A news/312.feature +M docs/content.md +M src/plone/api/content.py +M src/plone/api/tests/test_content.py + +b'diff --git a/docs/content.md b/docs/content.md\nindex 5228dd2a..6417a233 100644\n--- a/docs/content.md\n+++ b/docs/content.md\n@@ -195,6 +195,21 @@ documents = api.content.find(\n %\n % self.assertGreater(len(documents), 0)\n \n+Find all `Document` content types, and use unrestricted search results:\n+\n+```python\n+from plone import api\n+documents = api.content.find(\n+ context=api.portal.get(),\n+ portal_type="Document",\n+ unrestricted=True,\n+)\n+```\n+\n+% invisible-code-block: python\n+%\n+% self.assertGreater(len(documents), 0)\n+\n More information about how to use the catalog may be found in the\n [Plone Documentation](https://5.docs.plone.org/develop/plone/searching_and_indexing/index.html).\n \ndiff --git a/news/312.feature b/news/312.feature\nnew file mode 100644\nindex 00000000..c7c660d9\n--- /dev/null\n+++ b/news/312.feature\n@@ -0,0 +1 @@\n+Implemented unrestricted find of content types. @gogobd\n\\ No newline at end of file\ndiff --git a/src/plone/api/content.py b/src/plone/api/content.py\nindex 90f43776..6be66dec 100644\n--- a/src/plone/api/content.py\n+++ b/src/plone/api/content.py\n@@ -603,12 +603,13 @@ def _parse_object_provides_query(query):\n return result\n \n \n-def find(context=None, depth=None, **kwargs):\n+def find(context=None, depth=None, unrestricted=False, **kwargs):\n """Find content in the portal.\n \n :param context: Context for the search\n :type obj: Content object\n :param depth: How far in the content tree we want to search from context\n+ :param unrestricted: Boolean, use unrestrictedSearchResults if True\n :type obj: Content object\n :returns: Catalog brains\n :rtype: List\n@@ -656,4 +657,7 @@ def find(context=None, depth=None, **kwargs):\n if not valid_indexes:\n return []\n \n- return catalog(**query)\n+ if unrestricted:\n+ return catalog.unrestrictedSearchResults(**query)\n+ else:\n+ return catalog(**query)\ndiff --git a/src/plone/api/tests/test_content.py b/src/plone/api/tests/test_content.py\nindex 08ab2141..637b1c64 100644\n--- a/src/plone/api/tests/test_content.py\n+++ b/src/plone/api/tests/test_content.py\n@@ -913,6 +913,22 @@ def test_find(self):\n documents = api.content.find(portal_type="Document")\n self.assertEqual(len(documents), 2)\n \n+ def test_untrestricted_find(self):\n+ """Test the finding of content in with unrestricted search."""\n+\n+ # Search as Anonymous user\n+ from plone.app.testing import logout\n+\n+ logout()\n+\n+ # Find documents (unrestricted)\n+ documents = api.content.find(portal_type="Document", unrestricted=True)\n+ self.assertEqual(len(documents), 2)\n+\n+ # Find documents (restricted)\n+ documents = api.content.find(portal_type="Document")\n+ self.assertEqual(len(documents), 0)\n+\n def test_find_empty_query(self):\n """Make sure an empty query yields no results"""\n \n'