[Checkins] SVN: z3c.blobfile/trunk/src/z3c/blobfile/ Added
functional doctest for file upload.
Uwe Oestermeier
u.oestermeier at iwm-kmrc.de
Wed Nov 14 10:17:21 EST 2007
Log message for revision 81839:
Added functional doctest for file upload.
Changed:
U z3c.blobfile/trunk/src/z3c/blobfile/blobfile.txt
U z3c.blobfile/trunk/src/z3c/blobfile/browser/configure.zcml
U z3c.blobfile/trunk/src/z3c/blobfile/browser/file.py
U z3c.blobfile/trunk/src/z3c/blobfile/configure.zcml
U z3c.blobfile/trunk/src/z3c/blobfile/file.py
U z3c.blobfile/trunk/src/z3c/blobfile/ftesting.zcml
U z3c.blobfile/trunk/src/z3c/blobfile/storages.py
-=-
Modified: z3c.blobfile/trunk/src/z3c/blobfile/blobfile.txt
===================================================================
--- z3c.blobfile/trunk/src/z3c/blobfile/blobfile.txt 2007-11-14 14:12:57 UTC (rev 81838)
+++ z3c.blobfile/trunk/src/z3c/blobfile/blobfile.txt 2007-11-14 15:17:21 UTC (rev 81839)
@@ -58,6 +58,35 @@
you must provide your own evolution procedure.
+Adding Blob Files
+-----------------
+
+
+ >>> from zope.testbrowser.testing import Browser
+ >>> browser = Browser()
+ >>> browser.addHeader('Authorization', 'Basic mgr:mgrpw')
+ >>> dn = 'z3c.blobfile.file.File'
+ >>> browser.open('http://localhost/@@+/action.html?type_name=' + dn)
+
+ >>> ctrl = browser.getControl('Data')
+ >>> ctrl
+ <Control name='field.data' type='file'>
+
+ >>> import cStringIO
+
+ >>> ctrl.add_file(cStringIO.StringIO('File contents'),
+ ... 'text/plain', 'test.txt')
+
+ >>> browser.getControl('Add').click()
+ >>> 'test.txt' in browser.contents
+ True
+
+ >>> fp = root['test.txt'].open('r')
+ >>> fp.read()
+ 'File contents'
+ >>> fp.close()
+
+
Compatibility with zope.app.file.File
-------------------------------------
Modified: z3c.blobfile/trunk/src/z3c/blobfile/browser/configure.zcml
===================================================================
--- z3c.blobfile/trunk/src/z3c/blobfile/browser/configure.zcml 2007-11-14 14:12:57 UTC (rev 81838)
+++ z3c.blobfile/trunk/src/z3c/blobfile/browser/configure.zcml 2007-11-14 15:17:21 UTC (rev 81839)
@@ -44,14 +44,14 @@
title="File"
description="A File"
permission="zope.ManageContent"
- view="zope.app.file.File"
+ view="z3c.blobfile.file.File"
/>
<page
- name="zope.app.file.File"
+ name="z3c.blobfile.file.File"
for="zope.app.container.interfaces.IAdding"
template="file_add.pt"
- class="zope.app.file.browser.file.FileAdd"
+ class=".file.FileAdd"
permission="zope.ManageContent"
/>
@@ -88,11 +88,11 @@
/>
<addMenuItem
- class="zope.app.file.image.Image"
+ class="z3c.blobfile.image.Image"
title="Image"
description="An Image"
permission="zope.ManageContent"
- view="zope.app.file.Image"
+ view="z3c.blobfile.image.Image"
/>
<addform
Modified: z3c.blobfile/trunk/src/z3c/blobfile/browser/file.py
===================================================================
--- z3c.blobfile/trunk/src/z3c/blobfile/browser/file.py 2007-11-14 14:12:57 UTC (rev 81838)
+++ z3c.blobfile/trunk/src/z3c/blobfile/browser/file.py 2007-11-14 15:17:21 UTC (rev 81839)
@@ -15,6 +15,8 @@
$Id: file.py 81031 2007-10-24 14:08:53Z srichter $
"""
+__docformat__ = 'restructuredtext'
+
import zope.event
from zope import lifecycleevent
from zope.contenttype import guess_content_type
@@ -22,16 +24,16 @@
from zope.schema import Text
from zope.exceptions.interfaces import UserError
-from zope.app.file.file import File
from zope.app.file.interfaces import IFile
from zope.app.file.i18n import ZopeMessageFactory as _
from zope.dublincore.interfaces import IZopeDublinCore
+from zope.app.file.browser.file import FileUpdateView
import zope.datetime
import time
from datetime import datetime
-__docformat__ = 'restructuredtext'
+import z3c.blobfile.file
class FileView(object):
@@ -66,3 +68,13 @@
return self.context.open()
+class FileAdd(FileUpdateView):
+ """View that adds a new File object based on a file upload."""
+
+ def update_object(self, data, contenttype):
+ f = z3c.blobfile.file.File(data, contenttype)
+ zope.event.notify(lifecycleevent.ObjectCreatedEvent(f))
+ self.context.add(f)
+ self.request.response.redirect(self.context.nextURL())
+ return ''
+
Modified: z3c.blobfile/trunk/src/z3c/blobfile/configure.zcml
===================================================================
--- z3c.blobfile/trunk/src/z3c/blobfile/configure.zcml 2007-11-14 14:12:57 UTC (rev 81838)
+++ z3c.blobfile/trunk/src/z3c/blobfile/configure.zcml 2007-11-14 15:17:21 UTC (rev 81839)
@@ -78,6 +78,11 @@
factory=".storages.FileDescriptorStorable"
/>
+ <utility
+ name="zope.publisher.browser.FileUpload"
+ provides=".interfaces.IStorage"
+ factory=".storages.FileUploadStorable"
+ />
<adapter
for=".interfaces.IBlobImage"
Modified: z3c.blobfile/trunk/src/z3c/blobfile/file.py
===================================================================
--- z3c.blobfile/trunk/src/z3c/blobfile/file.py 2007-11-14 14:12:57 UTC (rev 81838)
+++ z3c.blobfile/trunk/src/z3c/blobfile/file.py 2007-11-14 15:17:21 UTC (rev 81839)
@@ -25,9 +25,6 @@
import interfaces
-# set the size of the chunks
-MAXCHUNKSIZE = 1 << 16
-
class File(Persistent):
"""A persistent content component storing binary file data."""
Modified: z3c.blobfile/trunk/src/z3c/blobfile/ftesting.zcml
===================================================================
--- z3c.blobfile/trunk/src/z3c/blobfile/ftesting.zcml 2007-11-14 14:12:57 UTC (rev 81838)
+++ z3c.blobfile/trunk/src/z3c/blobfile/ftesting.zcml 2007-11-14 15:17:21 UTC (rev 81839)
@@ -12,11 +12,13 @@
<include package="zope.app.zcmlfiles" />
<include package="zope.app.authentication" />
<include package="zope.app.securitypolicy" />
- <include package="zope.app.file"/>
+ <include package="zope.app.file" />
<include package="zope.annotation"/>
<include package="zope.dublincore"/>
<include package="z3c.blobfile"/>
-
+
+ <includeOverrides package="z3c.blobfile" file="overrides.zcml" />
+
<securityPolicy
component="zope.securitypolicy.zopepolicy.ZopeSecurityPolicy" />
Modified: z3c.blobfile/trunk/src/z3c/blobfile/storages.py
===================================================================
--- z3c.blobfile/trunk/src/z3c/blobfile/storages.py 2007-11-14 14:12:57 UTC (rev 81838)
+++ z3c.blobfile/trunk/src/z3c/blobfile/storages.py 2007-11-14 15:17:21 UTC (rev 81839)
@@ -20,7 +20,11 @@
import interfaces
from zope.app.file.file import FileChunk
+from zope.publisher.browser import FileUpload
+MAXCHUNKSIZE = 1 << 16
+
+
class StringStorable(object):
zope.interface.implements(interfaces.IStorage)
@@ -72,3 +76,18 @@
if filename is not None:
blob.consumeFile(filename)
return
+
+
+class FileUploadStorable(object):
+ zope.interface.implements(interfaces.IStorage)
+
+ def store(self, data, blob):
+ if not isinstance(data, FileUpload):
+ raise NotStorable("Could not store data (not of 'FileUpload').")
+
+ fp = blob.open('w')
+ block = data.read(MAXCHUNKSIZE)
+ while block:
+ fp.write(block)
+ block = data.read(MAXCHUNKSIZE)
+ fp.close()
More information about the Checkins
mailing list