[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