improve time tracking of tasks and CSV formatting

master
Clemens Klug 2019-10-15 14:42:51 +02:00
parent bc74cbd19a
commit cbe414232c
2 changed files with 28 additions and 9 deletions

View File

@ -365,6 +365,7 @@ class BiogamesTasks(Analyzer):
super().__init__(settings) super().__init__(settings)
self.settings: LogSettings = settings self.settings: LogSettings = settings
self.tasks = {} self.tasks = {}
self.first_board_view = {}
self.last_board = None self.last_board = None
self.instance_config_id: str = None self.instance_config_id: str = None
@ -372,11 +373,15 @@ class BiogamesTasks(Analyzer):
if self.instance_config_id is None: if self.instance_config_id is None:
if entry[self.settings.type_field] in self.settings.custom['instance_start']: if entry[self.settings.type_field] in self.settings.custom['instance_start']:
self.instance_config_id = json_path(entry, self.settings.custom['instance_config_id']) self.instance_config_id = json_path(entry, self.settings.custom['instance_config_id'])
if self.is_task(entry) and self.last_board: if self.is_task(entry):
entry['__duration'] = entry['timestamp'] - self.last_board['timestamp'] task_id = entry['answers']['@id']
self.tasks[self.ids()] = entry if task_id not in self.first_board_view:
logger.error("task_id is not in self.first_board_view!", task_id, entry)
else:
entry['__duration'] = entry['timestamp'] - self.first_board_view[task_id]['timestamp']
self.tasks[self.ids(task_id)] = entry
if self.is_board(entry): if self.is_board(entry):
self.last_board = entry self.first_board_view[entry['board_id']] = entry
return False return False
def result(self, store: ResultStore, name=None) -> None: def result(self, store: ResultStore, name=None) -> None:
@ -388,8 +393,9 @@ class BiogamesTasks(Analyzer):
results[ids] = {"duration": task['__duration'], "result": action['increment']} results[ids] = {"duration": task['__duration'], "result": action['increment']}
store.add(Result(type(self), results)) store.add(Result(type(self), results))
def ids(self): def ids(self, task_id):
return f"{self.instance_config_id}_{self.last_board['sequence_id']}_{self.last_board['board_id']}" task = self.first_board_view[task_id]
return f"{self.instance_config_id}_{task['sequence_id']}_{task['board_id']}"
def is_task(self, entry) -> bool: def is_task(self, entry) -> bool:
return entry['@class'] in self.DATA_CLASSES return entry['@class'] in self.DATA_CLASSES

View File

@ -1,14 +1,27 @@
from datetime import datetime as dt from datetime import datetime as dt
SEP = "\",\""
LS = "\""
LE = "\""
NL = LS + "\n" + LE
def flat_dict_to_csv(data): def flat_dict_to_csv(data):
keys = set() keys = set()
for i in data: for i in data:
keys = keys.union(set(i.keys())) keys = keys.union(set(i.keys()))
keys = sorted(keys) keys = sorted(keys)
out = ",".join(keys) out = SEP.join(keys)
for i in data: for i in data:
out += "\n" + ",".join([str(i.get(j, "")) for j in keys]) out += NL + SEP.join([escape(i.get(j, "")) for j in keys])
return out return LS + out + LE
def escape(value):
val = str(value)
val = val.replace(".", ",")
return val
def pretty_ts(timestamp, fmt="%Y-%m-%d %H:%M:%S"): def pretty_ts(timestamp, fmt="%Y-%m-%d %H:%M:%S"):
d = dt.fromtimestamp(int(timestamp)/1000.0) d = dt.fromtimestamp(int(timestamp)/1000.0)