Badges : retour à la ligne et créneaux en tableau par jour
Le texte des champs passe à la ligne pour tenir dans la largeur de son cadre (wrap_text) au lieu de déborder. Les créneaux affectés s'affichent en tableau : le jour de festival en en-tête, puis une colonne horaire et une colonne poste (plus de référent sur le badge) ; même tableau dans l'aperçu de l'éditeur. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
cfed76c239
commit
1a23881e81
@@ -3,7 +3,7 @@
|
||||
import datetime as dt
|
||||
import uuid
|
||||
|
||||
from app.api.badges import _field_text, _position_line
|
||||
from app.api.badges import _field_text, _positions_table
|
||||
from app.models import (
|
||||
BadgeField,
|
||||
BadgeFieldType,
|
||||
@@ -29,65 +29,45 @@ def _shift(start: dt.datetime, end: dt.datetime) -> Shift:
|
||||
)
|
||||
|
||||
|
||||
def test_position_line_shows_the_schedule():
|
||||
volunteer = _volunteer(first_name="Alex", last_name="Martin")
|
||||
position = _position(name="Bar central")
|
||||
shift = _shift(dt.datetime(2026, 7, 9, 19, 0), dt.datetime(2026, 7, 9, 22, 0))
|
||||
|
||||
line = _position_line(position, shift, referent=None, volunteer_id=volunteer.id)
|
||||
|
||||
assert line == "Bar central 19:00–22:00"
|
||||
_BOUNDARY = dt.time(2, 0) # journée de festival de 02:00 à 02:00
|
||||
|
||||
|
||||
def test_position_line_shows_the_referent_when_there_is_one():
|
||||
volunteer = _volunteer(first_name="Alex", last_name="Martin")
|
||||
position = _position(name="Bar central")
|
||||
shift = _shift(dt.datetime(2026, 7, 9, 19, 0), dt.datetime(2026, 7, 9, 22, 0))
|
||||
referent = _volunteer(first_name="Sam", last_name="Nuit")
|
||||
|
||||
line = _position_line(position, shift, referent=referent, volunteer_id=volunteer.id)
|
||||
|
||||
assert line == "Bar central 19:00–22:00 (Référent : Sam Nuit)"
|
||||
|
||||
|
||||
def test_position_line_hides_the_referent_when_it_is_the_badged_volunteer():
|
||||
# Pas besoin de se dire à soi-même qu'on est referent de son propre poste.
|
||||
volunteer = _volunteer(first_name="Sam", last_name="Nuit")
|
||||
|
||||
line = _position_line(
|
||||
_position(name="Bar central"),
|
||||
_shift(dt.datetime(2026, 7, 9, 19, 0), dt.datetime(2026, 7, 9, 22, 0)),
|
||||
referent=volunteer,
|
||||
volunteer_id=volunteer.id,
|
||||
)
|
||||
|
||||
assert "Référent" not in line
|
||||
|
||||
|
||||
def test_field_text_positions_lists_one_line_per_shift_in_chronological_order():
|
||||
volunteer = _volunteer(first_name="Alex", last_name="Martin")
|
||||
field = BadgeField(
|
||||
edition_id=uuid.uuid4(), field_type=BadgeFieldType.POSITIONS,
|
||||
x_mm=0, y_mm=0, width_mm=10, height_mm=10, font_size=9,
|
||||
)
|
||||
morning = (
|
||||
def test_positions_table_groups_shifts_under_their_day():
|
||||
accueil = (
|
||||
_position(name="Accueil"),
|
||||
_shift(dt.datetime(2026, 7, 9, 9, 0), dt.datetime(2026, 7, 9, 13, 0)),
|
||||
None,
|
||||
_shift(dt.datetime(2026, 7, 11, 9, 0), dt.datetime(2026, 7, 11, 13, 0)),
|
||||
)
|
||||
evening = (
|
||||
bar = (
|
||||
_position(name="Bar central"),
|
||||
_shift(dt.datetime(2026, 7, 9, 19, 0), dt.datetime(2026, 7, 9, 22, 0)),
|
||||
None,
|
||||
_shift(dt.datetime(2026, 7, 11, 19, 0), dt.datetime(2026, 7, 11, 22, 0)),
|
||||
)
|
||||
demontage = (
|
||||
_position(name="Démontage"),
|
||||
_shift(dt.datetime(2026, 7, 12, 14, 0), dt.datetime(2026, 7, 12, 18, 0)),
|
||||
)
|
||||
|
||||
text = _field_text(
|
||||
field, volunteer,
|
||||
assignments_by_volunteer={volunteer.id: [morning, evening]},
|
||||
lead_volunteer_ids=set(),
|
||||
table = _positions_table([accueil, bar, demontage], _BOUNDARY)
|
||||
|
||||
assert [(s.title, s.rows) for s in table.sections] == [
|
||||
("Samedi 11", (("09:00–13:00", "Accueil"), ("19:00–22:00", "Bar central"))),
|
||||
("Dimanche 12", (("14:00–18:00", "Démontage"),)),
|
||||
]
|
||||
|
||||
|
||||
def test_positions_table_keeps_a_night_shift_on_the_day_it_started():
|
||||
night = (
|
||||
_position(name="Bar central"),
|
||||
_shift(dt.datetime(2026, 7, 12, 0, 0), dt.datetime(2026, 7, 12, 1, 0)),
|
||||
)
|
||||
|
||||
assert text == "Accueil 09:00–13:00\nBar central 19:00–22:00"
|
||||
table = _positions_table([night], _BOUNDARY)
|
||||
|
||||
assert table.sections[0].title == "Samedi 11"
|
||||
assert table.sections[0].rows == (("00:00–01:00", "Bar central"),)
|
||||
|
||||
|
||||
def test_positions_table_is_empty_without_any_shift():
|
||||
assert _positions_table([], _BOUNDARY) is None
|
||||
|
||||
|
||||
def test_field_text_role_is_referent_only_for_lead_accounts():
|
||||
|
||||
Reference in New Issue
Block a user