imio.smartweb.core 1.2.84__py3-none-any.whl → 1.2.86__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 (25) hide show
  1. imio/smartweb/core/contents/sections/common_templates/carousel.pt +1 -0
  2. imio/smartweb/core/contents/sections/common_templates/table.pt +1 -0
  3. imio/smartweb/core/contents/sections/configure.zcml +18 -0
  4. imio/smartweb/core/contents/sections/events/view.py +5 -0
  5. imio/smartweb/core/contents/sections/files/view.py +10 -0
  6. imio/smartweb/core/contents/sections/gallery/view.pt +1 -1
  7. imio/smartweb/core/contents/sections/gallery/views.py +11 -0
  8. imio/smartweb/core/contents/sections/links/view.py +10 -0
  9. imio/smartweb/core/contents/sections/macros.pt +6 -0
  10. imio/smartweb/core/contents/sections/news/view.py +5 -0
  11. imio/smartweb/core/contents/sections/video/views.py +52 -1
  12. imio/smartweb/core/contents/sections/views.py +12 -0
  13. imio/smartweb/core/tests/resources/json_news_raw_mock.json +361 -0
  14. imio/smartweb/core/tests/test_section_gallery.py +75 -0
  15. imio/smartweb/core/tests/test_sections.py +15 -3
  16. imio/smartweb/core/tests/test_utils.py +19 -0
  17. imio/smartweb/core/utils.py +18 -0
  18. {imio.smartweb.core-1.2.84.dist-info → imio.smartweb.core-1.2.86.dist-info}/METADATA +40 -2
  19. {imio.smartweb.core-1.2.84.dist-info → imio.smartweb.core-1.2.86.dist-info}/RECORD +25 -23
  20. {imio.smartweb.core-1.2.84.dist-info → imio.smartweb.core-1.2.86.dist-info}/WHEEL +1 -1
  21. /imio.smartweb.core-1.2.84-py3.12-nspkg.pth → /imio.smartweb.core-1.2.86-py3.12-nspkg.pth +0 -0
  22. {imio.smartweb.core-1.2.84.dist-info → imio.smartweb.core-1.2.86.dist-info}/LICENSE.GPL +0 -0
  23. {imio.smartweb.core-1.2.84.dist-info → imio.smartweb.core-1.2.86.dist-info}/LICENSE.rst +0 -0
  24. {imio.smartweb.core-1.2.84.dist-info → imio.smartweb.core-1.2.86.dist-info}/namespace_packages.txt +0 -0
  25. {imio.smartweb.core-1.2.84.dist-info → imio.smartweb.core-1.2.86.dist-info}/top_level.txt +0 -0
@@ -49,6 +49,7 @@
49
49
  <a tal:omit-tag="not: item/url"
50
50
  tal:attributes="href item/url;
51
51
  class item/container_id | nothing;
52
+ title python:view.a_tag_item_title(item);
52
53
  target python:'_blank' if (open_in_new_tab and not can_edit_sections) else ''">
53
54
  <div class="swiper-image"
54
55
  tal:condition="python: item_has_image and show_lead_image"
@@ -59,6 +59,7 @@
59
59
  tal:attributes="class string:table_display ${item/container_id | nothing} ${item/smartweb_type | nothing};"
60
60
  >
61
61
  <a tal:attributes="class python:'table_image no-image' if no_icon_no_image else 'table_image';
62
+ title python:view.a_tag_item_title(item);
62
63
  href python:view.retrieve_item_url(item);
63
64
  target python:'_blank' if (open_in_new_tab and not can_edit_sections) else '';">
64
65
  <tal:if tal:condition="show_lead_image">
@@ -54,6 +54,24 @@
54
54
  layer="imio.smartweb.core.interfaces.IImioSmartwebCoreLayer"
55
55
  />
56
56
 
57
+ <browser:page
58
+ name="refresh_modification_date"
59
+ for="imio.smartweb.core.contents.ISectionNews"
60
+ class=".views.SectionView"
61
+ attribute="refresh_modification_date"
62
+ permission="cmf.ModifyPortalContent"
63
+ layer="imio.smartweb.core.interfaces.IImioSmartwebCoreLayer"
64
+ />
65
+
66
+ <browser:page
67
+ name="refresh_modification_date"
68
+ for="imio.smartweb.core.contents.ISectionEvents"
69
+ class=".views.SectionView"
70
+ attribute="refresh_modification_date"
71
+ permission="cmf.ModifyPortalContent"
72
+ layer="imio.smartweb.core.interfaces.IImioSmartwebCoreLayer"
73
+ />
74
+
57
75
  <browser:page
58
76
  for="*"
59
77
  name="getsizes"
@@ -2,6 +2,7 @@
2
2
 
3
3
  from datetime import date
4
4
  from dateutil.parser import parse
5
+ from DateTime import DateTime
5
6
  from imio.smartweb.common.utils import translate_vocabulary_term
6
7
  from imio.smartweb.core.config import EVENTS_URL
7
8
  from imio.smartweb.core.contents.sections.views import CarouselOrTableSectionView
@@ -9,6 +10,7 @@ from imio.smartweb.core.contents.sections.views import HashableJsonSectionView
9
10
  from imio.smartweb.core.utils import batch_results
10
11
  from imio.smartweb.core.utils import get_json
11
12
  from imio.smartweb.core.utils import hash_md5
13
+ from imio.smartweb.core.utils import remove_cache_key
12
14
  from plone import api
13
15
  from Products.CMFPlone.utils import normalizeString
14
16
 
@@ -26,6 +28,7 @@ class EventsView(CarouselOrTableSectionView, HashableJsonSectionView):
26
28
  selected_item = "&".join(
27
29
  [f"UID={event_uid}" for event_uid in specific_related_events]
28
30
  )
31
+ modified_hash = hash_md5(str(self.context.modification_date))
29
32
  params = [
30
33
  selected_item,
31
34
  "metadata_fields=container_uid",
@@ -37,6 +40,7 @@ class EventsView(CarouselOrTableSectionView, HashableJsonSectionView):
37
40
  "metadata_fields=has_leadimage",
38
41
  "metadata_fields=modified",
39
42
  "metadata_fields=UID",
43
+ f"cache_key={modified_hash}",
40
44
  f"event_dates.query={today}",
41
45
  "event_dates.range=min",
42
46
  f"b_size={max_items}",
@@ -50,6 +54,7 @@ class EventsView(CarouselOrTableSectionView, HashableJsonSectionView):
50
54
  ]
51
55
  url = "{}/@events?{}".format(EVENTS_URL, "&".join(params))
52
56
  self.json_data = get_json(url)
57
+ self.json_data = remove_cache_key(self.json_data)
53
58
  self.refresh_modification_date()
54
59
  if self.json_data is None or len(self.json_data.get("items", [])) == 0:
55
60
  return []
@@ -3,9 +3,11 @@ from imio.smartweb.core.contents import IPublication
3
3
  from imio.smartweb.core.contents.sections.views import CarouselOrTableSectionView
4
4
  from imio.smartweb.core.utils import batch_results
5
5
  from imio.smartweb.core.utils import get_scale_url
6
+ from imio.smartweb.locales import SmartwebMessageFactory as _
6
7
  from plone import api
7
8
  from plone.protect.interfaces import IDisableCSRFProtection
8
9
  from zope.component import queryMultiAdapter
10
+ from zope.i18n import translate
9
11
  from zope.interface import alsoProvides
10
12
 
11
13
 
@@ -32,6 +34,7 @@ class FilesView(CarouselOrTableSectionView):
32
34
  "url": url,
33
35
  "image": scale_url,
34
36
  "has_image": has_image,
37
+ "open_in_new_tab": True,
35
38
  }
