Avancé 2 : Agir sur plusieurs lignes¶
Objectif : nettoyer deux cents inscriptions de test sans deux cents confirmations.
Ce que la ressource doit déclarer¶
Rien n'est groupé par défaut : une suppression de masse ne s'ouvre pas toute seule.
registry.register(AdminResource(
entity="Article",
slug="articles",
label="Article",
plural_label="Articles",
list_fields=("title", "status"),
form_fields=("title", "body"),
table="articles",
bulk_delete=True,
status_field="status",
bulk_transitions=(("draft", "published"), ("published", "archived")),
))
| Attribut | Ce qu'il ouvre |
|---|---|
bulk_delete |
la suppression groupée des lignes cochées |
status_field |
la colonne que les transitions font changer |
bulk_transitions |
les couples départ vers arrivée autorisés, et eux seuls |
Le parcours d'une action groupée¶
Cocher des lignes, choisir l'action, valider : une page de confirmation affiche les lignes visées avant tout effet.
L'action ne s'exécute qu'à la soumission du formulaire, en POST, protégée par CSRF.
Une transition absente de bulk_transitions répond 400, et une ressource sans bulk_delete répond 403 même si la requête est forgée à la main.
Le contrôle est refait à l'exécution : passer par la page de confirmation ne dispense de rien.
Une sélection vide est refusée
DELETE FROM articles sans clause WHERE viderait la table entière.
La suppression groupée refuse donc une sélection vide plutôt que de construire une requête sans borne, et le message le dit.
Deux cents lignes au plus, par fournée
Au delà, l'action est refusée.
Une sélection de cette taille vient rarement d'un clic : le plafond transforme une manœuvre en refus plutôt qu'en dégât.
Une ligne disparue entre l'affichage et la validation n'est pas une erreur
Le compte rendu dit combien de lignes ont réellement été supprimées, qui peut être inférieur à la sélection.
Refuser toute la fournée pour cela ferait échouer une action correcte.
À retenir¶
- Rien n'est groupé sans déclaration explicite sur la ressource.
- Confirmation d'abord, effet en POST ensuite, et les contrôles sont refaits.
- Sélection vide refusée, plafond à deux cents.