provide 'size' column for resource listings

git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@1618 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2007-03-07 09:13:10 +00:00
parent b7ca4ca0c1
commit e4c18683e5
3 changed files with 38 additions and 8 deletions

View file

@ -87,6 +87,7 @@
<tr> <tr>
<th>Title</th> <th>Title</th>
<th>Type</th> <th>Type</th>
<th>Size</th>
<th>Modification Date</th> <th>Modification Date</th>
</tr> </tr>
<tal:items repeat="related resources"> <tal:items repeat="related resources">
@ -99,12 +100,13 @@
</a> </a>
</td> </td>
<td><span tal:replace="related/typeTitle">Type</span></td> <td><span tal:replace="related/typeTitle">Type</span></td>
<td><span tal:replace="related/context/sizeForDisplay">Type</span></td>
<td><span tal:replace="related/modified">Type</span></td> <td><span tal:replace="related/modified">Type</span></td>
</tr> </tr>
<tr tal:define="description related/description" <tr tal:define="description related/description"
tal:condition="description" tal:condition="description"
tal:attributes="class class"> tal:attributes="class class">
<td colspan="3" style="padding-left: 7em"> <td colspan="4" style="padding-left: 7em">
<i tal:content="description">describing...</i> <i tal:content="description">describing...</i>
</td> </td>
</tr> </tr>

View file

@ -7,6 +7,9 @@
<div metal:use-macro="views/node_macros/editicons" /> <div metal:use-macro="views/node_macros/editicons" />
</tal:edit> </tal:edit>
<h1 tal:content="item/title">Title</h1> <h1 tal:content="item/title">Title</h1>
<p tal:define="description item/description"
tal:condition="description">
<i tal:content="description">Description</i></p>
<div class="content-1" id="1.body" <div class="content-1" id="1.body"
tal:attributes="id id;" tal:attributes="id id;"
tal:content="structure item/render"> tal:content="structure item/render">
@ -30,6 +33,7 @@
<metal:block define-macro="image"> <metal:block define-macro="image">
<div tal:attributes="ondblclick python: item.openEditWindow('edit.html')"> <div tal:attributes="ondblclick python: item.openEditWindow('edit.html')">
<h3 tal:content="item/title">Title</h3> <h3 tal:content="item/title">Title</h3>
<p><i tal:content="item/description">Description</i></p>
<img src="#" <img src="#"
tal:attributes="src string:${view/url}/.target${view/targetId}/view" /> tal:attributes="src string:${view/url}/.target${view/targetId}/view" />
</div> </div>
@ -39,7 +43,7 @@
<metal:block define-macro="download"> <metal:block define-macro="download">
<div tal:attributes="ondblclick python: item.openEditWindow('edit.html')"> <div tal:attributes="ondblclick python: item.openEditWindow('edit.html')">
<h3 tal:content="item/title">Title</h3> <h3 tal:content="item/title">Title</h3>
<p tal:content="item/description">Description</p> <p><i tal:content="item/description">Description</i></p>
<p> <p>
<a href="#" <a href="#"
tal:attributes="href string:${view/url}/.target${view/targetId}/view"> tal:attributes="href string:${view/url}/.target${view/targetId}/view">

View file

@ -34,7 +34,7 @@ from zope.component import adapts
from zope.i18nmessageid import MessageFactory from zope.i18nmessageid import MessageFactory
from zope.interface import implements from zope.interface import implements
from zope.size.interfaces import ISized from zope.size.interfaces import ISized
from zope.traversing.api import getName from zope.traversing.api import getName, getParent
from persistent import Persistent from persistent import Persistent
from cStringIO import StringIO from cStringIO import StringIO
@ -111,8 +111,7 @@ class Resource(Image, Contained):
if current != concept: if current != concept:
typePred = self.getLoopsRoot().getConceptManager().getTypePredicate() typePred = self.getLoopsRoot().getConceptManager().getTypePredicate()
if typePred is None: if typePred is None:
raise ValueError('No type predicate found for ' raise ValueError('No type predicate found for ' + getName(self))
+ zapi.getName(self))
if current is not None: if current is not None:
self.deassignConcept(current, [typePred]) self.deassignConcept(current, [typePred])
self.assignConcept(concept, typePred) self.assignConcept(concept, typePred)
@ -123,6 +122,7 @@ class Resource(Image, Contained):
super(Resource, self)._setData(dataFile) super(Resource, self)._setData(dataFile)
if not self.contentType: if not self.contentType:
self.guessContentType(data) self.guessContentType(data)
self._size = len(data)
data = property(Image._getData, _setData) data = property(Image._getData, _setData)
def guessContentType(self, data): def guessContentType(self, data):
@ -167,13 +167,32 @@ class Resource(Image, Contained):
# ISized interface # ISized interface
def getSize(self): def getSize(self):
if self._size:
return self._size
tp = IType(self, None)
if tp is not None:
ti = tp.typeInterface
if ti is not None:
return len(ti(self).data)
return len(self.data) return len(self.data)
def sizeForSorting(self): def sizeForSorting(self):
return 'byte', self.getSize() return 'byte', self.getSize()
def sizeForDisplay(self): def sizeForDisplay(self):
return '%i Bytes' % self.getSize() size = self.getSize()
kb = 1024.0
unit = 'B'
if size < kb:
return '%.0f %s' % (size, unit)
unit = 'kB'
size = size / kb
if size >= kb:
unit = 'MB'
size = size / kb
size = round(size, 1)
return '%.1f %s' % (size, unit)
#return '%s %s' % (util.getNiceNumber(size), unit)
# Document and MediaAsset are legacy classes, will become obsolete # Document and MediaAsset are legacy classes, will become obsolete
@ -188,7 +207,9 @@ class Document(Resource):
self.title = title self.title = title
_data = u'' _data = u''
def setData(self, data): self._data = data.replace('\r', '') def setData(self, data):
self._data = data.replace('\r', '')
self._size = len(data)
def getData(self): return self._data def getData(self): return self._data
data = property(getData, setData) data = property(getData, setData)
@ -241,6 +262,7 @@ class ExternalFileAdapter(FileAdapter):
def setData(self, data): def setData(self, data):
storage = component.getUtility(IExternalStorage, name=self.storageName) storage = component.getUtility(IExternalStorage, name=self.storageName)
storage.setData(self.externalAddress, data, params=self.storageParams) storage.setData(self.externalAddress, data, params=self.storageParams)
self.context._size = len(data)
def getData(self): def getData(self):
storage = component.getUtility(IExternalStorage, name=self.storageName) storage = component.getUtility(IExternalStorage, name=self.storageName)
@ -257,7 +279,9 @@ class DocumentAdapter(ResourceAdapterBase):
# let the adapter handle the data attribute: # let the adapter handle the data attribute:
_adapterAttributes = ResourceAdapterBase._adapterAttributes + ('data',) _adapterAttributes = ResourceAdapterBase._adapterAttributes + ('data',)
def setData(self, data): self.context._data = data.replace('\r', '') def setData(self, data):
self.context._data = data.replace('\r', '')
self.context._size = len(data)
def getData(self): return self.context._data def getData(self): return self.context._data
data = property(getData, setData) data = property(getData, setData)