collective.tiles.carousel 1.0.2__py3-none-any.whl → 1.0.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. collective/tiles/carousel/__init__.py +1 -0
  2. collective/tiles/carousel/configure.zcml +12 -11
  3. collective/tiles/carousel/locales/en/LC_MESSAGES/collective.tiles.carousel.mo +0 -0
  4. collective/tiles/carousel/profiles/default/browserlayer.xml +4 -5
  5. collective/tiles/carousel/profiles/default/metadata.xml +1 -1
  6. collective/tiles/carousel/profiles/default/registry/mosaic.xml +11 -10
  7. collective/tiles/carousel/profiles/uninstall/browserlayer.xml +4 -5
  8. collective/tiles/carousel/setuphandlers.py +1 -1
  9. collective/tiles/carousel/slides/configure.zcml +9 -8
  10. collective/tiles/carousel/slides/slide_full_view.py +0 -2
  11. collective/tiles/carousel/slides/slide_view.pt +8 -5
  12. collective/tiles/carousel/slides/slide_view.py +1 -2
  13. collective/tiles/carousel/testing.py +0 -1
  14. collective/tiles/carousel/tests/test_setup.py +2 -2
  15. collective/tiles/carousel/tile.pt +103 -61
  16. collective/tiles/carousel/tile.py +13 -40
  17. collective/tiles/carousel/utils.py +6 -45
  18. collective.tiles.carousel-1.0.4-py3.11-nspkg.pth +2 -0
  19. {collective.tiles.carousel-1.0.2.dist-info → collective.tiles.carousel-1.0.4.dist-info}/METADATA +40 -4
  20. collective.tiles.carousel-1.0.4.dist-info/RECORD +39 -0
  21. {collective.tiles.carousel-1.0.2.dist-info → collective.tiles.carousel-1.0.4.dist-info}/WHEEL +1 -1
  22. collective.tiles.carousel-1.0.2-py3.11-nspkg.pth +0 -3
  23. collective.tiles.carousel-1.0.2.dist-info/RECORD +0 -38
  24. {collective.tiles.carousel-1.0.2.dist-info → collective.tiles.carousel-1.0.4.dist-info}/LICENSE.GPL +0 -0
  25. {collective.tiles.carousel-1.0.2.dist-info → collective.tiles.carousel-1.0.4.dist-info}/LICENSE.rst +0 -0
  26. {collective.tiles.carousel-1.0.2.dist-info → collective.tiles.carousel-1.0.4.dist-info}/entry_points.txt +0 -0
  27. {collective.tiles.carousel-1.0.2.dist-info → collective.tiles.carousel-1.0.4.dist-info}/namespace_packages.txt +0 -0
  28. {collective.tiles.carousel-1.0.2.dist-info → collective.tiles.carousel-1.0.4.dist-info}/top_level.txt +0 -0
@@ -1,4 +1,5 @@
1
1
  """Init and utils."""
2
+
2
3
  from zope.i18nmessageid import MessageFactory
3
4
 
4
5
 
@@ -3,7 +3,8 @@
3
3
  xmlns:genericsetup="http://namespaces.zope.org/genericsetup"
4
4
  xmlns:i18n="http://namespaces.zope.org/i18n"
5
5
  xmlns:plone="http://namespaces.plone.org/plone"
6
- i18n_domain="collective.tiles.carousel">
6
+ i18n_domain="collective.tiles.carousel"
7
+ >
7
8
 
8
9
  <i18n:registerTranslations directory="locales" />
9
10
 
@@ -14,39 +15,39 @@
14
15
 
15
16
  <!-- Slider tile -->
16
17
  <plone:tile
17
- add_permission="cmf.ModifyPortalContent"
18
- class=".tile.SliderTile"
18
+ name="collective.tiles.carousel"
19
+ title="Carousel"
19
20
  description=""
20
21
  for="*"
21
- layer="collective.tiles.carousel.interfaces.ICollectiveTilesCarouselLayer"
22
- name="collective.tiles.carousel"
23
- permission="zope2.View"
24
22
  schema=".tile.ISliderTile"
23
+ class=".tile.SliderTile"
25
24
  template="tile.pt"
26
- title="Carousel"
25
+ permission="zope2.View"
26
+ add_permission="cmf.ModifyPortalContent"
27
+ layer="collective.tiles.carousel.interfaces.ICollectiveTilesCarouselLayer"
27
28
  />
28
29
 
29
30
  <utility
30
- component="collective.tiles.carousel.tile.availableSliderViewsVocabulary"
31
31
  name="Available Slider Views"
32
+ component="collective.tiles.carousel.tile.availableSliderViewsVocabulary"
32
33
  />
33
-
34
+
34
35
 
35
36
  <genericsetup:registerProfile
36
37
  name="default"
37
38
  title="collective.tiles.carousel"
38
- directory="profiles/default"
39
39
  description="Installs the collective.tiles.carousel add-on."
40
40
  provides="Products.GenericSetup.interfaces.EXTENSION"
41
+ directory="profiles/default"
41
42
  post_handler=".setuphandlers.post_install"
42
43
  />
43
44
 
44
45
  <genericsetup:registerProfile
45
46
  name="uninstall"
46
47
  title="collective.tiles.carousel (uninstall)"
47
- directory="profiles/uninstall"
48
48
  description="Uninstalls the collective.tiles.carousel add-on."
49
49
  provides="Products.GenericSetup.interfaces.EXTENSION"
50
+ directory="profiles/uninstall"
50
51
  post_handler=".setuphandlers.uninstall"
51
52
  />
52
53
 
@@ -1,7 +1,6 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
1
+ <?xml version="1.0" encoding="utf-8"?>
2
2
  <layers>
3
- <layer
4
- name="collective.tiles.carousel"
5
- interface="collective.tiles.carousel.interfaces.ICollectiveTilesCarouselLayer"
6
- />
3
+ <layer interface="collective.tiles.carousel.interfaces.ICollectiveTilesCarouselLayer"
4
+ name="collective.tiles.carousel"
5
+ />
7
6
  </layers>
