From 5c923a9a6e8cebfc59690406b488488247276237 Mon Sep 17 00:00:00 2001 From: Antonio Golfari Date: Wed, 30 Aug 2023 13:52:06 +0200 Subject: [PATCH] FSDB export updated --- airscore/core/fsdb.py | 105 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 99 insertions(+), 6 deletions(-) diff --git a/airscore/core/fsdb.py b/airscore/core/fsdb.py index 63b8d19e..7226f625 100644 --- a/airscore/core/fsdb.py +++ b/airscore/core/fsdb.py @@ -162,7 +162,9 @@ def to_file(self, participants_fsdb: bool = False): - filename: STR - fsdb: FSDB xml data, to be used in frontend.""" from frontendUtils import get_pretty_data - from compUtils import get_comp_json + from compUtils import get_comp_json, get_comp_json_filename + from task import get_task_json + from result import get_comp_team_scoring, get_comp_country_scoring formula = self.comp.formula pilots = self.comp.participants @@ -234,9 +236,9 @@ def to_file(self, participants_fsdb: bool = False): for k, v in comp_attr.items(): comp.set(k, str(v)) - formula = ET.SubElement(comp, 'FsScoreFormula') + f = ET.SubElement(comp, 'FsScoreFormula') for k, v in formula_attr.items(): - formula.set(k, str(v)) + f.set(k, str(v)) notes = ET.SubElement(comp, 'FsCompetitionNotes') notes.text = CDATA('Generated by AirScore') @@ -286,7 +288,7 @@ def to_file(self, participants_fsdb: bool = False): task_s = ET.SubElement(task, 'FsTaskState') task_p = ET.SubElement(task, 'FsParticipants') task_sp = ET.SubElement(task, 'FsTaskScoreParams') - # task_tr = ET.SubElement(task, 'FsTaskResults') + task_tr = ET.SubElement(task, 'FsTaskResults') # tf = dict(t.formula.to_dict(), **t.stats) @@ -547,6 +549,39 @@ def to_file(self, participants_fsdb: bool = False): for k, v in r_attr.items(): pil_r.set(k, str(v)) + '''FsTaskResults''' + result = get_pretty_data(get_task_json(t.task_id)) + r = result['results'] + rankings = result['rankings'] + for el in rankings: + rank_id = el['rank_id'] + taskresult = ET.SubElement(task_tr, 'FsTaskResult') + taskresult.set('id', str(el['rank_name']).lower()) + taskresult.set('title', el['rank_name']) + taskresult.set('ts', '') + taskresult.set('result_pattern', ('#0.0' if formula.task_result_decimal == 1 else '#0')) + scorep = ET.SubElement(taskresult, 'FsTaskScoreParams') + for k, v in sp_attr.items(): + scorep.set(k, str(v)) + for i, tp in enumerate(tps): + sp_dist = ET.SubElement(scorep, 'FsTaskDistToTp') + sp_dist.set('tp_no', str(i + 1)) + sp_dist.set('distance', str(t.partial_distance[i])) + '''FsTaskResultParticipants''' + taskp = ET.SubElement(taskresult, 'FsTaskResultParticipants') + for p in [x for x in r if x['rankings'][rank_id]]: + pr = ET.SubElement(taskp, 'FsTaskParticipantResult') + pr.set('id', str(p['ID'])) + pr.set('rank', str(p['rankings'][rank_id]).split(' ')[0]) + pr.set('distance_points', p['distance_score'] or '0') + pr.set('ddeparture_points', '0') + pr.set('arrival_points', p['arrival_score'] or '0') + pr.set('leading_points', p['departure_score'] or '0') + pr.set('time_points', p['time_score'] or '0') + pr.set('points', p['score'].split('>')[1].split('<')[0] or '0') + if p['result_type'].lower() in ('abs', 'dnf', 'nyp'): + pr.set('no_distance', p['result_type'].upper()) + '''FsCompetitionResults''' compresults = ET.SubElement(comp, 'FsCompetitionResults') result = get_pretty_data(get_comp_json(self.comp.comp_id)) @@ -560,8 +595,8 @@ def to_file(self, participants_fsdb: bool = False): cr.set('top', 'all') # ? cr.set('tasks', ';'.join([str(i) for i in task_ids.keys()])) cr.set('ts', '') - cr.set('task_result_pattern', '#0.0' if self.comp.formula.task_result_decimal == 1 else '#0') - cr.set('comp_result_pattern', '#0.0' if self.comp.formula.comp_result_decimal == 1 else '#0') + cr.set('task_result_pattern', '#0.0' if formula.task_result_decimal == 1 else '#0') + cr.set('comp_result_pattern', '#0.0' if formula.comp_result_decimal == 1 else '#0') for p in [x for x in r if x['rankings'][rank_id]]: pr = ET.SubElement(cr, 'FsParticipant') pr.set('id', str(p['ID'])) @@ -575,6 +610,64 @@ def to_file(self, participants_fsdb: bool = False): pt.set('counting_points', x[1]['score']) pt.set('counts', '1') + if formula.team_scoring or formula.country_scoring: + '''FsTeamResults''' + teamresults = ET.SubElement(comp, 'FsTeamResults') + if formula.team_scoring: + filename = get_comp_json_filename(self.comp.comp_id) + results = get_comp_team_scoring(filename) + tr = ET.SubElement(teamresults, 'FsTeamResult') + tr.set('id', 'team') + tr.set('title', 'Team Results') + tr.set('tasks', ';'.join([str(i) for i in task_ids.keys()])) + tr.set('ts', '') + tr.set('task_result_pattern', '#0.0' if formula.task_result_decimal == 1 else '#0') + tr.set('comp_result_pattern', '#0.0' if formula.comp_result_decimal == 1 else '#0') + for idx, team in enumerate(sorted(results['teams'], key=lambda k: k['score'], reverse = 1), start=1): + team_pilots = sorted([p for p in results['data'] if p['team'].lower() == team['name'].lower()], key=lambda k: k['score'], reverse = 1) + print(f"Team: {team['name']} | pilots: {[p['name'] for p in team_pilots]}") + t = ET.SubElement(tr, 'FsTeam') + t.set('rank', str(idx)) + t.set('name', str(team['name'])) + t.set('points', str(team['score'])) + for p in team_pilots: + par = ET.SubElement(t, 'FsParticipant') + par.set('id', str(p['ID'])) + res = list(el for el in p['results'].items() if el[0] in task_ids.values()) + print(f"res: {res}") + for x in res: + print(f"ID: {x[0]} | items: {task_ids.items()}") + pt = ET.SubElement(par, 'FsTask') + pt.set('id', str(next(k for k, v in task_ids.items() if v == x[0]))) + pt.set('counts', str(x[1]['perf'])) + + if formula.country_scoring: + results = get_comp_country_scoring(filename) + tr = ET.SubElement(teamresults, 'FsTeamResult') + tr.set('id', 'nat_code_3166_a3') + tr.set('title', 'Nations Results') + tr.set('tasks', ';'.join([str(i) for i in task_ids.keys()])) + tr.set('ts', '') + tr.set('task_result_pattern', '#0.0' if formula.task_result_decimal == 1 else '#0') + tr.set('comp_result_pattern', '#0.0' if formula.comp_result_decimal == 1 else '#0') + for idx, team in enumerate(sorted(results['teams'], key=lambda k: k['score'], reverse = 1), start=1): + team_pilots = sorted([p for p in results['data'] if p['team'].lower() == team['name'].lower()], key=lambda k: k['score'], reverse = 1) + print(f"Team: {team['name']} | pilots: {[p['name'] for p in team_pilots]}") + t = ET.SubElement(tr, 'FsTeam') + t.set('rank', str(idx)) + t.set('name', str(team['name'])) + t.set('points', str(team['score'])) + for p in team_pilots: + par = ET.SubElement(t, 'FsParticipant') + par.set('id', str(p['ID'])) + res = list(el for el in p['results'].items() if el[0] in task_ids.values()) + print(f"res: {res}") + for x in res: + print(f"ID: {x[0]} | items: {task_ids.items()}") + pt = ET.SubElement(par, 'FsTask') + pt.set('id', str(next(k for k, v in task_ids.items() if v == x[0]))) + pt.set('counts', str(x[1]['perf'])) + '''creates the file to store''' fsdb = ET.tostring(root, pretty_print=True, xml_declaration=True, encoding='UTF-8')