prevent inconsistent use of db alias (#36028)

This commit is contained in:
Emmanuel Cazenave 2019-09-11 18:22:07 +02:00
parent 762cd93c6d
commit 1dca515624
3 changed files with 31 additions and 3 deletions

View File

@ -1,6 +1,7 @@
import logging
from django.conf import settings
from django.contrib.contenttypes.models import ContentType
import django.db.models
from .decorator import atomic
@ -55,7 +56,10 @@ def record(tag, template, using=None, **kwargs):
continue
tag = Tag.objects.using(using).get_cached(name=name)
if isinstance(value, django.db.models.Model):
journal.objectdata_set.create(tag=tag, content_object=value)
journal.objectdata_set.create(
tag=tag, content_type=ContentType.objects.db_manager(using).get_for_model(value),
object_id=value.pk
)
else:
journal.stringdata_set.create(tag=tag, content=unicode(value))
return journal
@ -71,4 +75,5 @@ def error_record(tag, tpl, **kwargs):
'''
if kwargs.get('using') is None:
kwargs['using'] = getattr(settings, 'JOURNAL_DB_FOR_ERROR_ALIAS', 'default')
return record(tag, tpl, **kwargs)

View File

@ -3,8 +3,18 @@ INSTALLED_APPS = (
'django.contrib.sessions'
)
DATABASES = {
'default': {'ENGINE': 'django.db.backends.postgresql_psycopg2'}
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': '_test'
},
'error': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': '_test'
}
}
SECRET_KEY = "django_tests_secret_key"
PASSWORD_HASHERS = ('django.contrib.auth.hashers.MD5PasswordHasher',)
ROOT_URLCONF = 'test_urls'
JOURNAL_DB_FOR_ERROR_ALIAS = 'error'

View File

@ -5,7 +5,7 @@ from django.db import transaction
from django_journal.journal import record, error_record
from django_journal.actions import export_as_csv_generator
from django_journal.models import Journal
from django_journal.models import Journal, Tag
class JournalTestCase(TestCase):
@ -63,3 +63,16 @@ def test_error_record(db):
# specifying None as database use the defaut one
error_record('error', 'error message', using=None)
assert Journal.objects.count() == 2
def test_error_record_with_db_obj(db):
tag = Tag.objects.create(name='some-tag')
journal = error_record('error', 'error message', someobj=tag)
objdata = journal.objectdata_set.first()
assert objdata.object_id == tag.pk
# If journal is not deleted test_export_as_csv crashes
# probably some db rollback not done since error_record
# uses a different db router
# to be investigated
journal.delete()