Added internal reference mixin class
authorThierry Florac <tflorac@ulthar.net>
Sat, 21 Jul 2018 03:34:33 +0200
changeset 879 47173c13e118
parent 878 6bc257d7f53f
child 880 374cbe07b0ff
Added internal reference mixin class
src/pyams_content/component/links/__init__.py
src/pyams_content/features/alert/__init__.py
src/pyams_content/features/menu/__init__.py
src/pyams_content/features/redirect/__init__.py
src/pyams_content/locales/fr/LC_MESSAGES/pyams_content.po
src/pyams_content/shared/imagemap/paragraph.py
--- 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):