36
39
  dict_item["item_infos"] = (
37
40
  None if file_view is None else file_view.human_readable_size()
@@ -62,3 +65,10 @@ class FilesView(CarouselOrTableSectionView):
62
65
  for prop in extra_properties:
63
66
  dict_item[prop] = getattr(item, prop, None)
64
67
  return dict_item
68
+
69
+ def a_tag_item_title(self, item):
70
+ # Files always open in a new tab
71
+ title = item.get("title") or ""
72
+ current_lang = api.portal.get_current_language()[:2]
73
+ new_tab_txt = translate(_("New tab"), target_language=current_lang)
74
+ return f"{title} ({new_tab_txt})"
@@ -38,7 +38,7 @@
38
38
  title item/title;
39
39
  data-description item/description">
40
40
  <img tal:attributes="src python:view.get_scale_url(item, thumb_scale);
41
- alt item/title;
41
+ alt python:view.alt_label(item);
42
42
  title item/title" />
43
43
  </a>
44
44
  </tal:images>
@@ -11,3 +11,14 @@ class GalleryView(SectionView, PhotoGallery):
11
11
  def get_scale_url(self, item, scale, orientation="paysage"):
12
12
  request = self.request
13
13
  return get_scale_url(item, request, "image", scale, orientation)
14
+
15
+ def alt_label(self, item):
16
+ title = item.title or ""
17
+ description = item.description or ""
18
+ # Accessibility: if title is the same as the filename, return empty string because, filename is not a good practice in alt tag for an img.
19
+ if item.image and title == item.image.filename and len(description) == 0:
20
+ title = ""
21
+ # Accessibility : Return description if longer is same or greater than title.
22
+ if len(description) >= len(title):
23
+ return description
24
+ return title
@@ -3,7 +3,9 @@
3
3
  from imio.smartweb.core.contents.sections.views import CarouselOrTableSectionView
4
4
  from imio.smartweb.core.utils import batch_results
5
5
  from imio.smartweb.core.utils import get_scale_url
6
+ from imio.smartweb.locales import SmartwebMessageFactory as _
6
7
  from plone import api
8
+ from zope.i18n import translate
7
9
 
8
10
 
9
11
  class LinksView(CarouselOrTableSectionView):
@@ -41,3 +43,11 @@ class LinksView(CarouselOrTableSectionView):
41
43
  }
42
44
  )
43
45
  return batch_results(results, self.context.nb_results_by_batch)
46
+
47
+ def a_tag_item_title(self, item):
48
+ title = item.get("title") or ""
49
+ if item.get("open_in_new_tab", False):
50
+ current_lang = api.portal.get_current_language()[:2]
51
+ new_tab_txt = translate(_("New tab"), target_language=current_lang)
52
+ return f"{title} ({new_tab_txt})"
53
+ return title
@@ -98,6 +98,12 @@
98
98
  </span>
99
99
  </tal:dates>
100
100
 
101
+ <tal:if tal:condition="python:context.portal_type in ['imio.smartweb.SectionNews', 'imio.smartweb.SectionEvents']">
102
+ <span class="glyphicon-repeat glyphicon"></span>
103
+ <a tal:attributes="href string:${context/absolute_url}/refresh_modification_date"
104
+ i18n:translate="">Refresh section</a>
105
+ </tal:if>
106
+
101
107
  </div>
102
108
  </div>
103
109
 
@@ -1,5 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
+ from DateTime import DateTime
3
4
  from imio.smartweb.common.utils import translate_vocabulary_term
4
5
  from imio.smartweb.core.config import NEWS_URL
5
6
  from imio.smartweb.core.contents.sections.views import CarouselOrTableSectionView
@@ -7,6 +8,7 @@ from imio.smartweb.core.contents.sections.views import HashableJsonSectionView
7
8
  from imio.smartweb.core.utils import batch_results
8
9
  from imio.smartweb.core.utils import get_json
9
10
  from imio.smartweb.core.utils import hash_md5
11
+ from imio.smartweb.core.utils import remove_cache_key
10
12
  from plone import api
11
13
  from Products.CMFPlone.utils import normalizeString
12
14
 
@@ -23,6 +25,7 @@ class NewsView(CarouselOrTableSectionView, HashableJsonSectionView):
23
25
  selected_item = "&".join(
24
26
  [f"UID={newsitem_uid}" for newsitem_uid in specific_related_newsitems]
25
27
  )
28
+ modified_hash = hash_md5(str(self.context.modification_date))
26
29
  params = [
27
30
  selected_item,
28
31
  "portal_type=imio.news.NewsItem",
@@ -34,6 +37,7 @@ class NewsView(CarouselOrTableSectionView, HashableJsonSectionView):
34
37
  "metadata_fields=modified",
35
38
  "metadata_fields=effective",
36
39
  "metadata_fields=UID",
40
+ f"cache_key={modified_hash}",
37
41
  f"sort_limit={max_items}",
38
42
  ]
39
43
  current_lang = api.portal.get_current_language()[:2]
@@ -46,6 +50,7 @@ class NewsView(CarouselOrTableSectionView, HashableJsonSectionView):
46
50
  ]
47
51
  url = "{}/@search?{}".format(NEWS_URL, "&".join(params))
48
52
  self.json_data = get_json(url)
53
+ self.json_data = remove_cache_key(self.json_data)
49
54
  self.refresh_modification_date()
50
55
  if self.json_data is None or len(self.json_data.get("items", [])) == 0:
51
56
  return []
@@ -1,10 +1,61 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
  from embeddify import Embedder
4
+ from embeddify import Vimeo
5
+ from embeddify import YouTube
6
+ from embeddify.embeddify import STANDARD_PLUGINS
4
7
  from imio.smartweb.core.contents.sections.views import SectionView
8
+ from imio.smartweb.locales import SmartwebMessageFactory as _
9
+ from plone import api
10
+ from zope.i18n import translate
11
+
12
+ import html
5
13
 
6
14
 
7
15
  class VideoView(SectionView):
8
16
  def get_embed_video(self, width=800, height=600):
9
- embedder = Embedder(width=width, height=height)
17
+ plugins = STANDARD_PLUGINS
18
+ plugins = [
19
+ SmartwebYoutube() if isinstance(plugin, YouTube) else plugin
20
+ for plugin in plugins
21
+ ]
22
+ plugins = [
23
+ SmartwebVimeo() if isinstance(plugin, Vimeo) else plugin
24
+ for plugin in plugins
25
+ ]
26
+ embedder = Embedder(width=width, height=height, plugins=plugins)
10
27
  return embedder(self.context.video_url, params=dict(autoplay=False))
28
+
29
+
30
+ class SmartwebYoutube(YouTube):
31
+
32
+ def do_request(self, parts, config):
33
+ if self.test(parts):
34
+ res = super(SmartwebYoutube, self).do_request(parts, config)
35
+ title = res.get("title", "")
36
+ current_lang = api.portal.get_current_language()[:2]
37
+ additional_accessibility_info = translate(
38
+ _("Youtube video"), target_language=current_lang
39
+ )
40
+ res["title"] = f"{title} ({additional_accessibility_info})"
41
+ if title != "":
42
+ res["html"] = res["html"].replace(html.escape(title), res["title"])
43
+ return res
44
+ return
45
+
46
+
47
+ class SmartwebVimeo(Vimeo):
48
+
49
+ def do_request(self, parts, config):
50
+ if self.test(parts):
51
+ res = super(SmartwebVimeo, self).do_request(parts, config)
52
+ title = res.get("title", "")
53
+ current_lang = api.portal.get_current_language()[:2]
54
+ additional_accessibility_info = translate(
55
+ _("Vimeo video"), target_language=current_lang
56
+ )
57
+ res["title"] = f"{title} ({additional_accessibility_info})"
58
+ if title != "":
59
+ res["html"] = res["html"].replace(html.escape(title), res["title"])
60
+ return res
61
+ return
@@ -58,6 +58,14 @@ class SectionView(BrowserView):
58
58
  api.portal.show_message(_("Section title has been shown"), self.request)
59
59
  self.redirect_to_section(self.context.id)
60
60
 
61
+ def refresh_modification_date(self):
62
+ alsoProvides(self.request, IDisableCSRFProtection)
63
+ modified(self.context)
64
+ api.portal.show_message(
65
+ _("Section modification date has been refreshed"), self.request
66
+ )
67
+ self.redirect_to_section(self.context.id)
68
+
61
69
  @property
62
70
  def display_container_title(self):
63
71
  return False
@@ -100,6 +108,10 @@ class SectionView(BrowserView):
100
108
  )
101
109
  return json.dumps({"id": section_size, "title": size_txt})
102
110
 
111
+ def a_tag_item_title(self, item):
112
+ title = item.get("title") or ""
113
+ return title
114
+
103
115
 
104
116
  class CarouselOrTableSectionView(SectionView):
105
117
  """Section view that can display a carousel"""
