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>
<th>Title</th>
<th>Type</th>
<th>Size</th>
<th>Modification Date</th>
</tr>
<tal:items repeat="related resources">
@ -99,12 +100,13 @@
</a>
</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>
</tr>
<tr tal:define="description related/description"
tal:condition="description"
tal:attributes="class class">
<td colspan="3" style="padding-left: 7em">
<td colspan="4" style="padding-left: 7em">
<i tal:content="description">describing...</i>
</td>
</tr>

View file

@ -7,6 +7,9 @@
<div metal:use-macro="views/node_macros/editicons" />
</tal:edit>
<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"
tal:attributes="id id;"
tal:content="structure item/render">
@ -30,6 +33,7 @@
<metal:block define-macro="image">
<div tal:attributes="ondblclick python: item.openEditWindow('edit.html')">
<h3 tal:content="item/title">Title</h3>
<p><i tal:content="item/description">Description</i></p>
<img src="#"
tal:attributes="src string:${view/url}/.target${view/targetId}/view" />
</div>
@ -39,7 +43,7 @@
<metal:block define-macro="download">
<div tal:attributes="ondblclick python: item.openEditWindow('edit.html')">
<h3 tal:content="item/title">Title</h3>
<p tal:content="item/description">Description</p>
<p><i tal:content="item/description">Description</i></p>
<p>
<a href="#"
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.interface import implements
from zope.size.interfaces import ISized
from zope.traversing.api import getName
from zope.traversing.api import getName, getParent
from persistent import Persistent
from cStringIO import StringIO
@ -111,8 +111,7 @@ class Resource(Image, Contained):
if current != concept:
typePred = self.getLoopsRoot().getConceptManager().getTypePredicate()
if typePred is None:
raise ValueError('No type predicate found for '
+ zapi.getName(self))
raise ValueError('No type predicate found for ' + getName(self))
if current is not None:
self.deassignConcept(current, [typePred])
self.assignConcept(concept, typePred)
@ -123,6 +122,7 @@ class Resource(Image, Contained):
super(Resource, self)._setData(dataFile)
if not self.contentType:
self.guessContentType(data)
self._size = len(data)
data = property(Image._getData, _setData)
def guessContentType(self, data):
@ -167,13 +167,32 @@ class Resource(Image, Contained):
# ISized interface
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)
def sizeForSorting(self):
return 'byte', self.getSize()
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
@ -188,7 +207,9 @@ class Document(Resource):
self.title = title
_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
data = property(getData, setData)
@ -241,6 +262,7 @@ class ExternalFileAdapter(FileAdapter):
def setData(self, data):
storage = component.getUtility(IExternalStorage, name=self.storageName)
storage.setData(self.externalAddress, data, params=self.storageParams)
self.context._size = len(data)
def getData(self):
storage = component.getUtility(IExternalStorage, name=self.storageName)
@ -257,7 +279,9 @@ class DocumentAdapter(ResourceAdapterBase):
# let the adapter handle the data attribute:
_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
data = property(getData, setData)