[Zope] non-zope objects in zope
Sam Gendler
sgendler at everesttech.net
Wed Apr 28 15:38:54 EDT 2004
OK, I take my last post back. I figured out a nice way to do it
without having to rewrite ANYTHING. I created a product whose sole
purpose is to cause zope to load some modules when it starts up.
Within the initialize method of that product, it is possible to call
'allow_module' and 'allow_class', which use some kind of introspection
to make all members of modules and classes available through the web.
You can't access modules by name from a dtml-method, but you can access
class instances.
Example:
In a product called Everest, file called __init__.py:
from AccessControl import ModuleSecurityInfo, allow_class, allow_type,
allow_module
import cv
import cv.everest
import cv.everest.everest_users
def initialize(context):
allow_module('cv')
allow_module('cv.everest')
allow_module('cv.everest.everest_users')
allow_class(cv.everest.everest_users.ev_user)
allow_class(cv.everest.everest_users.user_acct)
allow_class(cv.everest.everest_users.user_campaign)
Not that allow_module takes a string and allow_class takes an class as
a parameter. Seems inconsistent to me.
In a PythonScript called test:
import cv.everest.everest_users
return cv.everest.everest_users.list_users()
which returns a list of ev_user objects defined in the everest_users
module
In a dtml method:
<dtml-in test prefix="user">
<dtml-var expr="user_item.method1()"> <dtml-var
expr="user_item.method2()">
</dtml-in>
I assume that method1 and method2 of the ev_user class must return a
python built-in like dict, list, string, or number, or else must be
callable or at least be representable as a string.
--sam
On Apr 28, 2004, at 12:10 PM, Sam Gendler wrote:
> I am answering my own question so the next person who bumps into it
> might have more luck tracking it down. The following examples are
> taken from the 'Security' chapter of the Zope Developers Guidde (ZDG).
> Note that I still wish there were a way to use external objects
> unchanged. Particularly because I have a class heirarchy, where
> customer objects create campaignh objects, but I want to to return
> campaign objects that have zope security info, so I have to create
> instances of my zopified objects from the non-zope objects...very
> wasteful and slow.
>
> --sam
>
> # an external method that returns Book instances
>
> from AccessControl import ClassSecurityInfo
> from Acquistion import Implicit
> import Globals
>
> class Book(Implicit):
>
> def __init__(self, title):
> self._title=title
>
> # Create a SecurityInfo for this class
> security = ClassSecurityInfo()
> security.declareObjectPublic()
>
> security.declarePublic('getTitle')
> def getTitle(self):
> return self._title
>
> Globals.InitializeClass(Book)
>
> # The actual external method
> def GetBooks(self):
> books=[]
> books.append(Book('King Lear').__of__(self))
> books.append(Book('Romeo and Juliet').__of__(self))
> books.append(Book('The Tempest').__of__(self))
> return books
>
>
> Or, if you can't modify the original object, try this:
>
> # an external method that returns Book instances
>
> from AccessControl import ClassSecurityInfo
> from Acquisition import Implicit
> import bookstuff
> import Globals
>
> class Book(Implicit, bookstuff.Book):
> security = ClassSecurityInfo()
> security.declareObjectPublic()
> security.declarePublic('getTitle')
>
> Globals.InitializeClass(Book)
>
> # The actual external method
> def GetBooks(self):
> books=[]
> books.append(Book('King Lear'))
> books.append(Book('Romeo and Juliet'))
> books.append(Book('The Tempest'))
> return books
>
> On Apr 27, 2004, at 6:26 PM, Sam Gendler wrote:
>
>> I used to be a fairly knowledgable zope user many years ago, but
>> things have moved on and I've forgotten most of what I know. I have
>> a largish library of python modules which define a number of classes
>> which have methods that perform work in a product. Currently, much
>> of the system is managed vai commandline tools which utilize the
>> library. We want to ad a web interface, and I figured zope would be
>> a natural, since everything is already in python.
>>
>> I created external methods which return instances of classes, but if
>> I try to use those instances from within dtml (iterating over a list
>> of them, for instance), I just get prompted for authentication
>> credentials. I seem to recall that there was some way of applying
>> zopishness to external object instances at runtime, but I can't
>> remember what that mechanism is, and I couldn't find it in either the
>> zope book or the zope bible I went out an bought.
>>
>> For example, if I have a customer class which has name, id, and
>> revenue members, and I create an external method to return a list of
>> customer instances, I cannot do the following
>>
>> <dtml-in extListCustomers prefix="cust">
>> <dtml-var expr="cust_item.id"> <dtml-var expr="cust_item.name"> <dtml
>> var expr="cust_item.revenue">
>> </dtml-in>
>>
>> Thanks
>>
>> --sam
>>
>>
>> _______________________________________________
>> Zope maillist - Zope at zope.org
>> http://mail.zope.org/mailman/listinfo/zope
>> ** No cross posts or HTML encoding! **
>> (Related lists - http://mail.zope.org/mailman/listinfo/zope-announce
>> http://mail.zope.org/mailman/listinfo/zope-dev )
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: text/enriched
Size: 5356 bytes
Desc: not available
Url : http://mail.zope.org/pipermail/zope/attachments/20040428/7b5c5d07/attachment.bin
More information about the Zope
mailing list