Skip to content

Commit 8488f4c

Browse files
feat: srb settings (#532)
1 parent 5df1b7a commit 8488f4c

File tree

9 files changed

+164
-4
lines changed

9 files changed

+164
-4
lines changed

changelog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
## next
44

55
### Improvements
6+
+ Generation of SRB file (SFR results board) on saving
67
+ New field - middle name (new Russian requirements)
78
+ Import of full date of birth
89
+ Optional build on Pyside2 (Qt5) / Pyside6 (Qt6)

changelog_ru.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
## next
44

55
### Добавление
6+
+ Генерация файла SRB (SFR results board) при сохранении
67
+ Новое поле - отчество участника (по новым требованиям ЕВСК), также его обработка при импорте и экспорте
78
+ Дополнительный импорт/экспорт полной даты рождения, а не только года рождения
89
+ Вариативная сборка на Pyside2 (Qt5) / Pyside6 (Qt6)

languages/ru_RU/LC_MESSAGES/sportorg.po

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ msgstr ""
33
"Project-Id-Version: SportOrg\n"
44
"Report-Msgid-Bugs-To: \n"
55
"POT-Creation-Date: 2018-04-12 11:13+0300\n"
6-
"PO-Revision-Date: 2025-05-13 15:25+0500\n"
6+
"PO-Revision-Date: 2025-11-09 23:27+0500\n"
77
"Last-Translator: SportOrg\n"
88
"Language-Team: SportOrg\n"
99
"Language: ru_RU\n"
@@ -1763,4 +1763,7 @@ msgid "in list"
17631763
msgstr "в списке"
17641764

17651765
msgid "Gzip compression"
1766-
msgstr "Сжатие gzip"
1766+
msgstr "Сжатие gzip"
1767+
1768+
msgid "Generate SRB file (SFR results board)"
1769+
msgstr "Генерация файла SRB (SFR results board) при сохранении"

sportorg/gui/dialogs/settings.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,16 @@ def __init__(self, parent):
9595

9696
self.item_save_in_gzip = QCheckBox(translate("Compress files to gzip"))
9797
self.item_save_in_gzip.setChecked(settings.SETTINGS.file_save_in_gzip)
98+
9899
self.layout.addRow(self.item_save_in_gzip)
99100

101+
self.item_generate_srb = QCheckBox(
102+
translate("Generate SRB file (SFR results board)")
103+
)
104+
self.item_generate_srb.setChecked(settings.SETTINGS.file_generate_srb)
105+
106+
self.layout.addRow(self.item_generate_srb)
107+
100108
def save(self):
101109
old_window_show_toolbar = settings.SETTINGS.window_show_toolbar
102110
settings.SETTINGS.locale = self.item_lang.currentText()
@@ -107,6 +115,7 @@ def save(self):
107115
settings.SETTINGS.app_check_updates = self.item_check_updates.isChecked()
108116
settings.SETTINGS.file_save_in_utf8 = self.item_save_in_utf8.isChecked()
109117
settings.SETTINGS.file_save_in_gzip = self.item_save_in_gzip.isChecked()
118+
settings.SETTINGS.file_generate_srb = self.item_generate_srb.isChecked()
110119

111120
if old_window_show_toolbar != self.item_show_toolbar.isChecked():
112121
if self.item_show_toolbar.isChecked():

sportorg/gui/main.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,9 @@ def load_settings():
9191
settings.SETTINGS.file_save_in_gzip = Config().configuration.get(
9292
"save_in_gzip", True
9393
)
94+
settings.SETTINGS.file_generate_srb = Config().configuration.get(
95+
"generate_srb", True
96+
)
9497
settings.SETTINGS.file_open_recent_file = Config().configuration.get(
9598
"open_recent_file", True
9699
)

sportorg/modules/backup/file.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@
55
from boltons.fileutils import atomic_rename
66

77
from sportorg import settings
8-
9-
from . import json
8+
from . import json, sfr_results_board
109

1110
logger = logging.getLogger(__name__)
1211

@@ -69,6 +68,13 @@ def save(self) -> None:
6968
)
7069
atomic_rename(self._file_name + ".tmp", self._file_name, overwrite=True)
7170

