Skip to content

Commit cc9f0d3

Browse files
committed
Make start_on optional
1 parent 9433bf6 commit cc9f0d3

File tree

8 files changed

+50
-12
lines changed

8 files changed

+50
-12
lines changed

docs/operations/boards.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ Kanonickým zdrojem pravdy je ale `výpis na justice.cz <https://or.justice.cz/i
1212
1313
1414
15-
Výbor od 7.5.2025
16-
-------------------------------------------------
15+
Nově zvolený výbor
16+
------------------
1717

1818
.. list-table::
1919
:header-rows: 1

docs/operations/boards.rst.jinja

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,13 @@ Kanonickým zdrojem pravdy je ale `výpis na justice.cz <https://or.justice.cz/i
1212

1313

1414
{% for board in boards %}
15+
{%- if board.start_on == None %}
16+
Nově zvolený výbor
17+
------------------
18+
{%- else %}
1519
Výbor od {{ board.start_on.strftime("%-d.%-m.%Y") }}
1620
-------------------------------------------------
21+
{%- endif %}
1722

1823
.. list-table::
1924
:header-rows: 1

src/pyvec_docs/boards.py

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,22 +39,40 @@ def is_treasurer(self) -> bool:
3939

4040

4141
class Board(BaseModel):
42-
start_on: date
42+
start_on: date | None = None
4343
members: list[BoardMember]
4444

4545
model_config = {"extra": "forbid", "frozen": True}
4646

4747
@property
48-
def years(self) -> tuple[int, int]:
48+
def years(self) -> tuple[int, int] | tuple[None, None]:
49+
if self.start_on is None:
50+
return None, None
4951
start_year = self.start_on.year
5052
return (start_year, start_year + BOARDS_MANDATE_LENGTH)
5153

54+
@property
55+
def sort_key(self):
56+
# Boards without a start date sort as starting in the future
57+
if self.start_on is None:
58+
return (1, None)
59+
return (0, self.start_on)
60+
5261

5362
@cache
5463
def load_boards(path: Path | str = BOARDS_CONFIG_PATH) -> list[Board]:
64+
"""Load all boards, including inactive ones"""
5565
data = tomllib.loads(Path(path).read_text())
5666
return sorted(
5767
(Board(**board) for board in data["board"]),
58-
key=attrgetter("start_on"),
68+
key=attrgetter('sort_key'),
5969
reverse=True,
6070
)
71+
72+
@cache
73+
def load_current_board(path: Path | str = BOARDS_CONFIG_PATH) -> Board:
74+
"""Load the board that is currently in power"""
75+
return [
76+
board for board in load_boards(path)
77+
if board.start_on is not None
78+
][0]

src/pyvec_docs/boards.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
# The Pyvec board members in time
2-
# The current board is first, previous boards are listed in descending order
2+
# The most recent board is first, previous boards are listed in descending order
33
# Each member has a `name`, `github`, and optionally a `roles` array
44
#
5-
# "start_on" should ideally be the date of the hand-over meeting
5+
# "start_on" should ideally be the date from justice.cz. If missing, the board
6+
# doesn't officially have power yet.
67

78
[[board]]
8-
start_on = "2025-05-07"
99

1010
[[board.members]]
1111
name = "Jakub Vysoký"

src/pyvec_docs/ext/board_dates.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@
44
from sphinx.application import Sphinx
55
from sphinx.config import Config
66

7-
from pyvec_docs.boards import BOARDS_MANDATE_LENGTH, load_boards
7+
from pyvec_docs.boards import BOARDS_MANDATE_LENGTH, load_current_board
88

99

1010
def board_dates(app: Sphinx, config: Config):
11-
board = load_boards()[0]
11+
board = load_current_board()
12+
assert board.start_on is not None
1213

1314
board_start = board.start_on
1415
board_end = board_start + timedelta(days=BOARDS_MANDATE_LENGTH * 365)

src/pyvec_docs/ext/slack.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
from docutils import nodes
1111

12-
from pyvec_docs.boards import load_boards
12+
from pyvec_docs.boards import load_current_board
1313

1414

1515
# https://docutils.readthedocs.io/en/sphinx-docs/howto/rst-roles.html
@@ -34,6 +34,6 @@ def slack(
3434

3535

3636
def setup(app):
37-
pyvec_board_years = load_boards()[0].years
37+
pyvec_board_years = load_current_board().years
3838
app.add_role("slack", functools.partial(slack, pyvec_board_years=pyvec_board_years))
3939
return {"version": "1.0", "parallel_read_safe": True}

src/pyvec_docs/grants.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ def remove_comments(html):
1818

1919
def get_board_member_name(username, voted_at, boards: list[Board]):
2020
for board in boards: # sorted from the most recent
21+
if board.start_on is None:
22+
continue
2123
if voted_at > board.start_on:
2224
for member in board.members:
2325
if member.github == username:

tests/test_scripts_generate_grants.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,14 @@
1414
@pytest.fixture
1515
def boards():
1616
return [ # sorted!
17+
Board(
18+
**{
19+
# No start_on; votes don't count
20+
"members": [
21+
{"name": "Bob", "github": "bobby"},
22+
],
23+
}
24+
),
1725
Board(
1826
**{
1927
"start_on": date(2020, 1, 1),
@@ -34,6 +42,10 @@ def boards():
3442
]
3543

3644

45+
def assert_boards_sorted(boards):
46+
assert boards == sorted(boards)
47+
48+
3749
def test_to_date():
3850
assert to_date("2020-02-12T13:22:01Z") == date(2020, 2, 12)
3951

0 commit comments

Comments
 (0)