Finally super useful optimization on guardian request.
--- 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):