# HG changeset patch # User cavaliet # Date 1363619746 -3600 # Node ID 026d510a3dc384950ba07823f07ecf5e2b18970e # Parent 12449faa8a77eca9eec9d8ce26e84c72b3867ab1 Finally super useful optimization on guardian request. diff -r 12449faa8a77 -r 026d510a3dc3 src/ldt/ldt/ldt_utils/views/group.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 diff -r 12449faa8a77 -r 026d510a3dc3 src/ldt/ldt/security/utils.py --- 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):