[Checkins]
SVN: z3c.traverser/trunk/src/z3c/traverser/stackinfo/traversing.py
Solve more virtual host things
Jürgen Kartnaller
juergen at kartnaller.at
Sun Oct 15 07:48:52 EDT 2006
Log message for revision 70637:
Solve more virtual host things
Changed:
U z3c.traverser/trunk/src/z3c/traverser/stackinfo/traversing.py
-=-
Modified: z3c.traverser/trunk/src/z3c/traverser/stackinfo/traversing.py
===================================================================
--- z3c.traverser/trunk/src/z3c/traverser/stackinfo/traversing.py 2006-10-15 11:20:48 UTC (rev 70636)
+++ z3c.traverser/trunk/src/z3c/traverser/stackinfo/traversing.py 2006-10-15 11:48:51 UTC (rev 70637)
@@ -8,33 +8,10 @@
CONSUMERS_ANNOTATION_KEY='z3c.traverser.consumers'
CONSUMED_ANNOTATION_KEY='z3c.traverser.consumed'
+
def getStackConsumers(context, request):
"""consumes the stack"""
- class VHStack:
- vh = []
- def prepare(self):
- if not self.vh:
- stack = request.getTraversalStack()
- if not stack:
- return
- name = stack[-1]
- if name.startswith('++vh++'):
- while True:
- self.vh.append(stack.pop())
- if name == '++':
- break
- if not stack:
- break
- name = stack[-1]
- # set stack without virtual host entries
- request.setTraversalStack(stack)
- def reset(self):
- if self.vh:
- stack = request.getTraversalStack()
- while self.vh:
- stack.append(self.vh.pop())
- request.setTraversalStack(stack)
- vhStack = VHStack()
+ vhStack = VHStack(request)
while True:
vhStack.prepare()
stack = request.getTraversalStack()
@@ -42,9 +19,9 @@
break
name = stack[-1]
consumer = component.queryMultiAdapter(
- (context, request),
- interface=interfaces.ITraversalStackConsumer,
- name=name)
+ (context, request),
+ interface=interfaces.ITraversalStackConsumer,
+ name=name)
if consumer is None:
break
try:
@@ -55,6 +32,7 @@
yield (name, consumer)
vhStack.reset()
+
def applyStackConsumers(context, request):
if not request.annotations.has_key(CONSUMED_ANNOTATION_KEY):
request.annotations[CONSUMED_ANNOTATION_KEY] = []
@@ -69,21 +47,26 @@
newStack = request.getTraversalStack()
if newStack != orgStack:
consumed = request.annotations[CONSUMED_ANNOTATION_KEY]
- items = orgStack[len(newStack):]
+ numItems = len(orgStack)-len(newStack)
+ vhStack = VHStack(request)
+ vhStack.prepare()
+ stack = request.getTraversalStack()
+ items = orgStack[len(stack):len(stack)+numItems]
+ vhStack.reset()
items.reverse()
consumed.append((context, items))
request.annotations[CONSUMERS_ANNOTATION_KEY].extend(cons)
+
def _encode(v, _safe='@+'):
return urllib.quote(v.encode('utf-8'), _safe)
+
def unconsumedURL(context, request):
-
consumed = list(request.annotations.get(CONSUMED_ANNOTATION_KEY))
if not consumed:
return absoluteURL(context, request)
from zope.traversing import api
-
from zope.traversing.interfaces import IContainmentRoot
name = api.getName(context)
items = name and [name] or []
@@ -96,10 +79,11 @@
else:
base = unconsumedURL(api.getParent(context), request)
items = map(_encode, items)
- if not base.endswith('/'):
+ if items and not base.endswith('/'):
base += '/'
return base + '/'.join(items)
+
class UnconsumedURL(BrowserView):
# XXX test this
def __unicode__(self):
@@ -110,3 +94,34 @@
__call__ = __str__
+
+class VHStack:
+ """Helper class to work around the special case with virtual hosts"""
+ vh = []
+ def __init__(self, request):
+ self.request = request
+
+ def prepare(self):
+ if not self.vh:
+ stack = self.request.getTraversalStack()
+ if not stack:
+ return
+ name = stack[-1]
+ if name.startswith('++vh++'):
+ while True:
+ self.vh.append(stack.pop())
+ if name == '++':
+ break
+ if not stack:
+ break
+ name = stack[-1]
+ # set stack without virtual host entries
+ self.request.setTraversalStack(stack)
+
+ def reset(self):
+ if self.vh:
+ stack = self.request.getTraversalStack()
+ while self.vh:
+ stack.append(self.vh.pop())
+ self.request.setTraversalStack(stack)
+
More information about the Checkins
mailing list