Skip to content

Commit ebd5e45

Browse files
committed
WEB-4165 : SEO : Improve sitemap.xml.gz generation to include new seo_html views
1 parent 43e3df5 commit ebd5e45

File tree

10 files changed

+79
-38
lines changed

10 files changed

+79
-38
lines changed

CHANGES.rst

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ Changelog
55
1.4.11 (unreleased)
66
-------------------
77

8-
- Nothing changed yet.
8+
- WEB-4165 : SEO : Improve sitemap.xml.gz generation to include new seo_html views
9+
and some other seo improvements
10+
[boulch]
911

1012

1113
1.4.10 (2025-08-07)

src/imio/smartweb/core/browser/sitemap.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from imio.smartweb.core.contents.rest.events.endpoint import EventsEndpointGet
55
from imio.smartweb.core.contents.rest.news.endpoint import NewsEndpointGet
66
from imio.smartweb.core.interfaces import IImioSmartwebCoreLayer
7+
from imio.smartweb.locales import SmartwebMessageFactory as _
78
from plone.app.layout.navigation.navtree import buildFolderTree
89
from plone.app.layout.sitemap.sitemap import SiteMapView
910
from plone.base.interfaces import IPloneSiteRoot
@@ -76,7 +77,11 @@ def get_endpoint_data(obj, request):
7677
def format_sitemap_items(items, base_url):
7778
"""Format items for sitemap(.xml.gz)"""
7879
formatted_items = []
80+
latest_lastmod = None
81+
item_type = ""
7982
for item in items:
83+
item_type = item.get("@type", "")
84+
lastmod = item.get("lastmod")
8085
item_id = normalizeString(item.get("title"))
8186
item_uid = item.get("UID")
8287
lastmod = item.get("modified") or "1970-01-01T00:00:00Z"
@@ -94,6 +99,29 @@ def format_sitemap_items(items, base_url):
9499
"normalized_portal_type": "imio-smartweb-authsources-item",
95100
}
96101
)
102+
if latest_lastmod is None or lastmod > latest_lastmod:
103+
latest_lastmod = lastmod
104+
seo_title = ""
105+
if item_type == "imio.news.NewsItem":
106+
seo_title = _("News : SEO Links")
107+
elif item_type == "imio.directory.Contact":
108+
seo_title = _("Directory : SEO Links")
109+
else:
110+
seo_title = _("Agenda : SEO Links")
111+
formatted_items.append(
112+
{
113+
"loc": f"{base_url}/seo_html",
114+
"lastmod": latest_lastmod,
115+
"Title": seo_title,
116+
"Description": seo_title,
117+
"getURL": f"{base_url}/seo_html",
118+
"getRemoteUrl": Missing.Value,
119+
"currentItem": False,
120+
"currentParent": False,
121+
"normalized_review_state": "published",
122+
"normalized_portal_type": "imio-smartweb-authsources-root",
123+
}
124+
)
97125
return formatted_items
98126

99127

src/imio/smartweb/core/contents/rest/events/view.pt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
<h1 tal:content="event/name"></h1>
2424
<strong tal:condition="event/period_text" tal:content="event/period_text"></strong>
2525
<p tal:condition="event/description" tal:content="event/description"></p>
26-
<p tal:condition="event/text" tal:content="event/text"></p>
26+
<p tal:condition="event/text" tal:content="structure event/text/data"></p>
2727
<p tal:condition="event/address" tal:content="event/address"></p>
2828
<p tal:condition="event/phone">
2929
<span i18n:translate="label_phone">Phone</span>&nbsp;:&nbsp;

src/imio/smartweb/core/contents/rest/results.pt

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,38 +6,42 @@
66
i18n:domain="imio.smartweb">
77
<body>
88
<metal:main fill-slot="content-core">
9-
<h2 tal:content="view/label">SEO React Links</h2>
9+
<script type="text/javascript" tal:content="structure string:window.location.href='${view/default_view}';">
10+
</script>
11+
<noscript>
12+
<h2 tal:content="view/label">SEO Links</h2>
1013

11-
<ul>
12-
<li tal:repeat="item view/get_data">
13-
<a tal:attributes="href item/getURL" tal:content="item/Title">Link</a>
14-
</li>
15-
</ul>
14+
<ul>
15+
<li tal:repeat="item view/get_data">
16+
<a tal:attributes="href item/getURL" tal:content="item/Title">Link</a>
17+
</li>
18+
</ul>
1619

