[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