Hi Dieter. I think I understand. What I have done so far is to make a
upload folder product. I have taken the portal folder base class to
create a portal upload folder base class, commented out the PUT_factory
method and added the following methods for bobo traverse and PUT. I am
then subclassing this to create upload folder types that will be
available to portal.
I commented out the portion of the PUT's method that creates the object
so it should proceed to the response without making the object. I have
yet to test any of this out but this is what I have got so far. Does
this look sensible?
# Catch put in traversal
def __bobo_traverse__(self, REQUEST):
if method == 'PUT':
# Using default put method from NullResource
def _default_PUT_factory( self, name, typ, body ):
# Return DTMLDoc/PageTemplate/Image/File, based on sniffing.
if name and name.endswith('.pt'):
from Products.PageTemplates.ZopePageTemplate import
ob = ZopePageTemplate(name, body, content_type=typ)
elif typ in ('text/html', 'text/xml', 'text/plain'):
from OFS.DTMLDocument import DTMLDocument
ob = DTMLDocument( '', __name__=name )
from OFS.Image import Image
ob=Image(name, '', body, content_type=typ)
from OFS.Image import File
ob=File(name, '', body, content_type=typ)
# Modified PUT from NullResource
PUT__roles__ = ('Anonymous',)
def PUT(self, REQUEST, RESPONSE):
"""Create a new non-collection resource.
from ZServer import LARGE_FILE_THRESHOLD
name = self.__name__
parent = self.__parent__
ifhdr = REQUEST.get_header('If', '')
if WriteLockInterface.isImplementedBy(parent) and
# There was no If header at all, and our parent
# so we fail here
# There was an If header, but the parent is not locked
# SDS: Only use BODY if the file size is smaller than
# LARGE_FILE_THRESHOLD, otherwise read LARGE_FILE_THRESHOLD
# bytes from the file which should be enough to trigger
# content_type detection, and possibly enough for CMF's
# content_type_registry too.
# Note that body here is really just used for detecting the
# content type and figuring out the correct factory. The correct
# file content will be uploaded on ob.PUT(REQUEST, RESPONSE)
# the object has been created.
# A problem I could see is content_type_registry predicates
# that do depend on the whole file being passed here as an
# argument. There's none by default that does this though. If
# they really do want to look at the file, they should use
# REQUEST['BODYFILE'] directly and try as much as possible not
# to read the whole file into memory.
if int(REQUEST.get('CONTENT_LENGTH') or 0) >
file = REQUEST['BODYFILE']
body = file.read(LARGE_FILE_THRESHOLD)
body = REQUEST.get('BODY', '')
if typ is None:
factory = getattr(parent, 'PUT_factory',
ob = factory(name, typ, body)
if ob is None:
ob = self._default_PUT_factory(name, typ, body)
# We call _verifyObjectPaste with verify_src=0, to see if the
# user can create this type of object (and we don't need to
# check the clipboard.
raise Unauthorized, sys.exc_info()
# We don' want an object - so object creation below commented
# Delegate actual PUT handling to the new object,
# SDS: But just *after* it has been stored.
# self.__parent__._setObject(name, ob)
# ob = self.__parent__._getOb(name)
# ob.PUT(REQUEST, RESPONSE)
On Sunday, August 21, 2005, at 05:58 PM, Dieter Maurer wrote:
David Pratt wrote at 2005-8-19 15:38 -0300:
First step is to make new type - will
do this today but might need to ask a question or two when I get to
bobo traverse portion. When you say another auxillary object, what
of object is this so I understand a bit better?
One similar to "webdav.Resource.NullResource" (and probably deriving
from it) but with a PUT method that does what you want.
Zope maillist - [EMAIL PROTECTED]
** No cross posts or HTML encoding! **
(Related lists -