17-
<div class="batching">
18-
<tal:batch tal:define="start python:view.b_start;
19-
size python:view.b_size;
20-
total python:view.total;
21-
base_url python:context.absolute_url();
22-
has_prev python:start > 0;
23-
has_next python:(start + size) < total;
24-
prev_start python:max(0, start - size);
25-
next_start python:start + size">
20+
<div class="batching">
21+
<tal:batch tal:define="start python:view.b_start;
22+
size python:view.b_size;
23+
total python:view.total;
24+
base_url python:context.absolute_url();
25+
has_prev python:start > 0;
26+
has_next python:(start + size) < total;
27+
prev_start python:max(0, start - size);
28+
next_start python:start + size">
2629

27-
<a tal:condition="has_prev"
28-
i18n:translate="previous"
29-
tal:attributes="href string:${base_url}/seo_html?b_start=${prev_start}&amp;b_size=${size}">
30-
&laquo; Previous
31-
</a>
30+
<a tal:condition="has_prev"
31+
i18n:translate="previous"
32+
tal:attributes="href string:${base_url}/seo_html?b_start=${prev_start}&amp;b_size=${size}">
33+
&laquo; Previous
34+
</a>
3235

33-
<a tal:condition="has_next"
34-
i18n:translate="label_external_url"
35-
tal:attributes="href string:${base_url}/seo_html?b_start=${next_start}&amp;b_size=${size}">
36-
Next &raquo;
37-
</a>
36+
<a tal:condition="has_next"
37+
i18n:translate="label_external_url"
38+
tal:attributes="href string:${base_url}/seo_html?b_start=${next_start}&amp;b_size=${size}">
39+
Next &raquo;
40+
</a>
3841

39-
</tal:batch>
40-
</div>
42+
</tal:batch>
43+
</div>
44+
</noscript>
4145
</metal:main>
4246
</body>
4347
</html>

src/imio/smartweb/core/contents/rest/view.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,15 +118,19 @@ def __call__(self):
118118
self.b_size = b_size
119119
return self.index()
120120

121+
@property
122+
def default_view(self):
123+
return self.context.absolute_url()
124+
121125
@property
122126
def label(self):
123127
label = ""
124128
if IDirectoryView.providedBy(self.context):
125-
label = _("Contacts links")
129+
label = _("Direcotry : SEO links")
126130
elif IEventsView.providedBy(self.context):
127-
label = _("Events links")
131+
label = _("Agenda : SEO links")
128132
elif INewsView.providedBy(self.context):
129-
label = _("News links")
133+
label = _("News : SEO links")
130134
return label
131135

132136
@property

src/imio/smartweb/core/viewlets/configure.zcml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -331,8 +331,8 @@
331331
view="imio.smartweb.core.interfaces.INoIndexedUtils"
332332
manager="plone.app.layout.viewlets.interfaces.IHtmlHead"
333333
layer="imio.smartweb.core.interfaces.IImioSmartwebCoreLayer"
334-
template="no_indexed_header.pt"
335-
class=".header.NoIndexedViewlet"
334+
template="seo_header.pt"
335+
class=".header.SeoViewlet"
336336
permission="zope2.View"
337337
/>
338338

src/imio/smartweb/core/viewlets/header.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class IPortalHeaderTopContainerViewletManager(IViewletManager):
1414
"""Viewlet manager containing top header viewlets"""
1515

1616

17-
class NoIndexedViewlet(HeaderViewlet):
17+
class SeoViewlet(HeaderViewlet):
1818
"""Pages that should not be indexed by search engines"""
1919

2020
def render(self):
@@ -41,6 +41,6 @@ def render(self):
4141
return "\n".join(links)
4242

4343
def update(self):
44-
super(NoIndexedViewlet, self).update()
44+
super(SeoViewlet, self).update()
4545
# This page should not be indexed, we set the X-Robots-Tag header
4646
self.request.response.setHeader("X-Robots-Tag", "noindex, follow")

src/imio/smartweb/core/viewlets/no_indexed_header.pt

Lines changed: 0 additions & 1 deletion
This file was deleted.

src/imio/smartweb/core/viewlets/ogptags.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,10 @@ def set_ogp_informations_for_item(self):
8888
auth_source_url = f"{auth_source_url}/{endpoint}?UID={uid}&{params}"
8989
result_json = get_json(auth_source_url)
9090
if result_json:
91-
self._item = result_json["items"][0]
91+
if isinstance(result_json["items"], list):
92+
self._item = result_json["items"][0]
93+
else:
94+
self._item = result_json["items"]
9295
self._set_image()
9396

9497
def _set_image(self):
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<meta name="robots" content="index, follow">

0 commit comments

Comments
 (0)