Commit 93464ba7 by benjaoming

add more tests of custom managers and add support for django 1.5 and 1.6's…

add more tests of custom managers and add support for django 1.5 and 1.6's patterns for empty querysets
parent 294839ea
...@@ -57,7 +57,7 @@ class ArticleForm(forms.ModelForm): ...@@ -57,7 +57,7 @@ class ArticleForm(forms.ModelForm):
revisions = models.ArticleRevision.objects.filter(article=self.instance) revisions = models.ArticleRevision.objects.filter(article=self.instance)
self.fields['current_revision'].queryset = revisions self.fields['current_revision'].queryset = revisions
else: else:
self.fields['current_revision'].queryset = models.ArticleRevision.objects.get_empty_query_set() self.fields['current_revision'].queryset = models.ArticleRevision.objects.none()
self.fields['current_revision'].widget = forms.HiddenInput() self.fields['current_revision'].widget = forms.HiddenInput()
class ArticleAdmin(admin.ModelAdmin): class ArticleAdmin(admin.ModelAdmin):
......
...@@ -138,7 +138,14 @@ class ArticleManager(models.Manager): ...@@ -138,7 +138,14 @@ class ArticleManager(models.Manager):
class ArticleFkManager(models.Manager): class ArticleFkManager(models.Manager):
def get_empty_query_set(self): def get_empty_query_set(self):
return ArticleFkEmptyQuerySet(model=self.model) # Pre 1.6 django, we needed a custom inheritor of EmptyQuerySet
# to pass custom methods. However, 1.6 introduced that EmptyQuerySet
# cannot be instantiated but instead passes through the methods
# of the custom QuerySet.
# See: https://code.djangoproject.com/ticket/22817
if DJANGO_VERSION < (1, 6):
return ArticleFkEmptyQuerySet(model=self.model)
return self.get_query_set().none()
def get_query_set(self): def get_query_set(self):
return ArticleFkQuerySet(self.model, using=self._db) return ArticleFkQuerySet(self.model, using=self._db)
...@@ -171,7 +178,14 @@ class URLPathQuerySet(QuerySet, ArticleFkQuerySetMixin): ...@@ -171,7 +178,14 @@ class URLPathQuerySet(QuerySet, ArticleFkQuerySetMixin):
class URLPathManager(TreeManager): class URLPathManager(TreeManager):
def get_empty_query_set(self): def get_empty_query_set(self):
return URLPathEmptyQuerySet(model=self.model) # Pre 1.6 django, we needed a custom inheritor of EmptyQuerySet
# to pass custom methods. However, 1.6 introduced that EmptyQuerySet
# cannot be instantiated but instead passes through the methods
# of the custom QuerySet.
# See: https://code.djangoproject.com/ticket/22817
if DJANGO_VERSION < (1, 6):
return URLPathEmptyQuerySet(model=self.model)
return self.get_query_set().none()
def get_query_set(self): def get_query_set(self):
"""Return a QuerySet with the same ordering as the TreeManager.""" """Return a QuerySet with the same ordering as the TreeManager."""
......
...@@ -279,7 +279,7 @@ class AttachmentSearchView(ArticleMixin, ListView): ...@@ -279,7 +279,7 @@ class AttachmentSearchView(ArticleMixin, ListView):
def get_queryset(self): def get_queryset(self):
self.query = self.request.GET.get('query', None) self.query = self.request.GET.get('query', None)
if not self.query: if not self.query:
qs = models.Attachment.objects.get_empty_query_set() qs = models.Attachment.objects.none()
else: else:
qs = models.Attachment.objects.active().can_read(self.request.user) qs = models.Attachment.objects.active().can_read(self.request.user)
qs = qs.filter(Q(original_filename__contains=self.query) | qs = qs.filter(Q(original_filename__contains=self.query) |
......
...@@ -16,7 +16,7 @@ class ImageForm(forms.ModelForm): ...@@ -16,7 +16,7 @@ class ImageForm(forms.ModelForm):
revisions = models.ImageRevision.objects.filter(plugin=self.instance) revisions = models.ImageRevision.objects.filter(plugin=self.instance)
self.fields['current_revision'].queryset = revisions self.fields['current_revision'].queryset = revisions
else: else:
self.fields['current_revision'].queryset = models.ImageRevision.objects.get_empty_query_set() self.fields['current_revision'].queryset = models.ImageRevision.objects.none()
self.fields['current_revision'].widget = forms.HiddenInput() self.fields['current_revision'].widget = forms.HiddenInput()
......
...@@ -9,6 +9,7 @@ import pprint ...@@ -9,6 +9,7 @@ import pprint
from .base import ArticleTestBase, WebTestBase from .base import ArticleTestBase, WebTestBase
from wiki import models from wiki import models
from wiki.plugins.attachments.models import Attachment
class ModelTests(ArticleTestBase): class ModelTests(ArticleTestBase):
...@@ -38,6 +39,23 @@ class ModelTests(ArticleTestBase): ...@@ -38,6 +39,23 @@ class ModelTests(ArticleTestBase):
self.assertEqual(models.Article.objects.none().can_write(self.superuser1).count(), 0) self.assertEqual(models.Article.objects.none().can_write(self.superuser1).count(), 0)
self.assertEqual(models.Article.objects.none().active().count(), 0) self.assertEqual(models.Article.objects.none().active().count(), 0)
# Do the same for Attachment which uses ArtickeFkManager
# Test methods directly on manager
self.assertEqual(Attachment.objects.can_read(self.superuser1).count(), 0)
self.assertEqual(Attachment.objects.can_write(self.superuser1).count(), 0)
self.assertEqual(Attachment.objects.active().count(), 0)
# Test methods on querysets
self.assertEqual(Attachment.objects.all().can_read(self.superuser1).count(), 0)
self.assertEqual(Attachment.objects.all().can_write(self.superuser1).count(), 0)
self.assertEqual(Attachment.objects.all().active().count(), 0)
# Test empty query sets
# See: https://code.djangoproject.com/ticket/22817
self.assertEqual(Attachment.objects.none().can_read(self.superuser1).count(), 0)
self.assertEqual(Attachment.objects.none().can_write(self.superuser1).count(), 0)
self.assertEqual(Attachment.objects.none().active().count(), 0)
class RootArticleViewTests(WebTestBase): class RootArticleViewTests(WebTestBase):
......
...@@ -499,7 +499,7 @@ class SearchView(ListView): ...@@ -499,7 +499,7 @@ class SearchView(ListView):
def get_queryset(self): def get_queryset(self):
if not self.query: if not self.query:
return models.Article.objects.get_empty_query_set() return models.Article.objects.none()
articles = models.Article.objects.filter(Q(current_revision__title__icontains=self.query) | articles = models.Article.objects.filter(Q(current_revision__title__icontains=self.query) |
Q(current_revision__content__icontains=self.query)) Q(current_revision__content__icontains=self.query))
if not permissions.can_moderate(models.URLPath.root().article, self.request.user): if not permissions.can_moderate(models.URLPath.root().article, self.request.user):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment