diff --git a/browser/concept_macros.pt b/browser/concept_macros.pt
index 34d2d1b..adf40d0 100644
--- a/browser/concept_macros.pt
+++ b/browser/concept_macros.pt
@@ -87,6 +87,7 @@
Title |
Type |
+ Size |
Modification Date |
@@ -99,12 +100,13 @@
Type |
+ Type |
Type |
-
+ |
describing...
|
diff --git a/browser/resource_macros.pt b/browser/resource_macros.pt
index 62fa891..76cc4ef 100644
--- a/browser/resource_macros.pt
+++ b/browser/resource_macros.pt
@@ -7,6 +7,9 @@
Title
+
+ Description
@@ -30,6 +33,7 @@
Title
+
Description
@@ -39,7 +43,7 @@
Title
-
Description
+
Description
diff --git a/resource.py b/resource.py
index a51135a..5f699a3 100644
--- a/resource.py
+++ b/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)