@@ -0,0 +1,361 @@
1
+ {
2
+ "@id": "http://localhost:8080/Plone/@search?selected_news_folders=3b1a50f17b7047f7bb0fc75cf5ad7329&portal_type=imio.news.NewsItem&metadata_fields=category_title&metadata_fields=topics&metadata_fields=has_leadimage&metadata_fields=UID&metadata_fields=container_uid&metadata_fields=local_category&metadata_fields=modified&metadata_fields=effective&cache_key=0158244a017b01923cecc32d0613e46e",
3
+ "batching": {
4
+ "@id": "http://localhost:8080/Plone/@search?selected_news_folders=3b1a50f17b7047f7bb0fc75cf5ad7329&portal_type=imio.news.NewsItem&metadata_fields=category_title&metadata_fields=topics&metadata_fields=has_leadimage&metadata_fields=UID&metadata_fields=container_uid&metadata_fields=local_category&metadata_fields=modified&metadata_fields=effective&cache_key=0158244a017b01923cecc32d0613e46e&sort_limit=9&sort_on=effective&sort_order=descending",
5
+ "first": "http://localhost:8080/Plone/@search?b_start=0&selected_news_folders=3b1a50f17b7047f7bb0fc75cf5ad7329&portal_type=imio.news.NewsItem&metadata_fields=category_title&metadata_fields=topics&metadata_fields=has_leadimage&metadata_fields=UID&metadata_fields=container_uid&metadata_fields=local_category&metadata_fields=modified&metadata_fields=effective&cache_key=0158244a017b01923cecc32d0613e46e&sort_limit=9&sort_on=effective&sort_order=descending",
6
+ "last": "http://localhost:8080/Plone/@search?b_start=25&selected_news_folders=3b1a50f17b7047f7bb0fc75cf5ad7329&portal_type=imio.news.NewsItem&metadata_fields=category_title&metadata_fields=topics&metadata_fields=has_leadimage&metadata_fields=UID&metadata_fields=container_uid&metadata_fields=local_category&metadata_fields=modified&metadata_fields=effective&cache_key=0158244a017b01923cecc32d0613e46e&sort_limit=9&sort_on=effective&sort_order=descending",
7
+ "next": "http://localhost:8080/Plone/@search?b_start=25&selected_news_folders=3b1a50f17b7047f7bb0fc75cf5ad7329&portal_type=imio.news.NewsItem&metadata_fields=category_title&metadata_fields=topics&metadata_fields=has_leadimage&metadata_fields=UID&metadata_fields=container_uid&metadata_fields=local_category&metadata_fields=modified&metadata_fields=effective&cache_key=0158244a017b01923cecc32d0613e46e&sort_limit=9&sort_on=effective&sort_order=descending"
8
+ },
9
+ "items": [
10
+ {
11
+ "@id": "http://localhost:8080/Plone/belleville/commune/66ae76b8f652426089e237ee603386a2",
12
+ "@type": "imio.news.NewsItem",
13
+ "UID": "0505534d249c48a2b99713a7ac211ebe",
14
+ "category_title": null,
15
+ "container_uid": "f110a339e3b84561bc61962a9742b705",
16
+ "description": "Cybers\u00e9curit\u00e9 et e-gouvernement seront au coeur de l'iMio Day 2025, journ\u00e9e de conf\u00e9rences et d'ateliers interactifs pour les pouvoirs locaux wallons.",
17
+ "effective": "2025-01-30T07:30:00+00:00",
18
+ "has_leadimage": true,
19
+ "image_field": null,
20
+ "image_scales": {
21
+ "image": [
22
+ {
23
+ "content-type": "image/jpeg",
24
+ "download": "@@images/image-800-63339b1cf1fa99e483e2d22118838976.jpeg",
25
+ "filename": "imio-day-news.jpg",
26
+ "height": 567,
27
+ "scales": {
28
+ "carre_affiche": {
29
+ "download": "@@images/image-750-9b875e4ec5fac53cc1c3819436f9f6de.jpeg",
30
+ "height": 531,
31
+ "width": 750
32
+ },
33
+ "carre_liste": {
34
+ "download": "@@images/image-167-75c17e711259f2bf690953f8da94e166.jpeg",
35
+ "height": 118,
36
+ "width": 167
37
+ },
38
+ "carre_vignette": {
39
+ "download": "@@images/image-430-0fe2e5e1f941ab0a06f168e36f0e2354.jpeg",
40
+ "height": 304,
41
+ "width": 430
42
+ },
43
+ "icon": {
44
+ "download": "@@images/image-32-63570e5e551edbf00756dc83f3c175b8.jpeg",
45
+ "height": 22,
46
+ "width": 32
47
+ },
48
+ "large": {
49
+ "download": "@@images/image-768-6ff498338f7766f67c1706aab38c499a.jpeg",
50
+ "height": 544,
51
+ "width": 768
52
+ },
53
+ "listing": {
54
+ "download": "@@images/image-16-19207497efaeee9c1cbcfacc8b34a0ca.jpeg",
55
+ "height": 11,
56
+ "width": 16
57
+ },
58
+ "mini": {
59
+ "download": "@@images/image-200-e051498e2896e0b0e0e238f390d7e0ad.jpeg",
60
+ "height": 141,
61
+ "width": 200
62
+ },
63
+ "paysage_affiche": {
64
+ "download": "@@images/image-750-1bed9c113c6fb72251eece6b3715ad12.jpeg",
65
+ "height": 448,
66
+ "width": 632
67
+ },
68
+ "paysage_liste": {
69
+ "download": "@@images/image-167-cb1fbeb03984f81f82331d95f7220b62.jpeg",
70
+ "height": 100,
71
+ "width": 141
72
+ },
73
+ "paysage_vignette": {
74
+ "download": "@@images/image-430-eb01854c72f779c0e1af385cbe70de06.jpeg",
75
+ "height": 257,
76
+ "width": 363
77
+ },
78
+ "portrait_affiche": {
79
+ "download": "@@images/image-448-3bdd59fe0bc2c51557a362bcc7d1698e.jpeg",
80
+ "height": 317,
81
+ "width": 448
82
+ },
83
+ "portrait_liste": {
84
+ "download": "@@images/image-222-70fc7ff043421cbe10a50b9149bb40f0.jpeg",
85
+ "height": 157,
86
+ "width": 222
87
+ },
88
+ "portrait_vignette": {
89
+ "download": "@@images/image-448-3bdd59fe0bc2c51557a362bcc7d1698e.jpeg",
90
+ "height": 317,
91
+ "width": 448
92
+ },
93
+ "preview": {
94
+ "download": "@@images/image-400-592dedf61a5e8cd7e32cd309db88ccdc.jpeg",
95
+ "height": 283,
96
+ "width": 400
97
+ },
98
+ "thumb": {
99
+ "download": "@@images/image-128-558227cc08bb21c7d0b1ffa9bf0e27bd.jpeg",
100
+ "height": 90,
101
+ "width": 128
102
+ },
103
+ "tile": {
104
+ "download": "@@images/image-64-30d47052707adb48f3ec0e8b2b31b4a9.jpeg",
105
+ "height": 45,
106
+ "width": 64
107
+ }
108
+ },
109
+ "size": 222334,
110
+ "width": 800
111
+ }
112
+ ]
113
+ },
114
+ "local_category": null,
115
+ "modified": "2025-01-30T07:47:51+00:00",
116
+ "review_state": "published",
117
+ "title": "Ne ratez pas l'iMio Day du 13 f\u00e9vrier 2025 !",
118
+ "topics": null,
119
+ "type_title": "Actualit\u00e9",
120
+ "usefull_container_id": "commune",
121
+ "usefull_container_title": "Actualit\u00e9s de la commune"
122
+ },
123
+ {
124
+ "@id": "http://localhost:8080/Plone/belleville/commune/0767749eaf85441a8179303768f48ef2",
125
+ "@type": "imio.news.NewsItem",
126
+ "UID": "0767749eaf85441a8179303768f48ef2",
127
+ "category_title": null,
128
+ "container_uid": "f110a339e3b84561bc61962a9742b705",
129
+ "description": "",
130
+ "effective": "2025-01-14T14:07:06+00:00",
131
+ "has_leadimage": true,
132
+ "image_field": null,
133
+ "image_scales": {
134
+ "image": [
135
+ {
136
+ "content-type": "image/jpeg",
137
+ "download": "@@images/image-1920-0d28d8fef7ef4c6f46a185fd428a8a01.jpeg",
138
+ "filename": "motion-blur-g10d7a49bc_1920.jpg",
139
+ "height": 1279,
140
+ "scales": {
141
+ "banner": {
142
+ "download": "@@images/image-1920-1a0c7ac40882f46d5e5bd82542cd2bc3.jpeg",
143
+ "height": 1279,
144
+ "width": 1920
145
+ },
146
+ "carre_affiche": {
147
+ "download": "@@images/image-750-e2037c7eadaf2518e6fabe9c55570a43.jpeg",
148
+ "height": 499,
149
+ "width": 750
150
+ },
151
+ "carre_liste": {
152
+ "download": "@@images/image-167-b28c2562e2a234fb758a272e8cd2cfb8.jpeg",
153
+ "height": 111,
154
+ "width": 167
155
+ },
156
+ "carre_vignette": {
157
+ "download": "@@images/image-430-406b324c9324298c12da47de2e809bd3.jpeg",
158
+ "height": 286,
159
+ "width": 430
160
+ },
161
+ "icon": {
162
+ "download": "@@images/image-32-6fe71d6d2b377d659dbd031d3640eee8.jpeg",
163
+ "height": 21,
164
+ "width": 32
165
+ },
166
+ "large": {
167
+ "download": "@@images/image-768-c533dfefc4dab171ab67f91675346f37.jpeg",
168
+ "height": 511,
169
+ "width": 768
170
+ },
171
+ "listing": {
172
+ "download": "@@images/image-16-203636a735d8132c4e0be847b85343a6.jpeg",
173
+ "height": 10,
174
+ "width": 16
175
+ },
176
+ "mini": {
177
+ "download": "@@images/image-200-73a7abcb2d44f086523030a10902a972.jpeg",
178
+ "height": 133,
179
+ "width": 200
180
+ },
181
+ "paysage_affiche": {
182
+ "download": "@@images/image-750-4d6fa1004b2c148eaa85074c51bd26d8.jpeg",
183
+ "height": 448,
184
+ "width": 673
185
+ },
186
+ "paysage_liste": {
187
+ "download": "@@images/image-167-aa74a3ecc21959d849aa60e795b00cad.jpeg",
188
+ "height": 100,
189
+ "width": 150
190
+ },
191
+ "paysage_vignette": {
192
+ "download": "@@images/image-430-28ef12d29b66bb5c65b6f70b58943fc1.jpeg",
193
+ "height": 257,
194
+ "width": 386
195
+ },
196
+ "portrait_affiche": {
197
+ "download": "@@images/image-448-8613bdd585e702eba2a4a4d5fa66b013.jpeg",
198
+ "height": 298,
199
+ "width": 448
200
+ },
201
+ "portrait_liste": {
202
+ "download": "@@images/image-222-6f24b9a8a93b3d30e2dfb352962e9937.jpeg",
203
+ "height": 147,
204
+ "width": 222
205
+ },
206
+ "portrait_vignette": {
207
+ "download": "@@images/image-448-8613bdd585e702eba2a4a4d5fa66b013.jpeg",
208
+ "height": 298,
209
+ "width": 448
210
+ },
211
+ "preview": {
212
+ "download": "@@images/image-400-86c0a78163a36fb1fccff82b0cd58781.jpeg",
213
+ "height": 266,
214
+ "width": 400
215
+ },
216
+ "thumb": {
217
+ "download": "@@images/image-128-9e55ef22fea075a0211c335f39cdd91a.jpeg",
218
+ "height": 85,
219
+ "width": 128
220
+ },
221
+ "tile": {
222
+ "download": "@@images/image-64-570f49fe16b3a55e953eb555e8002cc5.jpeg",
223
+ "height": 42,
224
+ "width": 64
225
+ }
226
+ },
227
+ "size": 261649,
228
+ "width": 1920
229
+ }
230
+ ]
231
+ },
232
+ "local_category": null,
233
+ "modified": "2025-01-14T14:07:06+00:00",
234
+ "review_state": "published",
235
+ "title": "Le Caching Web : Optimisation des Performances",
236
+ "topics": null,
237
+ "type_title": "Actualit\u00e9",
238
+ "usefull_container_id": "commune",
239
+ "usefull_container_title": "Actualit\u00e9s de la commune"
240
+ },
241
+ {
242
+ "@id": "http://localhost:8080/Plone/belleville/commune/01678b36a5c14de08c0048a4e60960b6",
243
+ "@type": "imio.news.NewsItem",
244
+ "UID": "01678b36a5c14de08c0048a4e60960b6",
245
+ "category_title": null,
246
+ "container_uid": "f110a339e3b84561bc61962a9742b705",
247
+ "description": "Cette actualit\u00e9 est vraiment urgente",
248
+ "effective": "2025-01-14T12:40:00+00:00",
249
+ "has_leadimage": true,
250
+ "image_field": null,
251
+ "image_scales": {
252
+ "image": [
253
+ {
254
+ "content-type": "image/jpeg",
255
+ "download": "@@images/image-1920-bdb33a542ba3c3fa6a22a42b852d2ef5.jpeg",
256
+ "filename": "meadow-g92ecd61e0_1920.jpg",
257
+ "height": 1280,
258
+ "scales": {
259
+ "banner": {
260
+ "download": "@@images/image-1920-b65b0609f5d6758fbacbde2b23557b06.jpeg",
261
+ "height": 1280,
262
+ "width": 1920
263
+ },
264
+ "carre_affiche": {
265
+ "download": "@@images/image-750-b1582bdedef66b480c23485c7127b6be.jpeg",
266
+ "height": 500,
267
+ "width": 750
268
+ },
269
+ "carre_liste": {
270
+ "download": "@@images/image-167-c8a42e802696e7482095aa488c4394f7.jpeg",
271
+ "height": 111,
272
+ "width": 167
273
+ },
274
+ "carre_vignette": {
275
+ "download": "@@images/image-430-142b5f6c63148c8770b9fea68fe24df3.jpeg",
276
+ "height": 286,
277
+ "width": 430
278
+ },
279
+ "icon": {
280
+ "download": "@@images/image-32-6cc24c2d5ace4616b574db5b932a87ef.jpeg",
281
+ "height": 21,
282
+ "width": 32
283
+ },
284
+ "large": {
285
+ "download": "@@images/image-768-8f92dbb808d056cb5b1d5181b6d8194b.jpeg",
286
+ "height": 512,
287
+ "width": 768
288
+ },
289
+ "listing": {
290
+ "download": "@@images/image-16-b8e4b8a391de69be69ce347ffb23d3c7.jpeg",
291
+ "height": 10,
292
+ "width": 16
293
+ },
294
+ "mini": {
295
+ "download": "@@images/image-200-b8ae70b47662de08ad2ddad51ecf0729.jpeg",
296
+ "height": 133,
297
+ "width": 200
298
+ },
299
+ "paysage_affiche": {
300
+ "download": "@@images/image-750-109a22ed750b2f9cd2d37e8fa5031ed6.jpeg",
301
+ "height": 448,
302
+ "width": 672
303
+ },
304
+ "paysage_liste": {
305
+ "download": "@@images/image-167-d81cf3ac0f9b0d6c6d153e35733a4719.jpeg",
306
+ "height": 100,
307
+ "width": 150
308
+ },
309
+ "paysage_vignette": {
310
+ "download": "@@images/image-430-6c5129a3abcac460e8da4fd71de2f6f4.jpeg",
311
+ "height": 257,
312
+ "width": 386
313
+ },
314
+ "portrait_affiche": {
315
+ "download": "@@images/image-448-6c15b19eb0947c6532e21681494e9ab4.jpeg",
316
+ "height": 298,
317
+ "width": 448
318
+ },
319
+ "portrait_liste": {
320
+ "download": "@@images/image-222-98bce7ad7e0a55b3cd5b199e1e9e7f1f.jpeg",
321
+ "height": 148,
322
+ "width": 222
323
+ },
324
+ "portrait_vignette": {
325
+ "download": "@@images/image-448-6c15b19eb0947c6532e21681494e9ab4.jpeg",
326
+ "height": 298,
327
+ "width": 448
328
+ },
329
+ "preview": {
330
+ "download": "@@images/image-400-d9d488dd1677386f0107d79c1565f5ae.jpeg",
331
+ "height": 266,
332
+ "width": 400
333
+ },
334
+ "thumb": {
335
+ "download": "@@images/image-128-0419c932370ccfdc495871dd991a9b55.jpeg",
336
+ "height": 85,
337
+ "width": 128
338
+ },
339
+ "tile": {
340
+ "download": "@@images/image-64-f5524890af469fd078ca929b5387130b.jpeg",
341
+ "height": 42,
342
+ "width": 64
343
+ }
344
+ },
345
+ "size": 759049,
346
+ "width": 1920
347
+ }
348
+ ]
349
+ },
350
+ "local_category": null,
351
+ "modified": "2025-02-07T10:09:10+00:00",
352
+ "review_state": "published",
353
+ "title": "Une actualit\u00e9 tr\u00e8s urgente.",
354
+ "topics": null,
355
+ "type_title": "Actualit\u00e9",
356
+ "usefull_container_id": "commune",
357
+ "usefull_container_title": "Actualit\u00e9s de la commune"
358
+ }
359
+ ],
360
+ "items_total": 51
361
+ }
@@ -0,0 +1,75 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ from imio.smartweb.core.testing import IMIO_SMARTWEB_CORE_INTEGRATION_TESTING
4
+ from imio.smartweb.core.testing import ImioSmartwebTestCase
5
+ from imio.smartweb.core.tests.utils import make_named_image
6
+ from plone import api
7
+ from plone.app.testing import login
8
+ from plone.app.testing import logout
9
+ from plone.app.testing import setRoles
10
+ from plone.app.testing import TEST_USER_ID
11
+ from plone.namedfile.file import NamedBlobImage
12
+ from zope.component import queryMultiAdapter
13
+
14
+
15
+ class TestSectionGallery(ImioSmartwebTestCase):
16
+ layer = IMIO_SMARTWEB_CORE_INTEGRATION_TESTING
17
+
18
+ def setUp(self):
19
+ self.request = self.layer["request"]
20
+ self.portal = self.layer["portal"]
21
+ setRoles(self.portal, TEST_USER_ID, ["Manager"])
22
+ self.page = api.content.create(
23
+ container=self.portal,
24
+ type="imio.smartweb.Page",
25
+ id="page",
26
+ )
27
+
28
+ def test_alt_label(self):
29
+ gallery_section = api.content.create(
30
+ container=self.page,
31
+ type="imio.smartweb.SectionGallery",
32
+ title="Gallery section",
33
+ )
34
+ blob_image = NamedBlobImage(**make_named_image("plone.png"))
35
+
36
+ # image1 has no defined title (by default img blob filename) and no description
37
+ image1 = api.content.create(
38
+ container=gallery_section,
39
+ type="Image",
40
+ title="plone.png",
41
+ )
42
+ image1.image = blob_image
43
+
44
+ # image2 has a defined title and no description
45
+ image2 = api.content.create(
46
+ container=gallery_section,
47
+ type="Image",
48
+ title="Kamoulox",
49
+ )
50
+ image2.image = blob_image
51
+
52
+ # image3 has a defined title and description (greater than title)
53
+ image3 = api.content.create(
54
+ container=gallery_section,
55
+ type="Image",
56
+ title="Hello Plone !",
57
+ )
58
+ image3.image = blob_image
59
+ image3.description = "Hello Plone, what's up ?!"
60
+
61
+ # image4 has a defined title and a mistaked blank description (smaller than title)
62
+ image4 = api.content.create(
63
+ container=gallery_section,
64
+ type="Image",
65
+ title="Hello Plone !",
66
+ )
67
+ # This is a mistaked blank description
68
+ image4.image = blob_image
69
+ image4.description = " "
70
+
71
+ view = queryMultiAdapter((gallery_section, self.request), name="view")
72
+ self.assertEqual(view.alt_label(image1), "")
73
+ self.assertEqual(view.alt_label(image2), "Kamoulox")
74
+ self.assertEqual(view.alt_label(image3), "Hello Plone, what's up ?!")
75
+ self.assertEqual(view.alt_label(image4), "Hello Plone !")
@@ -116,6 +116,14 @@ class TestSections(ImioSmartwebTestCase):
116
116
  self.assertIn(
117
117
  "https://www.youtube.com/embed/_dOAthafoGQ?feature=oembed", embedded_video
118
118
  )
119
+ self.assertIn("(Youtube video)", embedded_video)
120
+
121
+ section.video_url = "https://vimeo.com/110990510"
122
+ view = queryMultiAdapter((section, self.request), name="view")
123
+ embedded_video = view.get_embed_video()
124
+ self.assertIn("iframe", embedded_video)
125
+ self.assertIn("https://player.vimeo.com/video/110990510", embedded_video)
126
+ self.assertIn("(Vimeo video)", embedded_video)
119
127
 
120
128
  def test_external_content_section(self):
121
129
  setRoles(self.portal, TEST_USER_ID, ["Contributor"])
@@ -283,6 +291,7 @@ class TestSections(ImioSmartwebTestCase):
283
291
  logout()
284
292
  view = queryMultiAdapter((page, self.request), name="full_view")()
285
293
  self.assertEqual(view.count('<h2 class="section-title">Title of my '), 5)
294
+
286
295
  login(self.portal, "test")
287
296
  gallery_section = getattr(page, "title-of-my-imio-smartweb-sectiongallery")
288
297
  api.content.create(
@@ -290,6 +299,7 @@ class TestSections(ImioSmartwebTestCase):
290
299
  type="Image",
291
300
  title="Image",
292
301
  )
302
+
293
303
  files_section = getattr(page, "title-of-my-imio-smartweb-sectionfiles")
