[Checkins] SVN: z3c.blobfile/trunk/ Bugfixes

Dan Korostelev nadako at gmail.com
Mon Oct 20 04:34:53 EDT 2008


Log message for revision 92388:
  Bugfixes

Changed:
  U   z3c.blobfile/trunk/CHANGES.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/image.py
  U   z3c.blobfile/trunk/src/z3c/blobfile/interfaces.py

-=-
Modified: z3c.blobfile/trunk/CHANGES.txt
===================================================================
--- z3c.blobfile/trunk/CHANGES.txt	2008-10-19 15:49:40 UTC (rev 92387)
+++ z3c.blobfile/trunk/CHANGES.txt	2008-10-20 08:34:50 UTC (rev 92388)
@@ -2,11 +2,19 @@
 CHANGES
 =======
 
-Version 0.1.3 (unreleased)
---------------------------
+Version 0.1.4 (unreleased)
 
 -
 
+Version 0.1.3 (2008-10-20)
+--------------------------
+
+- Bug: Don't get/set image data twice on Image initialization.
+- Cache file size and invalidate it on write access.
+- Download file/image using new openDetached method that provides
+  read-only file-like access to the blob, detached from the database
+  connection.
+
 Version 0.1.2 (2008-09-11)
 --------------------------
 

Modified: z3c.blobfile/trunk/src/z3c/blobfile/browser/configure.zcml
===================================================================
--- z3c.blobfile/trunk/src/z3c/blobfile/browser/configure.zcml	2008-10-19 15:49:40 UTC (rev 92387)
+++ z3c.blobfile/trunk/src/z3c/blobfile/browser/configure.zcml	2008-10-20 08:34:50 UTC (rev 92388)
@@ -1,131 +1,120 @@
 <configure
-    xmlns="http://namespaces.zope.org/browser"
-    xmlns:zope="http://namespaces.zope.org/zope"
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:browser="http://namespaces.zope.org/browser"
     i18n_domain="zope"
     >
 
-  <!-- IResult adapter for opened BlobFiles -->
-  <zope:adapter
-      for="ZODB.blob.BlobFile"
-      provides="zope.publisher.http.IResult"
-      factory="zope.app.wsgi.fileresult.FileResult"
-      />
+	<!-- directives for File -->
 
-  <!-- directives for File -->
-  
-  <form
-      name="edit.html"
-      for="z3c.blobfile.interfaces.IBlobFile"
-      schema="zope.app.file.browser.file.IFileEditForm"
-      label="Change a file"
-      permission="zope.ManageContent"
-      class="zope.app.file.browser.file.FileEdit"
-      />
+	<browser:addMenuItem
+	  class="z3c.blobfile.file.File"
+	  title="File"
+	  description="A File"
+	  permission="zope.ManageContent"
+	  view="z3c.blobfile.file.File"
+	  />
 
-  <menuItem
-      menu="zmi_views" title="Edit"
-      for="z3c.blobfile.interfaces.IBlobFile"
-      action="edit.html"
-      filter="python:context.contentType.startswith('text/')"
-      permission="zope.ManageContent"
-      />
+	<browser:page
+	  for="zope.app.container.interfaces.IAdding"
+	  name="z3c.blobfile.file.File"
+	  permission="zope.ManageContent"
+	  class=".file.FileAdd"
+	  template="file_add.pt"
+	  />
 
-  <page
-      name="upload.html"
-      menu="zmi_views" title="Upload"
-      for="z3c.blobfile.interfaces.IBlobFile"
-      template="file_upload.pt"
-      class="zope.app.file.browser.file.FileUpload"
-      permission="zope.ManageContent"
-      />
+	<browser:page
+	  name="upload.html"
+	  menu="zmi_views"
+	  title="Upload"
+	  for="z3c.blobfile.interfaces.IBlobFile"
+	  template="file_upload.pt"
+	  class="zope.app.file.browser.file.FileUpload"
+	  permission="zope.ManageContent"
+	  />
 
