#!/usr/bin/env python import otime import argparse import datetime from rich import print from rich import inspect from rich.console import Console from rich.columns import Columns from rich.table import Table def print_runners(Runners): table = Table(title="Runners") table.add_column("Name", justify="right", style="cyan", no_wrap=True) table.add_column("club", style="magenta") table.add_column("card", style="red") table.add_column("class", justify="right", style="green") table.add_column("Status", justify="right", style="blue") for i in Runners: table.add_row(i.fullname(), i.club ,str(i.card), i.o_class.name, i.status()) console = Console() console.print(table) def print_time(Runners): table = Table(title="Time") table.add_column("Name", justify="right", style="cyan", no_wrap=True) table.add_column("club", style="magenta") table.add_column("splits", style="red") table.add_column("Check", style="green") table.add_column("Time", justify="right", style="blue") for i in Runners: try: tottime = datetime.timedelta(seconds = i.totaltime()) except: tottime = 0 table.add_row(i.fullname(), i.o_class.name, str(i.splits), str(i.check_codes()), str(tottime)) console = Console() console.print(table) def print_class_result(runners, o_class): table = Table(title=o_class.name) table.add_column("Pos", style="red", no_wrap=True) table.add_column("Name", justify="right", style="cyan", no_wrap=True) table.add_column("Club", style="magenta") table.add_column("Time", justify="right", style="blue") pos = 0 if o_class: runners = otime.get_runners_in_class(runners, o_class) runners_ok = [] runners_dsq = [] for n in runners: if n.status() == 'OK': runners_ok.append(n) elif n.status() == 'Disqualified': runners_dsq.append(n) runners_ok.sort(key=lambda x: x.totaltime()) for i in runners_ok: #if i.status() == 'OK': pos += 1 table.add_row(str(pos)+'.',i.fullname(), i.club, str(datetime.timedelta(seconds=i.totaltime()))) for i in runners_dsq: table.add_row('Dsq',i.fullname(), i.club, '') console = Console() console.print(table) def print_class_splits(runners, o_class): table = Table(title=o_class.name) table.add_column("Pos", style="red", no_wrap=True) table.add_column("Name", justify="right", style="cyan", no_wrap=True) table.add_column("club", style="magenta") if o_class: for i in o_class.course.codes: table.add_column(str(i)) runners = otime.get_runners_in_class(runners, o_class) runners_ok = [] runners_dsq = [] for n in runners: if n.status() == 'OK': runners_ok.append(n) elif n.status() == 'Disqualified': runners_dsq.append(n) runners_ok.sort(key=lambda x: x.totaltime()) pos = 0 for i in runners_ok: splits = i.res_splits().values() pos += 1 list_string = map(lambda x:str(datetime.timedelta(seconds=x)), splits) table.add_row(str(pos)+'.', i.fullname(), i.club, *list_string) for i in runners_dsq: splits = i.res_splits().values() list_string = map(lambda x:str(datetime.timedelta(seconds=x)), splits) table.add_row('Dsq', i.fullname(), i.club, *list_string) console = Console() console.print(table) def print_o_classes(class_list): table = Table(title="Classes") table.add_column("Class", justify="right", style="cyan", no_wrap=True) table.add_column("Course", style="magenta") table.add_column("Controls", justify="right", style="green") for i in class_list: table.add_row(i.name, i.course.name , str(i.course.codes)) console = Console() console.print(table) def main(): parser = argparse.ArgumentParser() parser.add_argument( '--debug', action='store_true', help='Print debug info' ) subparsers = parser.add_subparsers(dest='command') show_runners = subparsers.add_parser('show_runners', help='show a table of runners') show_runners.add_argument('--ttcnf', required=True, help='ttime configuration file') show_runners.add_argument('--ttdb', required=True, help='ttime database file') show_runners.add_argument('--mtr', required=True, help='mtr csv file') show_runner = subparsers.add_parser('show_runner', help='show a table of runners') show_runner.add_argument('--ttcnf', required=True, help='ttime configuration file') show_runner.add_argument('--ttdb', required=True, help='ttime database file') show_runner.add_argument('--mtr', required=True, help='mtr csv file') show_runner.add_argument('--runner', required=True, help='Which runner to print') show_runners = subparsers.add_parser('show_result', help='show a table of runners') show_runners.add_argument('--ttcnf', required=True, help='ttime configuration file') show_runners.add_argument('--ttdb', required=True, help='ttime database file') show_runners.add_argument('--mtr', required=True, help='mtr csv file') show_runners.add_argument('--class', dest='o_class_str', help='Which class to show. Prints all classes if not set') show_runners.add_argument('--splits', action='store_true', help='Shows split times') show_classes = subparsers.add_parser('show_classes', help='show a table of classes') show_classes.add_argument('--ttcnf', required=True, help='ttime configuration file') create_xml = subparsers.add_parser('create_xml', help='Create xml result file') create_xml.add_argument('--ttcnf', required=True, help='ttime configuration file') create_xml.add_argument('--ttdb', required=True, help='ttime database file') create_xml.add_argument('--mtr', required=True, help='mtr csv file') create_xml.add_argument('--file', required=True, help='Filename for result file') args = parser.parse_args() if args.command == 'show_runners': event = otime.event(0, 'NoName') event.import_ttime_cnf(args.ttcnf) event.import_ttime_db(args.ttdb) event.import_mtr_file(args.mtr) event.match_runners_cards() print_runners(event.runners) elif args.command == 'show_runner': event = otime.event(0, 'NoName') event.import_ttime_cnf(args.ttcnf) event.import_ttime_db(args.ttdb) event.import_mtr_file(args.mtr) event.match_runners_cards() for n in event.runners: if args.runner == n.fullname(): inspect(n) break else: print('Runner not found. Use full name.') elif args.command == 'show_result': event = otime.event(0, 'NoName') event.import_ttime_cnf(args.ttcnf) event.import_ttime_db(args.ttdb) event.import_mtr_file(args.mtr) event.match_runners_cards() for n in event.o_classes: if args.o_class_str == n.name: sel_classes = [n] break else: sel_classes = event.o_classes for o_class in sel_classes: if args.splits: print_class_splits(event.runners, o_class) else: print_class_result(event.runners, o_class) elif args.command == 'show_classes': event = otime.event(0, 'NoName') event.import_ttime_cnf(args.ttcnf) print_o_classes(event.o_classes) elif args.command == 'create_xml': event = otime.event(0, 'NoName') event.import_ttime_cnf(args.ttcnf) event.import_ttime_db(args.ttdb) event.import_mtr_file(args.mtr) event.match_runners_cards() event.get_xml_res().write(args.file) if __name__ == "__main__": main()