Convert managers to querysets, resolves #2617 (#2896)

gthank-master
Frederick 2017-05-24 14:45:50 -07:00 committed by Anthony
parent 27e8dc3b65
commit 64854e4af9
6 changed files with 41 additions and 41 deletions

View File

@ -15,7 +15,7 @@ from taggit.managers import TaggableManager
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,
@ -346,7 +346,7 @@ class Build(models.Model):
# Manager
objects = BuildManager()
objects = BuildQuerySet.as_manager()
class Meta:
ordering = ['-date']
@ -414,7 +414,7 @@ class BuildCommandResult(BuildCommandResultMixin, models.Model):
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}')

View File

@ -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

View File

@ -14,7 +14,7 @@ from allauth.socialaccount.models import SocialAccount
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')
@ -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)
@ -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']

View File

@ -14,7 +14,7 @@ from readthedocs.core.utils.extend import (SettingsOverrideObject,
from readthedocs.projects import constants
class ProjectManager(models.Manager):
class ProjectQuerySet(models.QuerySet):
"""Projects take into account their own privacy_level setting."""
@ -22,7 +22,7 @@ class ProjectManager(models.Manager):
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
@ -175,7 +175,7 @@ class VersionQuerySet(SettingsOverrideObject):
_default_class = VersionQuerySetBase
class BuildManager(models.Manager):
class BuildQuerySet(models.QuerySet):
"""
Build objects that are privacy aware.
@ -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):
@ -206,7 +206,7 @@ class BuildManager(models.Manager):
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.
@ -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):
@ -264,17 +264,17 @@ class RelatedProjectManager(models.Manager):
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`"""
@ -282,11 +282,11 @@ class RelatedBuildManager(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(
queryset = self.filter(
build__version__pk__in=pks) | queryset
return queryset.distinct()
@ -302,7 +302,7 @@ class RelatedBuildManager(models.Manager):
return self.public(user)
class RelatedUserManager(models.Manager):
class RelatedUserQuerySet(models.QuerySet):
"""For models with relations through :py:class:`User`"""

View File

@ -13,8 +13,8 @@ from readthedocs.privacy import backend
from readthedocs.privacy.backends import syncers
class ProjectManager(SettingsOverrideObject):
_default_class = backend.ProjectManager
class ProjectQuerySet(SettingsOverrideObject):
_default_class = backend.ProjectQuerySet
_override_setting = 'PROJECT_MANAGER'
@ -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'

View File

@ -18,8 +18,8 @@ from readthedocs.api.client import api
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
@ -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)
@ -275,7 +275,7 @@ class Project(models.Model):
)
tags = TaggableManager(blank=True)
objects = ProjectManager()
objects = ProjectQuerySet.as_manager()
all_objects = models.Manager()
class Meta:
@ -854,7 +854,7 @@ class ImportedFile(models.Model):
class Notification(models.Model):
project = models.ForeignKey(Project,
related_name='%(class)s_notifications')
objects = RelatedProjectManager()
objects = RelatedProjectQuerySet.as_manager()
class Meta:
abstract = True
@ -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')