Skip to content

Convert managers to querysets, resolves #2617 #2896

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

Merged
merged 1 commit into from
May 24, 2017
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
6 changes: 3 additions & 3 deletions readthedocs/builds/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@

from readthedocs.core.utils import broadcast
from readthedocs.privacy.backend import VersionQuerySet, VersionManager
from readthedocs.privacy.loader import RelatedBuildManager, BuildManager
from readthedocs.privacy.loader import RelatedBuildQuerySet, BuildQuerySet
from readthedocs.projects.models import Project
from readthedocs.projects.constants import (PRIVACY_CHOICES, GITHUB_URL,
GITHUB_REGEXS, BITBUCKET_URL,
Expand Down Expand Up @@ -346,7 +346,7 @@ class Build(models.Model):

# Manager

objects = BuildManager()
objects = BuildQuerySet.as_manager()

class Meta:
ordering = ['-date']
Expand Down Expand Up @@ -414,7 +414,7 @@ class Meta:
ordering = ['start_time']
get_latest_by = 'start_time'

objects = RelatedBuildManager()
objects = RelatedBuildQuerySet.as_manager()

def __unicode__(self):
return (ugettext(u'Build command {pk} for build {build}')
Expand Down
6 changes: 3 additions & 3 deletions readthedocs/oauth/managers.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
"""Managers for OAuth models"""

from readthedocs.privacy.loader import RelatedUserManager
from readthedocs.privacy.loader import RelatedUserQuerySet


class RemoteRepositoryManager(RelatedUserManager):
class RemoteRepositoryQuerySet(RelatedUserQuerySet):
pass


class RemoteOrganizationManager(RelatedUserManager):
class RemoteOrganizationQuerySet(RelatedUserQuerySet):
pass
6 changes: 3 additions & 3 deletions readthedocs/oauth/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
from readthedocs.projects.constants import REPO_CHOICES
from readthedocs.projects.models import Project

from .managers import RemoteRepositoryManager, RemoteOrganizationManager
from .managers import RemoteRepositoryQuerySet, RemoteOrganizationQuerySet


DEFAULT_PRIVACY_LEVEL = getattr(settings, 'DEFAULT_PRIVACY_LEVEL', 'public')
Expand Down Expand Up @@ -47,7 +47,7 @@ class RemoteOrganization(models.Model):

json = models.TextField(_('Serialized API response'))

objects = RemoteOrganizationManager()
objects = RemoteOrganizationQuerySet.as_manager()

def __unicode__(self):
return 'Remote organization: {name}'.format(name=self.slug)
Expand Down Expand Up @@ -111,7 +111,7 @@ class RemoteRepository(models.Model):

json = models.TextField(_('Serialized API response'))

objects = RemoteRepositoryManager()
objects = RemoteRepositoryQuerySet.as_manager()

class Meta:
ordering = ['organization__name', 'name']
Expand Down
28 changes: 14 additions & 14 deletions readthedocs/privacy/backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@
from readthedocs.projects import constants


class ProjectManager(models.Manager):
class ProjectQuerySet(models.QuerySet):

"""Projects take into account their own privacy_level setting."""

use_for_related_fields = True

def _add_user_repos(self, queryset, user):
if user.has_perm('projects.view_project'):
return self.get_queryset().all().distinct()
return self.all().distinct()
if user.is_authenticated():
user_queryset = get_objects_for_user(user, 'projects.view_project')
queryset = user_queryset | queryset
Expand Down Expand Up @@ -175,7 +175,7 @@ class VersionQuerySet(SettingsOverrideObject):
_default_class = VersionQuerySetBase


class BuildManager(models.Manager):
class BuildQuerySet(models.QuerySet):

"""
Build objects that are privacy aware.
Expand All @@ -187,11 +187,11 @@ class BuildManager(models.Manager):

def _add_user_repos(self, queryset, user=None):
if user.has_perm('builds.view_version'):
return self.get_queryset().all().distinct()
return self.all().distinct()
if user.is_authenticated():
user_queryset = get_objects_for_user(user, 'builds.view_version')
pks = [p.pk for p in user_queryset]
queryset = self.get_queryset().filter(version__pk__in=pks) | queryset
queryset = self.filter(version__pk__in=pks) | queryset
return queryset.distinct()

def public(self, user=None, project=None):
Expand All @@ -206,7 +206,7 @@ def api(self, user=None):
return self.public(user)


class RelatedProjectManager(models.Manager):
class RelatedProjectQuerySet(models.QuerySet):

"""
A manager for things that relate to Project and need to get their perms from the project.
Expand All @@ -220,13 +220,13 @@ class RelatedProjectManager(models.Manager):
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.get_queryset().all().distinct()
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 = [p.pk for p in project_qs]
kwargs = {'%s__pk__in' % self.project_field: pks}
queryset = self.get_queryset().filter(**kwargs) | queryset
queryset = self.filter(**kwargs) | queryset
return queryset.distinct()

def public(self, user=None, project=None):
Expand Down Expand Up @@ -264,29 +264,29 @@ def api(self, user=None):
return self.public(user)


class ParentRelatedProjectManager(RelatedProjectManager):
class ParentRelatedProjectQuerySet(RelatedProjectQuerySet):
project_field = 'parent'
use_for_related_fields = True


class ChildRelatedProjectManager(RelatedProjectManager):
class ChildRelatedProjectQuerySet(RelatedProjectQuerySet):
project_field = 'child'
use_for_related_fields = True


class RelatedBuildManager(models.Manager):
class RelatedBuildQuerySet(models.QuerySet):

"""For models with association to a project through :py:class:`Build`"""

use_for_related_fields = True

def _add_user_repos(self, queryset, user=None):
if user.has_perm('builds.view_version'):
return self.get_queryset().all().distinct()
return self.all().distinct()
if user.is_authenticated():
user_queryset = get_objects_for_user(user, 'builds.view_version')
pks = [p.pk for p in user_queryset]
queryset = self.get_queryset().filter(
queryset = self.filter(
build__version__pk__in=pks) | queryset
return queryset.distinct()

Expand All @@ -302,7 +302,7 @@ def api(self, user=None):
return self.public(user)


class RelatedUserManager(models.Manager):
class RelatedUserQuerySet(models.QuerySet):

"""For models with relations through :py:class:`User`"""

Expand Down
24 changes: 12 additions & 12 deletions readthedocs/privacy/loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@
from readthedocs.privacy.backends import syncers


class ProjectManager(SettingsOverrideObject):
_default_class = backend.ProjectManager
class ProjectQuerySet(SettingsOverrideObject):
_default_class = backend.ProjectQuerySet
_override_setting = 'PROJECT_MANAGER'


Expand All @@ -24,28 +24,28 @@ class VersionManager(SettingsOverrideObject):
_override_setting = 'VERSION_MANAGER'


class BuildManager(SettingsOverrideObject):
_default_class = backend.BuildManager
class BuildQuerySet(SettingsOverrideObject):
_default_class = backend.BuildQuerySet
_override_setting = 'BUILD_MANAGER'


class RelatedProjectManager(SettingsOverrideObject):
_default_class = backend.RelatedProjectManager
class RelatedProjectQuerySet(SettingsOverrideObject):
_default_class = backend.RelatedProjectQuerySet
_override_setting = 'RELATED_PROJECT_MANAGER'


class RelatedBuildManager(SettingsOverrideObject):
_default_class = backend.RelatedBuildManager
class RelatedBuildQuerySet(SettingsOverrideObject):
_default_class = backend.RelatedBuildQuerySet
_override_setting = 'RELATED_BUILD_MANAGER'


class RelatedUserManager(SettingsOverrideObject):
_default_class = backend.RelatedUserManager
class RelatedUserQuerySet(SettingsOverrideObject):
_default_class = backend.RelatedUserQuerySet
_override_setting = 'RELATED_USER_MANAGER'


class ChildRelatedProjectManager(SettingsOverrideObject):
_default_class = backend.ChildRelatedProjectManager
class ChildRelatedProjectQuerySet(SettingsOverrideObject):
_default_class = backend.ChildRelatedProjectQuerySet
_override_setting = 'CHILD_RELATED_PROJECT_MANAGER'


Expand Down
12 changes: 6 additions & 6 deletions readthedocs/projects/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@
from readthedocs.core.utils import broadcast, slugify
from readthedocs.restapi.client import api as apiv2
from readthedocs.builds.constants import LATEST, LATEST_VERBOSE_NAME, STABLE
from readthedocs.privacy.loader import (RelatedProjectManager, ProjectManager,
ChildRelatedProjectManager)
from readthedocs.privacy.loader import (RelatedProjectQuerySet, ProjectQuerySet,
ChildRelatedProjectQuerySet)
from readthedocs.projects import constants
from readthedocs.projects.exceptions import ProjectImportError
from readthedocs.projects.templatetags.projects_tags import sort_version_aware
Expand Down Expand Up @@ -56,7 +56,7 @@ class ProjectRelationship(models.Model):
related_name='superprojects')
alias = models.CharField(_('Alias'), max_length=255, null=True, blank=True)

objects = ChildRelatedProjectManager()
objects = ChildRelatedProjectQuerySet.as_manager()

def __unicode__(self):
return "%s -> %s" % (self.parent, self.child)
Expand Down Expand Up @@ -275,7 +275,7 @@ class Project(models.Model):
)

tags = TaggableManager(blank=True)
objects = ProjectManager()
objects = ProjectQuerySet.as_manager()
all_objects = models.Manager()

class Meta:
Expand Down Expand Up @@ -854,7 +854,7 @@ def __unicode__(self):
class Notification(models.Model):
project = models.ForeignKey(Project,
related_name='%(class)s_notifications')
objects = RelatedProjectManager()
objects = RelatedProjectQuerySet.as_manager()

class Meta:
abstract = True
Expand Down Expand Up @@ -899,7 +899,7 @@ class Domain(models.Model):
)
count = models.IntegerField(default=0, help_text=_('Number of times this domain has been hit.'))

objects = RelatedProjectManager()
objects = RelatedProjectQuerySet.as_manager()

class Meta:
ordering = ('-canonical', '-machine', 'domain')
Expand Down