Skip to content

Commit 27d9161

Browse files
committed
Add linkintegrity support for canale_digitale_link field in Servizio CT
1 parent 0394359 commit 27d9161

File tree

7 files changed

+95
-7
lines changed

7 files changed

+95
-7
lines changed

CHANGES.rst

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ Changelog
66

77
- Avoid showing items inside cartella modulistica if omitted from navigation.
88
[daniele]
9-
9+
- Add linkintegrity support for canale_digitale_link field in Servizio CT.
10+
[cekk]
1011

1112
6.3.14 (2025-10-31)
1213
-------------------

src/design/plone/contenttypes/adapters/configure.zcml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,7 @@
2323

2424
<adapter factory=".query.ZCatalogCompatibleQueryAdapter" />
2525

26+
<!-- link integrity retriever -->
27+
<adapter factory=".linkintegrity_retriever.ServizioCanaleDigitaleRetriever" />
28+
2629
</configure>
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
"""Link Integrity - link retriever methods."""
2+
3+
from design.plone.contenttypes.interfaces.servizio import IServizio
4+
from plone.app.linkintegrity.interfaces import IRetriever
5+
from zope.component import adapter
6+
from zope.interface import implementer
7+
8+
9+
@implementer(IRetriever)
10+
@adapter(IServizio)
11+
class ServizioCanaleDigitaleRetriever:
12+
""""""
13+
14+
def __init__(self, context):
15+
self.context = context
16+
17+
def retrieveLinks(self):
18+
"""
19+
If canale_digitale_link refers to an internal object, enable linkintegrity
20+
"""
21+
canale_digitale_link = getattr(self.context, "canale_digitale_link", None)
22+
if canale_digitale_link and "resolveuid" in canale_digitale_link:
23+
return [canale_digitale_link]
24+
return []

src/design/plone/contenttypes/profiles/default/metadata.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<metadata>
3-
<version>7315</version>
3+
<version>7320</version>
44
<dependencies>
55
<dependency>profile-redturtle.bandi:default</dependency>
66
<dependency>profile-collective.venue:default</dependency>

src/design/plone/contenttypes/tests/test_ct_servizio.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
# -*- coding: utf-8 -*-
22
"""Setup tests for this package."""
3+
34
from design.plone.contenttypes.testing import (
45
DESIGN_PLONE_CONTENTTYPES_API_FUNCTIONAL_TESTING,
56
)
67
from plone import api
8+
from plone.app.linkintegrity.utils import getIncomingLinks
9+
from plone.app.linkintegrity.utils import getOutgoingLinks
710
from plone.app.testing import setRoles
811
from plone.app.testing import SITE_OWNER_NAME
912
from plone.app.testing import SITE_OWNER_PASSWORD
@@ -338,6 +341,38 @@ def test_servizio_fields_seo_fieldset(self):
338341
],
339342
)
340343

344+
def test_canale_digitale_link_to_object_generate_reference(self):
345+
doc = api.content.create(container=self.portal, type="Document", title="doc")
346+
347+
self.assertEqual(len(list(getIncomingLinks(doc))), 0)
348+
349+
servizio = api.content.create(
350+
container=self.portal,
351+
type="Servizio",
352+
title="servizio",
353+
canale_digitale_link=f"${{portal_url}}/resolveuid/{doc.UID()}",
354+
)
355+
self.assertEqual(len(list(getIncomingLinks(doc))), 1)
356+
self.assertEqual([x.from_object for x in getIncomingLinks(doc)], [servizio])
357+
358+
self.assertEqual(len(list(getOutgoingLinks(servizio))), 1)
359+
self.assertEqual([x.to_object for x in getOutgoingLinks(servizio)], [doc])
360+
361+
def test_canale_digitale_link_to_external_do_not_generate_reference(self):
362+
doc = api.content.create(container=self.portal, type="Document", title="doc")
363+
364+
self.assertEqual(len(list(getIncomingLinks(doc))), 0)
365+
366+
servizio = api.content.create(
367+
container=self.portal,
368+
type="Servizio",
369+
title="servizio",
370+
canale_digitale_link="https://www.plone.org",
371+
)
372+
self.assertEqual(len(list(getIncomingLinks(doc))), 0)
373+
374+
self.assertEqual(len(list(getOutgoingLinks(servizio))), 0)
375+
341376

342377
class TestServizioApi(unittest.TestCase):
343378
"""Test that design.plone.contenttypes is properly installed."""

src/design/plone/contenttypes/upgrades/configure.zcml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -962,4 +962,11 @@
962962
destination="7315"
963963
handler=".to_730x.to_7315"
964964
/>
965+
<genericsetup:upgradeStep
966+
title="Update Servizio canale_digitale_link refrences"
967+
profile="design.plone.contenttypes:default"
968+
source="7315"
969+
destination="7320"
970+
handler=".to_730x.to_7320"
971+
/>
965972
</configure>

src/design/plone/contenttypes/upgrades/to_730x.py

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
# -*- coding: utf-8 -*-
2-
import logging
3-
4-
import transaction
2+
from design.plone.contenttypes.events.common import createStructure
3+
from design.plone.contenttypes.events.common import SUBFOLDERS_MAPPING
4+
from design.plone.contenttypes.utils import create_default_blocks
55
from plone import api
6+
from plone.app.linkintegrity.handlers import getObjectsFromLinks
7+
from plone.app.linkintegrity.handlers import updateReferences
8+
from plone.app.linkintegrity.interfaces import IRetriever
69
from plone.app.upgrade.utils import installOrReinstallProduct
710
from Products.CMFPlone.interfaces import ISelectableConstrainTypes
811

9-
from design.plone.contenttypes.events.common import SUBFOLDERS_MAPPING, createStructure
10-
from design.plone.contenttypes.utils import create_default_blocks
12+
import logging
13+
import transaction
14+
1115

1216
logger = logging.getLogger(__name__)
1317

@@ -284,3 +288,17 @@ def to_7315(context):
284288
else:
285289
logger.info("Index {} already exists".format(name))
286290
logger.info("Reindex Bandi")
291+
292+
293+
def to_7320(context):
294+
brains = api.content.find(portal_type="Servizio")
295+
tot = len(brains)
296+
logger.info("Updating {} Servizio objects".format(tot))
297+
for i, brain in enumerate(brains):
298+
logger.info(f"Progress: {i+1}/{tot}")
299+
servizio = brain.getObject()
300+
retriever = IRetriever(servizio, None)
301+
if retriever is not None:
302+
links = retriever.retrieveLinks()
303+
refs = getObjectsFromLinks(servizio, links)
304+
updateReferences(servizio, refs)

0 commit comments

Comments
 (0)