views est la bibliothèque de vues de base de Mayan. Elle ne gère pas de modèles métier — elle fournit des classes réutilisables que toutes les autres apps utilisent comme fondation. Chaque vue d'une app Mayan hérite d'une ou plusieurs de ces classes.
L'app ajoute sur les vues génériques Django : contrôle de permissions, filtrage ACL automatique, gestion des redirections, sélection multiple d'objets, modes d'affichage liste/item, et plus.
| Classe | Base Django | Usage |
|---|---|---|
SimpleView |
TemplateView |
Page statique avec vérification de permission |
FormView |
FormView |
Formulaire simple avec permission + redirection |
DynamicFormView |
FormView |
Formulaire à champs dynamiques |
MultiFormView |
FormView |
Plusieurs formulaires sur une même page |
SingleObjectCreateView |
CreateView |
Création d'un objet avec messages de succès/erreur |
SingleObjectEditView |
UpdateView |
Édition d'un objet |
SingleObjectDetailView |
DetailView |
Affichage en lecture seule (formulaire non éditable) |
SingleObjectDeleteView |
DeleteView |
Suppression avec confirmation |
SingleObjectListView |
ListView |
Liste paginée avec tri, recherche et filtrage ACL |
SingleObjectDynamicFormCreateView |
CreateView |
Création via formulaire dynamique |
SingleObjectDynamicFormEditView |
UpdateView |
Édition via formulaire dynamique |
MultipleObjectFormActionView |
FormView |
Action sur un ou plusieurs objets via formulaire |
MultipleObjectConfirmActionView |
TemplateView |
Action sur un ou plusieurs objets avec confirmation |
MultipleObjectDeleteView |
ConfirmView |
Suppression en masse avec confirmation |
AddRemoveView |
MultiFormView |
Interface double-liste pour gérer des relations M2M |
ConfirmView |
TemplateView |
Confirmation Oui/Non avant une action |
RelationshipView |
FormView |
Gestion de relations entre deux modèles |
Chaque vue générique est composée de plusieurs mixins. Voici les plus importants :
ViewPermissionCheckViewMixinVérifie la permission globale avant même de traiter la requête. Si l'utilisateur n'a pas view_permission, PermissionDenied est levé immédiatement.
class MyView(SingleObjectListView):
view_permission = permission_document_view
RestrictedQuerysetViewMixinFiltre le queryset via les ACLs par objet. L'utilisateur ne voit que les objets auxquels il a accès.
class MyView(SingleObjectListView):
object_permission = permission_document_view
source_queryset = Document.objects.all()
# → restreint automatiquement au queryset accessible par l'utilisateur
ExternalObjectViewMixinCharge un objet "parent" depuis l'URL avec vérification d'accès. Typique des vues de sous-objets (ex. : liste des fichiers d'un document).
class DocumentFileListView(SingleObjectListView):
external_object_class = Document
external_object_permission = permission_document_view
external_object_pk_url_kwarg = 'document_id'
def get_source_queryset(self):
return self.external_object.files.all()
MultipleObjectViewMixinPermet à une vue d'opérer sur un seul ou plusieurs objets simultanément. Accepte un pk dans l'URL ou une liste d'IDs dans le query string (id_list=1,2,3). Utilisé pour les actions en masse depuis les listes.
ObjectActionViewMixinExécute une action sur chaque objet du queryset, gère les erreurs individuellement, et affiche un message de succès avec le compte ("3 documents supprimés").
class DocumentTrashView(MultipleObjectConfirmActionView):
def object_action(self, instance, form=None):
instance.delete() # appelé pour chaque objet sélectionné
AddRemoveViewInterface double-liste (disponible | ajouté) pour gérer les relations M2M : ajouter/retirer des permissions à un rôle, des groupes à un utilisateur, etc.
class RoleGroupsEditView(AddRemoveView):
main_object_model = Role
main_object_permission = permission_role_edit
secondary_object_model = Group
related_field = 'groups'
RedirectionViewMixinGère intelligemment la redirection après une action : priorité à post_action_redirect, sinon ?next= dans l'URL, sinon HTTP_REFERER.
ViewMixinConfirmRememberPermet à l'utilisateur de cocher "Ne plus demander" sur les confirmations de suppression. Sa préférence est stockée en base (UserConfirmView) et court-circuite la confirmation lors des prochaines suppressions.
ListModeViewMixinGère le basculement entre affichage liste et grille d'éléments pour les SingleObjectListView. La préférence est mémorisée par vue et par utilisateur (UserViewMode).
SortingViewMixinPermet le tri dynamique d'une liste via le paramètre ?sort_field=label dans l'URL.
URLUtilitaire pour construire et manipuler des URLs de façon programmatique, avec gestion des query strings :
from mayan.apps.views.http import URL
url = URL(viewname='documents:document_list', query={'page': 2, 'sort': 'label'})
str(url) # → "/documents/?page=2&sort=label"
# Modifier un paramètre
url.query_dict['page'] = 3
str(url) # → "/documents/?page=3&sort=label"
L'app stocke deux préférences utilisateur en base :
| Modèle | Rôle |
|---|---|
UserViewMode |
Mode d'affichage (liste / grille) par vue et par utilisateur |
UserConfirmView |
Mémorise "Ne plus demander" pour les confirmations de suppression |
from mayan.apps.views.generics import SingleObjectListView
from .models import Invoice
from .permissions import permission_invoice_view
class InvoiceListView(SingleObjectListView):
# Permission globale requise pour accéder à la vue
view_permission = permission_invoice_view
# Permission par objet pour filtrer le queryset via ACL
object_permission = permission_invoice_view
def get_source_queryset(self):
return Invoice.objects.all()
def get_extra_context(self):
return {
'title': _('Invoices'),
'hide_object': True,
}
Cette vue gère automatiquement : pagination, tri, filtrage ACL, mode liste/grille, recherche dynamique.
| Fichier | Rôle |
|---|---|
generics.py |
Toutes les vues génériques composées |
view_mixins.py |
Tous les mixins individuels |
http.py |
Classe URL pour construire des URLs |
models.py |
UserViewMode, UserConfirmView |