Skip to content

Commit e8dd03d

Browse files
authored
Merge pull request #625 from jbernal0019/master
Improve speed of DB queries related to granting a user permission to accesss folder/files resources
2 parents 0f4095c + 2137dcf commit e8dd03d

File tree

3 files changed

+27
-30
lines changed

3 files changed

+27
-30
lines changed

chris_backend/core/models.py

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -175,18 +175,19 @@ def has_user_permission(self, user, permission=''):
175175
Custom method to determine whether a user has been granted a permission
176176
to access the folder (perhaps through one of its groups).
177177
"""
178+
grp_qs = user.groups.all()
179+
178180
if not permission:
179-
lookup = models.Q(shared_folders=self) | models.Q(groups__shared_folders=self)
180-
qs = User.objects.filter(username=user.username).filter(lookup)
181+
if FolderUserPermission.objects.filter(folder=self, user=user).exists():
182+
return True
183+
qs = FolderGroupPermission.objects.filter(folder=self, group__in=grp_qs)
181184
else:
182185
p = validate_permission(permission)
183186
if FolderUserPermission.objects.filter(folder=self, user=user,
184187
permission=p).exists():
185188
return True
186-
187-
user_grp_ids = [g.id for g in user.groups.all()]
188189
qs = FolderGroupPermission.objects.filter(folder=self, permission=p,
189-
group__pk__in=user_grp_ids)
190+
group__in=grp_qs)
190191
return qs.exists()
191192

192193
def grant_group_permission(self, group, permission):
@@ -593,18 +594,19 @@ def has_user_permission(self, user, permission=''):
593594
Custom method to determine whether a user has been granted a permission to
594595
access the file (perhaps through one of its groups).
595596
"""
597+
grp_qs = user.groups.all()
598+
596599
if not permission:
597-
lookup = models.Q(shared_files=self) | models.Q(groups__shared_files=self)
598-
qs = User.objects.filter(username=user.username).filter(lookup)
600+
if FileUserPermission.objects.filter(file=self, user=user).exists():
601+
return True
602+
qs = FileGroupPermission.objects.filter(file=self, group__in=grp_qs)
599603
else:
600604
p = validate_permission(permission)
601605
if FileUserPermission.objects.filter(file=self, user=user,
602606
permission=p).exists():
603607
return True
604-
605-
user_grp_ids = [g.id for g in user.groups.all()]
606608
qs = FileGroupPermission.objects.filter(file=self, permission=p,
607-
group__pk__in=user_grp_ids)
609+
group__in=grp_qs)
608610
return qs.exists()
609611

610612
def grant_group_permission(self, group, permission):
@@ -879,19 +881,19 @@ def has_user_permission(self, user, permission=''):
879881
Custom method to determine whether a user has been granted a permission to
880882
access the link file (perhaps through one of its groups).
881883
"""
884+
grp_qs = user.groups.all()
885+
882886
if not permission:
883-
lookup = models.Q(shared_link_files=self) | models.Q(
884-
groups__shared_link_files=self)
885-
qs = User.objects.filter(username=user.username).filter(lookup)
887+
if LinkFileUserPermission.objects.filter(link_file=self, user=user).exists():
888+
return True
889+
qs = LinkFileGroupPermission.objects.filter(link_file=self, group__in=grp_qs)
886890
else:
887891
p = validate_permission(permission)
888892
if LinkFileUserPermission.objects.filter(link_file=self, user=user,
889893
permission=p).exists():
890894
return True
891-
892-
user_grp_ids = [g.id for g in user.groups.all()]
893895
qs = LinkFileGroupPermission.objects.filter(link_file=self, permission=p,
894-
group__pk__in=user_grp_ids)
896+
group__in=grp_qs)
895897
return qs.exists()
896898

897899
def grant_group_permission(self, group, permission):

chris_backend/feeds/views.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -165,9 +165,8 @@ def get_feeds_queryset(self, user):
165165
if not user.is_authenticated:
166166
return tag.feeds.filter(public=True)
167167

168-
group_ids = [g.id for g in user.groups.all()]
169168
lookup = Q(owner=user) | Q(public=True) | Q(shared_users=user) | Q(
170-
shared_groups__pk__in=group_ids)
169+
shared_groups__in=user.groups.all())
171170
return tag.feeds.filter(lookup)
172171

173172

@@ -261,9 +260,8 @@ def get_taggings_queryset(self, user):
261260
if not user.is_authenticated:
262261
return Tagging.objects.filter(tag=tag).filter(feed__public=True)
263262

264-
group_ids = [g.id for g in user.groups.all()]
265263
lookup = Q(feed__owner=user) | (Q(feed__public=True) | Q(
266-
feed__shared_users=user) | Q(feed__shared_groups__pk__in=group_ids))
264+
feed__shared_users=user) | Q(feed__shared_groups__in=user.groups.all()))
267265
return Tagging.objects.filter(tag=tag).filter(lookup)
268266

269267

@@ -299,8 +297,8 @@ def get_queryset(self):
299297
if user.username == 'chris':
300298
return Feed.objects.exclude(public=True)
301299

302-
group_ids = [g.id for g in user.groups.all()]
303-
lookup = Q(owner=user) | Q(shared_users=user) | Q(shared_groups__pk__in=group_ids)
300+
lookup = Q(owner=user) | Q(shared_users=user) | Q(
301+
shared_groups__in=user.groups.all())
304302
return Feed.objects.filter(lookup)
305303

306304
def list(self, request, *args, **kwargs):
@@ -368,8 +366,8 @@ def get_queryset(self):
368366
if user.username == 'chris':
369367
return Feed.objects.exclude(public=True)
370368

371-
group_ids = [g.id for g in user.groups.all()]
372-
lookup = Q(owner=user) | Q(shared_users=user) | Q(shared_groups__pk__in=group_ids)
369+
lookup = Q(owner=user) | Q(shared_users=user) | Q(
370+
shared_groups__in=user.groups.all())
373371
return Feed.objects.filter(lookup)
374372

375373

chris_backend/filebrowser/services.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,7 @@ def get_folder_children_queryset(folder, user=None):
3636
return folder.children.all()
3737

3838
lookup = models.Q(owner=user) | models.Q(public=True) | models.Q(
39-
shared_users=user) | models.Q(shared_groups__pk__in=[g.id for g
40-
in user.groups.all()])
39+
shared_users=user) | models.Q(shared_groups__in=user.groups.all())
4140
return folder.children.filter(lookup)
4241

4342

@@ -52,8 +51,7 @@ def get_folder_files_queryset(folder, user=None):
5251
return folder.chris_files.all()
5352

5453
lookup = models.Q(owner=user) | models.Q(public=True) | models.Q(
55-
shared_users=user) | models.Q(shared_groups__pk__in=[g.id for g
56-
in user.groups.all()])
54+
shared_users=user) | models.Q(shared_groups__in=user.groups.all())
5755
return folder.chris_files.filter(lookup)
5856

5957

@@ -68,6 +66,5 @@ def get_folder_link_files_queryset(folder, user=None):
6866
return folder.chris_link_files.all()
6967

7068
lookup = models.Q(owner=user) | models.Q(public=True) | models.Q(
71-
shared_users=user) | models.Q(shared_groups__pk__in=[g.id for g
72-
in user.groups.all()])
69+
shared_users=user) | models.Q(shared_groups__in=user.groups.all())
7370
return folder.chris_link_files.filter(lookup)

0 commit comments

Comments
 (0)