forked from Trygve/otime
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:
parent
9955c65c0a
commit
6ecf4ea103
133
otime.py
133
otime.py
@ -34,6 +34,11 @@ class Event:
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
self.card_dumps = []
|
self.card_dumps = []
|
||||||
|
|
||||||
|
try:
|
||||||
|
self.fees = kwargs['fees']
|
||||||
|
except KeyError:
|
||||||
|
self.fees = []
|
||||||
|
|
||||||
def add_course(self, *args):
|
def add_course(self, *args):
|
||||||
for n in args:
|
for n in args:
|
||||||
self.courses.append(n)
|
self.courses.append(n)
|
||||||
@ -46,8 +51,13 @@ class Event:
|
|||||||
for n in args:
|
for n in args:
|
||||||
self.runners.append(n)
|
self.runners.append(n)
|
||||||
|
|
||||||
|
def add_fees(self, *args):
|
||||||
|
for n in args:
|
||||||
|
self.fees.append(n)
|
||||||
|
|
||||||
def import_xml_entries(self, xml_file):
|
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):
|
def import_ttime_cnf(self, ttime_file):
|
||||||
self.add_course(*courses_from_ttime_conf(ttime_file))
|
self.add_course(*courses_from_ttime_conf(ttime_file))
|
||||||
@ -194,13 +204,18 @@ class Event:
|
|||||||
for dump in self.card_dumps:
|
for dump in self.card_dumps:
|
||||||
ddicts.append(dump.asdict())
|
ddicts.append(dump.asdict())
|
||||||
|
|
||||||
|
fdicts = []
|
||||||
|
for fee in self.fees:
|
||||||
|
fdicts.append(fee.asdict())
|
||||||
|
|
||||||
json_data = {
|
json_data = {
|
||||||
'id': self.id,
|
'id': self.id,
|
||||||
'name': self.name,
|
'name': self.name,
|
||||||
'runners': rdicts,
|
'runners': rdicts,
|
||||||
'courses': cdicts,
|
'courses': cdicts,
|
||||||
'o_classes': ocdicts,
|
'o_classes': ocdicts,
|
||||||
'card_dumps': ddicts
|
'card_dumps': ddicts,
|
||||||
|
'fees': fdicts
|
||||||
}
|
}
|
||||||
return json.dumps(json_data, sort_keys=True, indent=4)
|
return json.dumps(json_data, sort_keys=True, indent=4)
|
||||||
|
|
||||||
@ -223,6 +238,10 @@ class Event:
|
|||||||
for d in data['card_dumps']:
|
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'])))
|
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)
|
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):
|
def create_start_list_pdf(self, file_name):
|
||||||
@ -575,11 +594,32 @@ class OClass:
|
|||||||
}
|
}
|
||||||
|
|
||||||
class Fee:
|
class Fee:
|
||||||
def __init__(self, fee_id, name, currency, amount):
|
def __init__(self, fee_id, name, currency, amount, **kwargs):
|
||||||
self.id = fee_id
|
self.id = fee_id
|
||||||
|
self.name = name
|
||||||
self.currency = currency
|
self.currency = currency
|
||||||
self.amount = amount
|
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.
|
# TODO: Take string instead of file.
|
||||||
def courses_from_ttime_conf(ttime_file):
|
def courses_from_ttime_conf(ttime_file):
|
||||||
courses = []
|
courses = []
|
||||||
@ -609,45 +649,68 @@ def classes_from_ttime_conf(ttime_file, courses):
|
|||||||
loops += 1
|
loops += 1
|
||||||
return o_classes
|
return o_classes
|
||||||
|
|
||||||
def runners_from_xml_entries(xml_file, o_classes=[]):
|
def runners_from_xml_entries(xml_file):
|
||||||
tree = ET.parse(xml_file)
|
tree = ET.parse(xml_file)
|
||||||
root = tree.getroot()
|
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:
|
try:
|
||||||
club_id = person_root[2][0].text
|
card = int(p_entry.find('./{http://www.orienteering.org/datastandard/3.0}ControlCard').text)
|
||||||
club = person_root[2][1].text
|
except AttributeError:
|
||||||
except:
|
card = None
|
||||||
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
|
|
||||||
|
|
||||||
start_time = None
|
start_time = None
|
||||||
runnerarray.append(Runner(rid, first, last, club=club, club_id=club_id,
|
runners.append(Runner(rid, first, last, club=club_name, club_id=club_id,
|
||||||
country=country,card=card, o_class_str=xml_class_str,
|
country=country,card=card, o_class_str=class_str,
|
||||||
o_class=runner_o_class, start_time=start_time))
|
start_time=start_time))
|
||||||
#print(rid, first, last, club_id, club, card, xml_class_str)
|
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
|
# Checks if small list is in big list
|
||||||
def contains(small, big):
|
def contains(small, big):
|
||||||
|
Loading…
Reference in New Issue
Block a user