Merge pull request #612 from ProtixIT/generate-custom-soft-delete-manager

Auto-generate manager implementation for `CustomSoftDelete`
This commit is contained in:
Jelmer 2024-04-17 09:36:00 +02:00 committed by GitHub
commit ba9ac5db81
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 19 additions and 22 deletions

View file

@ -1,13 +0,0 @@
from model_utils.managers import SoftDeletableManager, SoftDeletableQuerySet
class CustomSoftDeleteQuerySet(SoftDeletableQuerySet):
def only_read(self):
return self.filter(is_read=True)
class CustomSoftDeleteManager(SoftDeletableManager):
_queryset_class = CustomSoftDeleteQuerySet
def only_read(self):
return self.get_queryset().only_read()

View file

@ -9,7 +9,13 @@ from django.utils.translation import gettext_lazy as _
from model_utils import Choices from model_utils import Choices
from model_utils.fields import MonitorField, SplitField, StatusField, UUIDField from model_utils.fields import MonitorField, SplitField, StatusField, UUIDField
from model_utils.managers import InheritanceManager, JoinManager, QueryManager from model_utils.managers import (
InheritanceManager,
JoinManager,
QueryManager,
SoftDeletableManager,
SoftDeletableQuerySet,
)
from model_utils.models import ( from model_utils.models import (
SoftDeletableModel, SoftDeletableModel,
StatusModel, StatusModel,
@ -19,7 +25,6 @@ from model_utils.models import (
) )
from model_utils.tracker import FieldTracker, ModelTracker from model_utils.tracker import FieldTracker, ModelTracker
from tests.fields import MutableField from tests.fields import MutableField
from tests.managers import CustomSoftDeleteManager
class InheritanceManagerTestRelated(models.Model): class InheritanceManagerTestRelated(models.Model):
@ -347,10 +352,15 @@ class SoftDeletable(SoftDeletableModel):
all_objects: ClassVar[Manager[SoftDeletable]] = models.Manager() all_objects: ClassVar[Manager[SoftDeletable]] = models.Manager()
class CustomSoftDeleteQuerySet(SoftDeletableQuerySet):
def only_read(self):
return self.filter(is_read=True)
class CustomSoftDelete(SoftDeletableModel): class CustomSoftDelete(SoftDeletableModel):
is_read = models.BooleanField(default=False) is_read = models.BooleanField(default=False)
objects: ClassVar[CustomSoftDeleteManager[SoftDeletableModel]] = CustomSoftDeleteManager() available_objects = SoftDeletableManager.from_queryset(CustomSoftDeleteQuerySet)() # type: ignore[misc]
class StringyDescriptor: class StringyDescriptor:

View file

@ -6,21 +6,21 @@ from tests.models import CustomSoftDelete
class CustomSoftDeleteManagerTests(TestCase): class CustomSoftDeleteManagerTests(TestCase):
def test_custom_manager_empty(self): def test_custom_manager_empty(self):
qs = CustomSoftDelete.objects.only_read() qs = CustomSoftDelete.available_objects.only_read()
self.assertEqual(qs.count(), 0) self.assertEqual(qs.count(), 0)
def test_custom_qs_empty(self): def test_custom_qs_empty(self):
qs = CustomSoftDelete.objects.all().only_read() qs = CustomSoftDelete.available_objects.all().only_read()
self.assertEqual(qs.count(), 0) self.assertEqual(qs.count(), 0)
def test_is_read(self): def test_is_read(self):
for is_read in [True, False, True, False]: for is_read in [True, False, True, False]:
CustomSoftDelete.objects.create(is_read=is_read) CustomSoftDelete.available_objects.create(is_read=is_read)
qs = CustomSoftDelete.objects.only_read() qs = CustomSoftDelete.available_objects.only_read()
self.assertEqual(qs.count(), 2) self.assertEqual(qs.count(), 2)
def test_is_read_removed(self): def test_is_read_removed(self):
for is_read, is_removed in [(True, True), (True, False), (False, False), (False, True)]: for is_read, is_removed in [(True, True), (True, False), (False, False), (False, True)]:
CustomSoftDelete.objects.create(is_read=is_read, is_removed=is_removed) CustomSoftDelete.available_objects.create(is_read=is_read, is_removed=is_removed)
qs = CustomSoftDelete.objects.only_read() qs = CustomSoftDelete.available_objects.only_read()
self.assertEqual(qs.count(), 1) self.assertEqual(qs.count(), 1)