294
304
  file_obj = api.content.create(
295
305
  container=files_section,
@@ -297,12 +307,14 @@ class TestSections(ImioSmartwebTestCase):
297
307
  title="My file",
298
308
  )
299
309
  file_obj.file = NamedBlobFile(data="file data", filename="file.txt")
310
+
300
311
  links_section = getattr(page, "title-of-my-imio-smartweb-sectionlinks")
301
312
  api.content.create(
302
313
  container=links_section,
303
314
  type="imio.smartweb.BlockLink",
304
315
  title="My link",
305
316
  )
317
+
306
318
  view = queryMultiAdapter((page, self.request), name="full_view")()
307
319
  self.assertEqual(
308
320
  view.count('<h2 class="section-title">Title of my '), len(section_types)
@@ -531,12 +543,12 @@ class TestSections(ImioSmartwebTestCase):
531
543
  )
532
544
  view = getMultiAdapter((self.page, self.request), name="full_view")
533
545
  self.assertIn(
534
- '<a class="table_image no-image" href="http://nohost/plone/page/section-links/my-link" target="">',
546
+ '<a class="table_image no-image" title="My link" href="http://nohost/plone/page/section-links/my-link" target="">',
535
547
  view(),
536
548
  )
537
549
  link.image = NamedBlobImage(**make_named_image())
538
550
  self.assertIn(
539
- '<a class="table_image" href="http://nohost/plone/page/section-links/my-link" target="">',
551
+ '<a class="table_image" title="My link" href="http://nohost/plone/page/section-links/my-link" target="">',
540
552
  view(),
541
553
  )
542
554
  link.open_in_new_tab = True
@@ -548,7 +560,7 @@ class TestSections(ImioSmartwebTestCase):
548
560
  clear_cache(self.request)
549
561
  view = getMultiAdapter((self.page, self.request), name="full_view")
550
562
  self.assertIn(
551
- '<a class="table_image" href="http://nohost/plone/page/section-links/my-link" target="_blank">',
563
+ '<a class="table_image" title="My link (New tab)" href="http://nohost/plone/page/section-links/my-link" target="_blank">',
552
564
  view(),
553
565
  )
554
566
  link.remoteUrl = "http://www.perdu.com"
@@ -6,6 +6,8 @@ from imio.smartweb.core.testing import ImioSmartwebTestCase
6
6
  from imio.smartweb.core.tests.utils import make_named_image
7
7
  from imio.smartweb.core.utils import batch_results
8
8
  from imio.smartweb.core.utils import get_scale_url
9
+ from imio.smartweb.core.utils import remove_cache_key
10
+ from imio.smartweb.core.tests.utils import get_json
9
11
  from plone import api
10
12
  from plone.app.testing import setRoles
11
13
  from plone.app.testing import TEST_USER_ID
@@ -92,3 +94,20 @@ class TestUtils(ImioSmartwebTestCase):
92
94
  get_scale_url(brain, self.request, "image", "portrait_affiche", "portrait"),
93
95
  "http://nohost/plone/page/@@images/image/portrait_affiche?cache_key=78fd1bab198354b6877aed44e2ea0b4d",
94
96
  )
97
+
98
+ def test_remove_cache_key(self):
99
+ self.json_news = get_json("resources/json_news_raw_mock.json")
100
+ self.assertIn("cache_key", self.json_news["@id"])
101
+ for key in ["@id", "first", "last", "next"]:
102
+ if key in self.json_news["batching"] and isinstance(
103
+ self.json_news["batching"][key], str
104
+ ):
105
+ self.assertIn("cache_key", self.json_news["batching"][key])
106
+ self.json_news = remove_cache_key(self.json_news)
107
+
108
+ self.assertNotIn("cache_key", self.json_news["@id"])
109
+ for key in ["@id", "first", "last", "next"]:
110
+ if key in self.json_news["batching"] and isinstance(
111
+ self.json_news["batching"][key], str
112
+ ):
113
+ self.assertNotIn("cache_key", self.json_news["batching"][key])
@@ -228,3 +228,21 @@ def get_iadeliberation_json(url):
228
228
  json = get_json(url, auth=f"Basic {b64Val.decode('utf-8')}", timeout=20)
229
229
 
230
230
  return json
