From b78c35cc2b1ffddcb610f26ed774a5176d467a62 Mon Sep 17 00:00:00 2001 From: David Glick Date: Sat, 9 Jul 2022 20:55:33 -0700 Subject: [PATCH] Make sure get_or_generate stores scales with the same uid --- news/60.bugfix | 5 +++++ plone/scale/storage.py | 7 ++++--- plone/scale/tests/test_storage.py | 13 +++++++++++++ 3 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 news/60.bugfix diff --git a/news/60.bugfix b/news/60.bugfix new file mode 100644 index 0000000..c8324e9 --- /dev/null +++ b/news/60.bugfix @@ -0,0 +1,5 @@ +* Fix to ensure that when a scale that was registered using `pre_scale` is + later actually generated by `get_or_generate`, it is stored with the same + uid as the placeholder info that was stored by `pre_scale`. This avoids + an issue where the same scale was generated repeatedly. + [davisagli] diff --git a/plone/scale/storage.py b/plone/scale/storage.py index 60bf8a3..fd3fca0 100644 --- a/plone/scale/storage.py +++ b/plone/scale/storage.py @@ -267,7 +267,7 @@ def pre_scale(self, **parameters): logger.debug(f"Pre scale returns new {info}") return info - def generate_scale(self, **parameters): + def generate_scale(self, uid=None, **parameters): logger.debug("Generating scale...") scaling_factory = IImageScaleFactory(self.context, None) if scaling_factory is None: @@ -282,7 +282,8 @@ def generate_scale(self, **parameters): self._cleanup(fieldname=fieldname) data, format_, dimensions = result width, height = dimensions - uid = self.hash_key(**parameters) + if uid is None: + uid = self.hash_key(**parameters) key = self.hash(**parameters) info = dict( uid=uid, @@ -331,7 +332,7 @@ def get_or_generate(self, name): # This scale has not been generated yet. # Get the parameters used when pre-registering this scale. parameters = self.unhash(info["key"]) - return self.generate_scale(**parameters) + return self.generate_scale(uid=name, **parameters) def _cleanup(self, fieldname=None): storage = self.storage diff --git a/plone/scale/tests/test_storage.py b/plone/scale/tests/test_storage.py index 9ac541e..4456878 100644 --- a/plone/scale/tests/test_storage.py +++ b/plone/scale/tests/test_storage.py @@ -152,6 +152,19 @@ def test_get_or_generate(self): self.assertEqual(real["height"], 23) self.assertEqual(real["mimetype"], "image/png") + def test_get_or_generate__stable_uid(self): + # When get_or_generate actually generates the scale, + # it should store it with the same uid that was used + # to find the placeholder info, even if the field + # has been modified or a modified time is not available + self._provide_dummy_scale_adapter() + storage = self.storage + scale = storage.pre_scale(width=50, height=80) + uid = scale["uid"] + storage.modified = lambda: 100 + real = storage.get_or_generate(uid) + self.assertEqual(real["uid"], uid) + def testScaleForExistingScale(self): self._provide_dummy_scale_adapter() storage = self.storage