# HG changeset patch # User Damien Correia # Date 1529665588 -7200 # Node ID 770bac310903afdec466e7d84f983c43633ba99f # Parent 3f729a99d55bb065f001760918b26d3bc5697aa1# Parent 4eff8c9109eb3f965592b85630a694a5c687bfb9 merge default diff -r 3f729a99d55b -r 770bac310903 src/pyams_utils/interfaces/url.py --- a/src/pyams_utils/interfaces/url.py Wed Jun 20 12:20:54 2018 +0200 +++ b/src/pyams_utils/interfaces/url.py Fri Jun 22 13:06:28 2018 +0200 @@ -26,3 +26,13 @@ def get_url(self, view_name=None, query=None): """Get content's canonical URL""" + + +DISPLAY_CONTEXT = 'pyams_utils.display_context' + + +class IRelativeURL(Interface): + """Get content URL based on another context""" + + def get_url(self, display_context=None, view_name=None, query=None): + """Get content URL relative to given display context""" diff -r 3f729a99d55b -r 770bac310903 src/pyams_utils/url.py --- a/src/pyams_utils/url.py Wed Jun 20 12:20:54 2018 +0200 +++ b/src/pyams_utils/url.py Fri Jun 22 13:06:28 2018 +0200 @@ -17,10 +17,10 @@ # import interfaces from pyams_utils.interfaces.tales import ITALESExtension -from pyams_utils.interfaces.url import ICanonicalURL +from pyams_utils.interfaces.url import ICanonicalURL, IRelativeURL, DISPLAY_CONTEXT # import packages -from pyams_utils.adapter import ContextRequestViewAdapter, adapter_config +from pyams_utils.adapter import ContextRequestViewAdapter, adapter_config, ContextRequestAdapter from pyams_utils.unicode import translate_string from pyramid.encode import url_quote, urlencode from pyramid.url import resource_url, QUERY_SAFE @@ -38,6 +38,10 @@ remove_punctuation=True, keep_chars='-').split('-'))) +# +# Absolute URLs management +# + def absolute_url(context, request, view_name=None, query=None): """Get resource absolute_url @@ -88,6 +92,10 @@ return absolute_url(context, self.request, view_name) +# +# Canonical URLs management +# + def canonical_url(context, request, view_name=None, query=None): """Get resource canonical URL""" @@ -116,3 +124,36 @@ if context is None: context = self.context return canonical_url(context, self.request, view_name) + + +# +# Relative URLs management +# + +@adapter_config(context=(Interface, Interface), provides=IRelativeURL) +class DefaultRelativeURLAdapter(ContextRequestAdapter): + """Default relative URL adapter""" + + def get_url(self, display_context=None, view_name=None, query=None): + return absolute_url(self.context, self.request, view_name, query) + + +def relative_url(context, request, display_context=None, view_name=None, query=None): + """Get resource URL relative to given context""" + if display_context is None: + display_context = request.annotations.get(DISPLAY_CONTEXT, request.context) + adapter = request.registry.getMultiAdapter((context, request), IRelativeURL) + return adapter.get_url(display_context, view_name, query) + + +@adapter_config(name='relative_url', context=(Interface, Interface, Interface), provides=ITALESExtension) +class RelativeUrlTalesExtension(ContextRequestViewAdapter): + """extension:relative_url(context, view_name, query) TALES extension + + A PyAMS TALES extension used to get an object's relative URL based on current request display context. + """ + + def render(self, context=None, view_name=None, query=None): + if context is None: + context = self.context + return relative_url(context, self.request, view_name=view_name, query=query)