diff --git a/CHANGES.rst b/CHANGES.rst index 8472ee85d..59c2e4ac9 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -9,6 +9,9 @@ There's a frood who really knows where his towel is. - Fix ``@@updatetilecontent`` view to avoid rendering outdated data. [hvelarde] +- Fix ``TypeError`` when changing default image scale on basic tiles (fixes `#686`_). + [rodfersou] + - Fixed adding a 'more' link in list tiles. Previously you could select an item to use as 'more' link, but it did not stick. [maurits] @@ -160,3 +163,4 @@ Previous entries can be found in the HISTORY.rst file. .. _`#608`: https://github.com/collective/collective.cover/issues/608 .. _`#641`: https://github.com/collective/collective.cover/issues/641 .. _`#651`: https://github.com/collective/collective.cover/issues/651 +.. _`#686`: https://github.com/collective/collective.cover/issues/686 diff --git a/src/collective/cover/browser/scaling.py b/src/collective/cover/browser/scaling.py index df9af4aa7..f82c814f0 100644 --- a/src/collective/cover/browser/scaling.py +++ b/src/collective/cover/browser/scaling.py @@ -158,10 +158,10 @@ def modified(self): name='images', default=None) return base_scales and base_scales.modified() - mtime = '' + mtime = None for k, v in self.context.data.items(): if INamedImage.providedBy(v): - mtime += self.context.data.get('{0}_mtime'.format(k), '') + mtime = self.context.data.get('{0}_mtime'.format(k), None) return mtime diff --git a/src/collective/cover/tests/test_scaling.robot b/src/collective/cover/tests/test_scaling.robot new file mode 100644 index 000000000..59e3ebab3 --- /dev/null +++ b/src/collective/cover/tests/test_scaling.robot @@ -0,0 +1,63 @@ +*** Settings *** + +Resource cover.robot +Library Remote ${PLONE_URL}/RobotRemote + +Suite Setup Open Test Browser +Suite Teardown Close all browsers + +*** Variables *** + +${basic_tile_name} = "collective.cover.basic" +${image_selector} //div[@id="content-trees"]//li[@class="ui-draggable"]/a[@data-ct-type="Image"]/span[text()='Test image']/.. +${tile_selector} div.tile-container div.tile +${tile_class} = div.cover-tile + +*** Test cases *** + +Test Scaling + Enable Autologin as Site Administrator + Go to Homepage + + Create Cover Title Description + + Open Layout Tab + + Add Tile ${basic_tile_name} + Save Cover Layout + + Compose Cover + Open Content Chooser + Click Element link=Content tree + Drag And Drop xpath=${image_selector} css=${tile_selector} + + Click Link link=View + Page Should Contain Element xpath=//img[@width=50][@height=50] + + Open Layout Tab + Click Config from Tile ${tile_class} + Wait until element is visible id=buttons-cancel + Select From List css=#collective-cover-basic-image-imgsize listing 16:16 + Click Button id=buttons-save + Save Cover Layout + + Click Link link=View + Page Should Contain Element xpath=//img[@width=16][@height=16] + + Open Layout Tab + Click Config from Tile ${tile_class} + Wait until element is visible id=buttons-cancel + Select From List css=#collective-cover-basic-image-imgsize icon 32:32 + Click Button id=buttons-save + Save Cover Layout + + Click Link link=View + Page Should Contain Element xpath=//img[@width=32][@height=32] + + +*** Keywords *** + +Click Config from Tile + [arguments] ${tile} + + Click Element css=${tile} .config-tile-link diff --git a/src/collective/cover/tests/test_upgrades.py b/src/collective/cover/tests/test_upgrades.py index e7e6a357c..4069e245a 100644 --- a/src/collective/cover/tests/test_upgrades.py +++ b/src/collective/cover/tests/test_upgrades.py @@ -587,4 +587,37 @@ def setUp(self): def test_registrations(self): version = self.setup.getLastVersionForProfile(self.profile_id)[0] self.assertGreaterEqual(int(version), int(self.to_version)) - self.assertEqual(self._how_many_upgrades_to_do(), 1) + self.assertEqual(self._how_many_upgrades_to_do(), 2) + + def test_fix_image_field_modification_time(self): + from persistent.dict import PersistentDict + title = u'Fix image field modification time' + step = self._get_upgrade_step(title) + assert step is not None + + # simulate state on previous version + cover = self._create_cover('test-cover', 'Empty layout') + cover.cover_layout = ( + '[{"type": "row", "children": [{"column-size": 16, "type": ' + '"group", "children": [{"tile-type": ' + '"collective.cover.basic", "type": "tile", "id": ' + '"ca6ba6675ef145e4a569c5e410af7511"}], "roles": ["Manager"]}]}]' + ) + + tile = cover.get_tile('ca6ba6675ef145e4a569c5e410af7511') + obj = self.portal['my-image'] + tile.populate_with_object(obj) + + dmgr = ITileDataManager(tile) + old_data = dmgr.get() + old_data['image_mtime'] = repr(old_data['image_mtime']) + dmgr.annotations[dmgr.key] = PersistentDict(old_data) + + data = dmgr.get() + assert isinstance(data['image_mtime'], str) + + # run the upgrade step to validate the update + self._do_upgrade_step(step) + + data = dmgr.get() + self.assertIsInstance(data['image_mtime'], float) diff --git a/src/collective/cover/tiles/data.py b/src/collective/cover/tiles/data.py index ce62a69fd..6214251a9 100644 --- a/src/collective/cover/tiles/data.py +++ b/src/collective/cover/tiles/data.py @@ -1,5 +1,4 @@ # -*- coding: utf-8 -*- - from collective.cover.tiles.base import IPersistentCoverTile from persistent.dict import PersistentDict from plone.namedfile.interfaces import INamedImage @@ -52,9 +51,9 @@ def set(self, data): data[k] != self.annotations[self.key][k])): # set modification time of the image notify(Purge(self.tile)) - data[mtime_key] = repr(time.time()) + data[mtime_key] = time.time() else: - data[mtime_key] = self.annotations[self.key].get(mtime_key, '') + data[mtime_key] = self.annotations[self.key].get(mtime_key, None) self.annotations[self.key] = PersistentDict(data) notify(ObjectModifiedEvent(self.context)) diff --git a/src/collective/cover/upgrades/v15/__init__.py b/src/collective/cover/upgrades/v15/__init__.py index 40a96afc6..67c538a18 100644 --- a/src/collective/cover/upgrades/v15/__init__.py +++ b/src/collective/cover/upgrades/v15/__init__.py @@ -1 +1,31 @@ # -*- coding: utf-8 -*- +from collective.cover.interfaces import ICover +from collective.cover.logger import logger +from persistent.dict import PersistentDict +from plone.namedfile.interfaces import INamedImage +from plone.tiles.interfaces import ITileDataManager + + +def fix_image_field_modification_time(context): + """Fix image modification time to be float timestamp instead of string.""" + + covers = context.portal_catalog(object_provides=ICover.__identifier__) + logger.info('About to update {0} objects'.format(len(covers))) + for cover in covers: + obj = cover.getObject() + for tile_id in obj.list_tiles(): + tile = obj.get_tile(tile_id) + dmgr = ITileDataManager(tile) + data = dmgr.get() + for k, v in data.items(): + if not INamedImage.providedBy(v): + continue + + mtime_key = '{0}_mtime'.format(k) + data[mtime_key] = float(data[mtime_key]) + # need to set changes directly into annotation + dmgr.annotations[dmgr.key] = PersistentDict(data) + msg = 'Tile {0} at {1} updated' + logger.info(msg.format(tile_id, cover.getPath())) + + logger.info('Done') diff --git a/src/collective/cover/upgrades/v15/configure.zcml b/src/collective/cover/upgrades/v15/configure.zcml index 04a52854c..78e047795 100644 --- a/src/collective/cover/upgrades/v15/configure.zcml +++ b/src/collective/cover/upgrades/v15/configure.zcml @@ -9,6 +9,12 @@ destination="15" profile="collective.cover:default"> + +