forked from sportorg/pysport
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: recovery features (sportorg#423)
- Loading branch information
1 parent
698011f
commit 8d8435a
Showing
9 changed files
with
432 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,112 @@ | ||
""" | ||
Parse finish CSV from online-service orgeo.ru (2023) | ||
-- Format: | ||
CSV, separator ";" | ||
SPLITS: [hh:mm:ss|code|]* | ||
П/п;Группа;Фамилия, имя участника;Команда;№;Номер чипа;Место;Результат;Отст.;Время старта;[TV;90cp;]Сплиты; | ||
-- Example: | ||
1;Ж10;Лимонникова Анна;72_СШ №2 Кобелева;39;8510418;1;00:09:10;+00:00;12:33:00;00:01:41|59|00:00:55|60|00:01:14|61| | ||
2;Ж10;Глухарева Светлана;72_СШ №2 Глухарева;35;2102481;2;00:11:06;+01:56;12:29:00;00:01:30|59|00:00:43|60|00:01:28|61| | ||
18;Ж10;Радченко Милана;72_СШ №2 Кобелева;37;9111137;;не старт;;12:37:00; | ||
33;Ж12;Аристова Надежда;55_Омская обл.;162;8517947;;непр.отмет.;;13:09:00;00:03:00|70| | ||
""" | ||
import csv | ||
|
||
from sportorg.models.memory import ( | ||
Group, | ||
Organization, | ||
Person, | ||
Race, | ||
ResultSportident, | ||
ResultStatus, | ||
Split, | ||
) | ||
from sportorg.utils.time import hhmmss_to_time | ||
|
||
POS_GROUP = 1 | ||
POS_NAME = 2 | ||
POS_TEAM = 3 | ||
POS_BIB = 4 | ||
POS_CARD = 5 | ||
POS_RES = 7 | ||
POS_START = 9 | ||
POS_SPLITS = -1 | ||
|
||
DNS_STATUS = ['DNS', 'не старт'] | ||
DSQ_STATUS = ['DSQ', 'непр.отмет.'] | ||
|
||
|
||
def recovery(file_name: str, race: Race) -> None: | ||
encoding = 'cp1251' | ||
separator = ';' | ||
spl_separator = '|' | ||
|
||
with open(file_name, encoding=encoding) as csv_file: | ||
spam_reader = csv.reader(csv_file, delimiter=separator) | ||
for tokens in spam_reader: | ||
if len(tokens) <= POS_START: | ||
continue | ||
|
||
bib = tokens[POS_BIB] | ||
if bib == '' or not bib.isdigit(): | ||
continue | ||
|
||
name = tokens[POS_NAME] | ||
person = Person() | ||
spl_pos = name.find(' ') | ||
if spl_pos > 0: | ||
person.surname = name[:spl_pos] | ||
person.name = name[spl_pos + 1 :] | ||
else: | ||
person.name = name | ||
person.bib = int(bib) | ||
|
||
team_name = tokens[POS_TEAM] | ||
team = race.find_team(team_name) | ||
if not team: | ||
team = Organization() | ||
team.name = team_name | ||
race.organizations.append(team) | ||
person.organization = team | ||
|
||
group_name = tokens[POS_GROUP] | ||
group = race.find_group(group_name) | ||
if not group: | ||
group = Group() | ||
group.name = group_name | ||
race.groups.append(group) | ||
person.group = group | ||
|
||
if len(tokens[POS_START]) > 0: | ||
person.start_time = hhmmss_to_time(tokens[POS_START]) | ||
|
||
res = ResultSportident() | ||
res.person = person | ||
if tokens[POS_CARD].isdigit(): | ||
res.card_number = int(tokens[POS_CARD]) | ||
res.start_time = person.start_time | ||
result = tokens[POS_RES] | ||
if result.find(':') > 0: | ||
result_value = hhmmss_to_time(result) | ||
res.finish_time = res.start_time + result_value | ||
else: | ||
if result in DNS_STATUS: | ||
res.status = ResultStatus.DID_NOT_START | ||
elif result in DSQ_STATUS: | ||
res.status = ResultStatus.DISQUALIFIED | ||
|
||
splits = tokens[POS_SPLITS] | ||
if len(splits) > 1: | ||
splits_array = splits.split(spl_separator) | ||
cur_time = person.start_time | ||
for i in range(len(splits_array) // 2): | ||
split = Split() | ||
cur_time += hhmmss_to_time(splits_array[i * 2]) | ||
split.time = cur_time | ||
split.code = int(splits_array[i * 2 + 1]) | ||
res.splits.append(split) | ||
|
||
race.persons.append(person) | ||
race.results.append(res) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
""" | ||
Parse backup memory CSV file of BSM SPORTident station generated by SI Config Plus | ||
-- Format: | ||
CSV, separator ";" | ||
Needed positions: card number (2), start (15), finish (21), splits (44): count of punches, (code + time) * n | ||
No;Read on;SIID;Start no;Clear CN;Clear DOW;Clear time;Clear_r CN;Clear_r DOW;Clear_r time;Check CN;Check DOW;Check time | ||
;Start CN;Start DOW;Start time;Start_r CN;Start_r DOW;Start_r time;Finish CN;Finish DOW;Finish time;Finish_r CN;Finish_r | ||
DOW;Finish_r time;Class;First name;Last name;Club;Country;Email;Date of birth;Sex;Phone;Street;ZIP;City;Hardware version | ||
;Software version;Battery date;Battery voltage;Clear count;Character set;SEL_FEEDBACK;No. of records;Record 1 CN;Record | ||
1 DOW;Record 1 time;Record 2 CN;Record 2 DOW;Record 2 time;Record 3 CN; | ||
-- Example: | ||
440;2023-12-17 11:59:02;2007313;;2;Su; 12:40:50;;;;2;Su; 12:40:50;;;;;;;1;Su; 14:50:45;;;;;2007313;SPORTident Ru;;;;;;;; | ||
;;;;;;;;;10;34;Su; 12:41:33;49;Su; 12:54:39;43;Su; 13:22:28;39;Su; 13:51:28;42;Su; 14:02:34;46;Su; 14:15:04;40;Su; 14:31 | ||
:03;47;Su; 14:39:54;37;Su; 14:47:02;90;Su; 14:49:21; | ||
""" | ||
import csv | ||
|
||
from sportorg.common.otime import OTime | ||
from sportorg.models.memory import Race, ResultSportident, Split | ||
from sportorg.modules.sportident.fix_time_sicard_5 import fix_time | ||
from sportorg.utils.time import hhmmss_to_time | ||
|
||
POS_CARD = 2 | ||
POS_START = 15 | ||
POS_FINISH = 21 | ||
POS_COUNT = 44 | ||
|
||
|
||
def recovery(file_name: str, race: Race) -> None: | ||
separator = ';' | ||
|
||
zero_time_val = race.get_setting('system_zero_time', (8, 0, 0)) | ||
zero_time = OTime( | ||
hour=zero_time_val[0], minute=zero_time_val[1], sec=zero_time_val[2] | ||
) | ||
|
||
with open(file_name, encoding='cp1251') as csv_file: | ||
spam_reader = csv.reader(csv_file, delimiter=separator) | ||
for tokens in spam_reader: | ||
if tokens[0] == 'No' or len(tokens) < 45: | ||
continue | ||
|
||
res = ResultSportident() | ||
res.card_number = int(tokens[POS_CARD]) | ||
res.start_time = hhmmss_to_time(tokens[POS_START]) | ||
res.finish_time = hhmmss_to_time(tokens[POS_FINISH]) | ||
|
||
punch_count = int(tokens[POS_COUNT]) | ||
existing_punches = (len(tokens) - POS_COUNT - 1) // 3 | ||
|
||
for i in range(min(punch_count, existing_punches)): | ||
punch = Split() | ||
punch.code = tokens[POS_COUNT + 3 * i + 1] | ||
punch.time = hhmmss_to_time(tokens[POS_COUNT + 3 * i + 3]) | ||
res.splits.append(punch) | ||
|
||
fix_time(res, zero_time) | ||
race.results.append(res) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
""" | ||
Parse SportOrg HTML report (containing full json) | ||
""" | ||
import os.path | ||
import string | ||
from io import open | ||
from random import choices | ||
from tempfile import gettempdir | ||
|
||
|
||
def recovery(file_name: str) -> str: | ||
with open(file_name, 'r', encoding='utf-8') as f: | ||
for line in f.readlines(): | ||
if line.find("var race = {\"courses\":") > -1: | ||
json = line.strip()[11:-1] | ||
|
||
# save json to tmp file and op[en with standard import action | ||
tmp_filename = os.path.join( | ||
gettempdir(), | ||
f"sportorg_{''.join(choices(string.ascii_letters, k=10))}.json", | ||
) | ||
with open(tmp_filename, 'w') as temp_file: | ||
temp_file.write(json) | ||
|
||
return tmp_filename | ||
return "" |
Oops, something went wrong.