-  <page
-      for="z3c.blobfile.interfaces.IBlobFile"
-      name="index.html"
-      permission="zope.View"
-      class="z3c.blobfile.browser.file.FileView"
-      attribute="show"
-      />
+	<browser:menuItem
+	  menu="zmi_views"
+	  title="Edit"
+	  for="z3c.blobfile.interfaces.IBlobFile"
+	  action="edit.html"
+	  filter="python:context.contentType.startswith('text/')"
+	  permission="zope.ManageContent"
+	  />
 
-  <addMenuItem
-      class="z3c.blobfile.file.File"
-      title="File"
-      description="A File"
-      permission="zope.ManageContent"
-      view="z3c.blobfile.file.File"
-      />
+	<browser:form
+	  name="edit.html"
+	  for="z3c.blobfile.interfaces.IBlobFile"
+	  schema="zope.app.file.browser.file.IFileEditForm"
+	  label="Change a file"
+	  permission="zope.ManageContent"
+	  class="zope.app.file.browser.file.FileEdit"
+	  />
 
-  <page
-      name="z3c.blobfile.file.File"
-      for="zope.app.container.interfaces.IAdding"
-      template="file_add.pt"
-      class=".file.FileAdd"
-      permission="zope.ManageContent"
-      />
+	<browser:page
+	  for="z3c.blobfile.interfaces.IBlobFile"
+	  name="index.html"
+	  permission="zope.View"
+	  class="z3c.blobfile.browser.file.FileView"
+	  attribute="show"
+	  />
 
-  <icon
-      name="zmi_icon"
-      for="z3c.blobfile.interfaces.IBlobFile"
-      file="file_icon.gif"
-      />
+	<browser:icon
+	  name="zmi_icon"
+	  for="z3c.blobfile.interfaces.IBlobFile"
+	  file="file_icon.gif"
+	  />
 
-  <!-- Directives for Image -->
+	<browser:page
+	  for="z3c.blobfile.interfaces.IBlobFile"
+	  name="preview.html"
+	  template="preview.pt"
+	  permission="zope.ManageContent"
+	  menu="zmi_views"
+	  title="Preview"
+	  />
 
-  <editform
-      schema="z3c.blobfile.interfaces.IBlobImage"
-      name="upload.html"
-      menu="zmi_views" title="Upload"
-      label="Upload an image"
-      permission="zope.ManageContent"
-      class="zope.app.file.browser.image.ImageUpload"
-      template="image_edit.pt"
-      />
+	<!-- Directives for Image -->
 
-  <page
-      name="index.html"
-      for="z3c.blobfile.interfaces.IBlobImage"
-      permission="zope.View"
-      allowed_attributes="__call__ tag"
-      class=".image.ImageData"
-      />
+	<browser:addMenuItem
+	  class="z3c.blobfile.image.Image"
+	  title="Image"
+	  description="An Image"
+	  permission="zope.ManageContent"
+	  view="z3c.blobfile.image.Image"
+	  />
 
-  <icon
-      name="zmi_icon"
-      for="z3c.blobfile.interfaces.IBlobImage"
-      file="image_icon.gif"
+	<browser:addform
+	  name="z3c.blobfile.image.Image"
+	  schema="z3c.blobfile.interfaces.IBlobImage"
+	  label="Add an Image"
+	  content_factory="z3c.blobfile.image.Image"
+	  class="zope.app.file.browser.image.ImageAdd"
+	  permission="zope.ManageContent"
       />
 
-  <addMenuItem
-      class="z3c.blobfile.image.Image"
-      title="Image"
-      description="An Image"
-      permission="zope.ManageContent"
-      view="z3c.blobfile.image.Image"
-      />
+	<browser:editform
+	  schema="z3c.blobfile.interfaces.IBlobImage"
+	  name="upload.html"
+	  menu="zmi_views"
+	  title="Upload"
+	  label="Upload an image"
+	  permission="zope.ManageContent"
+	  class="zope.app.file.browser.image.ImageUpload"
+	  template="image_edit.pt"
+	  />
 