71+
if settings.SETTINGS.file_generate_srb:
72+
self._backup(
73+
self._file_name + ".srb",
74+
sfr_results_board.dump,
75+
"w",
76+
)
77+
7278
def open(self) -> None:
7379
logger.info("Open " + self._file_name)
7480
self._backup(
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import os
2+
3+
from sportorg.models.memory import race
4+
5+
6+
def dump(file, *, compress=False):
7+
r = race()
8+
sep = "\t"
9+
10+
is_rogaine = r.get_setting("result_processing_mode", "time") == "scores"
11+
is_ardf = r.get_setting("result_processing_mode", "time") == "ardf"
12+
is_relay = r.is_relay()
13+
14+
for result in r.results:
15+
if result.person:
16+
line = get_srb_line_for_result(result, sep, is_rogaine, is_ardf, is_relay)
17+
if compress:
18+
file.write(bytes(line, "utf-8"))
19+
else:
20+
file.write(line)
21+
file.flush()
22+
os.fsync(file.fileno())
23+
24+
25+
def get_srb_line_for_result(result, sep, is_rogaine, is_ardf, is_relay) -> str:
26+
person = result.person
27+
if person:
28+
uid = str(person.bib)
29+
group = ""
30+
if person.group:
31+
group = person.group.name
32+
33+
scores_for_sort = 99999
34+
if is_rogaine:
35+
scores_for_sort -= result.rogaine_score
36+
elif is_ardf:
37+
scores_for_sort -= result.scores_ardf
38+
leg_for_sort = 0
39+
if is_relay:
40+
leg_for_sort = int(person.bib) // 1000
41+
sort = (
42+
("0" + str(leg_for_sort))[-2:] + str(scores_for_sort) + result.get_result()
43+
)
44+
45+
place = "1"
46+
if not result.is_status_ok():
47+
place = "0"
48+
if person.is_out_of_competition:
49+
place = "0"
50+
res = result.get_result()
51+
name = person.full_name
52+
team = ""
53+
if person.organization:
54+
team = person.organization.name
55+
line = (
56+
uid
57+
+ sep
58+
+ group
59+
+ sep
60+
+ sort
61+
+ sep
62+
+ place
63+
+ sep
64+
+ name
65+
+ sep
66+
+ team
67+
+ sep
68+
+ res
69+
+ "\n"
70+
)
71+
return line
72+
return ""

sportorg/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class Settings:
2222
file_autosave_interval: int = 300
2323
file_save_in_utf8: bool = False
2424
file_save_in_gzip: bool = True
25+
file_generate_srb: bool = False
2526
file_open_recent_file: bool = False
2627
file_recent: str = ""
2728
printer_main: str = ""

tests/test_srb_generation.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
from sportorg.common.otime import OTime
2+
from sportorg.language import translate
3+
from sportorg.models.memory import (
4+
ResultSportident,
5+
Person,
6+
ResultStatus,
7+
Organization,
8+
Group,
9+
race,
10+
)
11+
from sportorg.modules.backup.sfr_results_board import get_srb_line_for_result
12+
13+
14+
def test_srb_generation():
15+
res = ResultSportident()
16+
res.place = 12
17+
res.finish_time = OTime(hour=12, minute=58, sec=59)
18+
19+
person = Person()
20+
person.name = "Sergei"
21+
person.surname = "Petrov"
22+
person.set_bib(2023)
23+
res.person = person
24+
25+
group = Group()
26+
group.name = "ME"
27+
person.group = group
28+
29+
team = Organization()
30+
team.name = "SKI Team"
31+
person.organization = team
32+
33+
line = get_srb_line_for_result(res, "\t", False, False, False)
34+
assert line == "2023\tME\t009999912:58:59\t1\tPetrov Sergei\tSKI Team\t12:58:59\n"
35+
36+
res.rogaine_score = 300
37+
race().set_setting("result_processing_mode", "scores")
38+
line = get_srb_line_for_result(res, "\t", True, False, False)
39+
assert (
40+
line
41+
== f"2023\tME\t0099699300 {translate('points')} 12:58:59\t1\tPetrov Sergei\tSKI Team\t300 {translate('points')} 12:58:59\n"
42+
)
43+
44+
res.scores_ardf = 500
45+
race().set_setting("result_processing_mode", "ardf")
46+
line = get_srb_line_for_result(res, "\t", False, True, False)
47+
assert (
48+
line
49+
== f"2023\tME\t0099499500 {translate('points')} 12:58:59\t1\tPetrov Sergei\tSKI Team\t500 {translate('points')} 12:58:59\n"
50+
)
51+
52+
race().set_setting("result_processing_mode", "time")
53+
line = get_srb_line_for_result(res, "\t", False, False, True)
54+
assert line == "2023\tME\t029999912:58:59\t1\tPetrov Sergei\tSKI Team\t12:58:59\n"
55+
56+
person.is_out_of_competition = True
57+
line = get_srb_line_for_result(res, "\t", False, False, False)
58+
assert line == "2023\tME\t009999912:58:59\t0\tPetrov Sergei\tSKI Team\t12:58:59\n"
59+
60+
person.is_out_of_competition = False
61+
res.status = ResultStatus.MISSING_PUNCH
62+
res.status_comment = "DSQ"
63+
line = get_srb_line_for_result(res, "\t", False, False, False)
64+
assert line == "2023\tME\t0099999DSQ\t0\tPetrov Sergei\tSKI Team\tDSQ\n"

0 commit comments

Comments
 (0)