diff --git a/last_commit.txt b/last_commit.txt index 2a1160a798..29cf18aa5f 100644 --- a/last_commit.txt +++ b/last_commit.txt @@ -1,32 +1,40 @@ -Repository: Products.CMFPlone +Repository: plone.app.event Branch: refs/heads/master -Date: 2018-09-09T11:19:32+02:00 -Author: Sune Broendum Woeller (sunew) -Commit: https://github.com/plone/Products.CMFPlone/commit/2365c49679e44d79ad4e51ce40e8b2fb8c826569 +Date: 2018-09-14T11:02:25+02:00 +Author: Franco Pellegrini (frapell) +Commit: https://github.com/plone/plone.app.event/commit/28c562bf101ff31cebc1b03bfe6ffcee00ec10c6 -Fix changelog after 5.1.x items sneaked in, in commit 5384b810d, and even more in 7cefb8f +Make sure to include the 'Content-Length' header for ical exports Files changed: M CHANGES.rst +M plone/app/event/browser/event_listing.py +M plone/app/event/ical/exporter.py +M plone/app/event/tests/test_event_listing.py +M plone/app/event/tests/test_icalendar.py -b"diff --git a/CHANGES.rst b/CHANGES.rst\nindex eb506dc4a..fc95e8c52 100644\n--- a/CHANGES.rst\n+++ b/CHANGES.rst\n@@ -10,194 +10,9 @@ Changelog\n \n Breaking changes:\n \n-- Remove all dependencies on plone.app.controlpanel. \n+- Remove all dependencies on plone.app.controlpanel.\n Third party code need either to depend on plone.app.controlpanel 4.0,\n which is a backward compatibilit package only, or also update to not depend on it anymore.\n-- *add item here*\n-\n-New features:\n-\n-- Adapt code and tests to the new indexing operations queueing.\n- Part of PLIP 1343: https://github.com/plone/Products.CMFPlone/issues/1343\n- [gforcada]\n-\n-Bug fixes:\n-\n-- Show version of products in Add-ons control panel configlet.\n- This fixes https://github.com/plone/Products.CMFPlone/issues/1472.\n-- Remove last legacy Javascript ``highlight-searchterms.js``. \n- Removes also the skins folder ``plone_ecmascript``. \n- It was broken for almost all use cases (Google, other search engines, own live search);\n- JS worked only when coming from Plone detailed search page.\n- [jensens]\n-\n-- Get rid of obsolete ``X-UA-Compatible`` header.\n- [hvelarde]\n-\n-- Resource registry legacy bundle cooking: Exit early with a warning, if preconditions to build are not given (no compilation paths).\n- Allow cooking CSS, even if no JS is defined.\n- Log all important steps of the cooking process.\n- [thet]\n-\n-- Remove unused ``plone.css`` from static repository.\n- [thet]\n-\n-- Check for ``AccessInactivePortalContent`` for each path in a catalog query.\n- This solves a problem, where Editors couldn't see inactive content, even though they had the required permission on a subpath of the portal (e.g. a subsite).\n- [thet]\n-\n-- Remove last legacy Javascript ``highlight-searchterms.js``. \n- Removes also the skins folder ``plone_ecmascript``. \n- It was broken for all (Google, other search engines, own live search);\n- JS worked only when coming from Plone detailed search.\n- [jensens]\n-\n-\n-5.1b2 (2017-02-20)\n-------------------\n-\n-Bug fixes:\n-\n-- Fix packaging error.\n- [esteele]\n-\n-5.1b1 (2017-02-20)\n-------------------\n-\n-Breaking changes:\n-\n-- Add helper method to get all catalog entries from a given catalog: ``Products.CMFPlone.CatalogTool.catalog_get_all``.\n- In Products.ZCatalog before 4.0 a catalog call without a query returned all catalog brains.\n- This can be used as a replacement where it is needed, for exampe in tests.\n- [thet, gogobd]\n-\n-- Remove ``query_request`` from CatalogTool's search method, as it isn't supported in Products.ZCatalog 4 anymore.\n- [thet]\n-\n-- Removed our patch that added ``secureSend`` to the ``MailHost``.\n- This was originally scheduled for removal in Plone 5.0. See `issue\n- 965 `_.\n- [maurits]\n-\n-- The related items widget has changed a lot.\n- See the Mockup changelog for 2.4.0 here: https://github.com/plone/mockup/blob/master/CHANGES.rst\n-\n-- All css classes named ``enableUnloadProtection`` were changed to ``pat-formunloadalert`` to trigger that pattern.\n- Templates using ``enableUnloadProtection`` should change to ``pat-formunloadalert`` too.\n- This change shouldn't impact too much, because the form unload protection didn't work at all in Plone 5 until now.\n- [thet]\n-\n-- MimetypesRegistry icons are now a browser resource directory instead of skins folder.\n- [jensens]\n-\n-- Remove unused ``plone_scripts`` (not used nor tested anywhere in coredev) [jensens, davisagli]\n-\n- - ``add_ext_editor.py``\n- - ``author_find_content.py``\n- - ``canSelectDefaultPage.py`` with tests\n- - ``create_query_string.py``\n- - ``createMultiColumnList.py``\n- - ``displayContentsTab.py``\n- - ``formatColumns.py`` with tests\n- - ``getAllowedTypes.py``\n- - ``getGlobalPortalRoles.py``\n- - ``getNotAddableTypes.py``\n- - ``getPopupScript.py``\n- - ``getPortalTypeList.py`` and metadata\n- - ``getPortalTypes.py``\n- - ``getSelectableViews.py`` with tests\n- - ``hasIndexHtml.py`` with tests\n- - ``navigationParent.py`` with test\n- - ``plone_log.py``\n- - ``plone.css.py``\n- - ``returnNone.py`` with occurence refactored\n- - ``reverseList.py`` with test\n- - ``sort_modified_ascending.py``\n-\n-- Move scripts ``datecomponents.py`` and ``show_id.py`` to Archetypes\n- [jensens, davisagli]\n-\n-- Remove methods of the ``@@plone`` view that were marked for deprecation:\n- - ``showEditableBorder`` (use ``@@plone/showToolbar``)\n- - ``mark_view`` (use ``@@plone_layout/mark_view``)\n- - ``hide_columns`` (use ``@@plone_layout/hide_columns``)\n- - ``icons_visible`` (use ``@@plone_layout/icons_visible``)\n- - ``getIcon`` (use ``@@plone_layout/getIcon``)\n- - ``have_portlets`` (use ``@@plone_layout/have_portlets``)\n- - ``bodyClass`` (use ``@@plone_layout/bodyClass``)\n- [davisagli]\n-\n-- Move plone_content skin templates into Products.ATContentTypes as browser views.\n- [gforcada]\n-\n-New features:\n-\n-- Added ``ok`` view. This is useful for automated checks, for example\n- httpok, to see if the site is still available. It returns the text\n- ``OK`` and sets headers to avoid caching.\n- [maurits]\n-\n-- Make contact form extensible. This fixes https://github.com/plone/Products.CMFPlone/issues/1879.\n- [timo]\n-\n-- Don't minify CSS or JavaScript resources if they end with ``.min.css`` resp. ``.min.js``.\n- [thet]\n-\n-- Add ``safe_encode`` utility function to ``utils`` to safely encode unicode to a specified encoding.\n- The encoding defaults to ``utf-8``.\n- [thet]\n-\n-- The password reset templates were changed to make use of ``content-core`` macros.\n- [thet]\n-\n-- Add utility method to retrieve the top most parent request from a sub request.\n- [thet]\n-\n-- Add ``mockup-patterns-relateditems-upload`` resource, which can be used in custom bundles to add the upload feature in the related items widget.\n- [thet]\n-\n-- Move ``get_top_site_from_url`` from plone.app.content to ``utils.py`` and make it robust against unicode paths.\n- This function allows in virtual hosting environments to acquire the top most visible portal object to operate on.\n- It is used for example to calculate the correct virtual root objects for Mockup's related items and structure pattern.\n- [thet]\n-\n-- Add sort_on field to search controlpanel.\n- [rodfersou]\n-\n-- PLIP 1340: Deprecate portal_quickinstaller.\n- You should no longer use CMFQuickInstallerTool methods, but GenericSetup profiles.\n- See https://github.com/plone/Products.CMFPlone/issues/1340\n- [maurits]\n-\n-- Include mockup 2.4.0.\n- [thet]\n-\n-- PasswordResetTool moved from its own package to here (includes cleanup and removal of ``getStats``).\n- [tomgross]\n-\n-- Prevent workflow menu overflowing in toolbar [MatthewWilkes]\n-\n-- Add default icon for top-level contentview and contentmenu toolbar entries [alecm]\n-\n-- Toolbar: Make menu hover background fit whole menu width. [thet]\n-\n-- Toolbar: Don't force scoll buttons to be left, when toolbar is right. [thet]\n-\n-- Toolbar: Make first level list items exand the whole toolbar width - also when scroll buttons are shown. [thet]\n-\n-- Toolbar: Make scroll buttons exand whole toolbar width. [thet]\n-\n-- Toolbar: Let the toolbar submenus be as wide as they need to be and do not break entries into multiple lines. [thet]\n-\n-- Resource Registry:\n- In ``debug-mode`` (zope.conf, buildout) do not load cache the production bundle.\n- [jensens]\n-\n-- Resource Registry:\n- In ``debug-mode`` (zope.conf, buildout) do not ignore development mode for anonymous users.\n- [jensens]\n-\n-- Resource Registry: If file system version is newer than ``last_compilation`` date of a bundle, use this as ``last_compilation`` date.\n [jensens]\n \n - New browser view based login code - merged from plone.login (credits to esteele, pbauer, agitator, jensens, et al).\n@@ -216,38 +31,6 @@ New features:\n - Some tools from CMFCore are now utilities\n [pbauer]\n \n-Bug fixes:\n-\n-- Fix an undefined variable in a test helper function\n- [ale-rt]\n-\n-- Let the ``combine-bundles`` import step also work when the ``IBundleRegistry`` keyword is not in ``registry.xml``, but in a ``registry`` directory.\n- `Issue 2520 `_.\n- [maurits]\n-\n-- Get rid of obsolete ``X-UA-Compatible`` header.\n- [hvelarde]\n-\n-- Fix registration of ``robots.txt`` browser view to avoid ``AttributeError`` on Zope's root (fixes `#2052 `_).\n- [hvelarde]\n-\n-- Get rid of obsolete ``X-UA-Compatible`` header.\n- [hvelarde]\n-\n-- Add test for issue #2469.\n- [jensens]\n-\n-- Fixed tests when IRichText behavior is used.\n- IRichText -> IRichTextBehavior\n- This is a follow up to `issue 476 `_.\n- [iham]\n-\n-\n-5.1.3 (2018-06-22)\n-------------------\n-\n-Breaking changes:\n-\n - Remove five.pt for Zope 4\n [jensens]\n \n@@ -300,6 +83,36 @@ New Features:\n \n Bug Fixes:\n \n+- Remove last legacy Javascript ``highlight-searchterms.js``.\n+ Removes also the skins folder ``plone_ecmascript``.\n+ It was broken for all (Google, other search engines, own live search);\n+ JS worked only when coming from Plone detailed search.\n+ [jensens]\n+\n+- Fix an undefined variable in a test helper function\n+ [ale-rt]\n+\n+- Let the ``combine-bundles`` import step also work when the ``IBundleRegistry`` keyword is not in ``registry.xml``, but in a ``registry`` directory.\n+ `Issue 2520 `_.\n+ [maurits]\n+\n+- Get rid of obsolete ``X-UA-Compatible`` header.\n+ [hvelarde]\n+\n+- Fix registration of ``robots.txt`` browser view to avoid ``AttributeError`` on Zope's root (fixes `#2052 `_).\n+ [hvelarde]\n+\n+- Get rid of obsolete ``X-UA-Compatible`` header.\n+ [hvelarde]\n+\n+- Add test for issue #2469.\n+ [jensens]\n+\n+- Fixed tests when IRichText behavior is used.\n+ IRichText -> IRichTextBehavior\n+ This is a follow up to `issue 476 `_.\n+ [iham]\n+\n - Hide ``plone.app.querystring`` from add-ons control panel.\n Fixes `issue 2426 `_.\n [maurits]\n" +b'diff --git a/CHANGES.rst b/CHANGES.rst\nindex 919f1c7a..8d8b2de2 100644\n--- a/CHANGES.rst\n+++ b/CHANGES.rst\n@@ -14,6 +14,9 @@ New features:\n \n Bug fixes:\n \n+- Make sure to include the \'Content-Length\' header for ical exports\n+ [frapell]\n+\n - Update plone.app.event resources. Requires plonetheme.barceloneta >= 1.9.\n [agitator]\n \ndiff --git a/plone/app/event/browser/event_listing.py b/plone/app/event/browser/event_listing.py\nindex 09058dbc..3c49bf03 100644\n--- a/plone/app/event/browser/event_listing.py\n+++ b/plone/app/event/browser/event_listing.py\n@@ -188,12 +188,14 @@ def ical(self):\n batch=False)\n cal = construct_icalendar(self.context, events)\n name = \'%s.ics\' % self.context.getId()\n+ contents = cal.to_ical()\n self.request.response.setHeader(\'Content-Type\', \'text/calendar\')\n self.request.response.setHeader(\n \'Content-Disposition\',\n \'attachment; filename="%s"\' % name\n )\n- self.request.response.write(cal.to_ical())\n+ self.request.response.setHeader(\'Content-Length\', len(contents))\n+ self.request.response.write(contents)\n \n @property\n def ical_url(self):\ndiff --git a/plone/app/event/ical/exporter.py b/plone/app/event/ical/exporter.py\nindex 70e5d43e..defdfa8e 100644\n--- a/plone/app/event/ical/exporter.py\n+++ b/plone/app/event/ical/exporter.py\n@@ -423,6 +423,6 @@ def __call__(self):\n \'Content-Disposition\',\n \'attachment; filename="{0}"\'.format(name)\n )\n- self.request.response.setHeader(\'Content-Length\', len(ical))\n self.request.response.setHeader(\'Pragma\', \'no-cache\')\n+ self.request.response.setHeader(\'Content-Length\', len(ical))\n self.request.response.write(ical)\ndiff --git a/plone/app/event/tests/test_event_listing.py b/plone/app/event/tests/test_event_listing.py\nindex 5f3c6b05..147bf397 100644\n--- a/plone/app/event/tests/test_event_listing.py\n+++ b/plone/app/event/tests/test_event_listing.py\n@@ -49,8 +49,9 @@ def test_events_listing_ical(self):\n headers, output, request = make_fake_response(self.request)\n view = self._listing_view(name=\'@@event_listing_ical\')\n view()\n- self.assertEqual(len(headers), 2)\n+ self.assertEqual(len(headers), 3)\n self.assertEqual(headers[\'Content-Type\'], \'text/calendar\')\n+ self.assertTrue(\'Content-Length\' in headers)\n icalstr = \'\'.join(output)\n self.assertTrue(\'Long Event\' in icalstr)\n \ndiff --git a/plone/app/event/tests/test_icalendar.py b/plone/app/event/tests/test_icalendar.py\nindex da7f122b..e24b3ae4 100644\n--- a/plone/app/event/tests/test_icalendar.py\n+++ b/plone/app/event/tests/test_icalendar.py\n@@ -44,6 +44,7 @@ def test_event_ical(self):\n view()\n self.assertEqual(len(headers), 4)\n self.assertEqual(headers[\'Content-Type\'], \'text/calendar\')\n+ self.assertTrue(\'Content-Length\' in headers)\n icalstr = \'\'.join(output)\n \n self.checkOrder(\n@@ -94,6 +95,7 @@ def test_event_occurrence_ical(self):\n view()\n self.assertEqual(len(headers), 4)\n self.assertEqual(headers[\'Content-Type\'], \'text/calendar\')\n+ self.assertTrue(\'Content-Length\' in headers)\n icalstr = \'\'.join(output)\n self.assertTrue(\'Now Event\' in icalstr)\n self.assertTrue(\'RRULE\' not in icalstr)\n@@ -104,6 +106,7 @@ def test_portal_ical(self):\n view()\n self.assertEqual(len(headers), 4)\n self.assertEqual(headers[\'Content-Type\'], \'text/calendar\')\n+ self.assertTrue(\'Content-Length\' in headers)\n icalstr = \'\'.join(output)\n \n # No occurrences in export. Otherwise count would be 8.\n@@ -195,8 +198,9 @@ def test_event_listing_ical_portal(self):\n )\n view.mode = \'all\'\n view()\n- self.assertEqual(len(headers), 2)\n+ self.assertEqual(len(headers), 3)\n self.assertEqual(headers[\'Content-Type\'], \'text/calendar\')\n+ self.assertTrue(\'Content-Length\' in headers)\n icalstr = \'\'.join(output)\n # No occurrences in export. Otherwise count would be 8.\n self.assertEqual(icalstr.count(\'BEGIN:VEVENT\'), 4)\n@@ -213,8 +217,9 @@ def test_event_listing_ical_portal__specific_date(self):\n view.mode = \'day\'\n view._date = \'2013-04-27\'\n view()\n- self.assertEqual(len(headers), 2)\n+ self.assertEqual(len(headers), 3)\n self.assertEqual(headers[\'Content-Type\'], \'text/calendar\')\n+ self.assertTrue(\'Content-Length\' in headers)\n icalstr = \'\'.join(output)\n self.assertEqual(icalstr.count(\'BEGIN:VEVENT\'), 2)\n self.assertTrue(\'Past Event\' in icalstr)\n@@ -231,6 +236,7 @@ def test_collection_ical(self):\n view()\n self.assertEqual(len(headers), 4)\n self.assertEqual(headers[\'Content-Type\'], \'text/calendar\')\n+ self.assertTrue(\'Content-Length\' in headers)\n icalstr = \'\'.join(output)\n self.assertEqual(icalstr.count(\'BEGIN:VEVENT\'), 4)\n \n@@ -252,6 +258,7 @@ def test_collection_all_ical(self):\n view()\n self.assertEqual(len(headers), 4)\n self.assertEqual(headers[\'Content-Type\'], \'text/calendar\')\n+ self.assertTrue(\'Content-Length\' in headers)\n icalstr = \'\'.join(output)\n self.assertEqual(icalstr.count(\'BEGIN:VEVENT\'), 4)\n \n' -Repository: Products.CMFPlone +Repository: plone.app.event Branch: refs/heads/master -Date: 2018-09-14T10:24:33+02:00 -Author: Sune Broendum Woeller (sunew) -Commit: https://github.com/plone/Products.CMFPlone/commit/d07d596bb78df07271ddfdb18636a8181afbef88 +Date: 2018-09-14T11:09:40+02:00 +Author: Johannes Raggam (thet) +Commit: https://github.com/plone/plone.app.event/commit/4d3eda8c06e035f6c6cf9220ee4b7e435d3c5011 -Merge pull request #2511 from plone/fix-changelog-09092018 +Merge pull request #286 from plone/frapell-ical -Fix changelog after 5.1.x items sneaked in, in commit 5384b810d, and … +Make sure to include the 'Content-Length' header for ical exports Files changed: M CHANGES.rst +M plone/app/event/browser/event_listing.py +M plone/app/event/ical/exporter.py +M plone/app/event/tests/test_event_listing.py +M plone/app/event/tests/test_icalendar.py -b"diff --git a/CHANGES.rst b/CHANGES.rst\nindex eb506dc4a..fc95e8c52 100644\n--- a/CHANGES.rst\n+++ b/CHANGES.rst\n@@ -10,194 +10,9 @@ Changelog\n \n Breaking changes:\n \n-- Remove all dependencies on plone.app.controlpanel. \n+- Remove all dependencies on plone.app.controlpanel.\n Third party code need either to depend on plone.app.controlpanel 4.0,\n which is a backward compatibilit package only, or also update to not depend on it anymore.\n-- *add item here*\n-\n-New features:\n-\n-- Adapt code and tests to the new indexing operations queueing.\n- Part of PLIP 1343: https://github.com/plone/Products.CMFPlone/issues/1343\n- [gforcada]\n-\n-Bug fixes:\n-\n-- Show version of products in Add-ons control panel configlet.\n- This fixes https://github.com/plone/Products.CMFPlone/issues/1472.\n-- Remove last legacy Javascript ``highlight-searchterms.js``. \n- Removes also the skins folder ``plone_ecmascript``. \n- It was broken for almost all use cases (Google, other search engines, own live search);\n- JS worked only when coming from Plone detailed search page.\n- [jensens]\n-\n-- Get rid of obsolete ``X-UA-Compatible`` header.\n- [hvelarde]\n-\n-- Resource registry legacy bundle cooking: Exit early with a warning, if preconditions to build are not given (no compilation paths).\n- Allow cooking CSS, even if no JS is defined.\n- Log all important steps of the cooking process.\n- [thet]\n-\n-- Remove unused ``plone.css`` from static repository.\n- [thet]\n-\n-- Check for ``AccessInactivePortalContent`` for each path in a catalog query.\n- This solves a problem, where Editors couldn't see inactive content, even though they had the required permission on a subpath of the portal (e.g. a subsite).\n- [thet]\n-\n-- Remove last legacy Javascript ``highlight-searchterms.js``. \n- Removes also the skins folder ``plone_ecmascript``. \n- It was broken for all (Google, other search engines, own live search);\n- JS worked only when coming from Plone detailed search.\n- [jensens]\n-\n-\n-5.1b2 (2017-02-20)\n-------------------\n-\n-Bug fixes:\n-\n-- Fix packaging error.\n- [esteele]\n-\n-5.1b1 (2017-02-20)\n-------------------\n-\n-Breaking changes:\n-\n-- Add helper method to get all catalog entries from a given catalog: ``Products.CMFPlone.CatalogTool.catalog_get_all``.\n- In Products.ZCatalog before 4.0 a catalog call without a query returned all catalog brains.\n- This can be used as a replacement where it is needed, for exampe in tests.\n- [thet, gogobd]\n-\n-- Remove ``query_request`` from CatalogTool's search method, as it isn't supported in Products.ZCatalog 4 anymore.\n- [thet]\n-\n-- Removed our patch that added ``secureSend`` to the ``MailHost``.\n- This was originally scheduled for removal in Plone 5.0. See `issue\n- 965 `_.\n- [maurits]\n-\n-- The related items widget has changed a lot.\n- See the Mockup changelog for 2.4.0 here: https://github.com/plone/mockup/blob/master/CHANGES.rst\n-\n-- All css classes named ``enableUnloadProtection`` were changed to ``pat-formunloadalert`` to trigger that pattern.\n- Templates using ``enableUnloadProtection`` should change to ``pat-formunloadalert`` too.\n- This change shouldn't impact too much, because the form unload protection didn't work at all in Plone 5 until now.\n- [thet]\n-\n-- MimetypesRegistry icons are now a browser resource directory instead of skins folder.\n- [jensens]\n-\n-- Remove unused ``plone_scripts`` (not used nor tested anywhere in coredev) [jensens, davisagli]\n-\n- - ``add_ext_editor.py``\n- - ``author_find_content.py``\n- - ``canSelectDefaultPage.py`` with tests\n- - ``create_query_string.py``\n- - ``createMultiColumnList.py``\n- - ``displayContentsTab.py``\n- - ``formatColumns.py`` with tests\n- - ``getAllowedTypes.py``\n- - ``getGlobalPortalRoles.py``\n- - ``getNotAddableTypes.py``\n- - ``getPopupScript.py``\n- - ``getPortalTypeList.py`` and metadata\n- - ``getPortalTypes.py``\n- - ``getSelectableViews.py`` with tests\n- - ``hasIndexHtml.py`` with tests\n- - ``navigationParent.py`` with test\n- - ``plone_log.py``\n- - ``plone.css.py``\n- - ``returnNone.py`` with occurence refactored\n- - ``reverseList.py`` with test\n- - ``sort_modified_ascending.py``\n-\n-- Move scripts ``datecomponents.py`` and ``show_id.py`` to Archetypes\n- [jensens, davisagli]\n-\n-- Remove methods of the ``@@plone`` view that were marked for deprecation:\n- - ``showEditableBorder`` (use ``@@plone/showToolbar``)\n- - ``mark_view`` (use ``@@plone_layout/mark_view``)\n- - ``hide_columns`` (use ``@@plone_layout/hide_columns``)\n- - ``icons_visible`` (use ``@@plone_layout/icons_visible``)\n- - ``getIcon`` (use ``@@plone_layout/getIcon``)\n- - ``have_portlets`` (use ``@@plone_layout/have_portlets``)\n- - ``bodyClass`` (use ``@@plone_layout/bodyClass``)\n- [davisagli]\n-\n-- Move plone_content skin templates into Products.ATContentTypes as browser views.\n- [gforcada]\n-\n-New features:\n-\n-- Added ``ok`` view. This is useful for automated checks, for example\n- httpok, to see if the site is still available. It returns the text\n- ``OK`` and sets headers to avoid caching.\n- [maurits]\n-\n-- Make contact form extensible. This fixes https://github.com/plone/Products.CMFPlone/issues/1879.\n- [timo]\n-\n-- Don't minify CSS or JavaScript resources if they end with ``.min.css`` resp. ``.min.js``.\n- [thet]\n-\n-- Add ``safe_encode`` utility function to ``utils`` to safely encode unicode to a specified encoding.\n- The encoding defaults to ``utf-8``.\n- [thet]\n-\n-- The password reset templates were changed to make use of ``content-core`` macros.\n- [thet]\n-\n-- Add utility method to retrieve the top most parent request from a sub request.\n- [thet]\n-\n-- Add ``mockup-patterns-relateditems-upload`` resource, which can be used in custom bundles to add the upload feature in the related items widget.\n- [thet]\n-\n-- Move ``get_top_site_from_url`` from plone.app.content to ``utils.py`` and make it robust against unicode paths.\n- This function allows in virtual hosting environments to acquire the top most visible portal object to operate on.\n- It is used for example to calculate the correct virtual root objects for Mockup's related items and structure pattern.\n- [thet]\n-\n-- Add sort_on field to search controlpanel.\n- [rodfersou]\n-\n-- PLIP 1340: Deprecate portal_quickinstaller.\n- You should no longer use CMFQuickInstallerTool methods, but GenericSetup profiles.\n- See https://github.com/plone/Products.CMFPlone/issues/1340\n- [maurits]\n-\n-- Include mockup 2.4.0.\n- [thet]\n-\n-- PasswordResetTool moved from its own package to here (includes cleanup and removal of ``getStats``).\n- [tomgross]\n-\n-- Prevent workflow menu overflowing in toolbar [MatthewWilkes]\n-\n-- Add default icon for top-level contentview and contentmenu toolbar entries [alecm]\n-\n-- Toolbar: Make menu hover background fit whole menu width. [thet]\n-\n-- Toolbar: Don't force scoll buttons to be left, when toolbar is right. [thet]\n-\n-- Toolbar: Make first level list items exand the whole toolbar width - also when scroll buttons are shown. [thet]\n-\n-- Toolbar: Make scroll buttons exand whole toolbar width. [thet]\n-\n-- Toolbar: Let the toolbar submenus be as wide as they need to be and do not break entries into multiple lines. [thet]\n-\n-- Resource Registry:\n- In ``debug-mode`` (zope.conf, buildout) do not load cache the production bundle.\n- [jensens]\n-\n-- Resource Registry:\n- In ``debug-mode`` (zope.conf, buildout) do not ignore development mode for anonymous users.\n- [jensens]\n-\n-- Resource Registry: If file system version is newer than ``last_compilation`` date of a bundle, use this as ``last_compilation`` date.\n [jensens]\n \n - New browser view based login code - merged from plone.login (credits to esteele, pbauer, agitator, jensens, et al).\n@@ -216,38 +31,6 @@ New features:\n - Some tools from CMFCore are now utilities\n [pbauer]\n \n-Bug fixes:\n-\n-- Fix an undefined variable in a test helper function\n- [ale-rt]\n-\n-- Let the ``combine-bundles`` import step also work when the ``IBundleRegistry`` keyword is not in ``registry.xml``, but in a ``registry`` directory.\n- `Issue 2520 `_.\n- [maurits]\n-\n-- Get rid of obsolete ``X-UA-Compatible`` header.\n- [hvelarde]\n-\n-- Fix registration of ``robots.txt`` browser view to avoid ``AttributeError`` on Zope's root (fixes `#2052 `_).\n- [hvelarde]\n-\n-- Get rid of obsolete ``X-UA-Compatible`` header.\n- [hvelarde]\n-\n-- Add test for issue #2469.\n- [jensens]\n-\n-- Fixed tests when IRichText behavior is used.\n- IRichText -> IRichTextBehavior\n- This is a follow up to `issue 476 `_.\n- [iham]\n-\n-\n-5.1.3 (2018-06-22)\n-------------------\n-\n-Breaking changes:\n-\n - Remove five.pt for Zope 4\n [jensens]\n \n@@ -300,6 +83,36 @@ New Features:\n \n Bug Fixes:\n \n+- Remove last legacy Javascript ``highlight-searchterms.js``.\n+ Removes also the skins folder ``plone_ecmascript``.\n+ It was broken for all (Google, other search engines, own live search);\n+ JS worked only when coming from Plone detailed search.\n+ [jensens]\n+\n+- Fix an undefined variable in a test helper function\n+ [ale-rt]\n+\n+- Let the ``combine-bundles`` import step also work when the ``IBundleRegistry`` keyword is not in ``registry.xml``, but in a ``registry`` directory.\n+ `Issue 2520 `_.\n+ [maurits]\n+\n+- Get rid of obsolete ``X-UA-Compatible`` header.\n+ [hvelarde]\n+\n+- Fix registration of ``robots.txt`` browser view to avoid ``AttributeError`` on Zope's root (fixes `#2052 `_).\n+ [hvelarde]\n+\n+- Get rid of obsolete ``X-UA-Compatible`` header.\n+ [hvelarde]\n+\n+- Add test for issue #2469.\n+ [jensens]\n+\n+- Fixed tests when IRichText behavior is used.\n+ IRichText -> IRichTextBehavior\n+ This is a follow up to `issue 476 `_.\n+ [iham]\n+\n - Hide ``plone.app.querystring`` from add-ons control panel.\n Fixes `issue 2426 `_.\n [maurits]\n" +b'diff --git a/CHANGES.rst b/CHANGES.rst\nindex 919f1c7a..8d8b2de2 100644\n--- a/CHANGES.rst\n+++ b/CHANGES.rst\n@@ -14,6 +14,9 @@ New features:\n \n Bug fixes:\n \n+- Make sure to include the \'Content-Length\' header for ical exports\n+ [frapell]\n+\n - Update plone.app.event resources. Requires plonetheme.barceloneta >= 1.9.\n [agitator]\n \ndiff --git a/plone/app/event/browser/event_listing.py b/plone/app/event/browser/event_listing.py\nindex 09058dbc..3c49bf03 100644\n--- a/plone/app/event/browser/event_listing.py\n+++ b/plone/app/event/browser/event_listing.py\n@@ -188,12 +188,14 @@ def ical(self):\n batch=False)\n cal = construct_icalendar(self.context, events)\n name = \'%s.ics\' % self.context.getId()\n+ contents = cal.to_ical()\n self.request.response.setHeader(\'Content-Type\', \'text/calendar\')\n self.request.response.setHeader(\n \'Content-Disposition\',\n \'attachment; filename="%s"\' % name\n )\n- self.request.response.write(cal.to_ical())\n+ self.request.response.setHeader(\'Content-Length\', len(contents))\n+ self.request.response.write(contents)\n \n @property\n def ical_url(self):\ndiff --git a/plone/app/event/ical/exporter.py b/plone/app/event/ical/exporter.py\nindex 70e5d43e..defdfa8e 100644\n--- a/plone/app/event/ical/exporter.py\n+++ b/plone/app/event/ical/exporter.py\n@@ -423,6 +423,6 @@ def __call__(self):\n \'Content-Disposition\',\n \'attachment; filename="{0}"\'.format(name)\n )\n- self.request.response.setHeader(\'Content-Length\', len(ical))\n self.request.response.setHeader(\'Pragma\', \'no-cache\')\n+ self.request.response.setHeader(\'Content-Length\', len(ical))\n self.request.response.write(ical)\ndiff --git a/plone/app/event/tests/test_event_listing.py b/plone/app/event/tests/test_event_listing.py\nindex 5f3c6b05..147bf397 100644\n--- a/plone/app/event/tests/test_event_listing.py\n+++ b/plone/app/event/tests/test_event_listing.py\n@@ -49,8 +49,9 @@ def test_events_listing_ical(self):\n headers, output, request = make_fake_response(self.request)\n view = self._listing_view(name=\'@@event_listing_ical\')\n view()\n- self.assertEqual(len(headers), 2)\n+ self.assertEqual(len(headers), 3)\n self.assertEqual(headers[\'Content-Type\'], \'text/calendar\')\n+ self.assertTrue(\'Content-Length\' in headers)\n icalstr = \'\'.join(output)\n self.assertTrue(\'Long Event\' in icalstr)\n \ndiff --git a/plone/app/event/tests/test_icalendar.py b/plone/app/event/tests/test_icalendar.py\nindex da7f122b..e24b3ae4 100644\n--- a/plone/app/event/tests/test_icalendar.py\n+++ b/plone/app/event/tests/test_icalendar.py\n@@ -44,6 +44,7 @@ def test_event_ical(self):\n view()\n self.assertEqual(len(headers), 4)\n self.assertEqual(headers[\'Content-Type\'], \'text/calendar\')\n+ self.assertTrue(\'Content-Length\' in headers)\n icalstr = \'\'.join(output)\n \n self.checkOrder(\n@@ -94,6 +95,7 @@ def test_event_occurrence_ical(self):\n view()\n self.assertEqual(len(headers), 4)\n self.assertEqual(headers[\'Content-Type\'], \'text/calendar\')\n+ self.assertTrue(\'Content-Length\' in headers)\n icalstr = \'\'.join(output)\n self.assertTrue(\'Now Event\' in icalstr)\n self.assertTrue(\'RRULE\' not in icalstr)\n@@ -104,6 +106,7 @@ def test_portal_ical(self):\n view()\n self.assertEqual(len(headers), 4)\n self.assertEqual(headers[\'Content-Type\'], \'text/calendar\')\n+ self.assertTrue(\'Content-Length\' in headers)\n icalstr = \'\'.join(output)\n \n # No occurrences in export. Otherwise count would be 8.\n@@ -195,8 +198,9 @@ def test_event_listing_ical_portal(self):\n )\n view.mode = \'all\'\n view()\n- self.assertEqual(len(headers), 2)\n+ self.assertEqual(len(headers), 3)\n self.assertEqual(headers[\'Content-Type\'], \'text/calendar\')\n+ self.assertTrue(\'Content-Length\' in headers)\n icalstr = \'\'.join(output)\n # No occurrences in export. Otherwise count would be 8.\n self.assertEqual(icalstr.count(\'BEGIN:VEVENT\'), 4)\n@@ -213,8 +217,9 @@ def test_event_listing_ical_portal__specific_date(self):\n view.mode = \'day\'\n view._date = \'2013-04-27\'\n view()\n- self.assertEqual(len(headers), 2)\n+ self.assertEqual(len(headers), 3)\n self.assertEqual(headers[\'Content-Type\'], \'text/calendar\')\n+ self.assertTrue(\'Content-Length\' in headers)\n icalstr = \'\'.join(output)\n self.assertEqual(icalstr.count(\'BEGIN:VEVENT\'), 2)\n self.assertTrue(\'Past Event\' in icalstr)\n@@ -231,6 +236,7 @@ def test_collection_ical(self):\n view()\n self.assertEqual(len(headers), 4)\n self.assertEqual(headers[\'Content-Type\'], \'text/calendar\')\n+ self.assertTrue(\'Content-Length\' in headers)\n icalstr = \'\'.join(output)\n self.assertEqual(icalstr.count(\'BEGIN:VEVENT\'), 4)\n \n@@ -252,6 +258,7 @@ def test_collection_all_ical(self):\n view()\n self.assertEqual(len(headers), 4)\n self.assertEqual(headers[\'Content-Type\'], \'text/calendar\')\n+ self.assertTrue(\'Content-Length\' in headers)\n icalstr = \'\'.join(output)\n self.assertEqual(icalstr.count(\'BEGIN:VEVENT\'), 4)\n \n'