let subclasses of TrackingStorage define their own Track class (trackFactory)

git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@2003 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2007-09-06 09:43:55 +00:00
parent ef14fad4aa
commit fa535ce0dc

View file

@ -52,10 +52,41 @@ class Run(object):
str(self.finished)))
class Track(Persistent):
implements(ITrack)
metadata_attributes = ('taskId', 'runId', 'userName', 'timeStamp')
@property
def metadata(self):
return dict((attr, getattr(self, attr)) for attr in self.metadata_attributes)
def __init__(self, taskId, runId, userName, data={}):
self.taskId = taskId
self.runId = runId
self.userName = userName
self.timeStamp = getTimeStamp()
self.data = data
def update(self, newData):
self.timeStamp = getTimeStamp()
data = self.data
data.update(newData)
self.data = data
def __repr__(self):
md = self.metadata
md['timeStamp'] = timeStamp2ISO(md['timeStamp'])
return '<Track %s: %s>' % (`[md[a] for a in self.metadata_attributes]`,
`self.data`)
class TrackingStorage(BTreeContainer):
implements(ITrackingStorage)
trackFactory = Track
trackNum = runId = 0
runs = None
@ -119,7 +150,7 @@ class TrackingStorage(BTreeContainer):
self.trackNum += 1
trackNum = self.trackNum
trackId = self.idFromNum(trackNum)
track = Track(taskId, runId, userName, data)
track = self.trackFactory(taskId, runId, userName, data)
self[trackId] = track
self.indexTrack(trackNum, track)
return trackId
@ -163,6 +194,13 @@ class TrackingStorage(BTreeContainer):
for idx in kw:
value = kw[idx]
if idx in self.indexAttributes:
#if type(value) not in (list, tuple):
# value = [value]
# TODO: handle a list of values, provide union of results
# resultx = None
# for v in value:
# result = self.union(result, self.indexes[idx].apply((v, v)))
# result = self.intersect(result, resultx)
result = self.intersect(result, self.indexes[idx].apply((value, value)))
elif idx == 'timeFrom':
result = self.intersect(result,
@ -170,6 +208,10 @@ class TrackingStorage(BTreeContainer):
elif idx == 'timeTo':
result = self.intersect(result,
self.indexes['timeStamp'].apply((None, value)))
elif idx == 'timeFromTo': # expects a tuple (from, to)
start, end = value
result = self.intersect(result,
self.indexes['timeStamp'].apply((start, end)))
return result and [self[self.idFromNum(r)] for r in result] or set()
def intersect(self, r1, r2):
@ -182,35 +224,6 @@ class TrackingStorage(BTreeContainer):
return self.taskUsers.keys()
class Track(Persistent):
implements(ITrack)
metadata_attributes = ('taskId', 'runId', 'userName', 'timeStamp')
@property
def metadata(self):
return dict((attr, getattr(self, attr)) for attr in self.metadata_attributes)
def __init__(self, taskId, runId, userName, data={}):
self.taskId = taskId
self.runId = runId
self.userName = userName
self.timeStamp = getTimeStamp()
self.data = data
def update(self, newData):
self.timeStamp = getTimeStamp()
data = self.data
data.update(newData)
self.data = data
def __repr__(self):
md = self.metadata
md['timeStamp'] = timeStamp2ISO(md['timeStamp'])
return '<Track %s: %s>' % (`[md[a] for a in self.metadata_attributes]`,
`self.data`)
def timeStamp2ISO(ts):
return time.strftime('%Y-%m-%d %H:%M', time.gmtime(ts))