@@ -1,4 +1,4 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
1
+ <?xml version="1.0" encoding="utf-8"?>
2
2
  <metadata>
3
3
  <version>1000</version>
4
4
  <dependencies>
@@ -1,18 +1,18 @@
1
- <?xml version="1.0"?>
2
- <registry
3
- xmlns:i18n="http://xml.zope.org/namespaces/i18n"
4
- i18n:domain="collective.tiles.carousel">
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <registry xmlns:i18n="http://xml.zope.org/namespaces/i18n"
3
+ i18n:domain="collective.tiles.carousel"
4
+ >
5
5
 
6
- <!-- -*- extra stuff goes here -*- -->
6
+ <!-- -*- extra stuff goes here -*- -->
7
7
 
8
8
  <!-- dynamic form -->
9
9
  <!-- <records prefix="plone.resources/collective.tiles.sliders.dynamicform"
10
- interface='Products.CMFPlone.interfaces.IResourceRegistry'>
10
+ interface='plone.base.interfaces.IResourceRegistry'>
11
11
  <value key="js">++plone++collective.tiles.sliders.dynamicform/pattern.js</value>
12
12
  </records> -->
13
13
 
14
14
  <!-- <records prefix="plone.bundles/collective.tiles.sliders.dynamicform"
15
- interface='Products.CMFPlone.interfaces.IBundleRegistry'>
15
+ interface='plone.base.interfaces.IBundleRegistry'>
16
16
  <value key="resources">
17
17
  <element>collective.tiles.sliders.dynamicform</element>
18
18
  </value>
@@ -35,13 +35,14 @@
35
35
  </record>
36
36
 
37
37
 
38
- <records prefix="plone.app.mosaic.app_tiles.collective_tiles_carousel"
39
- interface="plone.app.mosaic.interfaces.ITile">
38
+ <records interface="plone.app.mosaic.interfaces.ITile"
39
+ prefix="plone.app.mosaic.app_tiles.collective_tiles_carousel"
40
+ >
40
41
  <value key="name">collective.tiles.carousel</value>
41
42
  <value key="label">Carousel</value>
42
43
  <value key="category">media</value>
43
44
  <value key="tile_type">app</value>
44
- <value key="default_value"></value>
45
+ <value key="default_value" />
45
46
  <value key="read_only">false</value>
46
47
  <value key="settings">true</value>
47
48
  <value key="favorite">false</value>
@@ -1,7 +1,6 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
1
+ <?xml version="1.0" encoding="utf-8"?>
2
2
  <layers>
3
- <layer
4
- name="collective.tiles.carousel"
5
- remove="true"
6
- />
3
+ <layer name="collective.tiles.carousel"
4
+ remove="true"
5
+ />
7
6
  </layers>
@@ -1,4 +1,4 @@
1
- from Products.CMFPlone.interfaces import INonInstallable
1
+ from plone.base.interfaces import INonInstallable
2
2
  from zope.interface import implementer
3
3
 
4
4
 
@@ -2,31 +2,32 @@
2
2
  xmlns="http://namespaces.zope.org/zope"
3
3
  xmlns:browser="http://namespaces.zope.org/browser"
4
4
  xmlns:plone="http://namespaces.plone.org/plone"
5
- i18n_domain="collective.tiles.carousel">
5
+ i18n_domain="collective.tiles.carousel"
6
+ >
6
7
 
7
8
  <!-- Publish static files -->
8
9
  <plone:static
10
+ directory="static"
9
11
  name="collective.tiles.carousel"
10
12
  type="plone"
11
- directory="static"
12
13
  />
13
14
 
14
15
  <browser:page
15
16
  name="slide_view"
16
- class=".slide_view.SlideView"
17
17
  for="*"
18
- layer="collective.tiles.carousel.interfaces.ICollectiveTilesCarouselLayer"
19
- permission="zope2.View"
18
+ class=".slide_view.SlideView"
20
19
  template="slide_view.pt"
20
+ permission="zope2.View"
21
+ layer="collective.tiles.carousel.interfaces.ICollectiveTilesCarouselLayer"
21
22
  />
22
23
 
23
24
  <browser:page
24
25
  name="slide_full_view"
25
- class=".slide_full_view.SlideFullView"
26
26
  for="*"
27
- layer="collective.tiles.carousel.interfaces.ICollectiveTilesCarouselLayer"
28
- permission="zope2.View"
27
+ class=".slide_full_view.SlideFullView"
29
28
  template="slide_full_view.pt"
29
+ permission="zope2.View"
30
+ layer="collective.tiles.carousel.interfaces.ICollectiveTilesCarouselLayer"
30
31
  />
31
32
 
32
33
 
@@ -1,5 +1,3 @@
1
- from collective.tiles.carousel import _
2
- from plone.app.contenttypes.browser.link_redirect_view import NON_RESOLVABLE_URL_SCHEMES
3
1
  from Products.Five import BrowserView
4
2
 
5
3
 
@@ -1,10 +1,13 @@
1
- <tal:item define="item python:view.item;
2
- title python:item['data']['show_title'] and item['title'] or None;
3
- description python:item['data']['show_description'] and item['description'] or None;">
1
+ <tal:item define="
2
+ item python:view.item;
3
+ title python:item['data']['show_title'] and item['title'] or None;
4
+ description python:item['data']['show_description'] and item['description'] or None;
5
+ ">
4
6
 
5
7
  <tal:img replace="structure python:item['img_tag']" />
6
- <div class="carousel-caption d-none d-md-block"
7
- tal:condition="python:title or description">
8
+ <div class="carousel-caption d-none d-md-block"
9
+ tal:condition="python:title or description"
10
+ >
8
11
  <h5 tal:condition="python:title">${title}</h5>
9
12
  <p tal:condition="python:description">${description}</p>
10
13
  </div>
