[Zope-dev] Acquisition by context first

Steve Alexander steve@cat-box.net
Fri, 15 Sep 2000 12:40:37 +0100


Here's an external method that ought to work. Well, it works for me:

# acquire the object of name "attr" by context alone
def aquire_by_context(self, attr):
    ob = self
    while hasattr(ob, 'aq_base'):
        aq_b=getattr(ob, 'aq_base', ob)
        if hasattr(aq_b, attr):
            attr_obj = getattr(aq_b, attr)
            break;
        ob = ob.aq_parent
    else:
        # not found
        raise KeyError, attr
    return self.restrictedTraverse(attr_obj.getPhysicalPath())


This should be secure, because I'm using restrictedTraverse.

Use in DTML like this:

<dtml-var standard_html_header>
<br>
<h2>Context</h2>
<dtml-var "acquire_by_context(this(), 'O')">
<br>
<dtml-var standard_html_footer>

Assuming that you called the external method "acquire_by_context".

Here, I'm assuming that you have objects like this:

some_folder
   A
     C
   B
     O  contains the string "some_folder->B->O"
   O    contains the string "some_folder->O"
   aq   dtml method containing the dtml above


Typing into your browser the URL .../some_folder/A/aq will get you
some_folder->O
Typing into your browser the URL .../some_folder/B/A/aq will get you
some_folder->B->O

To verify this against normal acquisition, use this DTML:

<dtml-var standard_html_header>
<br>
<h2>Context</h2>
<dtml-var "a_context(this(), 'O')">
<br>
<h2>Normal</h2>
<dtml-var O>
<dtml-var standard_html_footer>

--
Steve Alexander
Software Engineer
Cat-Box limited
http://www.cat-box.net