From 55c3137c4f9fb56d3fd0c2e3df1207e7b8e6b3f3 Mon Sep 17 00:00:00 2001 From: helmutm Date: Fri, 20 Jan 2006 12:14:46 +0000 Subject: [PATCH] Improvements on resource.MediaAsset; moved tests to directory in order to place files there for test upload git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@1020 fd906abe-77d9-0310-91a1-e0d9ade77398 --- README.txt | 43 ++++++++++++++++++++++++-------- configure.zcml | 14 +++++++---- interfaces.py | 25 ++++++++++++++----- resource.py | 25 ++++++++++++++----- tests/__init__.py | 4 +++ tests/test.pdf | Bin 0 -> 25862 bytes tests/test_icon.png | Bin 0 -> 381 bytes tests.py => tests/test_loops.py | 10 ++++---- view.py | 12 --------- 9 files changed, 89 insertions(+), 44 deletions(-) create mode 100644 tests/__init__.py create mode 100644 tests/test.pdf create mode 100644 tests/test_icon.png rename tests.py => tests/test_loops.py (85%) diff --git a/README.txt b/README.txt index a269591..3420b81 100755 --- a/README.txt +++ b/README.txt @@ -19,13 +19,12 @@ Let's start with creating a few example concepts, putting them in a top-level loops container and a concept manager: >>> from loops import Loops - >>> loops = Loops() >>> site['loops'] = Loops() - >>> loops = site['loops'] + >>> loopsRoot = site['loops'] >>> from loops.concept import ConceptManager, Concept - >>> loops['concepts'] = ConceptManager() - >>> concepts = loops['concepts'] + >>> loopsRoot['concepts'] = ConceptManager() + >>> concepts = loopsRoot['concepts'] >>> cc1 = Concept() >>> concepts['cc1'] = cc1 >>> cc1.title @@ -78,8 +77,8 @@ Resources and what they have to do with Concepts We first need a resource manager: >>> from loops.resource import ResourceManager, Document - >>> loops['resources'] = ResourceManager() - >>> resources = loops['resources'] + >>> loopsRoot['resources'] = ResourceManager() + >>> resources = loopsRoot['resources'] A common type of resource is a document: @@ -90,10 +89,35 @@ A common type of resource is a document: >>> doc1.data u'' >>> doc1.contentType - u'text/xml' + '' Another one is a media asset: + >>> from loops.resource import MediaAsset + >>> img = MediaAsset(u'A png Image') + +For testing we use some simple files from the tests directory: + + >>> from loops import tests + >>> import os + >>> path = os.path.join(*tests.__path__) + >>> img.data = open(os.path.join(path, 'test_icon.png')).read() + >>> img.getSize() + 381 + >>> img.getImageSize() + (16, 16) + >>> img.contentType + 'image/png' + + >>> pdf = MediaAsset(u'A pdf File') + >>> pdf.data = open(os.path.join(path, 'test.pdf')).read() + >>> pdf.getSize() + 25862 + >>> pdf.getImageSize() + (-1, -1) + >>> pdf.contentType + 'application/pdf' + We can associate a resource with a concept by assigning it to the concept: >>> cc1.assignResource(doc1) @@ -129,8 +153,8 @@ We first need a view manager: >>> nodeChecker = NamesChecker(('body',)) >>> defineChecker(Node, nodeChecker) - >>> loops['views'] = ViewManager() - >>> views = loops['views'] + >>> loopsRoot['views'] = ViewManager() + >>> views = loopsRoot['views'] The view space is typically built up with nodes; a node may be a top-level menu that may contain other nodes as menu or content items: @@ -290,7 +314,6 @@ instance to another. >>> data[3]['name'] u'm112' - >>> import os >>> dumpname = os.path.dirname(__file__) + '/test.tmp' >>> exporter.filename = dumpname >>> exporter.dumpData() diff --git a/configure.zcml b/configure.zcml index f136103..7403b9c 100644 --- a/configure.zcml +++ b/configure.zcml @@ -152,6 +152,12 @@ + + - - diff --git a/interfaces.py b/interfaces.py index 60e8a13..3191d02 100644 --- a/interfaces.py +++ b/interfaces.py @@ -108,14 +108,23 @@ class IResource(Interface): title = schema.TextLine( title=_(u'Title'), - description=_(u'Title of the document'), + description=_(u'Title of the resource'), + default=u'', + missing_value=u'', required=False) - contentType = schema.TextLine( + contentType = schema.BytesLine( title=_(u'Content Type'), - description=_(u'Content type (format) of the body field, ' - 'default is "text/xml"'), - default=_(u'text/xml'), + description=_(u'Content type (format) of the data field'), + default='', + missing_value='', + required=False) + + data = schema.Bytes( + title=_(u'Data'), + description=_(u'Resource raw data'), + default='', + missing_value='', required=False) def getClients(relationships=None): @@ -131,6 +140,8 @@ class IDocument(IResource): data = schema.Text( title=_(u'Data'), description=_(u'Raw body data of the document'), + default=u'', + missing_value=u'', required=False) @@ -141,7 +152,9 @@ class IMediaAsset(IResource, IBaseAsset): data = schema.Bytes( title=_(u'Data'), - description=_(u'Media asset raw data'), + description=_(u'Media asset file'), + default='', + missing_value='', required=False) diff --git a/resource.py b/resource.py index 72ddede..8e5afaa 100644 --- a/resource.py +++ b/resource.py @@ -44,16 +44,11 @@ class Resource(Contained, Persistent): def setTitle(self, title): self._title = title title = property(getTitle, setTitle) - _contentType = u'text/xml' + _contentType = '' def setContentType(self, contentType): self._contentType = contentType def getContentType(self): return self._contentType contentType = property(getContentType, setContentType) - _data = u'' - def setData(self, data): self._data = data - def getData(self): return self._data - data = property(getData, setData) - def getClients(self, relationships=None): rels = getRelations(second=self, relationships=relationships) return [r.first for r in rels] @@ -61,11 +56,18 @@ class Resource(Contained, Persistent): def __init__(self, title=u''): self.title = title + _size = 0 + class Document(Resource): implements(IDocument) + _data = u'' + def setData(self, data): self._data = data + def getData(self): return self._data + data = property(getData, setData) + class MediaAsset(Resource, BaseMediaAsset): @@ -75,6 +77,17 @@ class MediaAsset(Resource, BaseMediaAsset): super(MediaAsset, self).__init__() self.title = title + def _setData(self, data): + super(MediaAsset, self)._setData(data) + if not self.contentType: + self.guessContentType(data) + + data = property(BaseMediaAsset._getData, _setData) + + def guessContentType(self, data): + if data.startswith('%PDF'): + self.contentType = 'application/pdf' + class ResourceManager(BTreeContainer): diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..4bc90fb --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1,4 @@ +""" +$Id$ +""" + diff --git a/tests/test.pdf b/tests/test.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b440416ab13b14da7a447c4fe192fbc3f4aad4c6 GIT binary patch literal 25862 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 XsYMsvPhXP+1|5T^tDnm{r-UW|@Dqya literal 0 HcmV?d00001 diff --git a/tests.py b/tests/test_loops.py similarity index 85% rename from tests.py rename to tests/test_loops.py index 784165b..503ec23 100755 --- a/tests.py +++ b/tests/test_loops.py @@ -8,11 +8,11 @@ from zope.interface import implements from zope.app import zapi from zope.app.intid.interfaces import IIntIds -from interfaces import ILoops +from loops.interfaces import ILoops from loops import Loops -from interfaces import IConcept, IConceptManager -from interfaces import IDocument, IMediaAsset, IResourceManager -from interfaces import INode, IViewManager +from loops.interfaces import IConcept, IConceptManager +from loops.interfaces import IDocument, IMediaAsset, IResourceManager +from loops.interfaces import INode, IViewManager from loops.concept import Concept, ConceptManager from loops.resource import Document, MediaAsset, ResourceManager from loops.view import Node, ViewManager @@ -43,7 +43,7 @@ def test_suite(): flags = doctest.NORMALIZE_WHITESPACE | doctest.ELLIPSIS return unittest.TestSuite(( unittest.makeSuite(Test), - DocFileSuite('README.txt', optionflags=flags), + DocFileSuite('../README.txt', optionflags=flags), )) if __name__ == '__main__': diff --git a/view.py b/view.py index 3551dde..6014819 100644 --- a/view.py +++ b/view.py @@ -159,15 +159,3 @@ class NodeTraverser(ItemTraverser): return self.context.getLoopsRoot() return super(NodeTraverser, self).publishTraverse(request, name) - -# class NodeTraversable(ContainerTraversable): -# -# adapts(INode) -# -# def traverse(self, name, furtherPath): -# print name -# if str(name) == '.loops': -# print self._container.getLoopsRoot() -# return self._container.getLoopsRoot() -# return super(NodeTraversable, self).traverse(name, furtherPath) -