Skip to content

Commit 7e97aec

Browse files
committed
Completely remove use of CustomForeignKeyField
1 parent a2d8b61 commit 7e97aec

File tree

4 files changed

+42
-43
lines changed

4 files changed

+42
-43
lines changed

simple_history/models.py

Lines changed: 31 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,33 +2,37 @@
22

33
import threading
44
import copy
5-
try:
6-
from django.apps import apps
7-
except ImportError: # Django < 1.7
8-
apps = None
5+
import warnings
6+
97
from django.db import models, router
108
from django.db.models import loading
119
from django.db.models.fields.proxy import OrderWrt
1210
from django.db.models.fields.related import RelatedField
13-
try:
14-
from django.db.models.fields.related import RelatedObject
15-
except ImportError:
16-
pass
1711
from django.conf import settings
1812
from django.contrib import admin
1913
from django.utils import importlib, six
2014
from django.utils.encoding import python_2_unicode_compatible
2115
from django.utils.encoding import smart_text
2216
from django.utils.timezone import now
2317
from django.utils.translation import string_concat
18+
19+
from .manager import HistoryDescriptor
20+
21+
try:
22+
from django.apps import apps
23+
except ImportError: # Django < 1.7
24+
apps = None
25+
try:
26+
from django.db.models.fields.related import RelatedObject
27+
except ImportError:
28+
RelatedObject = None
2429
try:
2530
from south.modelsinspector import add_introspection_rules
2631
except ImportError: # south not present
2732
pass
2833
else: # south configuration for CustomForeignKeyField
2934
add_introspection_rules(
3035
[], ["^simple_history.models.CustomForeignKeyField"])
31-
from .manager import HistoryDescriptor
3236

3337
registered_models = {}
3438

@@ -124,29 +128,25 @@ def copy_fields(self, model):
124128
for field in model._meta.fields:
125129
field = copy.copy(field)
126130
field.rel = copy.copy(field.rel)
127-
if isinstance(field, models.ForeignKey):
128-
if not 'RelatedObject' in globals():
129-
old_field = field
130-
field = type(field)(field.rel.to, related_name='+', null=True, blank=True)
131-
field.rel = old_field.rel
132-
field.rel.related_name = '+'
133-
field.name = old_field.name
134-
field.db_constraint = False
135-
field._unique = False
136-
setattr(field, 'attname', field.name)
137-
else:
138-
# Don't allow reverse relations.
139-
# ForeignKey knows best what datatype to use for the column
140-
# we'll used that as soon as it's finalized by copying rel.to
141-
# Django < 1.8
142-
field.__class__ = CustomForeignKeyField
143-
field.rel.related_name = '+'
144-
field.null = True
145-
field.blank = True
146131
if isinstance(field, OrderWrt):
147132
# OrderWrt is a proxy field, switch to a plain IntegerField
148133
field.__class__ = models.IntegerField
149-
transform_field(field)
134+
if isinstance(field, models.ForeignKey):
135+
old_field = field
136+
field = type(field)(
137+
field.rel.to,
138+
related_name='+',
139+
null=True,
140+
blank=True,
141+
primary_key=False,
142+
db_index=True,
143+
serialize=True,
144+
)
145+
field._unique = False
146+
field.name = old_field.name
147+
field.db_constraint = False
148+
else:
149+
transform_field(field)
150150
fields[field.name] = field
151151
return fields
152152

@@ -241,6 +241,8 @@ def get_history_user(self, instance):
241241
class CustomForeignKeyField(models.ForeignKey):
242242

243243
def __init__(self, *args, **kwargs):
244+
warnings.warn("CustomForeignKeyField is deprecated.",
245+
DeprecationWarning)
244246
super(CustomForeignKeyField, self).__init__(*args, **kwargs)
245247
self.db_constraint = False
246248
self.generate_reverse_relation = False

simple_history/tests/migration_test_app/migrations/0001_initial.py

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from __future__ import unicode_literals
44

55
from django.db import models, migrations
6-
import simple_history.models
6+
import django.db.models.deletion
77
from django.conf import settings
88

99

@@ -30,12 +30,9 @@ class Migration(migrations.Migration):
3030
('history_id', models.AutoField(serialize=False, primary_key=True)),
3131
('history_date', models.DateTimeField()),
3232
('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)),
33-
('history_user', models.ForeignKey(null=True, to=settings.AUTH_USER_MODEL)),
33+
('history_user', models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, null=True)),
3434
],
35-
options={
36-
'verbose_name': 'historical yar',
37-
'ordering': ('-history_date', '-history_id'),
38-
},
35+
options={'ordering': ('-history_date', '-history_id'), 'get_latest_by': 'history_date', 'verbose_name': 'historical yar'},
3936
bases=(models.Model,),
4037
),
4138
migrations.CreateModel(
@@ -59,8 +56,8 @@ class Migration(migrations.Migration):
5956
),
6057
migrations.AddField(
6158
model_name='historicalyar',
62-
name='what_id',
63-
field=simple_history.models.CustomForeignKeyField(to='migration_test_app.WhatIMean', blank=True, null=True, related_name='+'),
59+
name='what',
60+
field=models.ForeignKey(related_name='+', db_constraint=False, blank=True, to='migration_test_app.WhatIMean', null=True),
6461
preserve_default=True,
6562
),
6663
]

simple_history/tests/tests/test_admin.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,4 +234,3 @@ def test_deleteting_user(self):
234234

235235
historical_poll = poll.history.all()[0]
236236
self.assertEqual(historical_poll.history_user, None)
237-

simple_history/tests/tests/test_models.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -487,20 +487,20 @@ def test_invalid_bases(self):
487487
self.assertRaises(TypeError, HistoricalRecords, bases=bases)
488488

489489
def test_import_related(self):
490-
field_object = HistoricalChoice._meta.get_field_by_name('poll_id')[0]
490+
field_object = HistoricalChoice._meta.get_field_by_name('poll')[0]
491491
try:
492492
related_model = field_object.rel.related_model
493493
except AttributeError: # Django<1.8
494494
related_model = field_object.related.model
495-
self.assertEqual(related_model, Choice)
495+
self.assertEqual(related_model, HistoricalChoice)
496496

497497
def test_string_related(self):
498-
field_object = HistoricalState._meta.get_field_by_name('library_id')[0]
498+
field_object = HistoricalState._meta.get_field_by_name('library')[0]
499499
try:
500500
related_model = field_object.rel.related_model
501501
except AttributeError: # Django<1.8
502502
related_model = field_object.related.model
503-
self.assertEqual(related_model, State)
503+
self.assertEqual(related_model, HistoricalState)
504504

505505
@skipUnless(django.get_version() >= "1.7", "Requires 1.7 migrations")
506506
def test_state_serialization_of_customfk(self):
@@ -660,7 +660,8 @@ class TestLatest(TestCase):
660660
""""Test behavior of `latest()` without any field parameters"""
661661

662662
def setUp(self):
663-
poll = Poll.objects.create(question="Does `latest()` work?", pub_date=yesterday)
663+
poll = Poll.objects.create(
664+
question="Does `latest()` work?", pub_date=yesterday)
664665
poll.pub_date = today
665666
poll.save()
666667

0 commit comments

Comments
 (0)