diff --git a/cybertools/composer/schema/grid/field.py b/cybertools/composer/schema/grid/field.py index e20e5ce..6d98529 100644 --- a/cybertools/composer/schema/grid/field.py +++ b/cybertools/composer/schema/grid/field.py @@ -157,6 +157,12 @@ class RecordsFieldInstance(GridFieldInstance): def getRenderer(self, name): return grid_macros.macros.get(name) + def fromKeyTable(self, value): + fis = self.columnFieldInstances + return [dict([(fis[0].name, k)] + + [(fi.name, v[i]) for i, v in enumerate(fis[1:])]) + for k, v in value.items()] + def marshall(self, value): result = [] value = value or [] @@ -258,6 +264,13 @@ class KeyTableFieldInstance(RecordsFieldInstance): pass +class ContextBasedRecordsFieldInstance(RecordsFieldInstance): + + @Lazy + def columnTypes(self): + obj = self.clientInstance.context + return [Field(name) for name in obj.columnNames] + class ContextBasedKeyTableFieldInstance(KeyTableFieldInstance): @Lazy diff --git a/cybertools/composer/schema/grid/interfaces.py b/cybertools/composer/schema/grid/interfaces.py index bc521d9..5fc27e2 100644 --- a/cybertools/composer/schema/grid/interfaces.py +++ b/cybertools/composer/schema/grid/interfaces.py @@ -51,6 +51,16 @@ class Records(Grid): instanceName='records',)) +class RecordsTable(Grid): + + __typeInfo__ = ('recordstable', + FieldType('recordstable', 'recordstable', + u'A series of records or rows.', + displayRenderer='display_records', + inputRenderer='input_records', + instanceName='recordstable',)) + + class KeyTable(Grid): __typeInfo__ = ('keytable', diff --git a/cybertools/tracking/btree.py b/cybertools/tracking/btree.py index 79df0ce..a49ac94 100644 --- a/cybertools/tracking/btree.py +++ b/cybertools/tracking/btree.py @@ -80,6 +80,11 @@ class Track(Persistent): data.update(newData) self.data = data # record change + def updateIndex(self, **kw): + for k, v in kw.items(): + setattr(self, k, v) + getParent(self).indexTrack(0, self, k) + def __repr__(self): md = self.metadata md['timeStamp'] = timeStamp2ISO(md['timeStamp']) @@ -102,6 +107,7 @@ class TrackingStorage(BTreeContainer): runs = None # currently active runs finishedRuns = None # finished runs currentRuns = None # the currently active run for each task + storage = None # compatibility with new cco.storage def __init__(self, *args, **kw): trackFactory = kw.pop('trackFactory', None) @@ -200,6 +206,9 @@ class TrackingStorage(BTreeContainer): self.indexTrack(trackNum, track) return trackId + def setTrackData(self, track, data): + track.data = data # persistent track: data will be stored automatically + def updateTrack(self, track, data, overwrite=False): trackId = str(track.__name__) trackNum = int(trackId) diff --git a/cybertools/util/date.py b/cybertools/util/date.py index f614d35..99328ab 100644 --- a/cybertools/util/date.py +++ b/cybertools/util/date.py @@ -32,6 +32,8 @@ def getTimeStamp(): return int(time.time()) def date2TimeStamp(d): + if isinstance(d, (int, float)): + return int(d) return int(time.mktime(d.timetuple()))