Créateur de badges refait d'après la maquette : champs sur le recto et le verso (BadgeField.face, verso placé en miroir dans le PDF pour le recto-verso), fond de zone, réduction automatique du texte, photo ovale, initiales sans photo, nom sur deux lignes (migration 0026) ; éditeur en trois colonnes (champs, aperçu recto/verso avec de vrais bénévoles, inspecteur), formats prédéfinis, annuler, flèches, zoom, repères de découpe, dépôt d'image sur l'aperçu, contrôle de tous les badges avant génération. Nombre de badges par bénévole (Volunteer.badge_count, 1 par défaut, migration 0027) : champ sur la fiche, autant d'exemplaires sur les planches, total affiché à la génération, colonne dans l'export Excel. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
96 lines
2.6 KiB
Python
96 lines
2.6 KiB
Python
"""Énumérations du domaine.
|
|
|
|
Stockées en base comme VARCHAR + contrainte CHECK (`native_enum=False`) : pas de
|
|
type ENUM natif PostgreSQL, donc pas de migration de type à gérer.
|
|
"""
|
|
|
|
import enum
|
|
|
|
|
|
class Role(enum.StrEnum):
|
|
COORDINATOR = "COORDINATOR"
|
|
LEAD = "LEAD"
|
|
VOLUNTEER = "VOLUNTEER"
|
|
|
|
|
|
class AssignmentSource(enum.StrEnum):
|
|
SOLVER = "SOLVER"
|
|
MANUAL = "MANUAL"
|
|
|
|
|
|
class PositionCategory(enum.StrEnum):
|
|
BAR = "BAR"
|
|
TICKETING = "TICKETING"
|
|
WELCOME = "WELCOME"
|
|
PARKING = "PARKING"
|
|
CLEANING = "CLEANING"
|
|
CATERING = "CATERING"
|
|
SETUP = "SETUP"
|
|
STAGE = "STAGE"
|
|
OTHER = "OTHER"
|
|
|
|
|
|
class BadgeFieldType(enum.StrEnum):
|
|
"""Champ affichable sur le recto ou le verso d'un badge (voir `app/badges/`)."""
|
|
|
|
FULL_NAME = "FULL_NAME"
|
|
POSITIONS = "POSITIONS"
|
|
CATEGORY = "CATEGORY"
|
|
ROLE = "ROLE"
|
|
# Photo du bénévole (`Volunteer.photo`), ajustée au cadre du champ.
|
|
PHOTO = "PHOTO"
|
|
# Texte libre saisi par la coordination dans l'éditeur (`BadgeField.text`,
|
|
# commun à tous les badges), remplacé pour un bénévole par le « Texte du
|
|
# badge » de sa fiche (`Volunteer.badge_text`) s'il en a un.
|
|
FREE_TEXT = "FREE_TEXT"
|
|
|
|
|
|
class BadgeFace(enum.StrEnum):
|
|
"""Face du badge sur laquelle un champ est imprimé : le verso est
|
|
personnalisable comme le recto (même champ possible sur les deux)."""
|
|
|
|
FRONT = "FRONT"
|
|
BACK = "BACK"
|
|
|
|
|
|
class BadgePhotoShape(enum.StrEnum):
|
|
"""Forme de découpe du champ `PHOTO` (cadre rectangulaire ou ellipse
|
|
inscrite dans le cadre)."""
|
|
|
|
RECT = "RECT"
|
|
OVAL = "OVAL"
|
|
|
|
|
|
class BadgeAlign(enum.StrEnum):
|
|
LEFT = "LEFT"
|
|
CENTER = "CENTER"
|
|
RIGHT = "RIGHT"
|
|
|
|
|
|
class FeePaymentStatus(enum.StrEnum):
|
|
"""Statut d'un paiement de cotisation via l'API SumUp (voir `app/sumup/`
|
|
et `app/api/forms.py`). Reprend tel quel le statut d'un checkout SumUp —
|
|
`NULL` sur `Volunteer.fee_payment_status` tant qu'aucun checkout n'a
|
|
jamais été créé pour ce bénévole."""
|
|
|
|
PENDING = "PENDING"
|
|
PAID = "PAID"
|
|
FAILED = "FAILED"
|
|
EXPIRED = "EXPIRED"
|
|
|
|
|
|
class FormFieldType(enum.StrEnum):
|
|
"""Champ activable sur le formulaire public d'inscription (voir
|
|
`app/api/forms.py`). Nom/prénom sont toujours collectés, pas au choix de
|
|
la coordination — ils sont indispensables à la création du bénévole."""
|
|
|
|
EMAIL = "EMAIL"
|
|
PHONE = "PHONE"
|
|
POSITION_WISHES = "POSITION_WISHES"
|
|
ARTIST_WISHES = "ARTIST_WISHES"
|
|
COMPANION_WISH = "COMPANION_WISH"
|
|
AVAILABLE = "AVAILABLE"
|
|
WILLING_TO_PAY_FEE = "WILLING_TO_PAY_FEE"
|
|
PHOTO = "PHOTO"
|
|
COMMENT = "COMMENT"
|