[Zope] queries and tiny tables and python methods... oh my!
Rik Hoekstra
rik.hoekstra@inghist.nl
Fri, 30 Jun 2000 11:46:52 +0200
Timothy Wilson wrote:
>
> Hi everyone,
>
> (Please excuse the vague Wizard of Oz reference in the sub., but my brain
> may be imploding. :-)
>
> I'm trying to merge several type of Zope objects, and I'm getting lots of
> little errors. I wonder if someone could suggest where my problem lies.
>
> 1. I'm querying our LDAP server to retrieve the records for a given person
> in the directory. No problem there.
>
> 2. I'm parsing one of the entries in the LDAP directory to retrieve the
> user's location. Python method code is simple.
>
> 3. I'm using a Tiny Table to look up a value for one of the parsed strings.
> Easy.
>
> The problem is hooking them all together. Passing the query to a
> PythonMethod is throwing up the following error:
>
> Error Type: TypeError
> Error Value: argument l: expected read-only character buffer, instance found
The error means you're trying to split up a string, but the argument is
no string, but an instance (a Python Object). In many cases this is
caused by an omission of parenthesis, like so
called_object instead of called_object()
in which case the object is referenced instead of called and nothing is
returned (of course). I did not find the culprit in your description,
though.
<snip>
>
> (Object: parseLocation)
> (Info: ((['SB_B208'],), {}, None))
> File <string>, line 2, in parseLocation
> TypeError: (see above)
>
I do not quite get what part you want to parse. Is it 'SB_B208'?
accessing this in python is a bit strange due to the returned value. You
get to the 'SB_B208'part in the following way:
whateverreturnstheresult(<someargument>)[0][0][0], meaning (in this
case):
the first element (of the list) of the first element (of the first
tuple) of the returned tuple
>
> parseLocation is a Python Method which takes 1 argument (a string) and
> returns the first element of the list that's formed by splitting the string.
> That first element is a two-letter code that's looked up in a Tiny Table
> called buildingCodes which returns the full name of the building.
>
> OK, it looks to my relatively inexperienced eyes that the Python Method
> isn't getting an argument of the type is expects.
yep, see above
>
> Here's the code for parseLocation ('l' is the argument):
>
> x = string.split(l, '_')
> return x[0]
I may be reading badly, but can you explain what the l is (or is
supposed to be)? Is it the tuple in the traceback?
>
> (BTW, changing it to x = string.split(`l`, '_') eliminates the error, but
> nothing is rendered.
>
> qry_person is an ZLDAP filter method that takes one argument (uid). The
> original dtml to display this mess looks like:
>
> <dtml-call "REQUEST.set('user_id', user_id)">
> <dtml-in "qry_person(uid = user_id)"><br>
> <dtml-in "buildingCodes(parseLocation(l))">
> <dtml-var building><br> # 'building' comes from the Tiny Table
> </dtml-in>
> </dtml-in>
>
> I'd appreciate it if anyone has any ideas about this. I'm probably making
> the whole thing too complicated, but for reasons of code reuse, this seemed
> like the most efficient approach.
hth
Rik