Startet på strekktids pdf og utregning av strekktider generelt
This commit is contained in:
parent
c4e2178c03
commit
c94aafe981
@ -259,7 +259,7 @@ class OClass:
|
|||||||
return f'name({self.name})'
|
return f'name({self.name})'
|
||||||
|
|
||||||
class RunnerResult:
|
class RunnerResult:
|
||||||
def __init__(self, runner_id: int, first: str, last: str, status: str, place: int, total_time: int, split_times: list[int], end_time,
|
def __init__(self, runner_id: int, first: str, last: str, status: str, place: int, total_time: int, splits: list[int], end_time,
|
||||||
club=None, club_id=None, country=None, card_id=None, o_class=None, controls=None, fork=0, start_time=None, fee_id=None):
|
club=None, club_id=None, country=None, card_id=None, o_class=None, controls=None, fork=0, start_time=None, fee_id=None):
|
||||||
self.id = runner_id
|
self.id = runner_id
|
||||||
self.first = first
|
self.first = first
|
||||||
@ -276,7 +276,7 @@ class RunnerResult:
|
|||||||
self.status = status
|
self.status = status
|
||||||
self.place = place
|
self.place = place
|
||||||
self.total_time = total_time
|
self.total_time = total_time
|
||||||
self.split_times = split_times
|
self.splits = splits
|
||||||
self.end_time = end_time
|
self.end_time = end_time
|
||||||
|
|
||||||
def fullname(self):
|
def fullname(self):
|
||||||
@ -366,10 +366,33 @@ class Event:
|
|||||||
|
|
||||||
def get_runner_splits(self, id):
|
def get_runner_splits(self, id):
|
||||||
try:
|
try:
|
||||||
return self.get_card_dump(self.get_runner(id).card_id).splits
|
runner = self.get_runner(id)
|
||||||
|
card_dump = self.get_card_dump(runner.card_id)
|
||||||
|
course = self.get_course(self.get_o_class(runner.o_class).course)
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
if card_dump == None:
|
||||||
|
return None
|
||||||
|
|
||||||
|
split_iter = zip(card_dump.controls, card_dump.splits).__iter__()
|
||||||
|
splits = [0] * len(course.codes)
|
||||||
|
for n, control in enumerate(course.codes):
|
||||||
|
if control not in card_dump.controls:
|
||||||
|
continue
|
||||||
|
split_debt = 0
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
punched_control, split = next(split_iter)
|
||||||
|
except StopIteration:
|
||||||
|
break
|
||||||
|
if punched_control == control:
|
||||||
|
splits[n] = split + split_debt
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
split_debt += split
|
||||||
|
return splits
|
||||||
|
|
||||||
def get_runner_controls(self, id):
|
def get_runner_controls(self, id):
|
||||||
try:
|
try:
|
||||||
return self.get_card_dump(self.get_runner(id).card_id).controls
|
return self.get_card_dump(self.get_runner(id).card_id).controls
|
||||||
@ -712,4 +735,4 @@ def rank_runners(allrunners, o_class):
|
|||||||
# Used to make creating xml files easier
|
# Used to make creating xml files easier
|
||||||
def xml_child(parent, tag, content):
|
def xml_child(parent, tag, content):
|
||||||
e = ET.SubElement(parent, tag)
|
e = ET.SubElement(parent, tag)
|
||||||
e.text = str(content)
|
e.text = str(content)
|
36
otime/pdf.py
36
otime/pdf.py
@ -1,6 +1,11 @@
|
|||||||
import datetime
|
import datetime
|
||||||
from fpdf import FPDF
|
from fpdf import FPDF
|
||||||
|
|
||||||
|
def format_m_s(seconds):
|
||||||
|
if seconds == 0: return ''
|
||||||
|
minutes, seconds = divmod(seconds, 60)
|
||||||
|
return f'{minutes:02}:{seconds:02}'
|
||||||
|
|
||||||
def create_result_list(event, file_path, o_classes=[]):
|
def create_result_list(event, file_path, o_classes=[]):
|
||||||
results = event.get_result(o_classes)
|
results = event.get_result(o_classes)
|
||||||
|
|
||||||
@ -22,12 +27,41 @@ def create_result_list(event, file_path, o_classes=[]):
|
|||||||
pdf.multi_cell(col_width, line_height, runner.fullname(), border=1, ln=3, max_line_height=pdf.font_size, align='L')
|
pdf.multi_cell(col_width, line_height, runner.fullname(), border=1, ln=3, max_line_height=pdf.font_size, align='L')
|
||||||
pdf.multi_cell(col_width, line_height, runner.club, border=1, ln=3, max_line_height=pdf.font_size)
|
pdf.multi_cell(col_width, line_height, runner.club, border=1, ln=3, max_line_height=pdf.font_size)
|
||||||
if runner.status == 'OK':
|
if runner.status == 'OK':
|
||||||
pdf.multi_cell(col_width, line_height, str(datetime.timedelta(seconds = runner.total_time)), border=1, ln=3, max_line_height=pdf.font_size)
|
pdf.multi_cell(col_width, line_height, format_m_s(runner.total_time), border=1, ln=3, max_line_height=pdf.font_size)
|
||||||
else:
|
else:
|
||||||
pdf.multi_cell(col_width, line_height, '', border=1, ln=3, max_line_height=pdf.font_size)
|
pdf.multi_cell(col_width, line_height, '', border=1, ln=3, max_line_height=pdf.font_size)
|
||||||
pdf.ln(line_height)
|
pdf.ln(line_height)
|
||||||
pdf.output(file_path)
|
pdf.output(file_path)
|
||||||
|
|
||||||
|
def create_split_result_list(event, file_path, o_classes=[]):
|
||||||
|
results = event.get_result(o_classes)
|
||||||
|
|
||||||
|
pdf = FPDF()
|
||||||
|
pdf.add_page(orientation='L')
|
||||||
|
pdf.add_font("LiberationSans", fname="../../otime/data/fonts/LiberationSans-Regular.ttf")
|
||||||
|
pdf.set_font("LiberationSans", size=8)
|
||||||
|
line_height = pdf.font_size * 1.5
|
||||||
|
col_width = pdf.epw / 4 # distribute content evenly
|
||||||
|
|
||||||
|
for class_result in results:
|
||||||
|
col_width = pdf.epw / (21+len(class_result.course))
|
||||||
|
pdf.write(txt=class_result.name)
|
||||||
|
pdf.ln(line_height)
|
||||||
|
for runner in class_result.runner_results:
|
||||||
|
if runner.status == 'OK':
|
||||||
|
pdf.multi_cell(5, line_height, str(runner.place), border=1, ln=3, max_line_height=pdf.font_size, align='L')
|
||||||
|
else:
|
||||||
|
pdf.multi_cell(5, line_height, runner.status, border=1, ln=3, max_line_height=pdf.font_size, align='L')
|
||||||
|
pdf.multi_cell(30, line_height, runner.fullname(), border=1, ln=3, max_line_height=pdf.font_size, align='L')
|
||||||
|
pdf.multi_cell(30, line_height, runner.club, border=1, ln=3, max_line_height=pdf.font_size)
|
||||||
|
if runner.status == 'OK' or runner.status == 'MissingPunch':
|
||||||
|
for split in runner.splits:
|
||||||
|
pdf.multi_cell(col_width, line_height, format_m_s(split), border=1, ln=3, max_line_height=pdf.font_size)
|
||||||
|
else:
|
||||||
|
pdf.multi_cell(col_width, line_height, '', border=1, ln=3, max_line_height=pdf.font_size)
|
||||||
|
pdf.ln(line_height)
|
||||||
|
pdf.output(file_path)
|
||||||
|
|
||||||
def create_all_invoices(self, filename_prefix):
|
def create_all_invoices(self, filename_prefix):
|
||||||
clubs = [x.club for x in self.runners if x.club != self.runners[self.runners.index(x)-1].club and x.club is not None]
|
clubs = [x.club for x in self.runners if x.club != self.runners[self.runners.index(x)-1].club and x.club is not None]
|
||||||
for club in clubs:
|
for club in clubs:
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
https://eventor.orientering.no/Events/Show/18618
|
@ -8,7 +8,7 @@ def main():
|
|||||||
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_result_list(event, 'output/result.pdf')
|
pdf.create_split_result_list(event, 'output/result.pdf')
|
||||||
print(event.get_runner_status('1400'))
|
print(event.get_runner_status('1400'))
|
||||||
results = event.get_result()
|
results = event.get_result()
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user