-
-
Notifications
You must be signed in to change notification settings - Fork 75
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Branch: refs/heads/master Date: 2021-09-09T16:52:44+02:00 Author: Peter Mathis (petschki) <peter.mathis@kombinat.at> Commit: plone/plone.app.theming@4f1fb0d Fix unclosed file fixes #199 Files changed: A news/199.bugfix M src/plone/app/theming/utils.py Repository: plone.app.theming Branch: refs/heads/master Date: 2021-09-09T18:04:36+02:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/plone.app.theming@28d4365 Merge pull request #200 from plone/issue-199 Fix unclosed file Files changed: A news/199.bugfix M src/plone/app/theming/utils.py
- Loading branch information
Showing
1 changed file
with
17 additions
and
38 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,57 +1,36 @@ | ||
Repository: plone.formwidget.namedfile | ||
Repository: plone.app.theming | ||
|
||
|
||
Branch: refs/heads/master | ||
Date: 2021-08-23T17:03:40+02:00 | ||
Author: Harald Friessnegger (frisi) <friessnegger@lovelysystems.com> | ||
Commit: https://github.com/plone/plone.formwidget.namedfile/commit/72db277e2ac5c54dcf82a04a034b1ea9560a6463 | ||
Date: 2021-09-09T16:52:44+02:00 | ||
Author: Peter Mathis (petschki) <peter.mathis@kombinat.at> | ||
Commit: https://github.com/plone/plone.app.theming/commit/4f1fb0d44eb36a9a89d90c002d8b53df36be54fb | ||
|
||
fix storage.cleanup() | ||
Fix unclosed file | ||
|
||
by not removing items while iterating over the dictionary | ||
fixes #199 | ||
|
||
Files changed: | ||
A news/52.bugfix | ||
M plone/formwidget/namedfile/utils.py | ||
A news/199.bugfix | ||
M src/plone/app/theming/utils.py | ||
|
||
b'diff --git a/news/52.bugfix b/news/52.bugfix\nnew file mode 100644\nindex 0000000..e8e7658\n--- /dev/null\n+++ b/news/52.bugfix\n@@ -0,0 +1 @@\n+Fix issue where expired temporary uploads have not been removed when calling FileUploadTemporaryStorage.cleanup() (https://github.com/plone/plone.formwidget.namedfile/issues/52) [fRiSi]\n\\ No newline at end of file\ndiff --git a/plone/formwidget/namedfile/utils.py b/plone/formwidget/namedfile/utils.py\nindex 1210ce1..de423e9 100644\n--- a/plone/formwidget/namedfile/utils.py\n+++ b/plone/formwidget/namedfile/utils.py\n@@ -43,12 +43,10 @@ def upload_map(self):\n def cleanup(self):\n """Remove obsolete temporary uploads."""\n upload_map = self.upload_map\n- for key, val in upload_map.items():\n- if (\n- val.get("dt", FALLBACK_DATE)\n- < (datetime.now() - timedelta(seconds=FILE_UPLOAD_EXPIRATION_TIME))\n- and randint(0, 5) == 0\n- ): # Avoid conflict errors by deleting only every fifth time # noqa\n+ expiration_limit = datetime.now() - timedelta(seconds=FILE_UPLOAD_EXPIRATION_TIME)\n+ for key in list(upload_map.keys()):\n+ dt = upload_map[key].get(\'dt\', FALLBACK_DATE)\n+ if dt < expiration_limit and randint(0, 5) == 0: # Avoid conflict errors by deleting only every fifth time # noqa\n # Delete expired files or files without timestamp\n del upload_map[key]\n \n' | ||
b'diff --git a/news/199.bugfix b/news/199.bugfix\nnew file mode 100644\nindex 0000000..052c088\n--- /dev/null\n+++ b/news/199.bugfix\n@@ -0,0 +1,2 @@\n+Fix unclosed file when reading manifest.cfg\n+[petschki]\ndiff --git a/src/plone/app/theming/utils.py b/src/plone/app/theming/utils.py\nindex f3ca223..e494e24 100644\n--- a/src/plone/app/theming/utils.py\n+++ b/src/plone/app/theming/utils.py\n@@ -471,9 +471,8 @@ def getThemeFromResourceDirectory(resourceDirectory):\n """\n name = resourceDirectory.__name__\n if resourceDirectory.isFile(MANIFEST_FILENAME):\n- manifest = getManifest(\n- resourceDirectory.openFile(MANIFEST_FILENAME), MANIFEST_FORMAT\n- )\n+ with resourceDirectory.openFile(MANIFEST_FILENAME) as manifest_fp:\n+ manifest = getManifest(manifest_fp, MANIFEST_FORMAT)\n else:\n manifest = {}\n \n' | ||
|
||
Repository: plone.formwidget.namedfile | ||
Repository: plone.app.theming | ||
|
||
|
||
Branch: refs/heads/master | ||
Date: 2021-08-23T17:05:54+02:00 | ||
Author: Harald Friessnegger (frisi) <friessnegger@lovelysystems.com> | ||
Commit: https://github.com/plone/plone.formwidget.namedfile/commit/c55667f3f025d2ba65f831d2e93f4fc7f1a477ba | ||
|
||
make cleanup interval patchable | ||
|
||
reduce risk of conflict errors and allow to force cleanup | ||
|
||
fixes #54 | ||
|
||
Files changed: | ||
A news/54.bugfix | ||
M plone/formwidget/namedfile/utils.py | ||
|
||
b'diff --git a/news/54.bugfix b/news/54.bugfix\nnew file mode 100644\nindex 0000000..bb9d919\n--- /dev/null\n+++ b/news/54.bugfix\n@@ -0,0 +1 @@\n+Make CLEANUP_INTERVAL patchable and fix condition (https://github.com/plone/plone.formwidget.namedfile/issues/54)\n\\ No newline at end of file\ndiff --git a/plone/formwidget/namedfile/utils.py b/plone/formwidget/namedfile/utils.py\nindex de423e9..f3a3643 100644\n--- a/plone/formwidget/namedfile/utils.py\n+++ b/plone/formwidget/namedfile/utils.py\n@@ -17,7 +17,7 @@\n FILE_UPLOAD_MAP_KEY = "file_upload_map"\n FILE_UPLOAD_EXPIRATION_TIME = 30 * 60 # seconds\n FALLBACK_DATE = datetime(2000, 2, 2)\n-\n+CLEANUP_INTERVAL = 5\n \n def is_file_upload(item):\n """Check if ``item`` is a file upload."""\n@@ -40,13 +40,19 @@ def upload_map(self):\n upload_map = annotations.setdefault(FILE_UPLOAD_MAP_KEY, OOBTree())\n return upload_map\n \n- def cleanup(self):\n- """Remove obsolete temporary uploads."""\n+ def cleanup(self, force=False):\n+ """Remove obsolete temporary uploads.\n+\n+ To avoid conflict errors, files are deleted on every ~5th method call.\n+ Use force to make sure all expired files are deleted\n+ """\n upload_map = self.upload_map\n expiration_limit = datetime.now() - timedelta(seconds=FILE_UPLOAD_EXPIRATION_TIME)\n+ # Avoid conflict errors by deleting only every fifth time\n+ delete = force or randint(1, CLEANUP_INTERVAL) == 1\n for key in list(upload_map.keys()):\n dt = upload_map[key].get(\'dt\', FALLBACK_DATE)\n- if dt < expiration_limit and randint(0, 5) == 0: # Avoid conflict errors by deleting only every fifth time # noqa\n+ if dt < expiration_limit and delete:\n # Delete expired files or files without timestamp\n del upload_map[key]\n \n' | ||
|
||
Repository: plone.formwidget.namedfile | ||
|
||
|
||
Branch: refs/heads/master | ||
Date: 2021-09-09T13:50:50+02:00 | ||
Date: 2021-09-09T18:04:36+02:00 | ||
Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> | ||
Commit: https://github.com/plone/plone.formwidget.namedfile/commit/83c24e97f1ed8e23069090299350badf052028ff | ||
Commit: https://github.com/plone/plone.app.theming/commit/28d43655caeef6e4c9e4e7c154bd5d98a567ae15 | ||
|
||
Merge pull request #55 from plone/fix/temp-storage-master | ||
Merge pull request #200 from plone/issue-199 | ||
|
||
fix storage.cleanup() for master | ||
Fix unclosed file | ||
|
||
Files changed: | ||
A news/52.bugfix | ||
A news/54.bugfix | ||
M plone/formwidget/namedfile/utils.py | ||
A news/199.bugfix | ||
M src/plone/app/theming/utils.py | ||
|
||
b'diff --git a/news/52.bugfix b/news/52.bugfix\nnew file mode 100644\nindex 0000000..e8e7658\n--- /dev/null\n+++ b/news/52.bugfix\n@@ -0,0 +1 @@\n+Fix issue where expired temporary uploads have not been removed when calling FileUploadTemporaryStorage.cleanup() (https://github.com/plone/plone.formwidget.namedfile/issues/52) [fRiSi]\n\\ No newline at end of file\ndiff --git a/news/54.bugfix b/news/54.bugfix\nnew file mode 100644\nindex 0000000..bb9d919\n--- /dev/null\n+++ b/news/54.bugfix\n@@ -0,0 +1 @@\n+Make CLEANUP_INTERVAL patchable and fix condition (https://github.com/plone/plone.formwidget.namedfile/issues/54)\n\\ No newline at end of file\ndiff --git a/plone/formwidget/namedfile/utils.py b/plone/formwidget/namedfile/utils.py\nindex 1210ce1..f3a3643 100644\n--- a/plone/formwidget/namedfile/utils.py\n+++ b/plone/formwidget/namedfile/utils.py\n@@ -17,7 +17,7 @@\n FILE_UPLOAD_MAP_KEY = "file_upload_map"\n FILE_UPLOAD_EXPIRATION_TIME = 30 * 60 # seconds\n FALLBACK_DATE = datetime(2000, 2, 2)\n-\n+CLEANUP_INTERVAL = 5\n \n def is_file_upload(item):\n """Check if ``item`` is a file upload."""\n@@ -40,15 +40,19 @@ def upload_map(self):\n upload_map = annotations.setdefault(FILE_UPLOAD_MAP_KEY, OOBTree())\n return upload_map\n \n- def cleanup(self):\n- """Remove obsolete temporary uploads."""\n+ def cleanup(self, force=False):\n+ """Remove obsolete temporary uploads.\n+\n+ To avoid conflict errors, files are deleted on every ~5th method call.\n+ Use force to make sure all expired files are deleted\n+ """\n upload_map = self.upload_map\n- for key, val in upload_map.items():\n- if (\n- val.get("dt", FALLBACK_DATE)\n- < (datetime.now() - timedelta(seconds=FILE_UPLOAD_EXPIRATION_TIME))\n- and randint(0, 5) == 0\n- ): # Avoid conflict errors by deleting only every fifth time # noqa\n+ expiration_limit = datetime.now() - timedelta(seconds=FILE_UPLOAD_EXPIRATION_TIME)\n+ # Avoid conflict errors by deleting only every fifth time\n+ delete = force or randint(1, CLEANUP_INTERVAL) == 1\n+ for key in list(upload_map.keys()):\n+ dt = upload_map[key].get(\'dt\', FALLBACK_DATE)\n+ if dt < expiration_limit and delete:\n # Delete expired files or files without timestamp\n del upload_map[key]\n \n' | ||
b'diff --git a/news/199.bugfix b/news/199.bugfix\nnew file mode 100644\nindex 0000000..052c088\n--- /dev/null\n+++ b/news/199.bugfix\n@@ -0,0 +1,2 @@\n+Fix unclosed file when reading manifest.cfg\n+[petschki]\ndiff --git a/src/plone/app/theming/utils.py b/src/plone/app/theming/utils.py\nindex f3ca223..e494e24 100644\n--- a/src/plone/app/theming/utils.py\n+++ b/src/plone/app/theming/utils.py\n@@ -471,9 +471,8 @@ def getThemeFromResourceDirectory(resourceDirectory):\n """\n name = resourceDirectory.__name__\n if resourceDirectory.isFile(MANIFEST_FILENAME):\n- manifest = getManifest(\n- resourceDirectory.openFile(MANIFEST_FILENAME), MANIFEST_FORMAT\n- )\n+ with resourceDirectory.openFile(MANIFEST_FILENAME) as manifest_fp:\n+ manifest = getManifest(manifest_fp, MANIFEST_FORMAT)\n else:\n manifest = {}\n \n' | ||
|