Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove django guardian from querysets #5853

Merged
merged 2 commits into from
Jun 27, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions readthedocs/builds/querysets.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
"""Build and Version QuerySet classes."""

from django.db import models
from guardian.shortcuts import get_objects_for_user

from readthedocs.core.utils.extend import SettingsOverrideObject
from readthedocs.projects import constants
Expand All @@ -20,7 +19,8 @@ def _add_user_repos(self, queryset, user):
if user.has_perm('builds.view_version'):
return self.all().distinct()
if user.is_authenticated:
user_queryset = get_objects_for_user(user, 'builds.view_version')
projects_pk = user.projects.all().values_list('pk', flat=True)
user_queryset = self.filter(project__in=projects_pk)
queryset = user_queryset | queryset
return queryset.distinct()

Expand Down Expand Up @@ -91,9 +91,9 @@ def _add_user_repos(self, queryset, user=None):
if user.has_perm('builds.view_version'):
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

btw, we don't set this in any part of the code, so I guess this can only be done in the db, but again, I don't think we do that or want to do that.

return self.all().distinct()
if user.is_authenticated:
user_queryset = get_objects_for_user(user, 'builds.view_version')
pks = user_queryset.values_list('pk', flat=True)
queryset = self.filter(version__pk__in=pks) | queryset
projects_pk = user.projects.all().values_list('pk', flat=True)
user_queryset = self.filter(project__in=projects_pk)
queryset = user_queryset | queryset
return queryset.distinct()

def public(self, user=None, project=None):
Expand Down Expand Up @@ -129,9 +129,9 @@ def _add_user_repos(self, queryset, user=None):
if user.has_perm('builds.view_version'):
return self.all().distinct()
if user.is_authenticated:
user_queryset = get_objects_for_user(user, 'builds.view_version')
pks = user_queryset.values_list('pk', flat=True)
queryset = self.filter(build__version__pk__in=pks,) | queryset
projects_pk = user.projects.all().values_list('pk', flat=True)
user_queryset = self.filter(build__project__in=projects_pk)
queryset = user_queryset | queryset
return queryset.distinct()

def public(self, user=None, project=None):
Expand Down
14 changes: 5 additions & 9 deletions readthedocs/projects/querysets.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
"""Project model QuerySet classes."""

from django.db import models
from django.db.models import Q, OuterRef, Subquery, Prefetch
from guardian.shortcuts import get_objects_for_user
from django.db.models import OuterRef, Prefetch, Q, Subquery

from readthedocs.core.utils.extend import SettingsOverrideObject

Expand All @@ -19,7 +18,7 @@ def _add_user_repos(self, queryset, user):
if user.has_perm('projects.view_project'):
return self.all().distinct()
if user.is_authenticated:
user_queryset = get_objects_for_user(user, 'projects.view_project')
user_queryset = user.projects.all()
queryset = user_queryset | queryset
return queryset.distinct()

Expand Down Expand Up @@ -131,15 +130,12 @@ class RelatedProjectQuerySetBase(models.QuerySet):
project_field = 'project'

def _add_user_repos(self, queryset, user=None):
# Hack around get_objects_for_user not supporting global perms
if user.has_perm('projects.view_project'):
return self.all().distinct()
if user.is_authenticated:
# Add in possible user-specific views
project_qs = get_objects_for_user(user, 'projects.view_project')
pks = project_qs.values_list('pk', flat=True)
kwargs = {'%s__pk__in' % self.project_field: pks}
queryset = self.filter(**kwargs) | queryset
projects_pk = user.projects.all().values_list('pk', flat=True)
user_queryset = self.filter(project__in=projects_pk)
queryset = user_queryset | queryset
return queryset.distinct()

def public(self, user=None, project=None):
Expand Down