diff --git a/last_commit.txt b/last_commit.txt index f6eb5bb7fa..ecd0d85d7d 100644 --- a/last_commit.txt +++ b/last_commit.txt @@ -1,28 +1,40 @@ -Repository: Products.CMFPlone +Repository: plone.app.widgets -Branch: refs/heads/6.0.x -Date: 2024-10-17T09:32:22-07:00 -Author: David Glick (davisagli) -Commit: https://github.com/plone/Products.CMFPlone/commit/0daab7cdf869b39aecc8f46dcb682013724da24b +Branch: refs/heads/master +Date: 2024-10-18T09:01:33+02:00 +Author: 1letter (1letter) <1letter@gmx.de> +Commit: https://github.com/plone/plone.app.widgets/commit/b3cc037a6e33d7b04f0e5c7df7b8648557ddfded -Backport filter improvements for URL Management control panel (#4032) +deactivate robot tests -* Merge pull request #4009 from Faakhir30/add_date_filters - -Added start and end filters in redirectionSet. - -* Allow substring matches when filtering aliases in the URL Management control panel - ---------- - -Co-authored-by: Faakhir Zahid <110815427+Faakhir30@users.noreply.github.com> +Files changed: +A news/224.tests +A plone/app/widgets/tests/robot/deactivate_test_querystring_widget.robot +A plone/app/widgets/tests/robot/deactivate_test_select_widget.robot +D plone/app/widgets/tests/robot/test_querystring_widget.robot +D plone/app/widgets/tests/robot/test_select_widget.robot + +b'diff --git a/news/224.tests b/news/224.tests\nnew file mode 100644\nindex 00000000..fbab5550\n--- /dev/null\n+++ b/news/224.tests\n@@ -0,0 +1 @@\n+deactivate robot tests in this package and move the tests to Products.CMFPlone @1letter\n\\ No newline at end of file\ndiff --git a/plone/app/widgets/tests/robot/test_querystring_widget.robot b/plone/app/widgets/tests/robot/deactivate_test_querystring_widget.robot\nsimilarity index 100%\nrename from plone/app/widgets/tests/robot/test_querystring_widget.robot\nrename to plone/app/widgets/tests/robot/deactivate_test_querystring_widget.robot\ndiff --git a/plone/app/widgets/tests/robot/test_select_widget.robot b/plone/app/widgets/tests/robot/deactivate_test_select_widget.robot\nsimilarity index 100%\nrename from plone/app/widgets/tests/robot/test_select_widget.robot\nrename to plone/app/widgets/tests/robot/deactivate_test_select_widget.robot\n' + +Repository: plone.app.widgets + + +Branch: refs/heads/master +Date: 2024-10-18T09:05:27+02:00 +Author: Peter Mathis (petschki) +Commit: https://github.com/plone/plone.app.widgets/commit/9a6e08b48af097f417e333dc7c87f8d7e58675f1 + +Merge pull request #225 from plone/deactivate-robot-tests + +deactivate robot tests Files changed: -A news/4009.feature -A news/4031.feature -M Products/CMFPlone/controlpanel/browser/redirects.py -M Products/CMFPlone/controlpanel/tests/test_controlpanel_browser_redirection.py +A news/224.tests +A plone/app/widgets/tests/robot/deactivate_test_querystring_widget.robot +A plone/app/widgets/tests/robot/deactivate_test_select_widget.robot +D plone/app/widgets/tests/robot/test_querystring_widget.robot +D plone/app/widgets/tests/robot/test_select_widget.robot -b'diff --git a/Products/CMFPlone/controlpanel/browser/redirects.py b/Products/CMFPlone/controlpanel/browser/redirects.py\nindex 46b128ca75..25e271028e 100644\n--- a/Products/CMFPlone/controlpanel/browser/redirects.py\n+++ b/Products/CMFPlone/controlpanel/browser/redirects.py\n@@ -1,4 +1,5 @@\n from csv import writer\n+import warnings\n from DateTime import DateTime\n from DateTime.interfaces import DateTimeError\n from io import StringIO\n@@ -163,7 +164,11 @@ def view_url(self):\n \n \n class RedirectionSet:\n- def __init__(self, query="", created="", manual=""):\n+ # Marker so that plone.restapi can detect if this is\n+ # a version that supports the start and end parameters\n+ supports_date_range_filtering = True\n+\n+ def __init__(self, query="", created="", manual="", start="", end=""):\n self.storage = getUtility(IRedirectionStorage)\n \n portal = getSite()\n@@ -171,7 +176,7 @@ def __init__(self, query="", created="", manual=""):\n self.portal_path_len = len(self.portal_path)\n \n # noinspection PyProtectedMember\n- if query:\n+ if query and query.startswith("/"):\n # with query path /Plone/news:\n # min_k is /Plone/news and\n # max_k is /Plone/newt\n@@ -179,6 +184,8 @@ def __init__(self, query="", created="", manual=""):\n min_k = "{:s}/{:s}".format(self.portal_path, query.strip("/"))\n max_k = min_k[:-1] + chr(ord(min_k[-1]) + 1)\n self.data = self.storage._paths.keys(min=min_k, max=max_k, excludemax=True)\n+ elif query:\n+ self.data = [path for path in self.storage._paths.keys() if query in path]\n else:\n self.data = self.storage._paths.keys()\n if manual:\n@@ -190,20 +197,35 @@ def __init__(self, query="", created="", manual=""):\n else:\n manual = ""\n if created:\n+ end = created\n+ warnings.warn(\n+ "The \'created\' parameter is deprecated. Use \'end\' parameter instead.",\n+ DeprecationWarning,\n+ )\n+ if start:\n+ try:\n+ start = DateTime(start)\n+ except DateTimeError:\n+ logger.warning("Failed to parse as DateTime: %s", start)\n+ start = ""\n+ if end:\n try:\n- created = DateTime(created)\n+ end = DateTime(end)\n except DateTimeError:\n- logger.warning("Failed to parse as DateTime: %s", created)\n- created = ""\n- if created or manual != "":\n+ logger.warning("Failed to parse as DateTime: %s", end)\n+ end = ""\n+ if start or end or manual != "":\n chosen = []\n for redirect in self.data:\n info = self.storage.get_full(redirect)\n if manual != "":\n if info[2] != manual:\n continue\n- if created and info[1]:\n- if info[1] >= created:\n+ if start and info[1]:\n+ if info[1] < start:\n+ continue\n+ if end and info[1]:\n+ if info[1] >= end:\n continue\n chosen.append(redirect)\n self.data = chosen\n@@ -256,6 +278,8 @@ def redirects(self):\n RedirectionSet(\n query=self.request.form.get("q", ""),\n created=self.request.form.get("datetime", ""),\n+ start=self.request.form.get("start", ""),\n+ end=self.request.form.get("end", ""),\n manual=self.request.form.get("manual", ""),\n ),\n int(self.request.form.get("b_size", "15")),\n@@ -280,9 +304,17 @@ def __call__(self):\n else:\n query = self.request.form.get("q", "")\n created = self.request.form.get("datetime", "")\n+ start = self.request.form.get("start", "")\n+ end = self.request.form.get("end", "")\n manual = self.request.form.get("manual", "")\n- if created or manual or (query and query != "/"):\n- rset = RedirectionSet(query=query, created=created, manual=manual)\n+ if created or start or end or manual or (query and query != "/"):\n+ rset = RedirectionSet(\n+ query=query,\n+ created=created,\n+ manual=manual,\n+ start=start,\n+ end=end,\n+ )\n redirects = list(rset.data)\n else:\n redirects = []\ndiff --git a/Products/CMFPlone/controlpanel/tests/test_controlpanel_browser_redirection.py b/Products/CMFPlone/controlpanel/tests/test_controlpanel_browser_redirection.py\nindex 3a219f5e57..2ba3fdde99 100644\n--- a/Products/CMFPlone/controlpanel/tests/test_controlpanel_browser_redirection.py\n+++ b/Products/CMFPlone/controlpanel/tests/test_controlpanel_browser_redirection.py\n@@ -241,6 +241,9 @@ def test_redirection_controlpanel_filtering(self):\n # this should return one and not two (we need excludemax=True)\n redirects = RedirectionSet(query="/foo1/777")\n self.assertEqual(len(redirects), 1)\n+ # query without an initial slash matches any substring\n+ redirects = RedirectionSet(query="999")\n+ self.assertEqual(len(redirects), 2)\n \n request = self.layer["request"].clone()\n request.form["q"] = "/foo"\n@@ -336,7 +339,7 @@ def test_redirection_controlpanel_filter_date(self):\n \n redirects = RedirectionSet()\n self.assertEqual(len(redirects), 400)\n- # created can be anything that can be parsed by DateTime.\n+ # created can be anything that can be parsed by DateTime. (deprecated)\n # Otherwise it is ignored.\n self.assertEqual(len(RedirectionSet(created="2019-01-01")), 400)\n self.assertEqual(len(RedirectionSet(created="1999-01-01")), 0)\n@@ -346,38 +349,57 @@ def test_redirection_controlpanel_filter_date(self):\n self.assertEqual(len(RedirectionSet(created="2001-02-01 00:00:00")), 31)\n self.assertEqual(len(RedirectionSet(created="2001-02-01 00:00:01")), 32)\n self.assertEqual(len(RedirectionSet(created="badvalue")), 400)\n+ # start is inclusive and can be anything that can be parsed by DateTime.\n+ # Otherwise it is ignored.\n+ self.assertEqual(len(RedirectionSet(start="2019-01-01")), 0)\n+ self.assertEqual(len(RedirectionSet(start="2001-01-02")), 399)\n+ self.assertEqual(len(RedirectionSet(start="2001-02-01 00:00:00")), 369)\n+ self.assertEqual(len(RedirectionSet(start="2001-02-01 00:00:01")), 368)\n+ self.assertEqual(len(RedirectionSet(start="badvalue")), 400)\n+\n+ # End is exclisive and can be anything that can be parsed by DateTime.\n+ # Otherwise it is ignored.\n+ self.assertEqual(len(RedirectionSet(end="1999-01-01")), 0)\n+ self.assertEqual(len(RedirectionSet(end="2000-01-01")), 0)\n+ self.assertEqual(len(RedirectionSet(end="2001-02-01")), 31)\n+ self.assertEqual(len(RedirectionSet(end="2001-02-01 00:00:00")), 31)\n+ self.assertEqual(len(RedirectionSet(end="2001-02-01 00:00:01")), 32)\n+ self.assertEqual(len(RedirectionSet(end="badvalue")), 400)\n+\n+ self.assertEqual(len(RedirectionSet(start="2001-01-01", end="2001-01-01")), 0)\n+ self.assertEqual(len(RedirectionSet(start="2001-01-01", end="2001-01-02")), 1)\n \n # DateTime(\'2002-01-01\') results in a timezone GMT+0\n- self.assertEqual(len(RedirectionSet(created="2002-01-01")), 365)\n+ self.assertEqual(len(RedirectionSet(end="2002-01-01")), 365)\n # DateTime(\'2002/01/01\') results in a timezone GMT+1 for me,\n # or a different zone depending on where in the world you are.\n # So we need to be lenient in the tests.\n- self.assertGreaterEqual(len(RedirectionSet(created="2002/01/01")), 364)\n- self.assertLessEqual(len(RedirectionSet(created="2002/01/01")), 366)\n+ self.assertGreaterEqual(len(RedirectionSet(end="2002/01/01")), 364)\n+ self.assertLessEqual(len(RedirectionSet(end="2002/01/01")), 366)\n \n request = self.layer["request"].clone()\n- request.form["datetime"] = ""\n+ request.form["start"] = ""\n view = getMultiAdapter(\n (self.layer["portal"], request), name="redirection-controlpanel"\n )\n self.assertEqual(view.redirects().numpages, math.ceil(400 / 15.0))\n \n request = self.layer["request"].clone()\n- request.form["datetime"] = "2001-01-27"\n+ request.form["end"] = "2001-01-27"\n view = getMultiAdapter(\n (self.layer["portal"], request), name="redirection-controlpanel"\n )\n self.assertEqual(view.redirects().numpages, math.ceil(27 / 15.0))\n \n request = self.layer["request"].clone()\n- request.form["datetime"] = "2002-01-01"\n+ request.form["end"] = "2002-01-01"\n view = getMultiAdapter(\n (self.layer["portal"], request), name="redirection-controlpanel"\n )\n self.assertEqual(view.redirects().numpages, math.ceil(365 / 15.0))\n \n request = self.layer["request"].clone()\n- request.form["datetime"] = "2019-01-01"\n+ request.form["end"] = "2019-01-01"\n view = getMultiAdapter(\n (self.layer["portal"], request), name="redirection-controlpanel"\n )\ndiff --git a/news/4009.feature b/news/4009.feature\nnew file mode 100644\nindex 0000000000..1a58fdb77f\n--- /dev/null\n+++ b/news/4009.feature\n@@ -0,0 +1 @@\n+Redirection control panel: Added support for start and end filters. @Faakhir30\ndiff --git a/news/4031.feature b/news/4031.feature\nnew file mode 100644\nindex 0000000000..767054e50c\n--- /dev/null\n+++ b/news/4031.feature\n@@ -0,0 +1 @@\n+URL Management control panel: Find substring matches when querying aliases. @davisagli\n' +b'diff --git a/news/224.tests b/news/224.tests\nnew file mode 100644\nindex 00000000..fbab5550\n--- /dev/null\n+++ b/news/224.tests\n@@ -0,0 +1 @@\n+deactivate robot tests in this package and move the tests to Products.CMFPlone @1letter\n\\ No newline at end of file\ndiff --git a/plone/app/widgets/tests/robot/test_querystring_widget.robot b/plone/app/widgets/tests/robot/deactivate_test_querystring_widget.robot\nsimilarity index 100%\nrename from plone/app/widgets/tests/robot/test_querystring_widget.robot\nrename to plone/app/widgets/tests/robot/deactivate_test_querystring_widget.robot\ndiff --git a/plone/app/widgets/tests/robot/test_select_widget.robot b/plone/app/widgets/tests/robot/deactivate_test_select_widget.robot\nsimilarity index 100%\nrename from plone/app/widgets/tests/robot/test_select_widget.robot\nrename to plone/app/widgets/tests/robot/deactivate_test_select_widget.robot\n'