From: Andreas Z. <svn...@pl...> - 2009-10-31 15:35:08
|
Author: witsch Date: Sat Oct 31 15:34:55 2009 New Revision: 30991 Added: plone.app.blob/trunk/src/plone/app/blob/adapters/ofsfile.py - copied, changed from r30834, plone.app.blob/trunk/src/plone/app/blob/adapters/atfile.py plone.app.blob/trunk/src/plone/app/blob/tests/test_adapters.py (contents, props changed) Modified: plone.app.blob/trunk/src/plone/app/blob/adapters/atfile.py plone.app.blob/trunk/src/plone/app/blob/adapters/configure.zcml plone.app.blob/trunk/src/plone/app/blob/configure.zcml plone.app.blob/trunk/src/plone/app/blob/interfaces.py plone.app.blob/trunk/src/plone/app/blob/subtypes/image.py Log: provide migration adapter for `OFS.File` making it possible to migrate custom types with more than one blob-enabled field. the migrator would need to use a `migrate_data` similar to: {{{ def migrate_data(self): self.new.getField('foo').getMutator(self.new)(self.old.getField('foo').get(self.old)) self.new.getField('bar').getMutator(self.new)(self.old.getField('bar').get(self.old)) }}} Modified: plone.app.blob/trunk/src/plone/app/blob/adapters/atfile.py ============================================================================== --- plone.app.blob/trunk/src/plone/app/blob/adapters/atfile.py (original) +++ plone.app.blob/trunk/src/plone/app/blob/adapters/atfile.py Sat Oct 31 15:34:55 2009 @@ -2,27 +2,15 @@ from zope.component import adapts from Products.ATContentTypes.interface import IATFile - from plone.app.blob.interfaces import IBlobbable +from plone.app.blob.adapters.ofsfile import BlobbableOFSFile -class BlobbableATFile(object): +class BlobbableATFile(BlobbableOFSFile): """ adapter for ATFile objects to work with blobs """ implements(IBlobbable) adapts(IATFile) - def __init__(self, context): - self.context = context - - def feed(self, blob): - """ see interface ... """ - blob.open('w').write(str(self.context)) # TODO: use an iterator!! - def filename(self): """ see interface ... """ return self.context.getFilename() - - def mimetype(self): - """ see interface ... """ - return self.context.getContentType() - Modified: plone.app.blob/trunk/src/plone/app/blob/adapters/configure.zcml ============================================================================== --- plone.app.blob/trunk/src/plone/app/blob/adapters/configure.zcml (original) +++ plone.app.blob/trunk/src/plone/app/blob/adapters/configure.zcml Sat Oct 31 15:34:55 2009 @@ -3,6 +3,7 @@ <adapter factory=".blobwrapper.BlobbableBlobWrapper" /> <adapter factory=".fileupload.BlobbableFileUpload" /> + <adapter factory=".ofsfile.BlobbableOFSFile" /> <adapter factory=".atfile.BlobbableATFile" /> <adapter factory=".atimage.BlobbableATImage" /> <adapter factory=".stringio.BlobbableStringIO" /> Copied: plone.app.blob/trunk/src/plone/app/blob/adapters/ofsfile.py (from r30834, plone.app.blob/trunk/src/plone/app/blob/adapters/atfile.py) ============================================================================== --- plone.app.blob/trunk/src/plone/app/blob/adapters/atfile.py (original) +++ plone.app.blob/trunk/src/plone/app/blob/adapters/ofsfile.py Sat Oct 31 15:34:55 2009 @@ -1,15 +1,13 @@ from zope.interface import implements from zope.component import adapts -from Products.ATContentTypes.interface import IATFile +from plone.app.blob.interfaces import IBlobbable, IOFSFile -from plone.app.blob.interfaces import IBlobbable - -class BlobbableATFile(object): - """ adapter for ATFile objects to work with blobs """ +class BlobbableOFSFile(object): + """ adapter for OFS.File objects to work with blobs """ implements(IBlobbable) - adapts(IATFile) + adapts(IOFSFile) def __init__(self, context): self.context = context @@ -20,9 +18,8 @@ def filename(self): """ see interface ... """ - return self.context.getFilename() + return self.context.filename def mimetype(self): """ see interface ... """ return self.context.getContentType() - Modified: plone.app.blob/trunk/src/plone/app/blob/configure.zcml ============================================================================== --- plone.app.blob/trunk/src/plone/app/blob/configure.zcml (original) +++ plone.app.blob/trunk/src/plone/app/blob/configure.zcml Sat Oct 31 15:34:55 2009 @@ -14,6 +14,10 @@ <include package=".adapters" /> <include package=".browser" /> + <class class="OFS.Image.File"> + <implements interface=".interfaces.IOFSFile" /> + </class> + <class class="ZPublisher.HTTPRequest.FileUpload"> <implements interface=".interfaces.IFileUpload" /> </class> Modified: plone.app.blob/trunk/src/plone/app/blob/interfaces.py ============================================================================== --- plone.app.blob/trunk/src/plone/app/blob/interfaces.py (original) +++ plone.app.blob/trunk/src/plone/app/blob/interfaces.py Sat Oct 31 15:34:55 2009 @@ -42,6 +42,10 @@ """ marker interface for blob-based archetypes image field """ +class IOFSFile(Interface): + """ marker interface for OFS.Image.File class """ + + class IFileUpload(Interface): """ marker interface for ZPublisher.HTTPRequest.FileUpload class """ Modified: plone.app.blob/trunk/src/plone/app/blob/subtypes/image.py ============================================================================== --- plone.app.blob/trunk/src/plone/app/blob/subtypes/image.py (original) +++ plone.app.blob/trunk/src/plone/app/blob/subtypes/image.py Sat Oct 31 15:34:55 2009 @@ -1,5 +1,5 @@ from zope.interface import implements -from Acquisition import Implicit, aq_base +from Acquisition import aq_base from Products.CMFPlone import PloneMessageFactory as _ from Products.Archetypes.atapi import AnnotationStorage from Products.Archetypes.atapi import ImageWidget Added: plone.app.blob/trunk/src/plone/app/blob/tests/test_adapters.py ============================================================================== --- (empty file) +++ plone.app.blob/trunk/src/plone/app/blob/tests/test_adapters.py Sat Oct 31 15:34:55 2009 @@ -0,0 +1,24 @@ +from unittest import defaultTestLoader +from ZODB.blob import Blob +from OFS.Image import File +from plone.app.blob.interfaces import IBlobbable +from plone.app.blob.tests.base import BlobTestCase +from plone.app.blob.tests.utils import getFile + + +class AdapterTests(BlobTestCase): + + def testBlobbableOFSFile(self): + obj = File('foo', 'Foo', getFile('plone.pdf'), 'application/pdf') + obj.filename = 'foo.pdf' + blobbable = IBlobbable(obj) + target = Blob() + blobbable.feed(target) + self.assertEquals(target.open('r').read(), + getFile('plone.pdf').read()) + self.assertEquals(blobbable.filename(), 'foo.pdf') + self.assertEquals(blobbable.mimetype(), 'application/pdf') + + +def test_suite(): + return defaultTestLoader.loadTestsFromName(__name__) |