Merge pull request #2103 from rtfd/manager-querysets

Build out proper querysets for managers.
break-out-core-urls-views
Eric Holscher 2016-03-31 11:07:40 -07:00
commit 94c821d610
2 changed files with 30 additions and 0 deletions

View File

@ -18,6 +18,8 @@ class ProjectManager(models.Manager):
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()
@ -70,6 +72,8 @@ class VersionManager(models.Manager):
Versions take into account their own privacy_level setting.
"""
use_for_related_fields = True
def _add_user_repos(self, queryset, user):
if user.has_perm('builds.view_version'):
return self.get_queryset().all().distinct()
@ -98,6 +102,16 @@ class VersionManager(models.Manager):
queryset = queryset.filter(active=True)
return queryset
def private(self, user=None, project=None, only_active=True):
queryset = self.filter(privacy_level__in=[constants.PRIVATE])
if user:
queryset = self._add_user_repos(queryset, user)
if project:
queryset = queryset.filter(project=project)
if only_active:
queryset = queryset.filter(active=True)
return queryset
def api(self, user=None):
return self.public(user, only_active=False)
@ -132,6 +146,8 @@ class BuildManager(models.Manager):
Build objects take into account the privacy of the Version they relate to.
"""
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()
@ -161,6 +177,8 @@ class RelatedProjectManager(models.Manager):
This shouldn't be used as a subclass.
"""
use_for_related_fields = True
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'):
@ -188,6 +206,8 @@ class RelatedBuildManager(models.Manager):
'''For models with association to a project through :py:cls:`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()

View File

@ -347,3 +347,13 @@ class PrivacyTests(TestCase):
self.client.login(username='tester', password='test')
r = self.client.get('/projects/django-kong/builds/')
self.assertTrue('test-slug' not in r.content)
def test_queryset_chaining(self):
"""
Test that manager methods get set on related querysets.
"""
kong = self._create_kong('public', 'private')
self.assertEqual(
kong.versions.private().get(slug='latest').slug,
'latest'
)