diff --git a/last_commit.txt b/last_commit.txt index de1c419e13..eb5c21d337 100644 --- a/last_commit.txt +++ b/last_commit.txt @@ -2,19 +2,22 @@ Repository: plone.restapi Branch: refs/heads/main -Date: 2024-10-02T09:01:47-07:00 -Author: Steve Piercy (stevepiercy) -Commit: https://github.com/plone/plone.restapi/commit/6e5e669ca11585ed69a5a02cd00175dfb5a73b46 +Date: 2024-10-02T14:00:40-07:00 +Author: Faakhir Zahid (Faakhir30) <110815427+Faakhir30@users.noreply.github.com> +Commit: https://github.com/plone/plone.restapi/commit/f68fab7ea3209a096423d8567fa7f70a93786c7a -Fix spelling of prerequisites (#1822) +Fix invalid values in RelationListFieldSerializer. (#1818) -* Fix spelling of prerequisites +* Fix invalid values in serializer. -* News +* Add test to check deleted relations + +* use to_id attribute to check content's existance. Files changed: -A news/1822.documentation -M docs/source/contributing/index.md +A news/1818.bugfix +M src/plone/restapi/serializer/relationfield.py +M src/plone/restapi/tests/test_dxcontent_serializer.py -b'diff --git a/docs/source/contributing/index.md b/docs/source/contributing/index.md\nindex 1c0c9ac61..f442e7130 100644\n--- a/docs/source/contributing/index.md\n+++ b/docs/source/contributing/index.md\n@@ -13,9 +13,9 @@ This section describes how to contribute to the `plone.restapi` project.\n It extends {doc}`plone:contributing/index`.\n \n \n-## Pre-requisites\n+## Prerequisites\n \n-Prepare your system by installing {ref}`plone:plone-pre-requisites-label`.\n+Prepare your system by installing {ref}`plone:plone-prerequisites-label`.\n \n \n ## Set up development environment\ndiff --git a/news/1822.documentation b/news/1822.documentation\nnew file mode 100644\nindex 000000000..c37ab9322\n--- /dev/null\n+++ b/news/1822.documentation\n@@ -0,0 +1 @@\n+Fixed spelling of prerequisites. @stevepiercy\n' +b'diff --git a/news/1818.bugfix b/news/1818.bugfix\nnew file mode 100644\nindex 000000000..54260238e\n--- /dev/null\n+++ b/news/1818.bugfix\n@@ -0,0 +1 @@\n+Fix response of `RelationListFieldSerializer` by filtering out invalid items. @Faakhir30\ndiff --git a/src/plone/restapi/serializer/relationfield.py b/src/plone/restapi/serializer/relationfield.py\nindex 28483ce42..d54cadb9d 100644\n--- a/src/plone/restapi/serializer/relationfield.py\n+++ b/src/plone/restapi/serializer/relationfield.py\n@@ -33,4 +33,16 @@ class RelationChoiceFieldSerializer(DefaultFieldSerializer):\n @adapter(IRelationList, IDexterityContent, Interface)\n @implementer(IFieldSerializer)\n class RelationListFieldSerializer(DefaultFieldSerializer):\n- pass\n+ def get_value(self, default=[]):\n+ """Return field value reduced to list of non-broken Relationvalues.\n+\n+ Args:\n+ default (list, optional): Default field value. Defaults to empty list.\n+\n+ Returns:\n+ list: List of RelationValues\n+ """\n+ value = super().get_value()\n+ if not value:\n+ return []\n+ return [el for el in value if el.to_id]\ndiff --git a/src/plone/restapi/tests/test_dxcontent_serializer.py b/src/plone/restapi/tests/test_dxcontent_serializer.py\nindex 6fd514956..567aa01e6 100644\n--- a/src/plone/restapi/tests/test_dxcontent_serializer.py\n+++ b/src/plone/restapi/tests/test_dxcontent_serializer.py\n@@ -27,6 +27,10 @@\n from zope.component import provideAdapter\n from zope.component import queryUtility\n from zope.interface import Interface\n+from z3c.relationfield import RelationValue\n+from z3c.relationfield.event import _setRelation\n+from zope.component import getUtility\n+from zope.intid.interfaces import IIntIds\n from zope.publisher.interfaces.browser import IBrowserRequest\n from importlib import import_module\n \n@@ -191,6 +195,30 @@ def test_serializer_includes_expansion(self):\n "foo",\n )\n \n+ def test_serializer_excludes_deleted_relations(self):\n+\n+ intids = getUtility(IIntIds)\n+ self.portal.invokeFactory(\n+ "DXTestDocument",\n+ id="doc2",\n+ )\n+ rel1 = RelationValue(intids.getId(self.portal.doc1))\n+ rel2 = RelationValue(intids.getId(self.portal.doc2))\n+ self.portal.doc1.test_relationlist_field = [\n+ rel1,\n+ rel2,\n+ ]\n+ _setRelation(self.portal.doc1, "test_relationlist_field", rel1)\n+ _setRelation(self.portal.doc1, "test_relationlist_field", rel2)\n+ # delete doc2 to make sure we have a None value in the relation list\n+ self.portal.manage_delObjects(["doc2"])\n+\n+ obj = self.serialize()\n+ self.assertEqual(1, len(obj["test_relationlist_field"]))\n+ self.assertEqual(\n+ "http://nohost/plone/doc1", obj["test_relationlist_field"][0]["@id"]\n+ )\n+\n def test_get_is_folderish(self):\n obj = self.serialize()\n self.assertIn("is_folderish", obj)\n'