[Zope] Upload files, set properties, search props

Troy Farrell troy@entheossoft.com
Mon, 19 May 2003 23:35:53 -0500

A few notes for you:
1) put this in a python script - it's much cleaner.  The code below 
would become

context.objects.manage_addFile(id='', file=file, title='test')
context.objects.manage_addProperty('keywords', keywords, 'text')

2) You are exactly right about your idea.  Here's the trick.  Look at 
$ZOPEDIR/lib/python/OFS/Image.py and find the function "manage_addFile". 
  You see that in there it calls

id, title = cookId(id, title, file)

so, we need to see what cookId() does.  Searching at the bottom of 
Image.py reveals this code:

def cookId(id, title, file):
     if not id and hasattr(file,'filename'):
         title=title or filename
     return id, title

So, we see that cookId reads the HTTP POST file object, and marshalls 
it's filename into a workable Id.  You need to duplicate this 
functionality if you want to use manage_addFile with a blank id.  I 
would setup an External Method like:

from OFS.Image import cookId

def findFileId(title, file):
   "All good methods have docstrings :)"
   return cookId('', title, file)[0]

I think that will work (it might need some tweaking...)  Then your 
python script becomes

context.objects.manage_addFile(id='', file=file, title='test')
fileId = context.externalMethodFromAboveCalledFindFileId('test', file)
context.objects[fileId].manage_addProperty('keywords', keywords, 'text')

I hope I didn't just do your homework for you ;-)


John Toews wrote:
> Thank you, pointing out I could do this without a Zclass is going to
> save me time... The one thing I don't understand right now. The code
> below adds a property to the containing folder, not the object I just
> uploaded. How do I obtain the id so I can deal with that? (objects is
> the name of my folder, it is a level under the script itself)
> <dtml-call expr="objects.manage_addFile(id='', file=file,
> title='test')">
> <dtml-call expr="objects.manage_addProperty('keywords', keywords,
> 'text')">
> I think the second one should be something like
> objects.UPLOADED_FILE_ID.manage_addProperty...
> Thanks!
> -----Original Message-----
> From: Paul Winkler [mailto:pw_lists@slinkp.com] 
> Sent: Monday, May 19, 2003 11:46 AM
> To: zope@zope.org
> Subject: Re: [Zope] Upload files, set properties, search props
> On Mon, May 19, 2003 at 02:57:46PM -0500, John Toews wrote:
>>Hello All,
>>I am (very) new to Zope and am trying to figure out how exactly to
>>implement what I want. I have read most of the Zope book and it
> doesn't
>>seem to go into the depths I want, but please feel free to point me to
>>better manual(s). What I want to be able to do is:
>>- Present the user a form with to upload a file and, for now, a text
> box
>>for keywords (I've done this already)
>>- Save the file to a folder and set a property for the keywords (I can
>>save to a folder with the generic File object [using
>>foldername.manage_addFile], but how do I create & set the keyword
> the details vary depending on whether you want 1 property per keyword,
> or 1 property for all keywords. but the basics can be gleaned from
> the online zope book:
> http://www.zope.org/Documentation/Books/ZopeBook/2_6Edition/ScriptingZop
> e.stx
> read the section on "The Zope API". There are examples of adding and
> changing properties.
> e.g. in the script that's the target of your form, do something like
> this
> to add a single property:
> request = context.REQUEST
> my_folder.manage_addProperty('keywords', request.get('keywords'),
> 'text')
>>- Catalog the keywords property and be able to search it (Haven't even
>>attempted yet)
> no problem, just give youtr catalog a KeywordIndex with the name of your
> property.
>>I believe the "correct" way to do this would be a Zclass using the
> File
>>base class and a property sheet.
> not necessary, the above will work.
> the only advantage of a custom Product (whether zclass or
> filesystem-based
> product) is that it can be made to support automatic cataloging
> so you don't have to periodically update the catalog.