Startet på strekktids pdf og utregning av strekktider generelt

This commit is contained in:
Trygve 2023-11-06 23:12:08 +01:00
parent c4e2178c03
commit c94aafe981
4 changed files with 65 additions and 7 deletions

View File

@ -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

View File

@ -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:

View File

@ -0,0 +1 @@
https://eventor.orientering.no/Events/Show/18618

View File

@ -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()