mirror of
https://github.com/jazzband/django-auditlog.git
synced 2026-03-16 22:20:26 +00:00
Some work on m2m relationships
This commit is contained in:
parent
dd379bb870
commit
3623812ab4
3 changed files with 36 additions and 1 deletions
|
|
@ -6,6 +6,7 @@ from django.conf import settings
|
|||
from django.contrib.contenttypes import generic
|
||||
from django.contrib.contenttypes.models import ContentType
|
||||
from django.db import models
|
||||
from django.db.models import QuerySet, Q
|
||||
from django.utils.encoding import python_2_unicode_compatible, smart_text
|
||||
from django.utils.six import iteritems, integer_types
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
|
@ -59,6 +60,23 @@ class LogEntryManager(models.Manager):
|
|||
else:
|
||||
return self.filter(content_type=content_type, object_pk=pk)
|
||||
|
||||
def get_for_objects(self, queryset):
|
||||
"""
|
||||
Get log entries for the objects in the specified queryset.
|
||||
|
||||
:param queryset: The queryset to get the log entries for.
|
||||
:type queryset: QuerySet
|
||||
:return: The LogEntry objects for the objects in the given queryset.
|
||||
:rtype: QuerySet
|
||||
"""
|
||||
if not isinstance(queryset, QuerySet) or queryset.count() == 0:
|
||||
return self.none()
|
||||
|
||||
content_type = ContentType.objects.get_for_model(queryset.model)
|
||||
primary_keys = queryset.values_list(queryset.model._meta.pk.name, flat=True)
|
||||
|
||||
return self.filter(content_type=content_type).filter(Q(object_id__in=primary_keys) | Q(object_pk__in=primary_keys))
|
||||
|
||||
def get_for_model(self, model):
|
||||
"""
|
||||
Get log entries for all objects of a specified type.
|
||||
|
|
|
|||
|
|
@ -85,5 +85,8 @@ class SimpleExcludeModel(models.Model):
|
|||
auditlog.register(SimpleModel)
|
||||
auditlog.register(AltPrimaryKeyModel)
|
||||
auditlog.register(ProxyModel)
|
||||
auditlog.register(RelatedModel)
|
||||
auditlog.register(ManyRelatedModel)
|
||||
auditlog.register(ManyRelatedModel.related.through)
|
||||
auditlog.register(SimpleIncludeModel, include_fields=['label', ])
|
||||
auditlog.register(SimpleExcludeModel, exclude_fields=['text', ])
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ from django.test import TestCase, RequestFactory
|
|||
from auditlog.middleware import AuditlogMiddleware
|
||||
from auditlog.models import LogEntry
|
||||
from auditlog_tests.models import SimpleModel, AltPrimaryKeyModel, ProxyModel, \
|
||||
SimpleIncludeModel, SimpleExcludeModel
|
||||
SimpleIncludeModel, SimpleExcludeModel, RelatedModel, ManyRelatedModel
|
||||
|
||||
|
||||
class SimpleModelTest(TestCase):
|
||||
|
|
@ -75,6 +75,20 @@ class ProxyModelTest(SimpleModelTest):
|
|||
self.obj = ProxyModel.objects.create(text='I am not what you think.')
|
||||
|
||||
|
||||
class ManyRelatedModelTest(TestCase):
|
||||
"""
|
||||
Test the behaviour of a many-to-many relationship.
|
||||
"""
|
||||
def setUp(self):
|
||||
self.obj = ManyRelatedModel.objects.create()
|
||||
self.rel_obj = ManyRelatedModel.objects.create()
|
||||
self.obj.related.add(self.rel_obj)
|
||||
|
||||
def test_related(self):
|
||||
self.assertEqual(LogEntry.objects.get_for_objects(self.obj.related.all()).count(), self.rel_obj.history.count())
|
||||
self.assertEqual(LogEntry.objects.get_for_objects(self.obj.related.all()).first(), self.rel_obj.history.first())
|
||||
|
||||
|
||||
class MiddlewareTest(TestCase):
|
||||
"""
|
||||
Test the middleware responsible for connecting and disconnecting the signals used in automatic logging.
|
||||
|
|
|
|||
Loading…
Reference in a new issue