def from_json(comp_id: int, ref_id=None): """Reads competition from json result file takes com_id as argument""" from db.tables import TblResultFile as R with db_session() as db: if ref_id: file = db.query(R).get(ref_id).filename else: file = db.query(R.filename).filter(and_(R.comp_id == comp_id, R.task_id.is_(None), R.active == 1)).scalar() if file: comp = Comp(comp_id=comp_id) with open(path.join(RESULTDIR, file), 'r') as f: '''read task json file''' data = json.load(f) for k, v in data['info'].items(): # not using update to intercept changing in formats if hasattr(comp, k): setattr(comp, k, v) # comp.as_dict().update(data['info']) comp.stats = dict(**data['stats']) comp.rankings.update(data['rankings']) comp.tasks.extend(data['tasks']) comp.formula = Formula.from_dict(data['formula']) comp.data = dict(**data['file_stats']) results = [] for p in data['results']: '''get participants''' participant = Participant(comp_id=comp_id) participant.as_dict().update(p) results.append(participant) # should already be ordered, so probably not necessary comp.participants = sorted(results, key=lambda k: k.score, reverse=True) return comp