Finally super useful optimization on guardian request.
authorcavaliet
Mon, 18 Mar 2013 16:15:46 +0100
changeset 1132 026d510a3dc3
parent 1131 12449faa8a77
child 1133 2202f10710af
Finally super useful optimization on guardian request.
src/ldt/ldt/ldt_utils/views/group.py
src/ldt/ldt/security/utils.py
--- a/src/ldt/ldt/ldt_utils/views/group.py	Mon Mar 18 13:00:59 2013 +0100
+++ b/src/ldt/ldt/ldt_utils/views/group.py	Mon Mar 18 16:15:46 2013 +0100
@@ -30,15 +30,15 @@
     # Get group, user and project_list
     if grp_id == "-1":
         if exclude_owner:
-            project_list = get_objects_for_user(user, 'ldt_utils.view_project', use_groups=False).exclude(owner=user)
+            project_list = get_objects_for_user(user, 'ldt_utils.view_project', use_groups=False).exclude(owner=user).select_related("owner")
         else:
-            project_list = get_objects_for_user(user, 'ldt_utils.view_project', use_groups=False)
+            project_list = get_objects_for_user(user, 'ldt_utils.view_project', use_groups=False).select_related("owner")
     else:
         grp = Group.objects.get(id=grp_id)
         if exclude_front:
-            project_list = get_objects_for_group(grp, 'ldt_utils.view_project').exclude(title__startswith='front')
+            project_list = get_objects_for_group(grp, 'ldt_utils.view_project').exclude(title__startswith='front').select_related("owner")
         else:
-            project_list = get_objects_for_group(grp, 'ldt_utils.view_project')
+            project_list = get_objects_for_group(grp, 'ldt_utils.view_project').select_related("owner")
     project_list = add_change_attr(user, project_list)
     
     return project_list
--- a/src/ldt/ldt/security/utils.py	Mon Mar 18 13:00:59 2013 +0100
+++ b/src/ldt/ldt/security/utils.py	Mon Mar 18 16:15:46 2013 +0100
@@ -61,23 +61,24 @@
     """
     if len(obj_list) == 0:
         return []
-    
     model_name = obj_list[0].__class__.__name__.lower()
     ctype = ContentType.objects.get(model=model_name)
     cls = ctype.model_class()
-
+    # We don't use obj.values_list('pk', flat=True) because the full queryset will be calculated and used after anyway.
+    pk_list = [item.pk for item in obj_list]
     if model_name in [cls_name.lower() for cls_name in settings.USE_GROUP_PERMISSIONS] or model_name == 'group':
         to_check = True
-        change_list = get_objects_for_user(user, '%s.change_%s' % (cls._meta.app_label, model_name))
+        # Filter SUPER usefull : avoid to load ALL objects. We only check permissions on obj_list's objects
+        change_list = get_objects_for_user(user, '%s.change_%s' % (cls._meta.app_label, model_name)).filter(pk__in=pk_list)
     else:
-        to_check = False        
-        
+        to_check = False
+    
     for obj in obj_list:
         if not to_check or obj in change_list:
             obj.change = True
         else:
             obj.change = False
-            
+    
     return obj_list
 
 def assign_perm_to_obj(object, read_list, write_list, owner):