Skip to content

Commit e9956c6

Browse files
committed
Merge pull request #31 from scotta/feature/ignore-model
Ignore logging for models in DJANGO_FSM_LOG_IGNORED_MODELS setting
2 parents ce2e85a + 5986e28 commit e9956c6

File tree

4 files changed

+52
-0
lines changed

4 files changed

+52
-0
lines changed

README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,15 @@ StateLog.objects.all()
5151
# ...all recorded logs...
5252
```
5353

54+
### Disabling logging for specific models
55+
56+
By default transitions are logged for all models. Logging can be disabled for
57+
specific models by adding their fully qualified name to `DJANGO_FSM_LOG_IGNORED_MODELS`.
58+
59+
```python
60+
DJANGO_FSM_LOG_IGNORED_MODELS = ('poll.models.Vote')
61+
```
62+
5463
### `for_` Manager Method
5564

5665
For convenience there is a custom `for_` manager method to easily filter on the generic foreign key

django_fsm_log/backends.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ def pre_transition_callback(*args, **kwargs):
1515
def post_transition_callback(*args, **kwargs):
1616
raise NotImplementedError
1717

18+
@staticmethod
19+
def _get_model_qualified_name__(sender):
20+
return '%s.%s' % (sender.__module__,
21+
getattr(sender, '__qualname__', sender.__name__))
22+
1823

1924
class CachedBackend(object):
2025

@@ -26,6 +31,10 @@ def setup_model(model):
2631
@staticmethod
2732
def pre_transition_callback(sender, instance, name, source, target, **kwargs):
2833
from .models import StateLog
34+
35+
if BaseBackend._get_model_qualified_name__(sender) in settings.DJANGO_FSM_LOG_IGNORED_MODELS:
36+
return
37+
2938
StateLog.pending_objects.create(
3039
by=getattr(instance, 'by', None),
3140
state=target,
@@ -52,6 +61,10 @@ def pre_transition_callback(sender, **kwargs):
5261
@staticmethod
5362
def post_transition_callback(sender, instance, name, source, target, **kwargs):
5463
from .models import StateLog
64+
65+
if BaseBackend._get_model_qualified_name__(sender) in settings.DJANGO_FSM_LOG_IGNORED_MODELS:
66+
return
67+
5568
StateLog.objects.create(
5669
by=getattr(instance, 'by', None),
5770
state=target,

django_fsm_log/conf.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@
55
class DjangoFSMLogConf(AppConf):
66
STORAGE_METHOD = 'django_fsm_log.backends.SimpleBackend'
77
CACHE_BACKEND = 'default'
8+
IGNORED_MODELS = []

tests/tests.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
from unittest import skipIf
2+
3+
from django.conf import settings
24
from django.test import TestCase
35

46
from django_fsm_log.models import StateLog
@@ -98,6 +100,33 @@ def test_get_display_state(self):
98100
self.assertNotEqual(log.get_state_display(), article.get_state_display())
99101

100102

103+
class StateLogIgnoredModelTests(TestCase):
104+
def setUp(self):
105+
self.article = Article.objects.create(state='draft')
106+
self.user = User.objects.create_user(username='jacob', password='password')
107+
settings.DJANGO_FSM_LOG_IGNORED_MODELS = ['tests.models.Article']
108+
109+
def tearDown(self):
110+
settings.DJANGO_FSM_LOG_IGNORED_MODELS = []
111+
112+
def test_log_not_created_if_model_ignored(self):
113+
self.assertEqual(len(StateLog.objects.all()), 0)
114+
115+
self.article.submit()
116+
self.article.save()
117+
118+
self.assertEqual(len(StateLog.objects.all()), 0)
119+
120+
def test_log_created_on_transition_when_model_not_ignored(self):
121+
settings.DJANGO_FSM_LOG_IGNORED_MODELS = ['tests.models.SomeOtherModel']
122+
self.assertEqual(len(StateLog.objects.all()), 0)
123+
124+
self.article.submit()
125+
self.article.save()
126+
127+
self.assertEqual(len(StateLog.objects.all()), 1)
128+
129+
101130
class StateLogManagerTests(TestCase):
102131
def setUp(self):
103132
self.article = Article.objects.create(state='draft')

0 commit comments

Comments
 (0)