[Zope-CMF] Re: custom WebDAV upload handling
Raphael Ritz
r.ritz at biologie.hu-berlin.de
Wed Jun 8 04:06:42 EDT 2005
David Pratt wrote:
> Hi Raphael. Perhaps a workflow could be a solution.
>
[..]
> Hope this helps.
>
> Regards
> David
>
Hi David,
that's indeed an interesting idea! Need to think about it more.
After some more meditation over the code I got most of
what I want now. Since it might be interesting for others
as well, I try to sketch what I did so far:
First, one needs to understand the processing chain:
1. FTP/DAV uploads call 'PUT' from 'webdav.NullResource'
2. This gets the 'PUT_factory' from the parent in spe
(the target) folder.
For CMF this is usually the one from 'PortalFolder'.
3. The 'PUT_factory' contacts the 'content_type_registry' to
figure out what content type should be created for this
particular upload.
4. If a valid type is found, an _empty_ instance thereof is
created using 'parent.invokeFactory'.
5. Then this object is removed from the parent where it just has
been created. This now "kind of homeless" object is returned to
the calling 'PUT' from 'webdav.NullResource'
6. Calling 'parent._verifyObjectPaste' it is now checked whether
it is actually allowed to put the "homeless" object into the
parent and if so ...
7. ... it is placed in there.
(Why is this back-and-forth handling needed at all?)
8. Finally (for 'PUT' from 'webdav.NullResource'), it calls 'PUT'
on the newly created object, passing along (REQUEST, RESPONSE).
9. What this - potentially and usually - content-type specific 'PUT'
does in the end, is up to the type.
Now, what I did:
1. Tell the 'content_type_registry' that a '.bib' upload should generate
a 'BibliographyFolder'.
2. Provide the 'BibliographyFolder' with a 'PUT' method that checks
whether it lives in another bibfolder or some other folder type.
3. If the new bibfolder lives in another bibfolder, the import is done
to the parent and the new bibfolder gets deleted. Otherwise the
import is done to new folder.
Easy, isn't it ;-)
What I've noticed:
- For various reasons I don't allow nesting of bibfolders but as
I understand the processing chain skechted above I have to allow
bibfolders within bibfolders for this to work. I could live
with some intermediate standard Zope type but I find it restrictive
that it _has_ to be a valid content type (at least without patching
'webdav.NullResource').
What I'm still looking for:
- Has anyone ever extended the content_type_registry to support
the evaluation of an arbitrary TALES expression given the
upload's body (or the first few hundred bytes/characters thereof)?
Would it be worthwhile having something like that?
Maybe someone finds this interesting ...
Cheers,
Raphael
More information about the Zope-CMF
mailing list