[#2711] Décorateur get_object: lookup d'un autre champ que la clé primaire
authorEric Mc Sween <eric.mcsween@auf.org>
Wed, 29 Feb 2012 23:56:27 +0000 (18:56 -0500)
committerEric Mc Sween <eric.mcsween@auf.org>
Wed, 29 Feb 2012 23:56:27 +0000 (18:56 -0500)
auf/django/permissions/decorators.py

index d3dc705..b20c33c 100644 (file)
@@ -1,16 +1,17 @@
 from django.contrib.auth.decorators import user_passes_test
 from django.shortcuts import get_object_or_404
 
-def get_object(cls, perm=None, arg=0, kwarg=None):
+def get_object(cls, perm=None, key='pk', arg=0, kwarg=None):
     def decorator(view_func):
         def wrapped_view(request, *args, **kwargs):
-            pk = kwargs[kwarg] if kwarg else args[arg]
-            obj = get_object_or_404(cls, pk=pk)
+            key_val = kwargs[kwarg] if kwarg else args[arg]
+            obj = get_object_or_404(cls, **{key: key_val})
+            args = list(args)      # Make args mutable
             if kwarg:
-                kwargs[kwarg] = obj
+                del kwargs[kwarg]
             else:
-                args = list(args)      # Make args mutable
-                args[arg] = obj
+                del args[arg]
+            args.insert(0, obj)
             f = user_passes_test(lambda user: user.has_perm(perm, obj))(view_func) if perm else view_func
             return f(request, *args, **kwargs)
         return wrapped_view