Vignette carrée (14 mm, proportions préservées) à côté du nom de chaque bénévole affecté, à côté de son téléphone — case vide si le bénévole n'a pas de photo. Complète l'affichage déjà en place sur l'écran référent et l'écran bénévole (étape 22). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
121 lines
3.7 KiB
Python
121 lines
3.7 KiB
Python
"""Génération des feuilles de poste (module pur, sans base)."""
|
||
|
||
import base64
|
||
import datetime as dt
|
||
|
||
from app.sheets.pdf import (
|
||
PositionDaySheet,
|
||
SheetShift,
|
||
SheetVolunteer,
|
||
generate_position_sheets_pdf,
|
||
)
|
||
|
||
# PNG 1×1 valide (transparent), le plus petit possible.
|
||
_PNG = base64.b64decode(
|
||
"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY"
|
||
"42YAAAAASUVORK5CYII="
|
||
)
|
||
|
||
|
||
def _sheet(volunteers=(), min_staff=1, ideal_staff=2) -> PositionDaySheet:
|
||
return PositionDaySheet(
|
||
position_name="Bar central",
|
||
position_location="Chapiteau",
|
||
date=dt.date(2026, 7, 10),
|
||
shifts=(
|
||
SheetShift(
|
||
starts_at=dt.datetime(2026, 7, 10, 19, 0),
|
||
ends_at=dt.datetime(2026, 7, 10, 22, 0),
|
||
min_staff=min_staff,
|
||
ideal_staff=ideal_staff,
|
||
volunteers=volunteers,
|
||
),
|
||
),
|
||
)
|
||
|
||
|
||
def test_shift_is_understaffed_when_below_min_staff():
|
||
fully_staffed = _sheet(
|
||
volunteers=(SheetVolunteer(name="Alex Martin", phone="0600000000"),),
|
||
min_staff=1,
|
||
)
|
||
assert fully_staffed.shifts[0].understaffed is False
|
||
|
||
understaffed = _sheet(volunteers=(), min_staff=1)
|
||
assert understaffed.shifts[0].understaffed is True
|
||
|
||
|
||
def test_generates_a_valid_pdf_with_volunteers():
|
||
sheet = _sheet(
|
||
volunteers=(
|
||
SheetVolunteer(name="Alex Martin", phone="0600000000"),
|
||
SheetVolunteer(name="Sam Nuit", phone=None),
|
||
)
|
||
)
|
||
pdf = generate_position_sheets_pdf([sheet])
|
||
assert pdf.startswith(b"%PDF")
|
||
assert pdf.rstrip().endswith(b"%%EOF")
|
||
|
||
|
||
def test_generates_a_valid_pdf_with_no_volunteers_assigned():
|
||
pdf = generate_position_sheets_pdf([_sheet(volunteers=())])
|
||
assert pdf.startswith(b"%PDF")
|
||
|
||
|
||
def test_generates_a_valid_pdf_with_no_shifts_that_day():
|
||
sheet = PositionDaySheet(
|
||
position_name="Bar central", position_location=None,
|
||
date=dt.date(2026, 7, 10), shifts=(),
|
||
)
|
||
pdf = generate_position_sheets_pdf([sheet])
|
||
assert pdf.startswith(b"%PDF")
|
||
|
||
|
||
def test_multiple_sheets_produce_a_larger_pdf():
|
||
one = generate_position_sheets_pdf([_sheet()])
|
||
two = generate_position_sheets_pdf([_sheet(), _sheet()])
|
||
assert len(two) > len(one)
|
||
|
||
|
||
def test_generates_a_valid_pdf_with_a_referent():
|
||
sheet = PositionDaySheet(
|
||
position_name="Bar central", position_location="Chapiteau",
|
||
date=dt.date(2026, 7, 10), shifts=(),
|
||
referent_name="Sam Nuit", referent_phone="0600000000",
|
||
)
|
||
pdf = generate_position_sheets_pdf([sheet])
|
||
assert pdf.startswith(b"%PDF")
|
||
|
||
|
||
def test_generates_a_valid_pdf_without_a_referent():
|
||
sheet = PositionDaySheet(
|
||
position_name="Bar central", position_location="Chapiteau",
|
||
date=dt.date(2026, 7, 10), shifts=(),
|
||
)
|
||
assert sheet.referent_name is None
|
||
pdf = generate_position_sheets_pdf([sheet])
|
||
assert pdf.startswith(b"%PDF")
|
||
|
||
|
||
def test_generates_a_valid_pdf_with_volunteer_photos():
|
||
sheet = _sheet(
|
||
volunteers=(
|
||
SheetVolunteer(name="Alex Martin", phone="0600000000", photo=_PNG),
|
||
SheetVolunteer(name="Sam Nuit", phone=None, photo=None),
|
||
)
|
||
)
|
||
assert sheet.shifts[0].volunteers[0].photo == _PNG
|
||
assert sheet.shifts[0].volunteers[1].photo is None
|
||
pdf = generate_position_sheets_pdf([sheet])
|
||
assert pdf.startswith(b"%PDF")
|
||
|
||
|
||
def test_a_volunteer_photo_makes_the_pdf_larger():
|
||
without_photo = generate_position_sheets_pdf(
|
||
[_sheet(volunteers=(SheetVolunteer(name="Alex Martin", phone=None, photo=None),))]
|
||
)
|
||
with_photo = generate_position_sheets_pdf(
|
||
[_sheet(volunteers=(SheetVolunteer(name="Alex Martin", phone=None, photo=_PNG),))]
|
||
)
|
||
assert len(with_photo) > len(without_photo)
|