Skip to content

Commit

Permalink
chore: squash dev-ank commits into one
Browse files Browse the repository at this point in the history
feat: new features for a marked track with penalty loops (sportorg#421)

Co-authored-by: Aleksandr Karpov <[email protected]>

Squashed commit of the following:

commit 06102cc
Author: Sergei Kobelev <[email protected]>
Date:   Thu Dec 28 16:28:21 2023 +0500

    Ignore punches before start (for people who like to test start gates and my favorite triathlon organizers, who deliver activated SIACs through start/controls/finish) (sportorg#425)

commit 8d8435a
Author: Sergei Kobelev <[email protected]>
Date:   Wed Dec 20 13:10:15 2023 +0500

    feat: recovery features (sportorg#423)

commit 698011f
Author: Aleksandr Karpov <[email protected]>
Date:   Wed Dec 20 14:16:09 2023 +0700

    fix: shorter tab titles in the settings window (sportorg#424)

commit 4ab5f11
Author: Aleksandr Karpov <[email protected]>
Date:   Wed Dec 20 14:04:43 2023 +0700

    feat: new features for a marked track with penalty loops (sportorg#421)

    Co-authored-by: Aleksandr Karpov <[email protected]>

fix: remove unused changes
  • Loading branch information
alex-karpov committed Jul 29, 2024
1 parent ec8d804 commit 5a06780
Show file tree
Hide file tree
Showing 10 changed files with 1,193 additions and 64 deletions.
44 changes: 23 additions & 21 deletions configs/status_comments.txt
Original file line number Diff line number Diff line change
@@ -1,21 +1,23 @@
п.п.3.13.12.2 # нарушение порядка прохождения КП
п.п.3.4.6 # непрохождение имеющихся на трассе обозначенных участков
п.п.3.13.12.3 # не произвел считывание информации на финише
п.п.3.14.10 # получил преимущество в занятом месте от неаккуратной отметки
п.п.3.14.11 # контрольная карточка показывает, что нарушил заданный порядок прохождения КП
п.п.3.14.12 # не сдал на финише контрольную карточку
п.п.3.15.6 # спортсмен покинул зону изоляции до установленного времени
п.п.3.15.7 # тренер или специалист, работающий с командой, покинул зону изоляции до установленного времени
п.п.4.3.2 # не начал прохождение трассы по ВБ с начального КП
п.п.4.3.3 # не прошел через последний (финишный) обязательный КП
п.п.4.3.6.6 # взял меньшее число КП, чем задано для возрастной категории
п.п.4.6.12.7 # не прошел назначенное число штрафных кругов
п.п.4.7.6.3 # хотя бы одна отметка на базовом КП отсутствует (МТ вариант А)
п.п.4.8.6.3 # хотя бы одна отметка на базовом КП отсутствует (МТ вариант Б)
п.п.4.9.6.3 # хотя бы одна отметка крестом соответствующего цвета или специальным компостером отсутствует
п.п.4.10.8.3 # отсутствует отметка хотя бы на одной ТПР
п.п.4.11.7.3 # отсутствует отметка хотя бы одного истинного КП
п.п.5.4.7 # превышение контрольного времени
п.п.6.4.14 # нарушение целостности защиты оборотной стороны спортивной карты
п.п.6.6.4 # спортсмен сошел с трассы
п.п.7.2.6 # спортсмен не стартовал
пп3.13.12.2 # нарушение порядка прохождения КП
пп3.4.6 # непрохождение имеющихся на трассе обозначенных участков
пп3.13.12.3 # не произвел считывание информации на финише
пп3.14.10 # получил преимущество в занятом месте от неаккуратной отметки
пп3.14.11 # контрольная карточка показывает, что нарушил заданный порядок прохождения КП
пп3.14.12 # не сдал на финише контрольную карточку
пп3.15.6 # спортсмен покинул зону изоляции до установленного времени
пп3.15.7 # тренер или специалист, работающий с командой, покинул зону изоляции до установленного времени
пп4.3.2 # не начал прохождение трассы по ВБ с начального КП
пп4.3.3 # не прошел через последний (финишный) обязательный КП
пп4.3.6.6 # взял меньшее число КП, чем задано для возрастной категории
пп4.6.12.7 # не прошел назначенное число штрафных кругов
пп4.7.6.3 # хотя бы одна отметка на базовом КП отсутствует (МТ вариант А)
пп4.8.6.3 # хотя бы одна отметка на базовом КП отсутствует (МТ вариант Б)
пп4.9.6.3 # хотя бы одна отметка крестом соответствующего цвета или специальным компостером отсутствует
пп4.10.8.3 # отсутствует отметка хотя бы на одной ТПР
пп4.11.7.3 # отсутствует отметка хотя бы одного истинного КП
пп5.4.7 # превышение контрольного времени
пп6.4.14 # нарушение целостности защиты оборотной стороны спортивной карты
пп6.6.4 # спортсмен сошел с трассы
пп7.2.6 # спортсмен не стартовал
пп6.7.13 # пересечение запрещённых участков
пп6.4.6 # нарушение порядка передачи эстафеты
3 changes: 3 additions & 0 deletions languages/ru_RU/LC_MESSAGES/sportorg.po
Original file line number Diff line number Diff line change
Expand Up @@ -1551,6 +1551,9 @@ msgstr "ДИСКВ."
msgid "laps"
msgstr "кр."

msgid "Missing penalty lap"
msgstr "Пропущен штрафной круг"

msgid "contain"
msgstr "содержит"

Expand Down
25 changes: 22 additions & 3 deletions sportorg/gui/dialogs/text_io.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

from sportorg.gui.global_access import GlobalAccess
from sportorg.language import translate
from sportorg.models.memory import Qualification, ResultManual, race
from sportorg.models.memory import Organization, Qualification, ResultManual, race
from sportorg.utils.time import hhmmss_to_time, time_to_hhmmss


Expand All @@ -18,6 +18,9 @@ def get_value_options():
translate('Penalty time'),
translate('Penalty legs'),
translate('Card number'),
translate('Last name'),
translate('First name'),
translate('Year of birth'),
translate('Group'),
translate('Team'),
translate('Qualification'),
Expand Down Expand Up @@ -313,6 +316,12 @@ def get_property(person, key):
elif key == translate('Card number'):
if person.card_number:
return str(person.card_number)
elif key == translate('Last name'):
return str(person.surname)
elif key == translate('First name'):
return str(person.name)
elif key == translate('Year of birth'):
return str(person.year)
elif key == translate('Group'):
if person.group:
return person.group.name
Expand Down Expand Up @@ -369,14 +378,24 @@ def set_property(person, key, value, **options):
result.penalty_laps = int(value)
elif key == translate('Card number'):
race().person_card_number(person, int(value))
elif key == translate('Last name'):
person.surname = value
elif key == translate('First name'):
person.name = value
elif key == translate('Year of birth'):
if str(value).isdigit():
person.year = int(value)
elif key == translate('Group'):
group = race().find_group(value)
if group:
person.group = group
elif key == translate('Team'):
team = race().find_team(value)
if team:
person.organization = team
if not team:
team = Organization()
team.name = value
race().organizations.append(team)
person.organization = team
elif key == translate('Qualification'):
qual = Qualification.get_qual_by_name(value)
if qual is not None:
Expand Down
19 changes: 19 additions & 0 deletions sportorg/models/memory.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,12 @@ def __repr__(self) -> str:
return self.__str__()


class PrintableValue(object):
def __init__(self, value, printable_name):
self.value = value
self.printable_name = printable_name


class _TitleType(Enum):
def __str__(self) -> str:
return self._name_
Expand Down Expand Up @@ -1015,6 +1021,19 @@ def get_start_time(self):
def get_finish_time(self) -> OTime:
obj = race()
finish_source = obj.get_setting('system_finish_source', 'station')

# Эстафета 4 человека в Нижнем Новгороде 24 августа 2023 г.
# Первые этапы финишируют по станции 90, последний этап — по финишной станции
nizhni_novgorod_relay = False
if nizhni_novgorod_relay:
if self.person and self.person.bib > 1000:
next_leg_bib = self.person.bib + 1000
next_leg_person = find(obj.persons, bib=next_leg_bib)
if next_leg_person:
finish_source = 'cp'
else:
finish_source = 'station'

if finish_source == 'station':
if self.finish_time:
return self.finish_time
Expand Down
8 changes: 5 additions & 3 deletions sportorg/modules/live/orgeo.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

LOG_MSG = 'HTTP Status: %s, Msg: %s'


RESULT_STATUS = [
'NONE',
'OK',
Expand Down Expand Up @@ -37,8 +38,8 @@ def __init__(self, session, url: str, user_agent: str = 'SportOrg'):
async def send(self, data):
return await self.session.post(self._url, headers=self._headers, json=data)

async def send_online_cp(self, chip, code, time):
url = f'{self._url}&si={chip}&radio={code}&r={time}&fl=0'
async def send_online_cp(self, chip, code, time, status=0):
url = f'{self._url}&si={chip}&radio={code}&r={time}&fl={status}'
return await self.session.get(url, headers=self._headers)


Expand Down Expand Up @@ -312,8 +313,9 @@ async def create_online_cp(url, data, race_data, log, *, session):
for split in res['splits']:
if split['code'] in codes:
split_time = int_to_otime(split['time'] // 10).to_str()
status = WinOrientBinary.get_wdb_status(item['status'])
resp = await o.send_online_cp(
card_number, split['code'], split_time
card_number, split['code'], split_time, status
)
result_txt = make_nice(str(await resp.text()))
if resp.status != 200:
Expand Down
7 changes: 6 additions & 1 deletion sportorg/modules/printing/printout_split.py
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,9 @@ def print_split_normal(self, result):
fs_large = 4

# Information about start
self.print_line(obj.data.title, fn, fs_main)
title = obj.data.description.split('<br>')
for line in title:
self.print_line(line, fn, fs_main)
self.print_line(
str(obj.data.start_datetime)[:10] + ', ' + obj.data.location, fn, fs_main
)
Expand Down Expand Up @@ -381,4 +383,7 @@ def print_split_normal(self, result):

self.print_line(obj.data.url, fn, fs_main)

# empty vertical space for Xprinter printer without blade
# for _ in range(14): self.print_line('.', 'Arial', 1)

self.end_page()
16 changes: 14 additions & 2 deletions sportorg/modules/winorient/wdb.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from typing import Union

from sportorg.common.otime import OTime
from sportorg.libs.winorient.wdb import (
WDB,
Expand Down Expand Up @@ -60,6 +62,17 @@ def __init__(self, file=None):
def is_complete(self):
return self._is_complete

@classmethod
def get_wdb_status(cls, sportorg_status: Union[ResultStatus, int]) -> int:
if isinstance(sportorg_status, int):
try:
sportorg_status = ResultStatus(sportorg_status)
except ValueError:
return 0
if sportorg_status in cls.status_reverse:
return cls.status_reverse[sportorg_status]
return 0

def _read_file(self):
try:
with open(self._file, 'rb') as wdb_file:
Expand Down Expand Up @@ -294,8 +307,7 @@ def export(self):
new_finish.time = time_to_int(result.get_finish_time())
new_finish.number = man.bib

if result.status in self.status_reverse:
new_person.status = self.status_reverse[result.status]
new_person.status = self.get_wdb_status(result.status)

wdb_object.fin.append(new_finish)

Expand Down
Loading

0 comments on commit 5a06780

Please sign in to comment.