Compare commits
5 Commits
bf0b400708
...
3894eb7284
Author | SHA1 | Date | |
---|---|---|---|
3894eb7284 | |||
de4f288a4a | |||
7591523b37 | |||
e5a672ac70 | |||
3f4051426e |
41
otime/file_io.py
Normal file
41
otime/file_io.py
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
from yaml import load, dump
|
||||||
|
try:
|
||||||
|
from yaml import CLoader as Loader, CDumper as Dumper
|
||||||
|
except ImportError:
|
||||||
|
from yaml import Loader, Dumper
|
||||||
|
|
||||||
|
from copy import deepcopy
|
||||||
|
import otime
|
||||||
|
|
||||||
|
# Disse funksjonene er for å kunne lese og skrive seperate config, mtr og databasefiler.
|
||||||
|
def write_config(event, file_path):
|
||||||
|
output_event = deepcopy(event)
|
||||||
|
output_event.runners = []
|
||||||
|
output_event.card_dumps = []
|
||||||
|
with open(file_path, 'w') as f:
|
||||||
|
dump(output_event, f)
|
||||||
|
|
||||||
|
def write_card_dumps(event, file_path):
|
||||||
|
card_dumps = deepcopy(event.card_dumps)
|
||||||
|
with open(file_path, 'w') as f:
|
||||||
|
dump(card_dumps, f)
|
||||||
|
|
||||||
|
def write_runners_csv(event, file_path):
|
||||||
|
with open(file_path, 'w') as f:
|
||||||
|
for i in event.runners:
|
||||||
|
f.write(f'{i.id};{i.status_override};{i.first}, {i.last};{i.o_class};{i.club};{i.card_id};{i.fork};{i.start_time}\n')
|
||||||
|
|
||||||
|
def event_from_yaml_and_csv(config_path, mtr_path, csv_path):
|
||||||
|
with open(mtr_path, 'r') as f:
|
||||||
|
card_dumps = load(f, Loader=Loader)
|
||||||
|
|
||||||
|
with open(config_path, 'r') as f:
|
||||||
|
event = load(f, Loader=Loader)
|
||||||
|
|
||||||
|
with open(csv_path, 'r') as f:
|
||||||
|
data = [i.split(';') for i in f.readlines()]
|
||||||
|
for i in data: i[2] = i[2].split(',')
|
||||||
|
runners = [otime.Runner(id=i[0], status_override=i[1], first=i[2][0], last=i[2][1].strip(), o_class=i[3], club=i[4], card_id=i[5], fork=i[6], start_time=i[7]) for i in data]
|
||||||
|
event.card_dumps = card_dumps
|
||||||
|
event.runners = runners
|
||||||
|
return event
|
@ -1,5 +1,6 @@
|
|||||||
import datetime
|
import datetime
|
||||||
import xml.etree.ElementTree as ET
|
import xml.etree.ElementTree as ET
|
||||||
|
import otime
|
||||||
|
|
||||||
def xml_child(parent, tag, content):
|
def xml_child(parent, tag, content):
|
||||||
# Used to make creating xml files easier
|
# Used to make creating xml files easier
|
||||||
@ -73,6 +74,7 @@ def create_result_file(event, file_path, o_classes=[]):
|
|||||||
for code, split in zip(i.course.codes, n.splits):
|
for code, split in zip(i.course.codes, n.splits):
|
||||||
st = ET.SubElement(result, 'SplitTime')
|
st = ET.SubElement(result, 'SplitTime')
|
||||||
xml_child(st, 'ControlCode', code)
|
xml_child(st, 'ControlCode', code)
|
||||||
|
if split != 0: xml_child(st, 'Time', split)
|
||||||
else:
|
else:
|
||||||
xml_child(result, 'Status', n.status)
|
xml_child(result, 'Status', n.status)
|
||||||
else:
|
else:
|
||||||
@ -119,8 +121,8 @@ def runners_from_xml_entries(xml_file):
|
|||||||
card = None
|
card = None
|
||||||
|
|
||||||
start_time = None
|
start_time = None
|
||||||
runners.append(Runner(rid, first, last, club=club_name, club_id=club_id,
|
runners.append(otime.Runner(rid, first, last, club=club_name, club_id=club_id,
|
||||||
country=country,card=card, o_class_str=class_str,
|
country=country,card_id=card, o_class_str=class_str,
|
||||||
start_time=start_time, fee_id=fee_id))
|
start_time=start_time, fee_id=fee_id))
|
||||||
return runners
|
return runners
|
||||||
|
|
||||||
@ -150,7 +152,7 @@ def fees_from_xml_entries(xml_file):
|
|||||||
except AttributeError:
|
except AttributeError:
|
||||||
to_birth_date = None
|
to_birth_date = None
|
||||||
|
|
||||||
fee_objs.append(Fee(fee_id, name, currency, amount,
|
fee_objs.append(otime.Fee(fee_id, name, currency, amount,
|
||||||
from_birth_date=from_birth_date, to_birth_date=to_birth_date))
|
from_birth_date=from_birth_date, to_birth_date=to_birth_date))
|
||||||
return fee_objs
|
return fee_objs
|
||||||
|
|
||||||
@ -170,5 +172,36 @@ def courses_from_xml(xml_file):
|
|||||||
controls.remove('STA1')
|
controls.remove('STA1')
|
||||||
controls.remove('FIN1')
|
controls.remove('FIN1')
|
||||||
controls = [int(l) for l in controls]
|
controls = [int(l) for l in controls]
|
||||||
courseobjs.append(Course(name, controls))
|
courseobjs.append(otime.Course(name, controls))
|
||||||
return courseobjs
|
return courseobjs
|
||||||
|
|
||||||
|
def event_from_xml_entries(xml_file):
|
||||||
|
tree = ET.parse(xml_file)
|
||||||
|
root = tree.getroot()
|
||||||
|
|
||||||
|
url = '{http://www.orienteering.org/datastandard/3.0}'
|
||||||
|
event_el = root.find(f'./{url}Event')
|
||||||
|
event_id = int(event_el.find(f'./{url}Id').text)
|
||||||
|
name = event_el.find(f'./{url}Name').text
|
||||||
|
organiser = event_el.find(f'./{url}Organiser/{url}Name').text
|
||||||
|
|
||||||
|
start_ds = event_el.find(f'./{url}StartTime/{url}Date').text
|
||||||
|
start_ts = event_el.find(f'./{url}StartTime/{url}Time').text[:-1]
|
||||||
|
start_time = datetime.datetime.fromisoformat(f'{start_ds}T{start_ts}')
|
||||||
|
|
||||||
|
end_ds = event_el.find(f'./{url}EndTime/{url}Date').text
|
||||||
|
end_ts = event_el.find(f'./{url}EndTime/{url}Time').text[:-1]
|
||||||
|
end_time = datetime.datetime.fromisoformat(f'{end_ds}T{end_ts}')
|
||||||
|
|
||||||
|
person_entries = root.findall(f'./{url}PersonEntry')
|
||||||
|
|
||||||
|
class_names = []
|
||||||
|
for p_entry in person_entries:
|
||||||
|
class_names.append(p_entry.find(f'./{url}Class/{url}Name').text)
|
||||||
|
o_classes = [otime.OClass(i, []) for i in set(class_names)]
|
||||||
|
|
||||||
|
runners = runners_from_xml_entries(xml_file)
|
||||||
|
fees = fees_from_xml_entries(xml_file)
|
||||||
|
|
||||||
|
return otime.Event(event_id, name, organiser=organiser, runners=runners,
|
||||||
|
fees=fees, start_time=start_time, end_time=end_time, o_classes=o_classes)
|
36
otime/main.py
Normal file
36
otime/main.py
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
import argparse
|
||||||
|
import file_io
|
||||||
|
import iof_xml
|
||||||
|
|
||||||
|
# Main entrypoint for now. Cli with two options; init will make the files needed and run will start the program from the specified directory
|
||||||
|
def main():
|
||||||
|
parser = argparse.ArgumentParser(description='Otime very alpha version 😁')
|
||||||
|
subparsers = parser.add_subparsers(dest='command')
|
||||||
|
parser_init = subparsers.add_parser('init', help='INIT')
|
||||||
|
parser_init.add_argument('--entries', required=True, dest='entries_file', action='store', default='./',
|
||||||
|
help='The xml file with entries')
|
||||||
|
parser_init.add_argument('--courses', required=True, dest='courses_file', action='store', default='./',
|
||||||
|
help='The xml with courses')
|
||||||
|
parser_init.add_argument('--dir', required=False, dest='dir', action='store', default='./',
|
||||||
|
|
||||||
|
help='Specify a directort, if not set the files are created in the current directory')
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
if args.command == 'init':
|
||||||
|
init_dir(args.dir, args.entries_file, args.courses_file)
|
||||||
|
|
||||||
|
def init_dir(project_dir, entries_xml_file, courses_xml_file):
|
||||||
|
# Lager mappe med en config fil, en csv fil med løpere og en fil med mtr data
|
||||||
|
csv_db_path = project_dir + '/runners.csv'
|
||||||
|
config_path = project_dir + '/config.yaml'
|
||||||
|
mtr_path = project_dir + 'mtr.yaml'
|
||||||
|
|
||||||
|
event = iof_xml.event_from_xml_entries(entries_xml_file)
|
||||||
|
event.courses = iof_xml.courses_from_xml(courses_xml_file)
|
||||||
|
|
||||||
|
file_io.write_runners_csv(event, csv_db_path)
|
||||||
|
file_io.write_config(event, config_path)
|
||||||
|
file_io.write_card_dumps(event, mtr_path)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
@ -7,7 +7,7 @@ import pdf
|
|||||||
class Runner:
|
class Runner:
|
||||||
def __init__(self, id: int, first: str, last: str, club=None, club_id=None,
|
def __init__(self, id: int, first: str, last: str, club=None, club_id=None,
|
||||||
country=None, card_id=None, o_class_str=None, o_class=None,
|
country=None, card_id=None, o_class_str=None, o_class=None,
|
||||||
fork=0, start_time=None, fee_id=None, fee=None):
|
fork=0, start_time=None, fee_id=None, fee=None, status_override=''):
|
||||||
self.id = id
|
self.id = id
|
||||||
self.first = first
|
self.first = first
|
||||||
self.last = last
|
self.last = last
|
||||||
@ -19,7 +19,7 @@ class Runner:
|
|||||||
self.fork = fork
|
self.fork = fork
|
||||||
self.start_time = start_time
|
self.start_time = start_time
|
||||||
self.fee_id = fee_id
|
self.fee_id = fee_id
|
||||||
self.status_override = ''
|
self.status_override = status_override
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return(f'name({self.fullname()})')
|
return(f'name({self.fullname()})')
|
||||||
@ -289,6 +289,7 @@ class Event:
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
def get_runner_splits(self, id):
|
def get_runner_splits(self, id):
|
||||||
|
# Tida brukt frem til hver post, ikke tida fra forrige post
|
||||||
try:
|
try:
|
||||||
runner = self.get_runner(id)
|
runner = self.get_runner(id)
|
||||||
card_dump = self.get_card_dump(runner.card_id)
|
card_dump = self.get_card_dump(runner.card_id)
|
||||||
@ -304,17 +305,14 @@ class Event:
|
|||||||
for n, control in enumerate(course.codes):
|
for n, control in enumerate(course.codes):
|
||||||
if control not in card_dump.controls:
|
if control not in card_dump.controls:
|
||||||
continue
|
continue
|
||||||
split_debt = 0
|
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
punched_control, split = next(split_iter)
|
punched_control, split = next(split_iter)
|
||||||
except StopIteration:
|
except StopIteration:
|
||||||
break
|
break
|
||||||
if punched_control == control:
|
if punched_control == control:
|
||||||
splits[n] = split + split_debt
|
splits[n] = split
|
||||||
break
|
break
|
||||||
else:
|
|
||||||
split_debt += split
|
|
||||||
return splits
|
return splits
|
||||||
|
|
||||||
def get_runner_controls(self, id):
|
def get_runner_controls(self, id):
|
||||||
@ -339,29 +337,6 @@ class Event:
|
|||||||
self.add_fees(*fees_from_xml_entries(xml_file))
|
self.add_fees(*fees_from_xml_entries(xml_file))
|
||||||
|
|
||||||
# Må endres
|
# Må endres
|
||||||
def from_xml_entries(xml_file):
|
|
||||||
tree = ET.parse(xml_file)
|
|
||||||
root = tree.getroot()
|
|
||||||
|
|
||||||
url = '{http://www.orienteering.org/datastandard/3.0}'
|
|
||||||
event_el = root.find(f'./{url}Event')
|
|
||||||
event_id = int(event_el.find(f'./{url}Id').text)
|
|
||||||
name = event_el.find(f'./{url}Name').text
|
|
||||||
organiser = event_el.find(f'./{url}Organiser/{url}Name').text
|
|
||||||
|
|
||||||
start_ds = event_el.find(f'./{url}StartTime/{url}Date').text
|
|
||||||
start_ts = event_el.find(f'./{url}StartTime/{url}Time').text[:-1]
|
|
||||||
start_time = datetime.datetime.fromisoformat(f'{start_ds}T{start_ts}')
|
|
||||||
|
|
||||||
end_ds = event_el.find(f'./{url}EndTime/{url}Date').text
|
|
||||||
end_ts = event_el.find(f'./{url}EndTime/{url}Time').text[:-1]
|
|
||||||
end_time = datetime.datetime.fromisoformat(f'{end_ds}T{end_ts}')
|
|
||||||
|
|
||||||
runners = runners_from_xml_entries(xml_file)
|
|
||||||
fees = fees_from_xml_entries(xml_file)
|
|
||||||
|
|
||||||
return Event(event_id, name, organiser=organiser, runners=runners,
|
|
||||||
fees=fees, start_time=start_time, end_time=end_time)
|
|
||||||
|
|
||||||
def read_xml_courses(self, xml_file):
|
def read_xml_courses(self, xml_file):
|
||||||
self.courses = courses_from_xml(xml_file)
|
self.courses = courses_from_xml(xml_file)
|
||||||
|
@ -44,7 +44,7 @@ def create_split_result_list(event, file_path, o_classes=[]):
|
|||||||
col_width = pdf.epw / 4 # distribute content evenly
|
col_width = pdf.epw / 4 # distribute content evenly
|
||||||
|
|
||||||
for class_result in results:
|
for class_result in results:
|
||||||
col_width = pdf.epw / (21+len(class_result.course.codes))
|
col_width = 10
|
||||||
pdf.write(txt=class_result.name)
|
pdf.write(txt=class_result.name)
|
||||||
pdf.ln(line_height)
|
pdf.ln(line_height)
|
||||||
for runner in class_result.runner_results:
|
for runner in class_result.runner_results:
|
||||||
|
@ -3,16 +3,31 @@ sys.path.insert(0, '../../otime')
|
|||||||
import otime
|
import otime
|
||||||
import pdf
|
import pdf
|
||||||
import iof_xml
|
import iof_xml
|
||||||
|
import file_io
|
||||||
|
|
||||||
def main():
|
def ttime_testing():
|
||||||
event = otime.Event(0, 'TEEEST', start_time=None, end_time=None,organiser='Tygbe')
|
event = otime.Event(0, 'TEEEST', start_time=None, end_time=None,organiser='Tygbe')
|
||||||
event.read_ttime_cnf('tt.cnf')
|
event.read_ttime_cnf('tt.cnf')
|
||||||
event.read_ttime_db('db.csv')
|
event.read_ttime_db('db.csv')
|
||||||
event.read_mtr_file('mtr.csv')
|
event.read_mtr_file('mtr.csv')
|
||||||
pdf.create_split_result_list(event, 'output/result.pdf')
|
pdf.create_split_result_list(event, 'output/result.pdf')
|
||||||
iof_xml.create_result_file(event, 'output/result.xml')
|
iof_xml.create_result_file(event, '/home/trygve/Prosjekter/simple-liveresults/resultater/Resultater.xml')
|
||||||
print(event.get_runner_status('1400'))
|
print(event.get_runner_status('1400'))
|
||||||
results = event.get_result()
|
results = event.get_result()
|
||||||
|
print([pdf.format_m_s(i) for i in event.get_runner_splits('17')])
|
||||||
|
print([pdf.format_m_s(i) for i in event.get_card_dump(event.get_runner('17').card_id).splits])
|
||||||
|
file_io.write_config(event, 'output/config.yaml')
|
||||||
|
file_io.write_card_dumps(event, 'output/mtr.yaml')
|
||||||
|
file_io.write_runners_csv(event, 'output/runners.csv')
|
||||||
|
print(file_io.event_from_yaml_and_csv('output/config.yaml', 'output/mtr.yaml', 'output/runners.csv'))
|
||||||
|
|
||||||
|
def xml_testing():
|
||||||
|
event = iof_xml.event_from_xml_entries('entries.xml')
|
||||||
|
event.courses = iof_xml.courses_from_xml('course.xml')
|
||||||
|
file_io.write_config(event, 'output/config.yaml')
|
||||||
|
file_io.write_card_dumps(event, 'output/mtr.yaml')
|
||||||
|
file_io.write_runners_csv(event, 'output/runners.csv')
|
||||||
|
print(file_io.event_from_yaml_and_csv('output/config.yaml', 'output/mtr.yaml', 'output/runners.csv'))
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
xml_testing()
|
Loading…
Reference in New Issue
Block a user