Vue d'ensemble

Django 2.1, publié le 1er août 2018, apporte une amélioration très demandée par la communauté : la permission view sur les modèles. Jusqu'ici, l'interface d'administration n'offrait que les permissions add, change et delete. Désormais, il est possible de donner à un utilisateur un accès en lecture seule. Cette version introduit également la réutilisation de la base de test entre les lancements.

Fonctionnalités principales

Permission 'view' sur les modèles

Chaque modèle possède désormais quatre permissions par défaut : add, change, delete et view. La permission view permet de consulter un objet dans l'administration sans pouvoir le modifier. C'est particulièrement utile pour les tableaux de bord et les rôles de supervision.

python
from django.contrib.auth.models import User, Permission
from django.contrib.contenttypes.models import ContentType

# Récupérer la permission 'view' pour le modèle Commande
ct = ContentType.objects.get_for_model(Commande)
permission_voir = Permission.objects.get(
    codename='view_commande',
    content_type=ct,
)

# Attribuer la permission à un utilisateur superviseur
superviseur = User.objects.get(username='superviseur')
superviseur.user_permissions.add(permission_voir)

# Vérification dans une vue
def tableau_de_bord(request):
    if request.user.has_perm('boutique.view_commande'):
        commandes = Commande.objects.all()
        return render(request, 'tableau_de_bord.html', {
            'commandes': commandes,
        })
    return HttpResponseForbidden('Accès refusé')

# Dans l'admin, un ModelAdmin en lecture seule
from django.contrib import admin

class CommandeAdmin(admin.ModelAdmin):
    def has_change_permission(self, request, obj=None):
        return False

    def has_delete_permission(self, request, obj=None):
        return False

Réutilisation de la base de test

Le lanceur de tests peut désormais réutiliser la base de données de test existante au lieu de la recréer à chaque lancement. L'option --keepdb conserve la base entre les exécutions, ce qui accélère considérablement les cycles de développement sur des projets avec de nombreuses migrations.

python
# Lancer les tests en conservant la base de données
# python manage.py test --keepdb

# La première exécution crée la base et applique les migrations
# Les exécutions suivantes réutilisent la base existante
# Si le schéma a changé, Django le détecte et recrée la base

# Gain typique sur un projet avec 200+ migrations :
# Sans --keepdb : 45 secondes de démarrage
# Avec --keepdb :  3 secondes de démarrage

# Combinaison avec --parallel pour encore plus de rapidité
# python manage.py test --keepdb --parallel

Sources