-  <addform
-      schema="z3c.blobfile.interfaces.IBlobImage"
-      label="Add an Image"
-      content_factory="z3c.blobfile.image.Image"
-      class="zope.app.file.browser.image.ImageAdd"
-      name="z3c.blobfile.image.Image"
-      permission="zope.ManageContent"
-      />
+	<browser:page
+	  name="index.html"
+	  for="z3c.blobfile.interfaces.IBlobImage"
+	  permission="zope.View"
+	  allowed_attributes="__call__ tag"
+	  class=".image.ImageData"
+	  />
 
-    <page
-        for="z3c.blobfile.interfaces.IBlobFile"
-        name="preview.html"
-        template="preview.pt"
-        permission="zope.ManageContent"
-        menu="zmi_views" title="Preview"
-        />
+	<browser:icon
+	  name="zmi_icon"
+	  for="z3c.blobfile.interfaces.IBlobImage"
+	  file="image_icon.gif"
+	  />
 
-    <page
-        for="z3c.blobfile.interfaces.IBlobImage"
-        name="preview.html"
-        template="preview.pt"
-        permission="zope.ManageContent"
-        menu="zmi_views" title="Preview"
-        />
-
 </configure>

Modified: z3c.blobfile/trunk/src/z3c/blobfile/browser/file.py
===================================================================
--- z3c.blobfile/trunk/src/z3c/blobfile/browser/file.py	2008-10-19 15:49:40 UTC (rev 92387)
+++ z3c.blobfile/trunk/src/z3c/blobfile/browser/file.py	2008-10-20 08:34:50 UTC (rev 92388)
@@ -48,25 +48,26 @@
         try:
             modified = IZopeDublinCore(self.context).modified
         except TypeError:
-            modified=None
-        if modified is None or not isinstance(modified,datetime):
-            return self.context.open()
+            modified = None
+        if modified is None or not isinstance(modified, datetime):
+            return self.context.openDetached()
 
         header= self.request.getHeader('If-Modified-Since', None)
         lmt = zope.datetime.time(modified.isoformat())
         if header is not None:
             header = header.split(';')[0]
-            try:    mod_since=long(zope.datetime.time(header))
-            except: mod_since=None
+            try:
+                mod_since = long(zope.datetime.time(header))
+            except:
+                mod_since = None
             if mod_since is not None:
                 if lmt <= mod_since:
                     self.request.response.setStatus(304)
                     return ''
-        self.request.response.setHeader('Last-Modified',
-                                        zope.datetime.rfc1123_date(lmt))
 
-        return self.context.open()
+        self.request.response.setHeader('Last-Modified', zope.datetime.rfc1123_date(lmt))
 
+        return self.context.openDetached()
 
 class FileAdd(FileUpdateView):
     """View that adds a new File object based on a file upload."""
@@ -77,4 +78,3 @@
         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	2008-10-19 15:49:40 UTC (rev 92387)
+++ z3c.blobfile/trunk/src/z3c/blobfile/configure.zcml	2008-10-20 08:34:50 UTC (rev 92388)
@@ -1,9 +1,8 @@
 <configure
     xmlns="http://namespaces.zope.org/zope"
-    i18n_domain='zope'
+    i18n_domain="zope"
     >
 
-
   <!-- content classes -->
 
   <!-- TODO: to decide later if BlobFiles and BlobImages shall appear 
@@ -14,12 +13,13 @@
 
     <require
         permission="zope.View"
-        interface=".interfaces.IBlobFile"
+        attributes="contentType data getSize openDetached"
         />
 
     <require
         permission="zope.ManageContent"
-        set_schema=".interfaces.IBlobFile"
+        attributes="open"
+        set_attributes="contentType data"
         />
 
     <implements
@@ -31,12 +31,13 @@
 
     <require
         permission="zope.View"
-        interface=".interfaces.IBlobImage"
+        attributes="contentType data getSize getImageSize openDetached"
         />
 
     <require
         permission="zope.ManageContent"
