--- a/src/pyams_content/component/links/__init__.py Sat Jul 21 02:36:35 2018 +0200
+++ b/src/pyams_content/component/links/__init__.py Sat Jul 21 03:34:33 2018 +0200
@@ -16,14 +16,16 @@
# import standard library
# import interfaces
-from pyams_content.component.association.interfaces import IAssociationInfo, IAssociationContainerTarget, IAssociationContainer
+from pyams_content.component.association.interfaces import IAssociationInfo, IAssociationContainerTarget, \
+ IAssociationContainer
from pyams_content.component.links.interfaces import IBaseLink, IInternalLink, IExternalLink, IMailtoLink
from pyams_content.features.checker.interfaces import IContentChecker, ERROR_VALUE
from pyams_content.interfaces import IBaseContent, MANAGE_CONTENT_PERMISSION
from pyams_content.reference.pictograms.interfaces import IPictogramTable
from pyams_form.interfaces.form import IFormContextPermissionChecker
from pyams_i18n.interfaces import II18n
-from pyams_sequence.interfaces import ISequentialIdInfo
+from pyams_sequence.interfaces import ISequentialIdInfo, IInternalReference
+from pyams_skin.layer import IPyAMSUserLayer
from pyams_workflow.interfaces import IWorkflow, IWorkflowPublicationInfo
# import packages
@@ -115,8 +117,27 @@
# Internal links
#
+@implementer(IInternalReference)
+class InternalReferenceMixin(object):
+ """Internal reference mixin class"""
+
+ reference = None
+
+ @volatile_property
+ def target(self):
+ return get_reference_target(self.reference)
+
+ def get_target(self, state=None, request=None):
+ if request is None:
+ request = check_request()
+ if (not state) and not IPyAMSUserLayer.providedBy(request):
+ return self.target
+ else:
+ return get_reference_target(self.reference, state, request)
+
+
@implementer(IInternalLink)
-class InternalLink(BaseLink):
+class InternalLink(BaseLink, InternalReferenceMixin):
"""Internal link persistent class"""
icon_class = 'fa-external-link-square fa-rotate-90'
@@ -124,16 +145,6 @@
reference = FieldProperty(IInternalLink['reference'])
- @volatile_property
- def target(self):
- return get_reference_target(self.reference)
-
- def get_target(self, state=None):
- if not state:
- return self.target
- else:
- return get_reference_target(self.reference, state)
-
def is_visible(self, request=None):
target = self.get_target()
if target is not None:
--- a/src/pyams_content/features/alert/__init__.py Sat Jul 21 02:36:35 2018 +0200
+++ b/src/pyams_content/features/alert/__init__.py Sat Jul 21 03:34:33 2018 +0200
@@ -23,7 +23,7 @@
from pyams_form.interfaces.form import IFormContextPermissionChecker
# import packages
-from pyams_sequence.reference import get_reference_target
+from pyams_content.component.links import InternalReferenceMixin
from pyams_utils.adapter import adapter_config, ContextAdapter
from pyams_utils.registry import query_utility
from pyams_utils.zodb import volatile_property
@@ -33,7 +33,7 @@
@implementer(IAlertItem)
-class AlertItem(Persistent, Contained):
+class AlertItem(Persistent, Contained, InternalReferenceMixin):
"""Alert item persistent class"""
visible = FieldProperty(IAlertItem['visible'])
@@ -61,16 +61,6 @@
table = query_utility(IPictogramTable)
return table.get(self.pictogram_name)
- @volatile_property
- def target(self):
- return get_reference_target(self.reference)
-
- def get_target(self, state=None):
- if not state:
- return self.target
- else:
- return get_reference_target(self.reference)
-
@adapter_config(context=IAlertItem, provides=IFormContextPermissionChecker)
class AlertitemPermissionChecker(ContextAdapter):
--- a/src/pyams_content/features/menu/__init__.py Sat Jul 21 02:36:35 2018 +0200
+++ b/src/pyams_content/features/menu/__init__.py Sat Jul 21 03:34:33 2018 +0200
@@ -20,8 +20,7 @@
# import packages
from pyams_content.component.association.container import AssociationContainer
-from pyams_sequence.reference import get_reference_target
-from pyams_utils.zodb import volatile_property
+from pyams_content.component.links import InternalReferenceMixin
from zope.interface import implementer
from zope.schema.fieldproperty import FieldProperty
@@ -31,23 +30,13 @@
#
@implementer(IMenu)
-class Menu(AssociationContainer):
+class Menu(AssociationContainer, InternalReferenceMixin):
"""Associations menu"""
visible = FieldProperty(IMenu['visible'])
title = FieldProperty(IMenu['title'])
reference = FieldProperty(IMenu['reference'])
- @volatile_property
- def target(self):
- return get_reference_target(self.reference)
-
- def get_target(self, state=None):
- if not state:
- return self.target
- else:
- return get_reference_target(self.reference)
-
@implementer(IMenusContainer)
class MenusContainer(AssociationContainer):
--- a/src/pyams_content/features/redirect/__init__.py Sat Jul 21 02:36:35 2018 +0200
+++ b/src/pyams_content/features/redirect/__init__.py Sat Jul 21 03:34:33 2018 +0200
@@ -23,7 +23,7 @@
# import packages
from persistent import Persistent
-from pyams_sequence.reference import get_reference_target
+from pyams_content.component.links import InternalReferenceMixin
from pyams_utils.adapter import adapter_config, ContextAdapter
from pyams_utils.url import canonical_url
from pyams_utils.zodb import volatile_property
@@ -33,7 +33,7 @@
@implementer(IRedirectionRule)
-class RedirectionRule(Persistent, Contained):
+class RedirectionRule(Persistent, Contained, InternalReferenceMixin):
"""Redirection rule persistent class"""
active = FieldProperty(IRedirectionRule['active'])
@@ -54,16 +54,6 @@
del self.pattern
@volatile_property
- def target(self):
- return get_reference_target(self.reference)
-
- def get_target(self, state=None):
- if not state:
- return self.target
- else:
- return get_reference_target(self.reference, state)
-
- @volatile_property
def pattern(self):
return re.compile(self.url_pattern)
--- a/src/pyams_content/locales/fr/LC_MESSAGES/pyams_content.po Sat Jul 21 02:36:35 2018 +0200
+++ b/src/pyams_content/locales/fr/LC_MESSAGES/pyams_content.po Sat Jul 21 03:34:33 2018 +0200
@@ -5200,21 +5200,22 @@
"passed as input URL to the \n"
"next rule, until a matching rule is found.\n"
msgstr ""
-"Les règles de redirection sont utilisées pour transmettre des réponses de redirection "
-"au lieu de la fameuse erreur « 404 - Page non trouvée ».\n"
+"Les règles de redirection sont utilisées pour transmettre des réponses de "
+"redirection au lieu de la fameuse erreur « 404 - Page non trouvée ».\n"
"\n"
-"La gestion des redirections est particulièrement importante en phase de migration d'un site web, "
-"pour éviter les liens cassés, ne pas perdre votre référencement et faciliter la mise à jour "
-"des moteurs de recherche.\n"
+"La gestion des redirections est particulièrement importante en phase de "
+"migration d'un site web, pour éviter les liens cassés, ne pas perdre votre "
+"référencement et faciliter la mise à jour des moteurs de recherche.\n"
"\n"
-"Vous pouvez définir un ensemble de règles qui seront appliquées dès lors qu'une requête "
-"adressée au serveur génère une erreur de page non trouvée ; les règles sont basées sur des "
-"expressions rationnelles que l'on applique à l'URL de la requête reçue : si la règle correspond, "
-"l'URL est réécrite et une réponse de redirection vers cette nouvelle URL est renvoyée.\n"
+"Vous pouvez définir un ensemble de règles qui seront appliquées dès lors "
+"qu'une requête adressée au serveur génère une erreur de page non trouvée ; "
+"les règles sont basées sur des expressions rationnelles que l'on applique à "
+"l'URL de la requête reçue : si la règle correspond, l'URL est réécrite et "
+"une réponse de redirection vers cette nouvelle URL est renvoyée.\n"
"\n"
-"Vous pouvez également enchaîner les règles : lorsqu'une règle est \"chaînée\", la nouvelle URL "
-"qu'elle génère est passée aux règles suivantes, jusqu'à ce qu'une règle s'applique à cette "
-"nouvelle URL.\n"
+"Vous pouvez également enchaîner les règles : lorsqu'une règle est \"chaînée"
+"\", la nouvelle URL qu'elle génère est passée aux règles suivantes, jusqu'à "
+"ce qu'une règle s'applique à cette nouvelle URL.\n"
#: src/pyams_content/features/redirect/zmi/container.py:288
msgid "Test"
--- a/src/pyams_content/shared/imagemap/paragraph.py Sat Jul 21 02:36:35 2018 +0200
+++ b/src/pyams_content/shared/imagemap/paragraph.py Sat Jul 21 03:34:33 2018 +0200
@@ -24,15 +24,14 @@
from pyams_workflow.interfaces import IWorkflow, IWorkflowState
# import packages
+from pyams_content.component.links import InternalReferenceMixin
from pyams_content.component.paragraph import BaseParagraph, BaseParagraphContentChecker, BaseParagraphFactory
from pyams_content.features.renderer import RenderersVocabulary
-from pyams_sequence.reference import get_reference_target
from pyams_utils.adapter import adapter_config
from pyams_utils.factory import factory_config
from pyams_utils.registry import utility_config, get_utility
from pyams_utils.traversing import get_parent
from pyams_utils.vocabulary import vocabulary_config
-from pyams_utils.zodb import volatile_property
from zope.interface import implementer
from zope.schema.fieldproperty import FieldProperty
@@ -41,7 +40,7 @@
@implementer(IImageMapParagraph)
@factory_config(provided=IImageMapParagraph)
-class ImageMapParagraph(BaseParagraph):
+class ImageMapParagraph(BaseParagraph, InternalReferenceMixin):
"""Image map paragraph"""
icon_class = 'fa-location-arrow'
@@ -50,16 +49,6 @@
reference = FieldProperty(IImageMapParagraph['reference'])
renderer = FieldProperty(IImageMapParagraph['renderer'])
- @volatile_property
- def target(self):
- return get_reference_target(self.reference)
-
- def get_target(self, state=None):
- if not state:
- return self.target
- else:
- return get_reference_target(self.reference, state)
-
@utility_config(name=IMAGEMAP_PARAGRAPH_TYPE, provides=IParagraphFactory)
class ImageMapParagraphFactory(BaseParagraphFactory):