diff --git a/news/1864.bugfix b/news/1864.bugfix new file mode 100644 index 0000000000..9e63a64abd --- /dev/null +++ b/news/1864.bugfix @@ -0,0 +1 @@ +In the `@contextnavigation` endpoint, return `"icon": null` for Files with a mimetype not found in the `content_type_registry`, instead of raising `TypeError`. @mamico diff --git a/src/plone/restapi/services/contextnavigation/get.py b/src/plone/restapi/services/contextnavigation/get.py index 0fe0d7a054..3f22602222 100644 --- a/src/plone/restapi/services/contextnavigation/get.py +++ b/src/plone/restapi/services/contextnavigation/get.py @@ -357,7 +357,8 @@ def getMimeTypeIcon(self, node): mtt = getToolByName(self.context, "mimetypes_registry") if fileo.contentType: ctype = mtt.lookup(fileo.contentType) - return os.path.join(portal_url, guess_icon_path(ctype[0])) + if ctype: + return os.path.join(portal_url, guess_icon_path(ctype[0])) except AttributeError: pass diff --git a/src/plone/restapi/tests/test_services_contextnavigation.py b/src/plone/restapi/tests/test_services_contextnavigation.py index 9f8405e95a..05fe3c037e 100644 --- a/src/plone/restapi/tests/test_services_contextnavigation.py +++ b/src/plone/restapi/tests/test_services_contextnavigation.py @@ -3,6 +3,7 @@ from plone.app.testing import SITE_OWNER_NAME from plone.app.testing import SITE_OWNER_PASSWORD from plone.app.testing import TEST_USER_ID +from plone.namedfile.file import NamedBlobFile from plone.registry.interfaces import IRegistry from plone.restapi.services.contextnavigation.get import ContextNavigation from plone.restapi.testing import PLONE_RESTAPI_DX_FUNCTIONAL_TESTING @@ -99,6 +100,9 @@ def populateSite(self): folder2.invokeFactory("Document", "doc22") folder2.invokeFactory("Document", "doc23") folder2.invokeFactory("File", "file21") + folder2.file21.file = NamedBlobFile( + data="Hello World", contentType="text/plain", filename="file.txt" + ) folder2.invokeFactory("Folder", "folder21") folder21 = getattr(folder2, "folder21") folder21.invokeFactory("Document", "doc211") @@ -996,3 +1000,28 @@ def testContextNavigation(self): "/plone/folder1/doc11", ) ) + + def testIcon(self): + view = self.renderer( + self.portal.folder2.file21, + opts(root_path="/folder2", topLevel=0), + ) + tree = view.getNavTree() + self.assertTrue(tree) + self.assertEqual( + tree["items"][0]["icon"], + "/plone/++resource++mimetype.icons/txt.png", + ) + + def testIconNotRegisteredMimetype(self): + self.portal.folder2.file21.file.contentType = "plain/x-text" + view = self.renderer( + self.portal.folder2.file21, + opts(root_path="/folder2", topLevel=0), + ) + tree = view.getNavTree() + self.assertTrue(tree) + self.assertEqual( + tree["items"][0]["icon"], + None, + )