-        set_schema="zope.app.file.interfaces.IFile"
+        set_attributes="contentType data"
+        attributes="open"
         />
 
     <implements

Modified: z3c.blobfile/trunk/src/z3c/blobfile/file.py
===================================================================
--- z3c.blobfile/trunk/src/z3c/blobfile/file.py	2008-10-19 15:49:40 UTC (rev 92387)
+++ z3c.blobfile/trunk/src/z3c/blobfile/file.py	2008-10-20 08:34:50 UTC (rev 92388)
@@ -34,17 +34,25 @@
     implements(zope.app.publication.interfaces.IFileContent, 
                interfaces.IBlobFile)
 
-    size = 0
-    
     def __init__(self, data='', contentType=''):
+        self.contentType = contentType
         self._blob = Blob()
-        self.contentType = contentType
+        f = self._blob.open('w')
+        f.write('')
+        f.close()
         self._setData(data)
 
-    def open(self, mode="r"):
+    def open(self, mode='r'):
+        if mode != 'r' and 'size' in self.__dict__:
+            del self.__dict__['size']
         return self._blob.open(mode)
 
+    def openDetached(self):
+        return open(self._blob.committed(), 'rb')
+
     def _setData(self, data):
+        if 'size' in self.__dict__:
+            del self.__dict__['size']
         # Search for a storable that is able to store the data
         dottedName = ".".join((data.__class__.__module__,
                                data.__class__.__name__))
@@ -63,12 +71,13 @@
 
     @property
     def size(self):
-        if self._blob == "":
-            return 0
+        if 'size' in self.__dict__:
+            return self.__dict__['size']
         reader = self._blob.open()
         reader.seek(0,2)
         size = int(reader.tell())
         reader.close()
+        self.__dict__['size'] = size
         return size
 
     def getSize(self):

Modified: z3c.blobfile/trunk/src/z3c/blobfile/image.py
===================================================================
--- z3c.blobfile/trunk/src/z3c/blobfile/image.py	2008-10-19 15:49:40 UTC (rev 92387)
+++ z3c.blobfile/trunk/src/z3c/blobfile/image.py	2008-10-20 08:34:50 UTC (rev 92388)
@@ -37,13 +37,6 @@
 class Image(File):
     implements(interfaces.IBlobImage)
 
-    def __init__(self, data=''):
-        '''See interface `IFile`'''
-        self._blob = Blob()
-        self.data = data
-        firstbytes = self.getFirstBytes()
-        self.contentType, self._width, self._height = getImageInfo(firstbytes)
-
     def _setData(self, data):
         super(Image, self)._setData(data)
         firstbytes = self.getFirstBytes()
@@ -51,6 +44,8 @@
         if contentType:
             self.contentType = contentType
 
+    data = property(File._getData, _setData)
+
     def getFirstBytes(self):
         """Returns the first bytes of the file.
         
@@ -65,9 +60,6 @@
         """See interface `IImage`"""
         return (self._width, self._height)
 
-    data = property(File._getData, _setData)
-
-
 class ImageSized(object):
     implements(ISized)
 

Modified: z3c.blobfile/trunk/src/z3c/blobfile/interfaces.py
===================================================================
--- z3c.blobfile/trunk/src/z3c/blobfile/interfaces.py	2008-10-19 15:49:40 UTC (rev 92387)
+++ z3c.blobfile/trunk/src/z3c/blobfile/interfaces.py	2008-10-20 08:34:50 UTC (rev 92388)
@@ -25,10 +25,13 @@
     """Openable file
     """
 
-    def open(mode):
+    def open(mode='r'):
         """Open file and return the file descriptor
         """
 
+    def openDetached():
+        '''Return a read-only file descriptor, detached from ZODB connection'''
+
 class IBlobFile(zope.app.file.interfaces.IFile, IOpenable):
     """A file that uses Blobs as data storage."""
 



More information about the Checkins mailing list