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:
parent
b7ca4ca0c1
commit
e4c18683e5
3 changed files with 38 additions and 8 deletions
|
@ -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>
|
||||
|
|
|
@ -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">
|
||||
|
|
36
resource.py
36
resource.py
|
@ -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)
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue