[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