231
+
232
+
233
+ def remove_cache_key(json_data: dict) -> dict:
234
+ pattern = re.compile(r"&cache_key=[a-f0-9]{32}")
235
+ if json_data is None:
236
+ return json_data
237
+ if "@id" in json_data and isinstance(json_data["@id"], str):
238
+ json_data["@id"] = pattern.sub("", json_data["@id"])
239
+
240
+ # Nested keys inside 'batching'
241
+ if "batching" in json_data and isinstance(json_data["batching"], dict):
242
+ for key in ["@id", "first", "last", "next"]:
243
+ if key in json_data["batching"] and isinstance(
244
+ json_data["batching"][key], str
245
+ ):
246
+ json_data["batching"][key] = pattern.sub("", json_data["batching"][key])
247
+
248
+ return json_data
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: imio.smartweb.core
3
- Version: 1.2.84
3
+ Version: 1.2.86
4
4
  Summary: Core product for iMio websites
5
5
  Home-page: https://github.com/imio/imio.smartweb.core
6
6
  Author: Christophe Boulanger
@@ -57,6 +57,18 @@ Requires-Dist: plone.restapi[test]; extra == "test"
57
57
  Requires-Dist: requests-mock; extra == "test"
58
58
  Requires-Dist: beautifulsoup4; extra == "test"
59
59
  Requires-Dist: freezegun; extra == "test"
60
+ Dynamic: author
61
+ Dynamic: author-email
62
+ Dynamic: classifier
63
+ Dynamic: description
64
+ Dynamic: home-page
65
+ Dynamic: keywords
66
+ Dynamic: license
67
+ Dynamic: project-url
68
+ Dynamic: provides-extra
69
+ Dynamic: requires-dist
70
+ Dynamic: requires-python
71
+ Dynamic: summary
60
72
 
61
73
  .. This README is meant for consumption by humans and pypi. Pypi can render rst files so please do not use Sphinx features.
62
74
  If you want to learn more about writing documentation, please check out: http://docs.plone.org/about/documentation_styleguide.html
@@ -191,6 +203,32 @@ Changelog
191
203
  =========
192
204
 
193
205
 
206
+ 1.2.86 (2025-02-10)
207
+ -------------------
208
+
209
+ - WEB-4153 : Add a refresh_modification_date view to refresh the modification date of SectionEvents and SectionNews
210
+ [remdub]
211
+
212
+ - WEB-4153 : Add a cache key on SectionEvents and SectionNews requests to refresh the cache when the section is modified
213
+ [remdub]
214
+
215
+
216
+ 1.2.85 (2025-02-10)
217
+ -------------------
218
+
219
+ - WEB-3538 : Accessibility : Add video source information in title attribute of the iframe
220
+ [boulch]
221
+
222
+ - WEB-4217 : Accessibility : Warn the user that the link will open in a new tab (title attribute)
223
+ [boulch]
224
+
225
+ - WEB-3872 : Accessibility : Files in "files section" are automaticaly open in a new (target blank) tab
226
+ [boulch]
227
+
228
+ - WEB-4211 : Accessibility : Improve behavior of the "alt" attribute for images in a gallery section
229
+ [boulch]
230
+
231
+
194
232
  1.2.84 (2025-01-29)
195
233
  -------------------
196
234
 
@@ -1,4 +1,4 @@
1
- imio.smartweb.core-1.2.84-py3.12-nspkg.pth,sha256=XZ3YhlzwpUCC8tXtelHRqxVxo3NWomIiMsUfUshrbeE,1011
1
+ imio.smartweb.core-1.2.86-py3.12-nspkg.pth,sha256=XZ3YhlzwpUCC8tXtelHRqxVxo3NWomIiMsUfUshrbeE,1011
2
2
  imio/smartweb/core/__init__.py,sha256=iwhKnzeBJLKxpRVjvzwiRE63_zNpIBfaKLITauVph-0,24
3
3
  imio/smartweb/core/config.py,sha256=BUgfvh4hCaw0onCYAG4gQI1O4hZ-GzXWEltdHi4YLIs,337
4
4
  imio/smartweb/core/configure.zcml,sha256=PeC4rF--rF6MfVQ0NzggQrZWIl35oPtJdEhvQwGxhhI,1459
@@ -12,7 +12,7 @@ imio/smartweb/core/subscribers.py,sha256=zOmwTw0XvE6_bdoZI7qQln_W__7MxXCnKh6QwNK
12
12
  imio/smartweb/core/subscribers.zcml,sha256=BnrxZp4AfsRYreYHsJJxKgPQZJ-wpNM2XnDTuDUbBkA,1616
13
13
  imio/smartweb/core/testing.py,sha256=t0Y3t3FXX2RjgklcRzHT37AjKbMKL3ZjjT3d2UhQm7A,3636
14
14
  imio/smartweb/core/testing.zcml,sha256=VyKjWW2QHYuUYKkGUvtsdFI_Pa7Wcp1yBBDla112eMc,172
15
- imio/smartweb/core/utils.py,sha256=dQzbLYiJh55dtQ0qekQNr2tPCiXVABiMPjTpcf2zj3U,7685
15
+ imio/smartweb/core/utils.py,sha256=ToipQdzA1WnX8SLKIwaWhH7JraOBU89Q7ez2AJfAng8,8364
16
16
  imio/smartweb/core/vocabularies.py,sha256=ZzdnK7m0dPogoKSrtdTjsxCQjaSqgVDAL9YPWMOHync,22905
17
17
  imio/smartweb/core/vocabularies.zcml,sha256=KSH7JWlAJtKawLvfmsztZzE_AK1JR6B5udY6tleY2cQ,5904
18
18
  imio/smartweb/core/behaviors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -238,16 +238,16 @@ imio/smartweb/core/contents/rest/search/configure.zcml,sha256=BTFcBQ28NINyEfoVgY
238
238
  imio/smartweb/core/contents/rest/search/endpoint.py,sha256=i5LMM0R1Xvpy76JHO6pI98G41Xep15fPR9uv9rqropo,9797
239
239
  imio/smartweb/core/contents/sections/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
240
240
  imio/smartweb/core/contents/sections/base.py,sha256=2e3lIG_RGGFAshBEkTNG97OReAnn9GLQk_O_Eqh7SRY,2486
241
- imio/smartweb/core/contents/sections/configure.zcml,sha256=fPfYvU7YvezfjKPRT_yPcZgjmyUX9VZFb-6jUJiERqM,2767
242
- imio/smartweb/core/contents/sections/macros.pt,sha256=tvWBh40KuwWpOAu327NWZAwixvpWMMKdaOyIxMp0o-k,5579
241
+ imio/smartweb/core/contents/sections/configure.zcml,sha256=ApBAc2UyCmttliYs4BAC_ovaZXW4vz78LBPUaSGkpEk,3379
242
+ imio/smartweb/core/contents/sections/macros.pt,sha256=zlIgvxE5t0d6DKVrRzPHh058nmo6AmxiUUbGtEmL2KM,5923
243
243
  imio/smartweb/core/contents/sections/subscriber.py,sha256=WM7nEZVPOkmyT1GfkWGDWwLhuhUYaTnlBr6BJVqUJMk,642
244
- imio/smartweb/core/contents/sections/views.py,sha256=739Mm8cNrHz_JUdCD-x80tQXuxj2DocqpjYL19TxcnY,5977
244
+ imio/smartweb/core/contents/sections/views.py,sha256=0KA81s4rDfxTbT-CrxOv01uZ0dv2BDYeejjAvh7BIL8,6378
245
245
  imio/smartweb/core/contents/sections/collection/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
246
246
  imio/smartweb/core/contents/sections/collection/configure.zcml,sha256=Ak4UbKFjogWZad6-5_y6oSx8tWXt3nN7bEdKXG7pQCI,920
247
247
  imio/smartweb/core/contents/sections/collection/content.py,sha256=DMmU9rIaRlbRjIaot5RHXu59vJmAbun0FCmyahWhBCM,2379
248
248
  imio/smartweb/core/contents/sections/collection/views.py,sha256=G8Q7zlFmuEKKCmAGLj5cVL3axebzf5ZlSVRYx9q45U4,1470
249
- imio/smartweb/core/contents/sections/common_templates/carousel.pt,sha256=vcRaxpkNYQHjyIcLJEiOPEZ2yOvZKkXr_28utTbDk5U,5694
250
- imio/smartweb/core/contents/sections/common_templates/table.pt,sha256=_s0F0PfUSvvuj6malb9EMgAel3YW83rxJGTC7Iq4gbI,7475
249
+ imio/smartweb/core/contents/sections/common_templates/carousel.pt,sha256=7TiEYMm090RGS55f77aUOfGJmAoP3zI6XCWtYQ6SWxA,5774
250
+ imio/smartweb/core/contents/sections/common_templates/table.pt,sha256=_XPptTPmlO1AbyFDVvYQ6ysOKU2s_NQGgTBHnFNDNnA,7558
251
251
  imio/smartweb/core/contents/sections/contact/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
