Skip to content

Commit

Permalink
Merge pull request #61 from plone/fix-scale-uid
Browse files Browse the repository at this point in the history
Make sure get_or_generate stores scales with the same uid
  • Loading branch information
mauritsvanrees committed Jul 11, 2022
2 parents 9eafee6 + b78c35c commit 71d6d6c
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 3 deletions.
5 changes: 5 additions & 0 deletions news/60.bugfix
Original file line number Diff line number Diff line change
@@ -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]
7 changes: 4 additions & 3 deletions plone/scale/storage.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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,
Expand Down Expand Up @@ -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
Expand Down
13 changes: 13 additions & 0 deletions plone/scale/tests/test_storage.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 71d6d6c

Please sign in to comment.