From 1e73909fa3c4b1c39ba9b2ac8d56360c063c8a22 Mon Sep 17 00:00:00 2001 From: Daniel Marks Date: Thu, 19 Jan 2017 16:41:58 +1030 Subject: [PATCH 01/16] Add an exception so that JSON POST requests inside portal_resources don't fail --- src/plone/rest/traverse.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/plone/rest/traverse.py b/src/plone/rest/traverse.py index 6f88546..95e0218 100644 --- a/src/plone/rest/traverse.py +++ b/src/plone/rest/traverse.py @@ -9,6 +9,7 @@ from zope.interface import implements from zope.publisher.interfaces.browser import IBrowserPublisher from Products.CMFCore.interfaces import IContentish +from Products.BTreeFolder2.BTreeFolder2 import BTreeFolder2 class RESTTraverse(DefaultPublishTraverse): @@ -21,6 +22,9 @@ def publishTraverse(self, request, name): and not IService.providedBy(obj)): if isinstance(obj, VirtualHostMonster): return obj + elif (isinstance(obj, BTreeFolder2) + and obj.id == 'portal_resources'): + return obj else: raise KeyError except KeyError: From 317aee7f5ac0111ed91881c32b6bcdd56430cfce Mon Sep 17 00:00:00 2001 From: Daniel Marks Date: Thu, 19 Jan 2017 16:41:58 +1030 Subject: [PATCH 02/16] Add an exception so that JSON POST requests inside portal_resources don't fail --- src/plone/rest/traverse.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/plone/rest/traverse.py b/src/plone/rest/traverse.py index 6f88546..95e0218 100644 --- a/src/plone/rest/traverse.py +++ b/src/plone/rest/traverse.py @@ -9,6 +9,7 @@ from zope.interface import implements from zope.publisher.interfaces.browser import IBrowserPublisher from Products.CMFCore.interfaces import IContentish +from Products.BTreeFolder2.BTreeFolder2 import BTreeFolder2 class RESTTraverse(DefaultPublishTraverse): @@ -21,6 +22,9 @@ def publishTraverse(self, request, name): and not IService.providedBy(obj)): if isinstance(obj, VirtualHostMonster): return obj + elif (isinstance(obj, BTreeFolder2) + and obj.id == 'portal_resources'): + return obj else: raise KeyError except KeyError: From 47d7a3f559e0fe898fcefcfc028857053d776528 Mon Sep 17 00:00:00 2001 From: "quang.nguyen" Date: Tue, 30 Jan 2018 17:30:28 +1100 Subject: [PATCH 03/16] Add test case --- CHANGES.rst | 1 + src/plone/rest/traverse.py | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 4e6fad4..86857b9 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -24,6 +24,7 @@ Bugfixes: - Do not handle view namespace at all. This fixes: https://github.com/plone/plone.rest/issues/50 [buchi] +- Fix error with uploading file to theme editor [displacedaussie] 1.0a6 (2016-05-22) diff --git a/src/plone/rest/traverse.py b/src/plone/rest/traverse.py index 95e0218..84f591f 100644 --- a/src/plone/rest/traverse.py +++ b/src/plone/rest/traverse.py @@ -11,7 +11,6 @@ from Products.CMFCore.interfaces import IContentish from Products.BTreeFolder2.BTreeFolder2 import BTreeFolder2 - class RESTTraverse(DefaultPublishTraverse): adapts(IPloneSiteRoot, IAPIRequest) From 526af88b38ed25d8eef35770b2aed3ee9047b38e Mon Sep 17 00:00:00 2001 From: "quang.nguyen" Date: Tue, 30 Jan 2018 19:02:00 +1100 Subject: [PATCH 04/16] Add test case --- src/plone/rest/tests/test_traversal.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/plone/rest/tests/test_traversal.py b/src/plone/rest/tests/test_traversal.py index 8c0f6ba..474292e 100644 --- a/src/plone/rest/tests/test_traversal.py +++ b/src/plone/rest/tests/test_traversal.py @@ -126,3 +126,22 @@ def test_json_request_to_view_namespace_returns_view(self): self.portal[self.portal.invokeFactory('Folder', id='folder1')] obj = self.traverse('/plone/folder1/@@folder_contents') self.assertTrue(IBrowserView.providedBy(obj), 'IBrowserView expected') + + def test_json_request_to_portal_resource_returns_view(self): + obj = self.traverse('/plone/portal_resources') + self.assertTrue(IBrowserView.providedBy(obj), 'IBrowserView expected') + + self.portal[self.portal.invokeFactory('Folder', id='folder1')] + obj = self.traverse('/plone/folder1/portal_resources') + self.assertTrue(IBrowserView.providedBy(obj), 'IBrowserView expected') + + + + def test_json_request_to_portal_resource_returns_view(self): + obj = self.traverse('/plone/portal_resources') + print obj + self.assertTrue(IBrowserView.providedBy(obj), 'IBrowserView expected') + + self.portal[self.portal.invokeFactory('Folder', id='folder1')] + obj = self.traverse('/plone/folder1/portal_resources') + self.assertTrue(IBrowserView.providedBy(obj), 'IBrowserView expected') \ No newline at end of file From 17fefde37b88b4e7827dd42b708f08f467a733c3 Mon Sep 17 00:00:00 2001 From: "quang.nguyen" Date: Tue, 30 Jan 2018 19:21:09 +1100 Subject: [PATCH 05/16] Update test case --- src/plone/rest/tests/test_traversal.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/plone/rest/tests/test_traversal.py b/src/plone/rest/tests/test_traversal.py index 474292e..c8126f9 100644 --- a/src/plone/rest/tests/test_traversal.py +++ b/src/plone/rest/tests/test_traversal.py @@ -135,13 +135,10 @@ def test_json_request_to_portal_resource_returns_view(self): obj = self.traverse('/plone/folder1/portal_resources') self.assertTrue(IBrowserView.providedBy(obj), 'IBrowserView expected') - - def test_json_request_to_portal_resource_returns_view(self): obj = self.traverse('/plone/portal_resources') - print obj self.assertTrue(IBrowserView.providedBy(obj), 'IBrowserView expected') self.portal[self.portal.invokeFactory('Folder', id='folder1')] - obj = self.traverse('/plone/folder1/portal_resources') + obj = self.traverse('/plone/portal_resources/folder1') self.assertTrue(IBrowserView.providedBy(obj), 'IBrowserView expected') \ No newline at end of file From a8ab00db9127cda36f883580937b9e083fc47b0a Mon Sep 17 00:00:00 2001 From: "quang.nguyen" Date: Wed, 31 Jan 2018 13:47:48 +1100 Subject: [PATCH 06/16] Update doctest --- src/plone/rest/tests/test_traversal.py | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/plone/rest/tests/test_traversal.py b/src/plone/rest/tests/test_traversal.py index c8126f9..3a48888 100644 --- a/src/plone/rest/tests/test_traversal.py +++ b/src/plone/rest/tests/test_traversal.py @@ -131,14 +131,6 @@ def test_json_request_to_portal_resource_returns_view(self): obj = self.traverse('/plone/portal_resources') self.assertTrue(IBrowserView.providedBy(obj), 'IBrowserView expected') - self.portal[self.portal.invokeFactory('Folder', id='folder1')] - obj = self.traverse('/plone/folder1/portal_resources') - self.assertTrue(IBrowserView.providedBy(obj), 'IBrowserView expected') - - def test_json_request_to_portal_resource_returns_view(self): - obj = self.traverse('/plone/portal_resources') - self.assertTrue(IBrowserView.providedBy(obj), 'IBrowserView expected') - - self.portal[self.portal.invokeFactory('Folder', id='folder1')] - obj = self.traverse('/plone/portal_resources/folder1') + self.portal[self.portal.invokeFactory('theme', id='theme1')] + obj = self.traverse('/plone/portal_resources/theme1') self.assertTrue(IBrowserView.providedBy(obj), 'IBrowserView expected') \ No newline at end of file From 4d41fd5aeb4e7f03dc99fa33d4f793851ffaaaeb Mon Sep 17 00:00:00 2001 From: "quang.nguyen" Date: Wed, 31 Jan 2018 16:45:33 +1100 Subject: [PATCH 07/16] Update unitest for traverse portal resource --- src/plone/rest/tests/test_traversal.py | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/plone/rest/tests/test_traversal.py b/src/plone/rest/tests/test_traversal.py index 3a48888..b01b446 100644 --- a/src/plone/rest/tests/test_traversal.py +++ b/src/plone/rest/tests/test_traversal.py @@ -11,6 +11,8 @@ from zope.event import notify from zope.interface import alsoProvides from zope.publisher.interfaces.browser import IBrowserView +from Products.BTreeFolder2.BTreeFolder2 import BTreeFolder2 +from plone.resource.interfaces import IResourceDirectory import unittest @@ -128,9 +130,18 @@ def test_json_request_to_view_namespace_returns_view(self): self.assertTrue(IBrowserView.providedBy(obj), 'IBrowserView expected') def test_json_request_to_portal_resource_returns_view(self): - obj = self.traverse('/plone/portal_resources') - self.assertTrue(IBrowserView.providedBy(obj), 'IBrowserView expected') - - self.portal[self.portal.invokeFactory('theme', id='theme1')] - obj = self.traverse('/plone/portal_resources/theme1') - self.assertTrue(IBrowserView.providedBy(obj), 'IBrowserView expected') \ No newline at end of file + root = BTreeFolder2('portal_resources') + root._setOb('demo', BTreeFolder2('demo')) + from StringIO import StringIO + from OFS.Image import File + file = File('test.html', 'test.html', StringIO('asdf')) + root.demo._setOb('test.html', file) + from plone.resource.directory import PersistentResourceDirectory + return PersistentResourceDirectory(root) + + obj = self.traverse('/plone/portal_resources/demo') + self.assertTrue(IResourceDirectory.providedBy(obj), 'IResourceDirectory expected') + + from plone.resource.file import FilesystemFile + obj = self.traverse('/plone/portal_resources/demo/test.html') + self.assertTrue(isinstance(obj,FilesystemFile), 'FilesystemFile expected') \ No newline at end of file From b77a374ef7f28004c344b7831d173d327b284a38 Mon Sep 17 00:00:00 2001 From: "quang.nguyen" Date: Wed, 31 Jan 2018 16:57:11 +1100 Subject: [PATCH 08/16] Update unitest for traverse portal resource --- src/plone/rest/tests/test_traversal.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plone/rest/tests/test_traversal.py b/src/plone/rest/tests/test_traversal.py index b01b446..270e27a 100644 --- a/src/plone/rest/tests/test_traversal.py +++ b/src/plone/rest/tests/test_traversal.py @@ -129,7 +129,7 @@ def test_json_request_to_view_namespace_returns_view(self): obj = self.traverse('/plone/folder1/@@folder_contents') self.assertTrue(IBrowserView.providedBy(obj), 'IBrowserView expected') - def test_json_request_to_portal_resource_returns_view(self): + def test_json_request_to_portal_resource_returns_resource(self): root = BTreeFolder2('portal_resources') root._setOb('demo', BTreeFolder2('demo')) from StringIO import StringIO From a38c2058376ef2f0108b623ac1beaf0bc12caae7 Mon Sep 17 00:00:00 2001 From: "quang.nguyen" Date: Thu, 1 Feb 2018 14:47:21 +1100 Subject: [PATCH 09/16] Update unit test --- src/plone/rest/tests/test_traversal.py | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/src/plone/rest/tests/test_traversal.py b/src/plone/rest/tests/test_traversal.py index 270e27a..f38f427 100644 --- a/src/plone/rest/tests/test_traversal.py +++ b/src/plone/rest/tests/test_traversal.py @@ -1,5 +1,8 @@ # -*- coding: utf-8 -*- +from OFS.Image import File +from Products.CMFCore.FSPageTemplate import FSPageTemplate from Products.SiteAccess.VirtualHostMonster import VirtualHostMonster +from StringIO import StringIO from ZPublisher import BeforeTraverse from ZPublisher.pubevents import PubStart from base64 import b64encode @@ -11,8 +14,6 @@ from zope.event import notify from zope.interface import alsoProvides from zope.publisher.interfaces.browser import IBrowserView -from Products.BTreeFolder2.BTreeFolder2 import BTreeFolder2 -from plone.resource.interfaces import IResourceDirectory import unittest @@ -129,19 +130,7 @@ def test_json_request_to_view_namespace_returns_view(self): obj = self.traverse('/plone/folder1/@@folder_contents') self.assertTrue(IBrowserView.providedBy(obj), 'IBrowserView expected') - def test_json_request_to_portal_resource_returns_resource(self): - root = BTreeFolder2('portal_resources') - root._setOb('demo', BTreeFolder2('demo')) - from StringIO import StringIO - from OFS.Image import File - file = File('test.html', 'test.html', StringIO('asdf')) - root.demo._setOb('test.html', file) - from plone.resource.directory import PersistentResourceDirectory - return PersistentResourceDirectory(root) - - obj = self.traverse('/plone/portal_resources/demo') - self.assertTrue(IResourceDirectory.providedBy(obj), 'IResourceDirectory expected') - - from plone.resource.file import FilesystemFile - obj = self.traverse('/plone/portal_resources/demo/test.html') - self.assertTrue(isinstance(obj,FilesystemFile), 'FilesystemFile expected') \ No newline at end of file + def test_json_request_to_portal_resource_returns_page_template_object(self): + obj = self.traverse('/plone/portal_resources') + self.assertTrue(isinstance(obj._ReplaceableWrapper__ob,FSPageTemplate), 'FSPageTemplate expected') + From 106e2cf274bc9135ce7c55f3eb98bd02b69cb408 Mon Sep 17 00:00:00 2001 From: "quang.nguyen" Date: Thu, 1 Feb 2018 15:09:24 +1100 Subject: [PATCH 10/16] Fix Flake error --- src/plone/rest/tests/test_traversal.py | 6 +----- src/plone/rest/traverse.py | 1 + 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/plone/rest/tests/test_traversal.py b/src/plone/rest/tests/test_traversal.py index f38f427..bad57bf 100644 --- a/src/plone/rest/tests/test_traversal.py +++ b/src/plone/rest/tests/test_traversal.py @@ -1,8 +1,5 @@ # -*- coding: utf-8 -*- -from OFS.Image import File -from Products.CMFCore.FSPageTemplate import FSPageTemplate from Products.SiteAccess.VirtualHostMonster import VirtualHostMonster -from StringIO import StringIO from ZPublisher import BeforeTraverse from ZPublisher.pubevents import PubStart from base64 import b64encode @@ -132,5 +129,4 @@ def test_json_request_to_view_namespace_returns_view(self): def test_json_request_to_portal_resource_returns_page_template_object(self): obj = self.traverse('/plone/portal_resources') - self.assertTrue(isinstance(obj._ReplaceableWrapper__ob,FSPageTemplate), 'FSPageTemplate expected') - + self.assertIsNotNone(obj, 'Object expected') diff --git a/src/plone/rest/traverse.py b/src/plone/rest/traverse.py index 84f591f..95e0218 100644 --- a/src/plone/rest/traverse.py +++ b/src/plone/rest/traverse.py @@ -11,6 +11,7 @@ from Products.CMFCore.interfaces import IContentish from Products.BTreeFolder2.BTreeFolder2 import BTreeFolder2 + class RESTTraverse(DefaultPublishTraverse): adapts(IPloneSiteRoot, IAPIRequest) From ac5152640ebb9646ca08d0a3aacf2bedbb18c6f7 Mon Sep 17 00:00:00 2001 From: "quang.nguyen" Date: Thu, 1 Feb 2018 15:24:10 +1100 Subject: [PATCH 11/16] Fix code-analysis error --- src/plone/rest/tests/test_traversal.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plone/rest/tests/test_traversal.py b/src/plone/rest/tests/test_traversal.py index bad57bf..ac31c8f 100644 --- a/src/plone/rest/tests/test_traversal.py +++ b/src/plone/rest/tests/test_traversal.py @@ -127,6 +127,6 @@ def test_json_request_to_view_namespace_returns_view(self): obj = self.traverse('/plone/folder1/@@folder_contents') self.assertTrue(IBrowserView.providedBy(obj), 'IBrowserView expected') - def test_json_request_to_portal_resource_returns_page_template_object(self): + def test_json_request_to_portal_resource_returns_page_template(self): obj = self.traverse('/plone/portal_resources') self.assertIsNotNone(obj, 'Object expected') From 410a2a611f055302b347fc1973d832a80928bc18 Mon Sep 17 00:00:00 2001 From: "quang.nguyen" Date: Thu, 1 Feb 2018 16:25:28 +1100 Subject: [PATCH 12/16] Install diazo to support Plone4.3 testing --- src/plone/rest/testing.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plone/rest/testing.py b/src/plone/rest/testing.py index 63b3114..4588e4d 100644 --- a/src/plone/rest/testing.py +++ b/src/plone/rest/testing.py @@ -14,6 +14,7 @@ class PloneRestLayer(PloneSandboxLayer): defaultBases = (PLONE_APP_CONTENTTYPES_FIXTURE,) def setUpZope(self, app, configurationContext): + z2.installProduct(app, 'diazo') import plone.rest xmlconfig.file( 'configure.zcml', From 0a5f22e5eabd5cefc1a41fff83ed7c30166345c2 Mon Sep 17 00:00:00 2001 From: "quang.nguyen" Date: Thu, 1 Feb 2018 17:22:36 +1100 Subject: [PATCH 13/16] Install plone.app.theming to support testing with Plone4.3 --- src/plone/rest/testing.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/plone/rest/testing.py b/src/plone/rest/testing.py index 4588e4d..39c386c 100644 --- a/src/plone/rest/testing.py +++ b/src/plone/rest/testing.py @@ -5,7 +5,6 @@ from plone.app.testing import PloneSandboxLayer from plone.rest.service import Service from plone.testing import z2 - from zope.configuration import xmlconfig @@ -14,7 +13,7 @@ class PloneRestLayer(PloneSandboxLayer): defaultBases = (PLONE_APP_CONTENTTYPES_FIXTURE,) def setUpZope(self, app, configurationContext): - z2.installProduct(app, 'diazo') + z2.installProduct(app, 'plone.app.theming') import plone.rest xmlconfig.file( 'configure.zcml', @@ -27,6 +26,9 @@ def setUpZope(self, app, configurationContext): context=configurationContext ) + def setUpPloneSite(self, portal): + # Install into Plone site using portal_setup + self.applyProfile(portal, 'plone.app.theming:default') PLONE_REST_FIXTURE = PloneRestLayer() PLONE_REST_INTEGRATION_TESTING = IntegrationTesting( From 77716d800bfddcdbddde198968341b11fbc28e0a Mon Sep 17 00:00:00 2001 From: "quang.nguyen" Date: Thu, 1 Feb 2018 17:27:57 +1100 Subject: [PATCH 14/16] Install plone.app.theming to support testing with Plone4.3 --- src/plone/rest/testing.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plone/rest/testing.py b/src/plone/rest/testing.py index 39c386c..60c1b88 100644 --- a/src/plone/rest/testing.py +++ b/src/plone/rest/testing.py @@ -25,11 +25,12 @@ def setUpZope(self, app, configurationContext): plone.rest, context=configurationContext ) - + def setUpPloneSite(self, portal): # Install into Plone site using portal_setup self.applyProfile(portal, 'plone.app.theming:default') + PLONE_REST_FIXTURE = PloneRestLayer() PLONE_REST_INTEGRATION_TESTING = IntegrationTesting( bases=(PLONE_REST_FIXTURE,), From 3907aa6dc183073300706eeb85526441f8050768 Mon Sep 17 00:00:00 2001 From: "quang.nguyen" Date: Thu, 1 Feb 2018 17:31:04 +1100 Subject: [PATCH 15/16] Install plone.app.theming to support testing with Plone4.3 --- src/plone/rest/testing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plone/rest/testing.py b/src/plone/rest/testing.py index 60c1b88..4297636 100644 --- a/src/plone/rest/testing.py +++ b/src/plone/rest/testing.py @@ -25,7 +25,7 @@ def setUpZope(self, app, configurationContext): plone.rest, context=configurationContext ) - + def setUpPloneSite(self, portal): # Install into Plone site using portal_setup self.applyProfile(portal, 'plone.app.theming:default') From 9a025b35cb3934f2174da2135d1d6a9baafd7409 Mon Sep 17 00:00:00 2001 From: Dylan Jay Date: Thu, 1 Feb 2018 14:13:49 +0700 Subject: [PATCH 16/16] Update CHANGES.rst --- CHANGES.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 86857b9..b71c625 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,7 +4,8 @@ Changelog 1.0b2 (unreleased) ------------------ -- Nothing changed yet. +Bugfixes: +- Fix error with uploading file to theme editor. plone.rest no longer works in portal_resources. [displacedaussie] 1.0b1 (2017-05-14) @@ -24,7 +25,6 @@ Bugfixes: - Do not handle view namespace at all. This fixes: https://github.com/plone/plone.rest/issues/50 [buchi] -- Fix error with uploading file to theme editor [displacedaussie] 1.0a6 (2016-05-22)