252
252
  imio/smartweb/core/contents/sections/contact/configure.zcml,sha256=WjyGXO7alNf4yDW5dZCS_xQ_AYbQVQuRVRIeoyLIBzY,1591
253
253
  imio/smartweb/core/contents/sections/contact/content.py,sha256=MdhY6QPMdCseThddjwZ0e7xzkx1-p21MBuwqEic1f90,2690
@@ -260,7 +260,7 @@ imio/smartweb/core/contents/sections/events/__init__.py,sha256=47DEQpj8HBSa-_TIm
260
260
  imio/smartweb/core/contents/sections/events/configure.zcml,sha256=FCDIf6w-2qCPqq0QUodw8-xyAopq7l6O8zoU_uMHNwg,1117
261
261
  imio/smartweb/core/contents/sections/events/content.py,sha256=aolTpBgOCKu4EHLQUFjOkFN7YpJId0Wpj_iH5AZ9Vvk,3246
262
262
  imio/smartweb/core/contents/sections/events/macros.pt,sha256=llSq-xstFiOXctseKDwvhVCM7A1_Z1Jq-_cUgNiBe10,1522
263
- imio/smartweb/core/contents/sections/events/view.py,sha256=Jjs93_6uVCJsDMHwnmBC0mRpLYfysPa-_iOCiUCJFj8,4520
263
+ imio/smartweb/core/contents/sections/events/view.py,sha256=Tl92dalLryRuilVfu0MRAQ51jkfHuQTpCsPT-u3q4fE,4774
264
264
  imio/smartweb/core/contents/sections/external_content/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
265
265
  imio/smartweb/core/contents/sections/external_content/configure.zcml,sha256=6ZvD4hJiXMZM2-mz9D7ipZcphS5HKJFREG9XUzF_6ms,1651
266
266
  imio/smartweb/core/contents/sections/external_content/content.py,sha256=apHtfPwxkHkLQJVFVXs4F8O0gE09uI49AFQ8xRFrXgo,1096
@@ -273,12 +273,12 @@ imio/smartweb/core/contents/sections/external_content/views.py,sha256=KPOjV4HBXH
273
273
  imio/smartweb/core/contents/sections/files/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
274
274
  imio/smartweb/core/contents/sections/files/configure.zcml,sha256=DyyHzDEKLWmOywbV08Zf7bvf0At5jyAeDfZ8PCK5Rog,501
275
275
  imio/smartweb/core/contents/sections/files/content.py,sha256=C3jEokoNKIE-1cQlaWD-aKLfPDG6k8YasJeZxOR8swk,1088
276
- imio/smartweb/core/contents/sections/files/view.py,sha256=zIbPyNT07vqcI9_m9WE2eFgcSoxiO8zCc8oeRt-3aZc,2583
276
+ imio/smartweb/core/contents/sections/files/view.py,sha256=dGS1dqfq-J-kBz1UZWoFPF6czeBR_woDrEX5l0BxNY4,3017
277
277
  imio/smartweb/core/contents/sections/gallery/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
278
278
  imio/smartweb/core/contents/sections/gallery/configure.zcml,sha256=0fq5_PWU9vFrmPkExvFPBCzZrDSnlN8B0K7fHQReAvA,424
279
279
  imio/smartweb/core/contents/sections/gallery/content.py,sha256=l6HLGVNi70gcEP-zz9OXi2WYtyd-V6LCAZH44a2Td_s,780
280
- imio/smartweb/core/contents/sections/gallery/view.pt,sha256=3GLYQdPukj3bj07b5tTTQr98e8JYk5NjixihR4BZ8Eo,2058
281
- imio/smartweb/core/contents/sections/gallery/views.py,sha256=pQRD2jq1fR4pEhStrbys2xdJHVW6C2sdrqvCHzMvHCE,451
280
+ imio/smartweb/core/contents/sections/gallery/view.pt,sha256=pyBTNWejZfKCH8mVI3ntcN-jh7LdTLQQrGfN5DzojSY,2075
281
+ imio/smartweb/core/contents/sections/gallery/views.py,sha256=EpWWLBUmCq3jMkRdhZMh2Rrw9nAStgXTOApE6OqLXmY,994
282
282
  imio/smartweb/core/contents/sections/html/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
283
283
  imio/smartweb/core/contents/sections/html/configure.zcml,sha256=KsYNQY72doYTDf8Oa-5j147pOJYXqLPPBF7AtvMxDck,413
284
284
  imio/smartweb/core/contents/sections/html/content.py,sha256=6O1fD-6mEo_QEsuOJN80kPTsX0lLXBsqyIk0PBcjn2E,1352
@@ -286,7 +286,7 @@ imio/smartweb/core/contents/sections/html/view.pt,sha256=PY_z5Mn52IygWoMxAIEkbep
286
286
  imio/smartweb/core/contents/sections/links/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
287
287
  imio/smartweb/core/contents/sections/links/configure.zcml,sha256=rE-UWiubwkPYU6VvfxM1AH3UTr06WfsItEG1dSX9G8w,918
288
288
  imio/smartweb/core/contents/sections/links/content.py,sha256=drUefjzRnT3wFxIjVZ31qqaR-BGhWN5ffmcmnEeI5tQ,1051
289
- imio/smartweb/core/contents/sections/links/view.py,sha256=mMjSThkfhGODDBw0Yfv42CB61epDnFGwHzMNNVKCfzA,1664
289
+ imio/smartweb/core/contents/sections/links/view.py,sha256=Vxv12_pt3NpdocARCi1rrry77qU3jkU9YLEXdQoqn_8,2096
290
290
  imio/smartweb/core/contents/sections/map/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
291
291
  imio/smartweb/core/contents/sections/map/configure.zcml,sha256=8ocTq-RfXM7BvGHyHrhySzYAvKhwXrc5lyrABNSb2H0,412
292
292
  imio/smartweb/core/contents/sections/map/content.py,sha256=z5maHOFl0BpzFHRgEVrae7TnW9qU-aRXj_m9Z3CWtd0,372
@@ -295,7 +295,7 @@ imio/smartweb/core/contents/sections/map/views.py,sha256=3Z5oFis2NIByJCHh8bjAlLu
295
295
  imio/smartweb/core/contents/sections/news/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
296
296
  imio/smartweb/core/contents/sections/news/configure.zcml,sha256=8MOIEeI7Zr_wbNVgiMa_21Ohgv_bkpEi_7gJu6NK380,880
297
297
  imio/smartweb/core/contents/sections/news/content.py,sha256=A79d6gfxiqrrL87VPqFz13NYAfTjHbSFNZlpi1kixzE,3261
298
- imio/smartweb/core/contents/sections/news/view.py,sha256=VNhsyqAkVVLV1101Wp9mSIfL-i_U3oYM_Quq7YlQr1E,4147
298
+ imio/smartweb/core/contents/sections/news/view.py,sha256=RZOVu160AINgtdNTs2eA4NahN4qRASfWVka_2hEu9qs,4401
299
299
  imio/smartweb/core/contents/sections/postit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
300
300
  imio/smartweb/core/contents/sections/postit/configure.zcml,sha256=Q0Szs1pmrNP2OiRROpeSQPKLV3tCpyjqZa9vwNFTK9Q,504
301
301
  imio/smartweb/core/contents/sections/postit/content.py,sha256=--bqQPsjpKuqMzOb21eOERjp2a2QehGTAsBvZ3FnQMA,2239
@@ -324,7 +324,7 @@ imio/smartweb/core/contents/sections/video/__init__.py,sha256=47DEQpj8HBSa-_TImW
324
324
  imio/smartweb/core/contents/sections/video/configure.zcml,sha256=fB2sr0jyVajOXCIuQuDVzAGm-KV5yRpxFvEyrLm3CEE,418
325
325
  imio/smartweb/core/contents/sections/video/content.py,sha256=zWba02hLpdbzvbXoRDw4wgnABZ5w6iwmEb6Jd_-rpEU,978
326
326
  imio/smartweb/core/contents/sections/video/view.pt,sha256=RFya2M82XzAcV5UwJfAcamLmsv-n8Egwn1BEmWhE8lg,1105
327
- imio/smartweb/core/contents/sections/video/views.py,sha256=kyrpigOP6bg9bNHoO-jeU6RYrCzMRKlE6BStKbczy_s,342
327
+ imio/smartweb/core/contents/sections/video/views.py,sha256=4YQQuJonxRUm2DeY3fFo9dzd9owKCkzmKpAys-01yt0,2172
328
328
  imio/smartweb/core/faceted/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
329
329
  imio/smartweb/core/faceted/configure.zcml,sha256=xuZzXBOMGu87KNLuFIQ8gHz8fxct7lDwSbCHl1Y1Hec,826
