I am new to both Python and Zope. I have been playing with Zope for the past few weeks and my company is seriously considering using it in a project. So far I am enjoying both the Python language and the Zope framework, but I am not sure I am really "getting" the Zope way of doing things. In particular, there is a problem I have solved in two pieces, and I would like to know if the solutions are legitimate ways of doing these things. 1. In the first case I wanted to make a couple of queries to a database and then merge the results using Python. I am using gadfly, so I needed to get to the same in-core representation of the data that Zope is using, otherwise I would simply have opened a new connection to the database server. So I have a gadfly database connection, named "conn", open in Zope. I pass it into an external method using the following DTML: <!--#in expr="dump_event_user(conn)"--> Then, in the external method (with the same name as its Zope identifier) I extract the gadfly connection from the Zope DB using the following code: def dump_event_user(conn): connection = conn().db c = connection.cursor() c.execute("select * from event_user") ... I know this works, but since db is a data member, not a method, I don't know if this interface is meant to be accessible to external methods. Is it public? And in general how can I find this kind of thing out for myself? 2. My second question is much more general. One of the things I found really useful early on was the ability to apply the DTML "in" tag to database queries: <!--#in Z_SQL_METHOD_NAME--> <!--#var SOME_COLUMN_NAME--> <!--#/in--> However, when I decided to do a database query from within an external method as described above, I found that I no longer had as easy access to the metadata - the names of the columns. It would be really useful to be able to refer to the data from DTML as though it had been returned by a Z SQL Method. I checked the DTML documentation for the #in tag, and found that it only directly discussed this feature in terms of Z SQL Methods and Confera Topics. It does say that it can be used on sequences, but there is no example. So I played around with the Python code and, emulating the generic example, came up with something like this: class myobj: def __init__(self, n, p): self.n = n self.p = p def name(self): return self.n def phone(self): return self.p def test_sequence(): ret = [] ret.append(myobj("Tom", "898-8376")) ret.append(myobj("Jon", "616-0349")) return ret Which I found I could call using DTML like this: <!--#in test_sequence--> <br>name <!--#var name--> <br>phone <!--#var phone--> <!--#/in--> Similarly I found could package up data returned from the DB as objects and pass them back into Zope this way. Again I just wanted to confirm that this is the (or a) correct way of going about this kind of thing. I hope all this is not covered in some obvious place that I missed, such as a faq - I have tried to read as much of the docs as I can, but there is a lot to plough through, particularly when you are not sure exactly what you are looking for. Thanks, Rob