Skip to content

Commit

Permalink
Merge 982fe4d into f3c0176
Browse files Browse the repository at this point in the history
  • Loading branch information
sneridagh committed Mar 13, 2019
2 parents f3c0176 + 982fe4d commit 60b9656
Show file tree
Hide file tree
Showing 5 changed files with 127 additions and 7 deletions.
2 changes: 2 additions & 0 deletions news/698.feature
@@ -0,0 +1,2 @@
- Add full support for `fullobjects` support for AT content types.
[sneridagh]
2 changes: 1 addition & 1 deletion src/plone/restapi/serializer/atcollection.py
Expand Up @@ -14,7 +14,7 @@
@adapter(ICollection, Interface)
class SerializeCollectionToJson(SerializeToJson):

def __call__(self, version=None):
def __call__(self, version=None, include_items=True):
collection_metadata = super(
SerializeCollectionToJson, self).__call__(version=version)
results = self.context.results(batch=False)
Expand Down
19 changes: 13 additions & 6 deletions src/plone/restapi/serializer/atcontent.py
Expand Up @@ -111,10 +111,17 @@ def __call__(self, version=None, include_items=True):
if batch.links:
result['batching'] = batch.links

result['items'] = [
getMultiAdapter(
(brain, self.request), ISerializeToJsonSummary
)()
for brain in batch
]
if 'fullobjects' in list(self.request.form):
result['items'] = getMultiAdapter(
(brains, self.request),
ISerializeToJson
)(fullobjects=True)['items']
else:
result['items'] = [
getMultiAdapter(
(brain, self.request),
ISerializeToJsonSummary
)()
for brain in batch
]
return result
2 changes: 2 additions & 0 deletions src/plone/restapi/testing.py
Expand Up @@ -285,6 +285,8 @@ def setUpZope(self, app, configurationContext):
z2.installProduct(app, 'plone.restapi')

def setUpPloneSite(self, portal):
portal.acl_users.userFolderAddUser(
SITE_OWNER_NAME, SITE_OWNER_PASSWORD, ['Manager'], [])
set_supported_languages(portal)

if portal.portal_setup.profileExists(
Expand Down
109 changes: 109 additions & 0 deletions src/plone/restapi/tests/test_content_get.py
Expand Up @@ -6,6 +6,8 @@
from plone.app.testing import login
from plone.app.testing import setRoles
from plone.app.textfield.value import RichTextValue
from plone.restapi.testing import HAS_AT
from plone.restapi.testing import PLONE_RESTAPI_AT_FUNCTIONAL_TESTING
from plone.restapi.testing import PLONE_RESTAPI_DX_FUNCTIONAL_TESTING
from z3c.relationfield import RelationValue
from zope.component import getUtility
Expand All @@ -21,6 +23,8 @@ class TestContentGet(unittest.TestCase):
layer = PLONE_RESTAPI_DX_FUNCTIONAL_TESTING

def setUp(self):
if not HAS_AT:
raise unittest.SkipTest('Skip tests if Archetypes is not present')
self.app = self.layer['app']
self.portal = self.layer['portal']
self.portal_url = self.portal.absolute_url()
Expand Down Expand Up @@ -163,3 +167,108 @@ def test_get_content_includes_related_items(self):
}],
response.json()['relatedItems']
)


class TestContentATGet(unittest.TestCase):

layer = PLONE_RESTAPI_AT_FUNCTIONAL_TESTING

def setUp(self):
if not HAS_AT:
raise unittest.SkipTest('Skip tests if Archetypes is not present')
self.portal = self.layer['portal']
self.portal_url = self.portal.absolute_url()
setRoles(self.portal, TEST_USER_ID, ['Member'])
login(self.portal, SITE_OWNER_NAME)
self.portal.invokeFactory(
'Folder',
id='folder1',
title='My Folder'
)
self.portal.folder1.invokeFactory(
'Document',
id='doc1',
title='My Document'
)
self.portal.folder1.doc1.setText(u"Lorem ipsum.")
self.portal.folder1.invokeFactory(
'Folder',
id='folder2',
title='My Folder 2'
)
self.portal.folder1.folder2.invokeFactory(
'Document',
id='doc2',
title='My Document 2'
)
self.portal.folder1.invokeFactory(
'Collection',
id='collection',
title='My collection'
)
wftool = getToolByName(self.portal, 'portal_workflow')
wftool.doActionFor(self.portal.folder1, 'publish')
wftool.doActionFor(self.portal.folder1.doc1, 'publish')
wftool.doActionFor(self.portal.folder1.folder2, 'publish')
wftool.doActionFor(self.portal.folder1.folder2.doc2, 'publish')
transaction.commit()

def test_get_content_returns_fullobjects(self):
response = requests.get(
self.portal.folder1.absolute_url() + '?fullobjects',
headers={'Accept': 'application/json'},
auth=(SITE_OWNER_NAME, SITE_OWNER_PASSWORD),
)

self.assertEqual(response.status_code, 200)
self.assertEqual(3, len(response.json()['items']))
self.assertTrue(
'title' in list(response.json()['items'][0])
)
self.assertTrue(
'description' in list(response.json()['items'][0])
)
self.assertTrue(
'text' in list(response.json()['items'][0])
)
self.assertEqual(
{
u'data': u'<p>Lorem ipsum.</p>',
u'content-type': u'text/html',
},
response.json()['items'][0].get('text')
)

# make sure the single document response is the same as the items
response_doc = requests.get(
self.portal.folder1.doc1.absolute_url(),
headers={'Accept': 'application/json'},
auth=(SITE_OWNER_NAME, SITE_OWNER_PASSWORD),
)
self.assertEqual(
response.json()['items'][0],
response_doc.json()
)

def test_get_content_returns_fullobjects_correct_id(self):
response = requests.get(
self.portal.folder1.absolute_url() + '?fullobjects',
headers={'Accept': 'application/json'},
auth=(SITE_OWNER_NAME, SITE_OWNER_PASSWORD),
)

self.assertEqual(response.status_code, 200)
self.assertEqual(3, len(response.json()['items']))
self.assertEqual(response.json()['items'][1]['@id'],
self.portal_url + u'/folder1/folder2')

def test_get_content_returns_fullobjects_non_recursive(self):
response = requests.get(
self.portal.folder1.absolute_url() + '?fullobjects',
headers={'Accept': 'application/json'},
auth=(SITE_OWNER_NAME, SITE_OWNER_PASSWORD),
)

self.assertEqual(response.status_code, 200)
self.assertEqual(3, len(response.json()['items']))
self.assertTrue('items' not in response.json()['items'][1])

0 comments on commit 60b9656

Please sign in to comment.