330
330
  imio/smartweb/core/faceted/layout.py,sha256=9WCr3U7cEy0SmfI1cXBijR1bF4DVXQ684LzGpD-MNMw,395
@@ -428,16 +428,17 @@ imio/smartweb/core/tests/test_search.py,sha256=VryeRI4_5CvnStKOoNoG95M2WTy7Lyy_A
428
428
  imio/smartweb/core/tests/test_section_contact.py,sha256=BiJPxb67d7zURE5Dtk-9xOUbuJitcQ7YnlzDS1sT-cE,27344
429
429
  imio/smartweb/core/tests/test_section_events.py,sha256=7eP-HmXp0D3gvOrjVpzVPmV9nF_PKERnmOGz1G3Z0l0,8641
430
430
  imio/smartweb/core/tests/test_section_external_content.py,sha256=JI_zm3160ryO8a6NjtcmcboUJdJDa7lEX6ommbxlGao,7617
431
+ imio/smartweb/core/tests/test_section_gallery.py,sha256=Hg4QjMm6R6mq0bbCFWOnLOqnzECCOWAHiOCvhee3hZE,2687
431
432
  imio/smartweb/core/tests/test_section_news.py,sha256=6S7-r6ZnpeN_JdLYLZMWbHKRzeuf5ynPWnox2DDFPZk,9126
432
433
  imio/smartweb/core/tests/test_section_sendinblue.py,sha256=UmmKo33T9feelumxqeejM4HG4oLRPKJkbB8hkLO144E,2661
433
- imio/smartweb/core/tests/test_sections.py,sha256=7lxfneqdJku9sX5u_4Pvg9DWcmMFOE7KH04ojIqdcGQ,24767
434
+ imio/smartweb/core/tests/test_sections.py,sha256=zOILZHSXOw7vk-6QaibjIrbbfOAeDRk1iSgYI47TGgU,25249
434
435
  imio/smartweb/core/tests/test_setup.py,sha256=JcbMnXTNCuB_8grFh5E1kZ0uALdATlKMbahAdGfToZI,2092
435
436
  imio/smartweb/core/tests/test_sitemap.py,sha256=AhFvUhzpkUg5XAwVcK3obXXrOEJYwhQZC3XrWeZtnP0,6674
436
437
  imio/smartweb/core/tests/test_social.py,sha256=GVHkF4c8Ygnm09J1aGxhklbtd6b-1Fy8M7NnYmjRvfI,3046
437
438
  imio/smartweb/core/tests/test_subsite.py,sha256=wiD8Ke4_-ArstSYNLCs8ArqOuDx2xxUR6Wac3GXfnbE,9016
438
439
  imio/smartweb/core/tests/test_text.py,sha256=DtZNNGJ-MDYbJ-YQj2C0q2Hr7t4-sUbV6SWkE7tihBY,4652
439
440
  imio/smartweb/core/tests/test_toolbar.py,sha256=dxwOGNOg2wPkAnPU3hqGCI6VL2D2nPOIOtbMorvjfps,3823
440
- imio/smartweb/core/tests/test_utils.py,sha256=CkRkK3SbT4oQx_-Nq2Z0AhmhzR4kk2BkIZqSbIiPU04,4125
441
+ imio/smartweb/core/tests/test_utils.py,sha256=W_gR8ZOecscA6f86qrcOeQVGCzdyqhlzP6TgQI5ah2g,5045
441
442
  imio/smartweb/core/tests/test_vocabularies.py,sha256=1oF4rFc9kd1baUMHBor5wX9_tR7fcziQ6rvcENjyNDU,16956
442
443
  imio/smartweb/core/tests/test_vocabulary.py,sha256=9S3BtVIJbN1o0q2qMcX8k0CdUwixmc3DBs_s5qFrJwA,1648
443
444
  imio/smartweb/core/tests/utils.py,sha256=hsDrWOxL0oNNyx92Hke9Kj9ByKzc2kZ19q9QPVsNud4,2688
@@ -461,6 +462,7 @@ imio/smartweb/core/tests/resources/json_iadeliberations_publication.json,sha256=
461
462
  imio/smartweb/core/tests/resources/json_iadeliberations_publications.json,sha256=JsY4rynmLwpnmOEvvqhyoSQ0USUvNv3wGRYOGEKRThY,17115
462
463
  imio/smartweb/core/tests/resources/json_news_entities_raw_mock.json,sha256=InbDt8kUmVBsfCTyfn5M6qqC1j8z5RB8Edg7hIWRv0g,726
463
464
  imio/smartweb/core/tests/resources/json_news_newsfolder_raw_mock.json,sha256=JpryCi1tpJPAoqnF9c2ZPtcQc4R_ottDRiyU-z2x3FQ,783
465
+ imio/smartweb/core/tests/resources/json_news_raw_mock.json,sha256=P5KPoC_uJB3HaYY4t4J07uPjh58b-pxZD4ZrlKR1Gr4,15865
464
466
  imio/smartweb/core/tests/resources/json_no_contact_raw_mock.json,sha256=tfcIZuQi1Lz8HV8EV93Qp1pUr9KbKATxu4MHnpiZSrc,127
465
467
  imio/smartweb/core/tests/resources/json_no_newsfolder_raw_mock.json,sha256=qC4sfb5JCGTtZpM6a0t0_k1IADu_oyOazK7fow1gMCU,168
466
468
  imio/smartweb/core/tests/resources/json_procedures_raw_mock.json,sha256=eMrKdEMFtSzpRmAF-PT-YMEXAoi3H0GozMli6znQGuU,3217
@@ -756,10 +758,10 @@ imio/smartweb/core/webcomponents/src/utils/Map.jsx,sha256=cYuZykMIaLjr4KiLvmS4aY
756
758
  imio/smartweb/core/webcomponents/src/utils/Map.scss,sha256=xXWz0O-JBwSZrzz2XeQdN4nZEOjppU2sVFtlLQOitQ8,77
757
759
  imio/smartweb/core/webcomponents/src/utils/translation.js,sha256=5YDHwdaRNWFWOgyNd7YejoAdcDvnvAENo3Xn0GDT8P8,8941
758
760
  imio/smartweb/core/webcomponents/src/utils/url.js,sha256=iyl_1QXfPBgUn0LEbZYT_zMEEjmj5DMiEz44Z6AKLcg,244
759
- imio.smartweb.core-1.2.84.dist-info/LICENSE.GPL,sha256=gXf5dRMhNSbfLPYYTY_5hsZ1r7UU1OaKQEAQUhuIBkM,18092
760
- imio.smartweb.core-1.2.84.dist-info/LICENSE.rst,sha256=RzkMFz6AX3-cHd531zd2YQcXai8RIbjFWTs6m66Y5u4,653
761
- imio.smartweb.core-1.2.84.dist-info/METADATA,sha256=alCP5U7_-Zpi5R2qfvYdJhnKoWIFvNdh6qKFJlN7gbI,59541
762
- imio.smartweb.core-1.2.84.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
763
- imio.smartweb.core-1.2.84.dist-info/namespace_packages.txt,sha256=Pg8AH8t9viMMW1hJbNZvTy_n2jXG2igIYUpon5RA4Js,19
764
- imio.smartweb.core-1.2.84.dist-info/top_level.txt,sha256=ZktC0EGzThvMTAin9_q_41rzvvfMT2FYbP8pbhSLMSA,5
765
- imio.smartweb.core-1.2.84.dist-info/RECORD,,
761
+ imio.smartweb.core-1.2.86.dist-info/LICENSE.GPL,sha256=gXf5dRMhNSbfLPYYTY_5hsZ1r7UU1OaKQEAQUhuIBkM,18092
762
+ imio.smartweb.core-1.2.86.dist-info/LICENSE.rst,sha256=RzkMFz6AX3-cHd531zd2YQcXai8RIbjFWTs6m66Y5u4,653
763
+ imio.smartweb.core-1.2.86.dist-info/METADATA,sha256=o-etgfTICb5MaroIhxy03nNga9k3s5DUSTeMkCYdYZc,60571
764
+ imio.smartweb.core-1.2.86.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
765
+ imio.smartweb.core-1.2.86.dist-info/namespace_packages.txt,sha256=Pg8AH8t9viMMW1hJbNZvTy_n2jXG2igIYUpon5RA4Js,19
766
+ imio.smartweb.core-1.2.86.dist-info/top_level.txt,sha256=ZktC0EGzThvMTAin9_q_41rzvvfMT2FYbP8pbhSLMSA,5
767
+ imio.smartweb.core-1.2.86.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.6.0)
2
+ Generator: setuptools (75.8.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5