@@ -1,4 +1,3 @@
1
- from collective.tiles.carousel import _
2
1
  from plone import api
3
2
  from plone.app.contenttypes.browser.link_redirect_view import NON_RESOLVABLE_URL_SCHEMES
4
3
  from plone.app.contenttypes.utils import replace_link_variables_by_paths
@@ -27,7 +26,7 @@ class SlideView(BrowserView):
27
26
  scale_util = api.content.get_view("images", obj, self.request)
28
27
  return scale_util.tag(
29
28
  fieldname="image",
30
- mode=data.get("crop") and "cover" or "keep",
29
+ mode="contain" if data.get("crop") else "scale",
31
30
  scale=(
32
31
  data.get("image_scale")
33
32
  if data.get("image_scale", "") != "original"
@@ -10,7 +10,6 @@ import collective.tiles.carousel
10
10
 
11
11
 
12
12
  class CollectiveTilesCarouselLayer(PloneSandboxLayer):
13
-
14
13
  defaultBases = (PLONE_FIXTURE,)
15
14
 
16
15
  def setUpZope(self, app, configurationContext):
@@ -1,11 +1,12 @@
1
1
  """Setup tests for this package."""
2
+
2
3
  from collective.tiles.carousel.testing import (
3
4
  COLLECTIVE_TILES_CAROUSEL_INTEGRATION_TESTING,
4
5
  )
5
6
  from plone import api
6
7
  from plone.app.testing import setRoles
7
8
  from plone.app.testing import TEST_USER_ID
8
- from Products.CMFPlone.utils import get_installer
9
+ from plone.base.utils import get_installer
9
10
 
10
11
  import unittest
11
12
 
@@ -35,7 +36,6 @@ class TestSetup(unittest.TestCase):
35
36
 
36
37
 
37
38
  class TestUninstall(unittest.TestCase):
38
-
39
39
  layer = COLLECTIVE_TILES_CAROUSEL_INTEGRATION_TESTING
40
40
 
41
41
  def setUp(self):
@@ -1,71 +1,113 @@
1
- <html tal:define="items view/items | nothing;">
2
- <body>
3
- <tal:slider tal:condition="items">
4
- <tal:def define="
5
- portal context/@@plone_portal_state/portal;
6
- show_title view/data/show_title | None;
7
- show_description view/data/show_description | None;
8
- fullscreen python: view.data.get('allow_fullscreen') and 'fullscreen' or '';
9
- pager python:view.data.get('pager') and 'true' or 'false';
10
- navigation python:view.data.get('navigation') and 'true' or 'false';
11
- darkvariant python:view.data.get('darkvariant') and 'carousel-dark' or '';
12
- crossfade python:view.data.get('crossfade') and 'carousel-fade' or '';
13
- link_slides python:view.data.get('link_slides') != 'disabled';
14
- items_per_slide python:view.data.get('items_per_slide') and view.data.get('items_per_slide') or 1;
15
- items_responsive python: items_per_slide > 1 and 'row-cols-2' or 'row-cols-1';
16
- items_responsive python: items_per_slide == 3 and 'row-cols-1' or items_responsive;
17
- ">
1
+ <html tal:define="
2
+ items view/items | nothing;
3
+ ">
4
+ <body>
5
+ <tal:slider tal:condition="items">
6
+ <tal:def define="
7
+ portal context/@@plone_portal_state/portal;
8
+ show_title view/data/show_title | None;
9
+ show_description view/data/show_description | None;
10
+ fullscreen python: view.data.get('allow_fullscreen') and 'fullscreen' or '';
11
+ pager python:view.data.get('pager') and 'true' or 'false';
12
+ navigation python:view.data.get('navigation') and 'true' or 'false';
13
+ darkvariant python:view.data.get('darkvariant') and 'carousel-dark' or '';
14
+ crossfade python:view.data.get('crossfade') and 'carousel-fade' or '';
15
+ link_slides python:view.data.get('link_slides') != 'disabled';
16
+ items_per_slide python:view.data.get('items_per_slide') and view.data.get('items_per_slide') or 1;
17
+ items_responsive python: items_per_slide > 1 and 'row-cols-2' or 'row-cols-1';
18
+ items_responsive python: items_per_slide == 3 and 'row-cols-1' or items_responsive;
19
+ autoplay_interval view/data/carousel_speed|nothing;
20
+ ">
18
21
 
19
- <div class="tileHeader" tal:condition="python:view.data['title'] or view.data['description']">
20
- <h2 class="" tal:condition="python:view.data['title']"
21
- tal:content="python:view.data['title']">Title</h2>
22
- <div class="tileDescription lead" tal:condition="python:view.data['description']"
23
- tal:content="python:view.data['description']">Description</div>
24
- </div>
22
+ <div class="tileHeader"
23
+ tal:condition="python:view.data['title'] or view.data['description']"
24
+ >
25
+ <h2 class=""
26
+ tal:condition="python:view.data['title']"
27
+ tal:content="python:view.data['title']"
28
+ >Title</h2>
29
+ <div class="tileDescription lead"
30
+ tal:condition="python:view.data['description']"
31
+ tal:content="python:view.data['description']"
32
+ >Description</div>
33
+ </div>
25
34
 
26
- <div id="carousel-${view/id}" class="carousel ${darkvariant} slide ${crossfade} mb-3 collective-tiles-carousel" data-bs-ride="carousel" data-bs-interval="${python:view.data.get('carousel_speed', False) or 'false'}">
35
+ <div class="carousel ${darkvariant} slide ${crossfade} mb-3 collective-tiles-carousel"
36
+ id="carousel-${view/id}"
37
+ tal:attributes="
38
+ data-bs-ride python:'carousel' if autoplay_interval else None;
39
+ data-bs-interval python:autoplay_interval if autoplay_interval else None;
40
+ "
41
+ >
27
42
 
28
- <div class="carousel-indicators" tal:condition="view/data/indicators">
29
- <tal:indicators repeat="item items">
30
- <button type="button" data-bs-target="#carousel-${view/id}" data-bs-slide-to="${python:repeat.item.index}" class="${python:repeat.item.index == 0 and 'active' or None}" aria-current="true" aria-label="Slide ${python:repeat.item.index}"></button>
31
- </tal:indicators>
32
- </div>
43
+ <div class="carousel-indicators"
44
+ tal:condition="view/data/indicators"
45
+ >
46
+ <tal:indicators repeat="item items">
47
+ <button class="${python:repeat.item.index == 0 and 'active' or None}"
48
+ aria-current="true"
49
+ aria-label="Slide ${python:repeat.item.index}"
50
+ type="button"
51
+ data-bs-slide-to="${python:repeat.item.index}"
52
+ data-bs-target="#carousel-${view/id}"
53
+ i18n:attributes="aria-label"
54
+ ></button>
55
+ </tal:indicators>
56
+ </div>
33
57
 
34
- <div class="carousel-inner">
35
- <tal:slides repeat="slide items">
36
- <div class="carousel-item ${python:repeat.slide.index == 0 and 'active' or None}">
37
- <div class="row g-3 ${items_responsive} row-cols-md-${items_per_slide}">
38
- <tal:items repeat="item slide">
39
- <div class="col position-relative" tal:condition="link_slides">
40
- <a href="${python:view.get_link(item)}">
41
- <div tal:replace="structure python:view.item_view(item, view.data)">Listing</div>
42
- </a>
43
- </div>
44
- <div class="col position-relative" tal:condition="python: not link_slides">
45
- <div tal:replace="structure python:view.item_view(item, view.data)">Listing</div>
58
+ <div class="carousel-inner">
59
+ <tal:slides repeat="slide items">
60
+ <div class="carousel-item ${python:repeat.slide.index == 0 and 'active' or None}">
61
+ <div class="row g-3 ${items_responsive} row-cols-md-${items_per_slide}">
62
+ <tal:items repeat="item slide">
63
+ <div class="col position-relative"
64
+ tal:condition="link_slides"
65
+ >
66
+ <a href="${python:view.get_link(item)}">
67
+ <div tal:replace="structure python:view.item_view(item, view.data)">Listing</div>
68
+ </a>
69
+ </div>
70
+ <div class="col position-relative"
71
+ tal:condition="python: not link_slides"
72
+ >
73
+ <div tal:replace="structure python:view.item_view(item, view.data)">Listing</div>
74
+ </div>
75
+ </tal:items>
46
76
  </div>
47
- </tal:items>
48
- </div>
77
+ </div>
78
+ </tal:slides>
49
79
  </div>
50
- </tal:slides>
51
- </div>
52
80
 
53
- <a class="carousel-control-prev" tal:condition="view/data/controls"
54
- href="#carousel-${view/id}" role="button" data-bs-slide="prev">
55
- <span class="carousel-control-prev-icon" aria-hidden="true"></span>
56
- <span class="visually-hidden">Previous</span>
57
- </a>
58
- <a class="carousel-control-next" tal:condition="view/data/controls"
59
- href="#carousel-${view/id}" role="button" data-bs-slide="next">
60
- <span class="carousel-control-next-icon" aria-hidden="true"></span>
61
- <span class="visually-hidden">Next</span>
62
- </a>
81
+ <a class="carousel-control-prev"
82
+ href="#carousel-${view/id}"
83
+ role="button"
84
+ data-bs-slide="prev"
85
+ tal:condition="view/data/controls"
86
+ >
87
+ <span class="carousel-control-prev-icon"
88
+ aria-hidden="true"
89
+ ></span>
90
+ <span class="visually-hidden"
91
+ i18n:translate=""
92
+ >Previous</span>
93
+ </a>
94
+ <a class="carousel-control-next"
95
+ href="#carousel-${view/id}"
96
+ role="button"
97
+ data-bs-slide="next"
98
+ tal:condition="view/data/controls"
99
+ >
100
+ <span class="carousel-control-next-icon"
101
+ aria-hidden="true"
102
+ ></span>
103
+ <span class="visually-hidden"
104
+ i18n:translate=""
105
+ >Next</span>
106
+ </a>
63
107
 
64
- </div>
108
+ </div>
65
109
 
66
- </tal:def>
67
- </tal:slider>
68
- </body>
110
+ </tal:def>
111
+ </tal:slider>
112
+ </body>
69
113
  </html>
70
-
71
-
@@ -7,10 +7,8 @@ from plone import api
7
7
  from plone.app.contenttypes.browser.link_redirect_view import NON_RESOLVABLE_URL_SCHEMES
8
8
  from plone.app.contenttypes.interfaces import ICollection
9
9
  from plone.app.contenttypes.utils import replace_link_variables_by_paths
10
- from plone.app.querystring import queryparser
11
- from plone.app.querystring.interfaces import IParsedQueryIndexModifier
12
- from plone.app.z3cform.widget import QueryStringFieldWidget
13
- from plone.app.z3cform.widget import RelatedItemsFieldWidget
10
+ from plone.app.z3cform.widgets.querystring import QueryStringFieldWidget
11
+ from plone.app.z3cform.widgets.relateditems import RelatedItemsFieldWidget
14
12
  from plone.autoform import directives as form
15
13
  from plone.dexterity.interfaces import IDexterityContainer
16
14
  from plone.memoize import view
@@ -22,7 +20,6 @@ from z3c.relationfield.schema import RelationChoice
22
20
  from z3c.relationfield.schema import RelationList
23
21
  from zope import schema
24
22
  from zope.component import getMultiAdapter
25
- from zope.component import getUtilitiesFor
26
23
  from zope.component import getUtility
27
24
  from zope.interface import alsoProvides
28
25
  from zope.interface import implementer
@@ -124,7 +121,7 @@ class ISliderTile(Schema):
124
121
  default="large",
125
122
  )
126
123
 
127
- crop = schema.Bool(title=_("Crop Images"), required=False, default=True)
124
+ crop = schema.Bool(title=_("Crop Images"), required=False, default=False)
128
125
 
129
126
  image_class = schema.TextLine(
130
127
  title=_("Image Class"),
@@ -248,37 +245,10 @@ class SliderTile(Tile):
248
245
  values.append(name)
249
246
  return values
250
247
 
251
- def parse_query_from_data(data, context=None):
252
- """Parse query from data dictionary"""
253
- if context is None:
254
- context = api.portal.get()
255
- query = data.get("query", {}) or {}
256
- try:
257
- parsed = queryparser.parseFormquery(context, query)
258
- except KeyError:
259
- parsed = {}
260
-
261
- index_modifiers = getUtilitiesFor(IParsedQueryIndexModifier)
262
- for name, modifier in index_modifiers:
263
- if name in parsed:
264
- new_name, query = modifier(parsed[name])
265
- parsed[name] = query
266
- # if a new index name has been returned, we need to replace
267
- # the native ones
268
- if name != new_name:
269
- del parsed[name]
270
- parsed[new_name] = query
271
-
272
- if data.get("sort_on"):
273
- parsed["sort_on"] = data["sort_on"]
274
- if data.get("sort_reversed", False):
275
- parsed["sort_order"] = "reverse"
276
- return parsed
277
-
278
248
  @property
279
249
  def items(self):
280
250
  items = OrderedDict()
281
- if "carousel_items" in self.data:
251
+ if len(self.data.get("carousel_items") or []):
282
252
  for item in self.data["carousel_items"]:
283
253
  if ICollection.providedBy(item.to_object):
284
254
  items.update(
@@ -309,16 +279,19 @@ class SliderTile(Tile):
309
279
  else:
310
280
  items[item.to_object] = None
311
281
 
312
- if getattr(self, "query", None):
282
+ query = self.query
283
+ if query:
313
284
  items.update(
314
- OrderedDict.fromkeys(
315
- [x.getObject() for x in api.content.find(**self.query)]
316
- )
285
+ OrderedDict.fromkeys([x.getObject() for x in self.catalog(**query)])
317
286
  )
287
+
318
288
  result = []
319
- for obj in items.keys():
289
+ limit = self.data.get("limit") or 12
290
+ for count, obj in enumerate(items.keys(), 1):
320
291
  result.append(obj)
321
- ips = self.data.get("items_per_slide", 1)
292
+ if count >= limit:
293
+ break
294
+ ips = self.data.get("items_per_slide", 1) or 1
322
295
  slides = [
323
296
  result[i : i + ips]
324
297
  for i in [x * ips for x in range(0, int(len(result) / ips) + int(1))]
@@ -2,10 +2,6 @@
2
2
 
3
3
  from plone import api
4
4
  from plone.app.querystring import queryparser
5
- from plone.app.querystring.interfaces import IParsedQueryIndexModifier
6
- from plone.app.uuid.utils import uuidToObject
7
- from Products.ZCatalog.interfaces import ICatalogBrain
8
- from zope.component import getUtilitiesFor
9
5
 
10
6
 
11
7
  def parse_query_from_data(data, context=None):
@@ -14,48 +10,13 @@ def parse_query_from_data(data, context=None):
14
10
  context = api.portal.get()
15
11
  query = data.get("query", {}) or {}
16
12
  try:
17
- parsed = queryparser.parseFormquery(context, query)
13
+ parsed = queryparser.parseAndModifyFormquery(
14
+ context,
15
+ query,
16
+ data.get("sort_on"),
17
+ "desc" if data.get("sort_reversed", False) else "asc",
18
+ )
18
19
  except KeyError:
19
20
  parsed = {}
20
21
 
21
- index_modifiers = getUtilitiesFor(IParsedQueryIndexModifier)
22
- for name, modifier in index_modifiers:
23
- if name in parsed:
24
- new_name, query = modifier(parsed[name])
25
- parsed[name] = query
26
- # if a new index name has been returned, we need to replace
27
- # the native ones
28
- if name != new_name:
29
- del parsed[name]
30
- parsed[new_name] = query
31
-
32
- if data.get("sort_on"):
33
- parsed["sort_on"] = data["sort_on"]
34
- if data.get("limit"):
35
- parsed["sort_limit"] = data["limit"]
36
- if data.get("sort_reversed", False):
37
- parsed["sort_order"] = "reverse"
38
22
  return parsed
39
-
40
-
41
- def get_object(val):
42
- """Return the real object."""
43
- if ICatalogBrain.providedBy(val):
44
- return val.getObject()
45
-
46
- if not val:
47
- return None
48
-
49
- if isinstance(val, basestring):
50
- if val[0] == "/":
51
- # it's a path
52
- site = api.portal.get()
53
- return site.restrictedTraverse(val.strip("/"), None)
54
- else:
55
- # try querying catalog
56
- obj = uuidToObject(val)
57
- if obj:
58
- return obj
59
- if isinstance(val, basestring):
60
- return None
61
- return val
@@ -0,0 +1,2 @@
1
+ import sys, types, os;p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('collective',));importlib = __import__('importlib.util');__import__('importlib.machinery');m = sys.modules.setdefault('collective', importlib.util.module_from_spec(importlib.machinery.PathFinder.find_spec('collective', [os.path.dirname(p)])));m = m or sys.modules.setdefault('collective', types.ModuleType('collective'));mp = (m or []) and m.__dict__.setdefault('__path__',[]);(p not in mp) and mp.append(p)
2
+ import sys, types, os;p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('collective', 'tiles'));importlib = __import__('importlib.util');__import__('importlib.machinery');m = sys.modules.setdefault('collective.tiles', importlib.util.module_from_spec(importlib.machinery.PathFinder.find_spec('collective.tiles', [os.path.dirname(p)])));m = m or sys.modules.setdefault('collective.tiles', types.ModuleType('collective.tiles'));mp = (m or []) and m.__dict__.setdefault('__path__',[]);(p not in mp) and mp.append(p);m and setattr(sys.modules['collective'], 'tiles', m)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: collective.tiles.carousel
3
- Version: 1.0.2
3
+ Version: 1.0.4
4
4
  Summary: Slider for plone.app.mosaic based on Bootstrap 5
5
5
  Home-page: https://github.com/collective/collective.tiles.carousel
6
6
  Author: Peter Holzer
@@ -19,21 +19,34 @@ Classifier: Programming Language :: Python
19
19
  Classifier: Programming Language :: Python :: 3.8
20
20
  Classifier: Programming Language :: Python :: 3.9
21
21
  Classifier: Programming Language :: Python :: 3.10
22
+ Classifier: Programming Language :: Python :: 3.11
22
23
  Classifier: Operating System :: OS Independent
23
24
  Classifier: License :: OSI Approved :: GNU General Public License v2 (GPLv2)
24
- Requires-Python: >=3.7
25
+ Requires-Python: >=3.8
25
26
  License-File: LICENSE.GPL
26
27
  License-File: LICENSE.rst
27
28
  Requires-Dist: setuptools
28
- Requires-Dist: z3c.jbot
29
- Requires-Dist: Products.CMFPlone
29
+ Requires-Dist: Products.GenericSetup
30
+ Requires-Dist: plone.app.contenttypes
31
+ Requires-Dist: plone.app.querystring
30
32
  Requires-Dist: plone.app.mosaic
31
33
  Requires-Dist: plone.app.tiles
34
+ Requires-Dist: plone.app.z3cform
35
+ Requires-Dist: plone.autoform
36
+ Requires-Dist: plone.base
37
+ Requires-Dist: plone.dexterity
38
+ Requires-Dist: plone.memoize
39
+ Requires-Dist: plone.supermodel
32
40
  Requires-Dist: plone.tiles
41
+ Requires-Dist: plone.api
42
+ Requires-Dist: z3c.relationfield
33
43
  Provides-Extra: test
44
+ Requires-Dist: plone.app.dexterity ; extra == 'test'
34
45
  Requires-Dist: plone.app.testing ; extra == 'test'
46
+ Requires-Dist: plone.browserlayer ; extra == 'test'
35
47
  Requires-Dist: plone.testing ; extra == 'test'
36
48
  Requires-Dist: plone.app.robotframework[debug] ; extra == 'test'
49
+ Requires-Dist: robotsuite ; extra == 'test'
37
50
 
38
51
  .. This README is meant for consumption by humans and pypi. Pypi can render rst files so please do not use Sphinx features.
39
52
  If you want to learn more about writing documentation, please check out: http://docs.plone.org/about/documentation_styleguide.html
@@ -95,6 +108,29 @@ Changelog
95
108
  =========
96
109
 
97
110
 
111
+ 1.0.4 (2024-05-02)
112
+ ------------------
113
+
114
+ - Fix ``limit``.
115
+ [petschki]
116
+
117
+ - code cleanup.
118
+ [petschki]
119
+
120
+
121
+ 1.0.3 (2023-11-03)
122
+ ------------------
123
+
124
+ - Fix carousel speed "0" to stop autoplay.
125
+ [petschki]
126
+
127
+ - Fix image cropping when activated.
128
+ [petschki]
129
+
130
+ - configure with `plone/meta`.
131
+ [petschki]
132
+
133
+
98
134
  1.0.2 (2023-09-21)
99
135
  ------------------
100
136
 
@@ -0,0 +1,39 @@
1
+ collective.tiles.carousel-1.0.4-py3.11-nspkg.pth,sha256=2oWpeYM6MlxuTCe3-blu86w9h991-Etrc9-2Yn3D6ME,1059
2
+ collective/tiles/carousel/__init__.py,sha256=51V59Yi1aRW6PCzRAoJqUlWno0YQO1wAgi8d37mwTmA,119
3
+ collective/tiles/carousel/configure.zcml,sha256=1-9Nc4-Lej7b7HJb9Puc8Jw_rDRVyS6agix2SR98wrs,1783
4
+ collective/tiles/carousel/interfaces.py,sha256=erGd_4DSscSVyQCdzdWNABmPxuUBV1vwKvz6_m5BCc4,249
5
+ collective/tiles/carousel/setuphandlers.py,sha256=0y1cT8R_eYSdIv-aZUY-pazUGia27EFzCCHC-SiGMrI,586
6
+ collective/tiles/carousel/testing.py,sha256=WxBe18FLBdf-9nQmw_0rL_Gf1Eu0aLnUDD0RUxJ2VE0,1685
7
+ collective/tiles/carousel/tile.pt,sha256=ePFsqwYEMYpng21_l8Hp8Ok9-f_KfUKICaq-oJ3n3yc,4737
8
+ collective/tiles/carousel/tile.py,sha256=lkl_R91n7h6Oh3X-2QWn-m7YfqnFioCS2WhhcGciyjQ,12230
9
+ collective/tiles/carousel/utils.py,sha256=M0fOW-m5fhe63I4PtO8jCqnbooZ9ZXctj5in_Ru8j-o,550
10
+ collective/tiles/carousel/locales/README.rst,sha256=fS2h1MYp7b5Im-GcnIsZLHhK1N4F-_VuHBf_DorI2_A,611
11
+ collective/tiles/carousel/locales/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
+ collective/tiles/carousel/locales/collective.tiles.carousel.pot,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
+ collective/tiles/carousel/locales/update.py,sha256=jynjlAH6iDEu_33RfLPZahmfdX9nhVeD3jWIIw75vKY,1726
14
+ collective/tiles/carousel/locales/update.sh,sha256=ZGzBK0W3foiqphsq8fHnnCpfsVqkQmNVn8GhsT7sYDk,512
15
+ collective/tiles/carousel/locales/en/LC_MESSAGES/collective.tiles.carousel.mo,sha256=L2onKtwQZTXkBHC9_jRNfURepKFpwGdaacsyQ8btxUE,28
16
+ collective/tiles/carousel/locales/en/LC_MESSAGES/collective.tiles.carousel.po,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
+ collective/tiles/carousel/profiles/default/browserlayer.xml,sha256=vkPzWloz-1LXkyzzkxPZedUgdQ-wHH1vxWiWq7hy0ZY,193
18
+ collective/tiles/carousel/profiles/default/metadata.xml,sha256=cv6bIma1N737aldp-0Ut7FA8HsCv2FNLGqHfaqzeA3c,185
19
+ collective/tiles/carousel/profiles/default/registry/mosaic.xml,sha256=q3ndRBIbEugTINcceEW7ASIvlBTwp5d4PEfgRpVzsCw,2282
20
+ collective/tiles/carousel/profiles/uninstall/browserlayer.xml,sha256=xuau8KvRlNGSdVhzWfSqrD4A8hAjj3dFc4LL3WFkCFM,128
21
+ collective/tiles/carousel/slides/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
+ collective/tiles/carousel/slides/configure.zcml,sha256=oxth69DrGZtML8M4lWKGJk1Eiw2LgcWfgjZIzCcIJ0I,871
23
+ collective/tiles/carousel/slides/slide_full_view.pt,sha256=Ad-h042ygx7hyKdH5wa8B0o7FYTwWDXLma7pnMRXyak,91
24
+ collective/tiles/carousel/slides/slide_full_view.py,sha256=CaE5oyu6UzxzDTSOwVPa5cerKKDuncLdTUdNKfq-lWA,230
25
+ collective/tiles/carousel/slides/slide_view.pt,sha256=DKpaD-EBizwgnrm5ARBPbUU9swEjWMvS87TSGh2xDig,540
26
+ collective/tiles/carousel/slides/slide_view.py,sha256=CiDVVWD_Vcm1JDjruPoR5wJ83ghRRPyuitZCKX_zStM,3132
27
+ collective/tiles/carousel/slides/static/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
+ collective/tiles/carousel/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
+ collective/tiles/carousel/tests/test_robot.py,sha256=VPu3DguHGk-5srPM-N9BZj4dALjotYup8RWZ-QRdbpQ,947
30
+ collective/tiles/carousel/tests/test_setup.py,sha256=4FnSh4YBgEbcKTEw-feXs61FYm137R198GQUz4bXFBE,2221
31
+ collective/tiles/carousel/tests/robot/test_example.robot,sha256=RjktU-NOhxH3xDxc_Tn91wLAVcuQQ2aNnMEV5oHOKFw,2032
32
+ collective.tiles.carousel-1.0.4.dist-info/LICENSE.GPL,sha256=gXf5dRMhNSbfLPYYTY_5hsZ1r7UU1OaKQEAQUhuIBkM,18092
33
+ collective.tiles.carousel-1.0.4.dist-info/LICENSE.rst,sha256=iDVL_6C7byshRvxykg-JJfnJl1UQCvKDV_H-1dp_8GU,668
34
+ collective.tiles.carousel-1.0.4.dist-info/METADATA,sha256=58tQmNcfVHw1njopS1Y5WhOUJ6oq3C_DsoFBP3ipm90,4028
35
+ collective.tiles.carousel-1.0.4.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
36
+ collective.tiles.carousel-1.0.4.dist-info/entry_points.txt,sha256=ru0hdDg0GqdaMNDkHf3l7rtXvCkgCOmh7S-EiRWIpUk,130
37
+ collective.tiles.carousel-1.0.4.dist-info/namespace_packages.txt,sha256=AiVC9ju6UYs_UE8dvyfAvQmRsFgWG25eyAfTG-nLAjM,28
38
+ collective.tiles.carousel-1.0.4.dist-info/top_level.txt,sha256=FyC0xnd95fkjCaKazR3nfIgNqhWMpB0mYBlzALyXKTg,11
39
+ collective.tiles.carousel-1.0.4.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.40.0)
2
+ Generator: bdist_wheel (0.43.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,3 +0,0 @@
1
- import sys, types, os;has_mfs = sys.version_info > (3, 5);p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('collective',));importlib = has_mfs and __import__('importlib.util');has_mfs and __import__('importlib.machinery');m = has_mfs and sys.modules.setdefault('collective', importlib.util.module_from_spec(importlib.machinery.PathFinder.find_spec('collective', [os.path.dirname(p)])));m = m or sys.modules.setdefault('collective', types.ModuleType('collective'));mp = (m or []) and m.__dict__.setdefault('__path__',[]);(p not in mp) and mp.append(p)
2
- import sys, types, os;has_mfs = sys.version_info > (3, 5);p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('collective',));importlib = has_mfs and __import__('importlib.util');has_mfs and __import__('importlib.machinery');m = has_mfs and sys.modules.setdefault('collective', importlib.util.module_from_spec(importlib.machinery.PathFinder.find_spec('collective', [os.path.dirname(p)])));m = m or sys.modules.setdefault('collective', types.ModuleType('collective'));mp = (m or []) and m.__dict__.setdefault('__path__',[]);(p not in mp) and mp.append(p)
3
- import sys, types, os;has_mfs = sys.version_info > (3, 5);p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('collective', 'tiles'));importlib = has_mfs and __import__('importlib.util');has_mfs and __import__('importlib.machinery');m = has_mfs and sys.modules.setdefault('collective.tiles', importlib.util.module_from_spec(importlib.machinery.PathFinder.find_spec('collective.tiles', [os.path.dirname(p)])));m = m or sys.modules.setdefault('collective.tiles', types.ModuleType('collective.tiles'));mp = (m or []) and m.__dict__.setdefault('__path__',[]);(p not in mp) and mp.append(p);m and setattr(sys.modules['collective'], 'tiles', m)
@@ -1,38 +0,0 @@
1
- collective.tiles.carousel-1.0.2-py3.11-nspkg.pth,sha256=Vq44M1ox8wdw3b0VK_LUaGmCPYCr7x699rOAClrxCbs,1762
2
- collective/tiles/carousel/__init__.py,sha256=J9-8Hj1ymQi5g5IecTHwgRxzlYuFyIDJDVDoNs3IWjQ,118
3
- collective/tiles/carousel/configure.zcml,sha256=Xf51g0Waj8P9EbJzS6PWlXGc00X9huuBYV97z3_ey68,1782
4
- collective/tiles/carousel/interfaces.py,sha256=erGd_4DSscSVyQCdzdWNABmPxuUBV1vwKvz6_m5BCc4,249
5
- collective/tiles/carousel/setuphandlers.py,sha256=xS14jPrTbbqKOvYpxRR77uIM0hbY6H3RgzLovbjGy38,593
6
- collective/tiles/carousel/testing.py,sha256=A7AkCV9Z3Z5EQ40Bbrk1KSagdDuQjYPDcFZSo3siDnI,1686
7
- collective/tiles/carousel/tile.pt,sha256=tRjItcqSfT7MqIh5JM0aW_eVV_orYHHAzf67KqJhzkk,3560
8
- collective/tiles/carousel/tile.py,sha256=NEA_4iXQzWeKc3wV0RyyK9PXh40dtihjCga4Ret2LZU,13267
9
- collective/tiles/carousel/utils.py,sha256=ApwPwtC3Ww9Stm-zncHYkfpOvk4x7ism2Fl8wE54kdg,1833
10
- collective/tiles/carousel/locales/README.rst,sha256=fS2h1MYp7b5Im-GcnIsZLHhK1N4F-_VuHBf_DorI2_A,611
11
- collective/tiles/carousel/locales/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
- collective/tiles/carousel/locales/collective.tiles.carousel.pot,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
- collective/tiles/carousel/locales/update.py,sha256=jynjlAH6iDEu_33RfLPZahmfdX9nhVeD3jWIIw75vKY,1726
14
- collective/tiles/carousel/locales/update.sh,sha256=ZGzBK0W3foiqphsq8fHnnCpfsVqkQmNVn8GhsT7sYDk,512
15
- collective/tiles/carousel/locales/en/LC_MESSAGES/collective.tiles.carousel.po,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
- collective/tiles/carousel/profiles/default/browserlayer.xml,sha256=C1ZbYm9g7o6ar5eLz0lVEFTCtzQBo7pbsKOY3jzt4pU,200
17
- collective/tiles/carousel/profiles/default/metadata.xml,sha256=27DT54kAJb0JP4GtC3n5gtg89-Q_RSzu0_pmQYZpias,185
18
- collective/tiles/carousel/profiles/default/registry/mosaic.xml,sha256=GFD7PTXzyTRiZrb7CYWQF6ZkssLfOj3_rdFAZYqkLZg,2272
19
- collective/tiles/carousel/profiles/uninstall/browserlayer.xml,sha256=vBmB9Ia9G1qMplDWGufmhuE_UwW0P5jJrt-rVB7MJEU,135
20
- collective/tiles/carousel/slides/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
- collective/tiles/carousel/slides/configure.zcml,sha256=muwpjbEZAUbGzliFY1X9kMlCalngcjweWBKEcNszCxs,866
22
- collective/tiles/carousel/slides/slide_full_view.pt,sha256=Ad-h042ygx7hyKdH5wa8B0o7FYTwWDXLma7pnMRXyak,91
23
- collective/tiles/carousel/slides/slide_full_view.py,sha256=XhEDm8tUJO3yvaWNF_7BK4VbBevM6kM2OrNw7wCvyDk,359
24
- collective/tiles/carousel/slides/slide_view.pt,sha256=62KqoYY6QxngUXYwHlGHHBMlp71kc9BIsi5DhioY3oI,526
25
- collective/tiles/carousel/slides/slide_view.py,sha256=-pswsPb98dfnx-JekpPaQNwyvd1ng9xIaT1cZ9dToBc,3168
26
- collective/tiles/carousel/slides/static/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
- collective/tiles/carousel/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
- collective/tiles/carousel/tests/test_robot.py,sha256=VPu3DguHGk-5srPM-N9BZj4dALjotYup8RWZ-QRdbpQ,947
29
- collective/tiles/carousel/tests/test_setup.py,sha256=EySGVe2gxRJHO34oAWyscBd8ZrdFv8cbtxpqyzGoOek,2228
30
- collective/tiles/carousel/tests/robot/test_example.robot,sha256=RjktU-NOhxH3xDxc_Tn91wLAVcuQQ2aNnMEV5oHOKFw,2032
31
- collective.tiles.carousel-1.0.2.dist-info/LICENSE.GPL,sha256=gXf5dRMhNSbfLPYYTY_5hsZ1r7UU1OaKQEAQUhuIBkM,18092
32
- collective.tiles.carousel-1.0.2.dist-info/LICENSE.rst,sha256=iDVL_6C7byshRvxykg-JJfnJl1UQCvKDV_H-1dp_8GU,668
33
- collective.tiles.carousel-1.0.2.dist-info/METADATA,sha256=2NSf7MMOSyi5JIlWJu7udUpfsm4rAZPf-VsyYOPTyV4,3240
34
- collective.tiles.carousel-1.0.2.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92
35
- collective.tiles.carousel-1.0.2.dist-info/entry_points.txt,sha256=ru0hdDg0GqdaMNDkHf3l7rtXvCkgCOmh7S-EiRWIpUk,130
36
- collective.tiles.carousel-1.0.2.dist-info/namespace_packages.txt,sha256=AiVC9ju6UYs_UE8dvyfAvQmRsFgWG25eyAfTG-nLAjM,28
37
- collective.tiles.carousel-1.0.2.dist-info/top_level.txt,sha256=FyC0xnd95fkjCaKazR3nfIgNqhWMpB0mYBlzALyXKTg,11
38
- collective.tiles.carousel-1.0.2.dist-info/RECORD,,