Skip to content

Commit 3debf21

Browse files
committed
Merge pull request #126
2 parents 87a1947 + 8658064 commit 3debf21

File tree

5 files changed

+45
-9
lines changed

5 files changed

+45
-9
lines changed

setup.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
from setuptools import setup
22
import simple_history
33

4+
tests_require = ["Django>=1.4", "webtest==2.0.6", "django-webtest==1.7"]
5+
try:
6+
from unittest import skipUnless
7+
except ImportError: # Python 2.6 compatibility
8+
tests_require.append("unittest2")
9+
410
setup(
511
name='django-simple-history',
612
version=simple_history.__version__,
@@ -27,7 +33,7 @@
2733
'Programming Language :: Python :: 3.3',
2834
"License :: OSI Approved :: BSD License",
2935
],
30-
tests_require=["Django>=1.4", "webtest==2.0.6", "django-webtest==1.7"],
36+
tests_require=tests_require,
3137
include_package_data=True,
3238
test_suite='runtests.main',
3339
)

simple_history/models.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ def copy_fields(self, model):
149149
# Don't allow reverse relations.
150150
# ForeignKey knows best what datatype to use for the column
151151
# we'll used that as soon as it's finalized by copying rel.to
152-
field.__class__ = get_custom_fk_class(type(field))
152+
field.__class__ = CustomForeignKeyField
153153
field.rel.related_name = '+'
154154
field.null = True
155155
field.blank = True
@@ -243,7 +243,8 @@ def get_history_user(self, instance):
243243
return None
244244

245245

246-
class ForeignKeyMixin(object):
246+
class CustomForeignKeyField(models.ForeignKey):
247+
247248
def get_attname(self):
248249
return self.name
249250

@@ -303,7 +304,13 @@ def get_field(self, other, cls):
303304
def do_related_class(self, other, cls):
304305
field = self.get_field(other, cls)
305306
if not hasattr(self, 'related'):
306-
self.related = RelatedObject(other, cls.instance_type, self)
307+
try:
308+
instance_type = cls.instance_type
309+
except AttributeError: # when model is reconstituted for migration
310+
if cls.__module__ != "__fake__": # not from migrations, error
311+
raise
312+
else:
313+
self.related = RelatedObject(other, instance_type, self)
307314
transform_field(field)
308315
field.rel = None
309316

@@ -312,10 +319,6 @@ def contribute_to_class(self, cls, name):
312319
RelatedField.contribute_to_class(self, cls, name)
313320

314321

315-
def get_custom_fk_class(parent_type):
316-
return type(str('CustomForeignKey'), (ForeignKeyMixin, parent_type), {})
317-
318-
319322
def transform_field(field):
320323
"""Customize field appropriately for use in historical model"""
321324
field.name = field.attname

simple_history/tests/models.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,3 +193,8 @@ class UnicodeVerboseName(models.Model):
193193

194194
class Meta:
195195
verbose_name = '\u570b'
196+
197+
198+
class CustomFKError(models.Model):
199+
fk = models.ForeignKey(SecondLevelInheritedModel)
200+
history = HistoricalRecords()

simple_history/tests/tests/test_commands.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
from contextlib import contextmanager
22
from six.moves import cStringIO as StringIO
33
from datetime import datetime
4+
try:
5+
from unittest import skipUnless
6+
except ImportError:
7+
from unittest2 import skipUnless
8+
import django
49
from django.test import TestCase
510
from django.core import management
611
from simple_history import models as sh_models
@@ -101,3 +106,10 @@ def test_no_historical(self):
101106
stdout=out)
102107
self.assertIn(populate_history.Command.NO_REGISTERED_MODELS,
103108
out.getvalue())
109+
110+
111+
class TestMigrate(TestCase):
112+
113+
@skipUnless(django.get_version() >= "1.7", "Requires 1.7 migrations")
114+
def test_migrate_command(self):
115+
management.call_command('migrate', fake=True, stdout=StringIO())

simple_history/tests/tests/test_models.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
from __future__ import unicode_literals
22

33
from datetime import datetime, timedelta
4+
try:
5+
from unittest import skipUnless
6+
except ImportError:
7+
from unittest2 import skipUnless
48

9+
import django
510
try:
611
from django.contrib.auth import get_user_model
712
User = get_user_model()
@@ -19,7 +24,7 @@
1924
FileModel, Document, Book, HistoricalPoll, Library, State, AbstractBase,
2025
ConcreteAttr, ConcreteUtil, SelfFK, Temperature, WaterLevel,
2126
ExternalModel1, ExternalModel3, UnicodeVerboseName, HistoricalChoice,
22-
HistoricalState
27+
HistoricalState, HistoricalCustomFKError
2328
)
2429
from ..external.models import ExternalModel2, ExternalModel4
2530

@@ -471,6 +476,11 @@ def test_string_related(self):
471476
field_object = HistoricalState._meta.get_field_by_name('library_id')[0]
472477
self.assertEqual(field_object.related.model, State)
473478

479+
@skipUnless(django.get_version() >= "1.7", "Requires 1.7 migrations")
480+
def test_state_serialization_of_customfk(self):
481+
from django.db.migrations import state
482+
state.ModelState.from_model(HistoricalCustomFKError)
483+
474484

475485
class TestConvertAutoField(TestCase):
476486
"""Check what AutoFields get converted to."""

0 commit comments

Comments
 (0)