[Zope3-checkins] CVS: Zope3/src/zope/app/browser - absoluteurl.py:1.4

Albertas Agejevas alga@codeworks.lt
Tue, 15 Apr 2003 06:57:39 -0400


Update of /cvs-repository/Zope3/src/zope/app/browser
In directory cvs.zope.org:/tmp/cvs-serv31824/src/zope/app/browser

Modified Files:
	absoluteurl.py 
Log Message:
Added virtual hosting support to the @@absolute_url view.

Attempted to reduce code duplication in AbsoluteURL and SiteAbsoluteURL.
This changes behaviour of breadcrumbs if IContainmentRoot is wrapped in
something other than a side effect.  Should not matter.


=== Zope3/src/zope/app/browser/absoluteurl.py 1.3 => 1.4 ===
--- Zope3/src/zope/app/browser/absoluteurl.py:1.3	Sat Mar  1 16:13:59 2003
+++ Zope3/src/zope/app/browser/absoluteurl.py	Tue Apr 15 06:57:08 2003
@@ -20,65 +20,75 @@
 from zope.proxy.context import getWrapperContainer, getInnerWrapperData
 from zope.component import getView
 
-class AbsoluteURL(BrowserView):
+class AbsoluteURLBase(BrowserView):
 
     def __str__(self):
         context = self.context
         dict = getInnerWrapperData(context)
         name = dict and dict.get('name') or None
-        container = getWrapperContainer(context)
-        if name is None or container is None:
-            raise TypeError, 'Not enough context information to get a URL'
         if name == '.':
             name = dict.get('side_effect_name', name)
-
+            if name.startswith('++vh++'):
+                return self.request.getApplicationURL()
+        container = getWrapperContainer(context)
         return "%s/%s" % (getView(container, 'absolute_url', self.request),
                           name)
 
-    __call__ = __str__
-
     def breadcrumbs(self):
         context = self.context
         dict = getInnerWrapperData(context)
         name = dict and dict.get('name') or None
         container = getWrapperContainer(context)
-        if name is None or container is None:
-            raise TypeError, 'Not enough context information to get a URL'
+        base = getView(container, 'absolute_url', self.request).breadcrumbs()
 
         if name == '.':
             # The name is meaningless. There is a side-efect name
             # that we need to preserve in the urls (only)
             name = dict.get('side_effect_name', name)
-            base = getView(container, 'absolute_url',
-                           self.request).breadcrumbs()
+            if name.startswith('++vh++'):
+                return ({'name':'', 'url': self.request.getApplicationURL()}, )
 
             # replace the last step in base with a step with the same
             # name and an augmented url
-            base = base[:-1] + ({
-                'name': base[-1]['name'],
-                'url': ("%s/%s" % (base[-1]['url'], name)),
-                }, )
+            base = base[:-1] + (
+                {'name': base[-1]['name'],
+                 'url': ("%s/%s" % (base[-1]['url'], name))}, )
             return base
 
-        base = getView(container, 'absolute_url', self.request).breadcrumbs()
         base += ({'name': name, 'url': ("%s/%s" % (base[-1]['url'], name))}, )
         return base
 
 
-
-class SiteAbsoluteURL(BrowserView):
+class AbsoluteURL(AbsoluteURLBase):
 
     def __str__(self):
+        dict = getInnerWrapperData(self.context)
+        name = dict and dict.get('name') or None
+        container = getWrapperContainer(self.context)
+        if name is None or container is None:
+            raise TypeError, 'Not enough context information to get a URL'
+        return super(AbsoluteURL, self).__str__()
+
+    __call__ = __str__
+
+    def breadcrumbs(self):
         context = self.context
         dict = getInnerWrapperData(context)
         name = dict and dict.get('name') or None
-        if name:
-            if name == '.':
-                name = dict.get('side_effect_name', name)
-            container = getWrapperContainer(context)
-            return "%s/%s" % (getView(container, 'absolute_url', self.request),
-                              name)
+        container = getWrapperContainer(context)
+        if name is None or container is None:
+            raise TypeError, 'Not enough context information to get a URL'
+
+        return super(AbsoluteURL, self).breadcrumbs()
+
 
+class SiteAbsoluteURL(AbsoluteURLBase):
+
+    def __str__(self):
+        dict = getInnerWrapperData(self.context)
+        name = dict and dict.get('name') or None
+        if name:
+            return super(SiteAbsoluteURL, self).__str__()
         return self.request.getApplicationURL()
 
     __call__ = __str__
@@ -88,18 +98,5 @@
         dict = getInnerWrapperData(context)
         name = dict and dict.get('name') or None
         if name:
-            # The name is meaningless. There is a side-efect name
-            # that we need to preserve in the urls (only)
-            if name == '.':
-                name = dict.get('side_effect_name', name)
-            container = getWrapperContainer(context)
-            base = getView(container, 'absolute_url',
-                           self.request).breadcrumbs()
-            # replace the last step in base with a step with the same
-            # name ans an augmented url
-            base = base[:-1] + (
-                {'name': base[-1]['name'],
-                 'url': ("%s/%s" % (base[-1]['url'], name))}, )
-            return base
-
+            return super(SiteAbsoluteURL, self).breadcrumbs()
         return ({'name':'', 'url': self.request.getApplicationURL()}, )