[Zope] Workflow question
David Pratt
fairwinds at eastlink.ca
Sun Aug 21 22:43:08 EDT 2005
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):
method=REQUEST.get('REQUEST_METHOD', 'GET')
if method == 'PUT':
PUT(REQUEST, RESPONSE)
# 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 ZopePageTemplate
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 )
elif typ[:6]=='image/':
from OFS.Image import Image
ob=Image(name, '', body, content_type=typ)
else:
from OFS.Image import File
ob=File(name, '', body, content_type=typ)
return ob
# Modified PUT from NullResource
PUT__roles__ = ('Anonymous',)
def PUT(self, REQUEST, RESPONSE):
"""Create a new non-collection resource.
"""
from ZServer import LARGE_FILE_THRESHOLD
self.dav__init(REQUEST, RESPONSE)
name = self.__name__
parent = self.__parent__
ifhdr = REQUEST.get_header('If', '')
if WriteLockInterface.isImplementedBy(parent) and
parent.wl_isLocked():
if ifhdr:
parent.dav__simpleifhandler(REQUEST, RESPONSE, col=1)
else:
# There was no If header at all, and our parent is locked,
# so we fail here
raise Locked
elif ifhdr:
# There was an If header, but the parent is not locked
raise PreconditionFailed
# 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) after
# 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) > LARGE_FILE_THRESHOLD:
file = REQUEST['BODYFILE']
body = file.read(LARGE_FILE_THRESHOLD)
file.seek(0)
else:
body = REQUEST.get('BODY', '')
typ=REQUEST.get_header('content-type', None)
if typ is None:
typ, enc=OFS.content_types.guess_content_type(name, body)
factory = getattr(parent, 'PUT_factory', self._default_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.
try:
parent._verifyObjectPaste(ob.__of__(parent), 0)
except CopyError:
raise Unauthorized, sys.exc_info()[1]
# We don' want an object - so object creation below commented out
# 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)
RESPONSE.setStatus(201)
RESPONSE.setBody('')
return 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
>> kind
>> 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.
>
> --
> Dieter
>
More information about the Zope
mailing list