La til Fee import og eksport

Event har nå fees attributen. Fee kan importeres fra xml påmeldingsfiler
og importeres og eksporteres fra .otime filer.
This commit is contained in:
Trygve 2022-05-31 23:12:38 +02:00
parent 9955c65c0a
commit 6ecf4ea103

133
otime.py
View File

@ -34,6 +34,11 @@ class Event:
except KeyError:
self.card_dumps = []
try:
self.fees = kwargs['fees']
except KeyError:
self.fees = []
def add_course(self, *args):
for n in args:
self.courses.append(n)
@ -46,8 +51,13 @@ class Event:
for n in args:
self.runners.append(n)
def add_fees(self, *args):
for n in args:
self.fees.append(n)
def import_xml_entries(self, xml_file):
self.add_runners(*runners_from_xml_entries(xml_file, self.o_classes))
self.add_runners(*runners_from_xml_entries(xml_file))
self.add_fees(*fees_from_xml_entries(xml_file))
def import_ttime_cnf(self, ttime_file):
self.add_course(*courses_from_ttime_conf(ttime_file))
@ -194,13 +204,18 @@ class Event:
for dump in self.card_dumps:
ddicts.append(dump.asdict())
fdicts = []
for fee in self.fees:
fdicts.append(fee.asdict())
json_data = {
'id': self.id,
'name': self.name,
'runners': rdicts,
'courses': cdicts,
'o_classes': ocdicts,
'card_dumps': ddicts
'card_dumps': ddicts,
'fees': fdicts
}
return json.dumps(json_data, sort_keys=True, indent=4)
@ -223,6 +238,10 @@ class Event:
for d in data['card_dumps']:
card_dumps.append(CardDump(d['card'], d['controls'], d['splits'], datetime.datetime.fromisoformat(d['read_time']), datetime.datetime.fromisoformat(d['s_time']), datetime.datetime.fromisoformat(d['f_time'])))
fees = []
for f in data['fees']:
fees.append(Fee(f['id'], f['name'], f['currency'], f['amount'], from_birth_date=f['from_birth_date'], to_birth_date=f['to_birth_date']))
return Event(data['id'], data['name'], runners=runners, courses=courses, o_classes=o_classes, card_dumps=card_dumps)
def create_start_list_pdf(self, file_name):
@ -575,11 +594,32 @@ class OClass:
}
class Fee:
def __init__(self, fee_id, name, currency, amount):
def __init__(self, fee_id, name, currency, amount, **kwargs):
self.id = fee_id
self.name = name
self.currency = currency
self.amount = amount
try:
self.from_birth_date = kwargs['from_birth_date']
except KeyError:
self.from_birth_date = None
try:
self.to_birth_date = kwargs['to_birth_date']
except KeyError:
self.to_birth_date = None
def asdict(self):
return {
'id': self.id,
'name': self.name,
'currency': self.currency,
'amount': self.amount,
'from_birth_date': self.from_birth_date,
'to_birth_date': self.to_birth_date
}
# TODO: Take string instead of file.
def courses_from_ttime_conf(ttime_file):
courses = []
@ -609,45 +649,68 @@ def classes_from_ttime_conf(ttime_file, courses):
loops += 1
return o_classes
def runners_from_xml_entries(xml_file, o_classes=[]):
def runners_from_xml_entries(xml_file):
tree = ET.parse(xml_file)
root = tree.getroot()
runnerarray = []
runners = []
person_entries = root.findall('./{http://www.orienteering.org/datastandard/3.0}PersonEntry')
for p_entry in person_entries:
rid = p_entry[1][0].text
person = p_entry.find('./{http://www.orienteering.org/datastandard/3.0}Person')
name = person.find('./{http://www.orienteering.org/datastandard/3.0}Name')
first = name.find('./{http://www.orienteering.org/datastandard/3.0}Given').text
last = name.find('./{http://www.orienteering.org/datastandard/3.0}Family').text
organisation = p_entry.find('./{http://www.orienteering.org/datastandard/3.0}Organisation')
club_id = organisation.find('./{http://www.orienteering.org/datastandard/3.0}Id').text
club_name = organisation.find('./{http://www.orienteering.org/datastandard/3.0}Name').text
club_name_short = organisation.find('./{http://www.orienteering.org/datastandard/3.0}ShortName').text
country = organisation.find('./{http://www.orienteering.org/datastandard/3.0}Country').attrib['code']
class_el = p_entry.find('./{http://www.orienteering.org/datastandard/3.0}Class')
class_str = class_el.find('./{http://www.orienteering.org/datastandard/3.0}Name').text
for person_root in root[1:]:
rid = person_root[1][0].text
first = person_root[1][1][1].text
last = person_root[1][1][0].text
try:
club_id = person_root[2][0].text
club = person_root[2][1].text
except:
club = "None"
country = person_root[1][3].text
try:
card = int(person_root[3].text)
except:
card = 0
runner_o_class = None
try:
xml_class_str = person_root[4][1].text
except:
# VELDIG MIDLERTIDIG
runner_o_class = o_class_list[0]
else:
for i in o_classes:
if i.name == xml_class_str:
runner_o_class = i
break
# Gjør sånn at den lager nye o klasser om den ikke finnes fra før
card = int(p_entry.find('./{http://www.orienteering.org/datastandard/3.0}ControlCard').text)
except AttributeError:
card = None
start_time = None
runnerarray.append(Runner(rid, first, last, club=club, club_id=club_id,
country=country,card=card, o_class_str=xml_class_str,
o_class=runner_o_class, start_time=start_time))
#print(rid, first, last, club_id, club, card, xml_class_str)
runners.append(Runner(rid, first, last, club=club_name, club_id=club_id,
country=country,card=card, o_class_str=class_str,
start_time=start_time))
return runners
return runnerarray
def fees_from_xml_entries(xml_file):
tree = ET.parse(xml_file)
root = tree.getroot()
allfees = root.findall('.//{http://www.orienteering.org/datastandard/3.0}Fee')
added_ids = []
fee_objs = []
for fee in allfees:
f_id = fee.find('./{http://www.orienteering.org/datastandard/3.0}Id').text
if f_id not in added_ids:
added_ids.append(f_id)
fee_id = f_id
name = fee.find('./{http://www.orienteering.org/datastandard/3.0}Name').text
currency = fee.find('./{http://www.orienteering.org/datastandard/3.0}Amount').attrib['currency']
amount = fee.find('./{http://www.orienteering.org/datastandard/3.0}Amount').text
try:
from_birth_date = fee.find('./{http://www.orienteering.org/datastandard/3.0}FromDateOfBirth').text
except AttributeError:
from_birth_date = None
try:
to_birth_date = fee.find('./{http://www.orienteering.org/datastandard/3.0}ToDateOfBirth').text
except AttributeError:
to_birth_date = None
fee_objs.append(Fee(fee_id, name, currency, amount, from_birth_date=from_birth_date, to_birth_date=to_birth_date))
return fee_objs
# Checks if small list is in big list
def contains(small, big):