From f1d668b20d7c07720807a6fb368923abdd1a901f Mon Sep 17 00:00:00 2001 From: Thomas Fillon Date: Tue, 18 Jul 2017 15:41:37 +0200 Subject: [PATCH] Remove WeakForeignKey - restore unused class for supporting initial migration --- .../migrations/0004_auto_20170718_1540.py | 46 +++++++++++++++++++ telemeta/models/fields.py | 20 ++++++++ telemeta/models/format.py | 25 ++++++---- telemeta/models/location.py | 4 +- 4 files changed, 83 insertions(+), 12 deletions(-) create mode 100644 telemeta/migrations/0004_auto_20170718_1540.py diff --git a/telemeta/migrations/0004_auto_20170718_1540.py b/telemeta/migrations/0004_auto_20170718_1540.py new file mode 100644 index 00000000..e934a256 --- /dev/null +++ b/telemeta/migrations/0004_auto_20170718_1540.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion +import telemeta.models.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('telemeta', '0003_auto_20170718_1502'), + ] + + operations = [ + migrations.AlterField( + model_name='format', + name='original_channels', + field=telemeta.models.fields.ForeignKey(related_name='format', on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='telemeta.NumberOfChannels', null=True, verbose_name='number of channels'), + ), + migrations.AlterField( + model_name='format', + name='physical_format', + field=telemeta.models.fields.ForeignKey(related_name='format', on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='telemeta.PhysicalFormat', null=True, verbose_name='physical format'), + ), + migrations.AlterField( + model_name='format', + name='tape_speed', + field=telemeta.models.fields.ForeignKey(related_name='format', on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='telemeta.TapeSpeed', null=True, verbose_name='tape speed (cm/s)'), + ), + migrations.AlterField( + model_name='format', + name='tape_vendor', + field=telemeta.models.fields.ForeignKey(related_name='format', on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='telemeta.TapeVendor', null=True, verbose_name='tape vendor'), + ), + migrations.AlterField( + model_name='format', + name='tape_wheel_diameter', + field=telemeta.models.fields.ForeignKey(related_name='format', on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='telemeta.TapeWheelDiameter', null=True, verbose_name='tape wheel diameter (cm)'), + ), + migrations.AlterField( + model_name='location', + name='current_location', + field=telemeta.models.fields.ForeignKey(related_name='past_names', on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='telemeta.Location', null=True, verbose_name='current location'), + ), + ] diff --git a/telemeta/models/fields.py b/telemeta/models/fields.py index ef1cfc01..8629d043 100644 --- a/telemeta/models/fields.py +++ b/telemeta/models/fields.py @@ -198,6 +198,26 @@ class ForeignKey(models.ForeignKey): super(ForeignKey, self).__init__(to, **normalize_field(kwargs, 0)) +class WeakForeignKey(ForeignKey): + """A weak foreign key is the same as foreign key but without cascading + delete. Instead the reference is set to null when the referenced record + get deleted. This emulates the ON DELETE SET NULL sql behaviour. + + This field is automatically allowed to be null, there's no need to pass + null=True. + + The constructor arguments are normalized with normalize_field() by the + parent ForeignKey + + Warning: must be used in conjunction with EnhancedQuerySet, EnhancedManager, + and EnhancedModel + """ + def __init__(self, to, **kwargs): + kwargs['null'] = True + super(WeakForeignKey, self).__init__(to, **kwargs) + + + class CharField(models.CharField): """This is a CharField with a default max_length of 250. diff --git a/telemeta/models/format.py b/telemeta/models/format.py index 3a896067..e9418d72 100644 --- a/telemeta/models/format.py +++ b/telemeta/models/format.py @@ -38,8 +38,9 @@ class Format(ModelCore): item = ForeignKey('MediaItem', related_name="format", verbose_name = _("item"), blank=True, null=True, on_delete=models.SET_NULL) - physical_format = WeakForeignKey(PhysicalFormat, related_name="format", - verbose_name = _("physical format")) + physical_format = ForeignKey(PhysicalFormat, related_name="format", + verbose_name = _("physical format"), + blank=True, null=True, on_delete=models.SET_NULL) original_code = CharField(_('original code')) original_number = CharField(_('original number')) original_status = CharField(_('original status')) @@ -48,19 +49,23 @@ class Format(ModelCore): original_location = ForeignKey('Location', related_name="format", verbose_name = _("original location"), blank=True, null=True, on_delete=models.SET_NULL) - original_channels = WeakForeignKey(NumberOfChannels, related_name="format", - verbose_name = _("number of channels")) + original_channels = ForeignKey(NumberOfChannels, related_name="format", + verbose_name = _("number of channels"), + blank=True, null=True, on_delete=models.SET_NULL) original_audio_quality = TextField(_('audio quality')) recording_system = CharField(_('recording system')) # Tapes - tape_wheel_diameter = WeakForeignKey(TapeWheelDiameter, related_name="format", - verbose_name = _("tape wheel diameter (cm)")) + tape_wheel_diameter = ForeignKey(TapeWheelDiameter, related_name="format", + verbose_name = _("tape wheel diameter (cm)"), + blank=True, null=True, on_delete=models.SET_NULL) tape_thickness = CharField(_('tape thickness (um)')) - tape_speed = WeakForeignKey(TapeSpeed, related_name="format", - verbose_name = _("tape speed (cm/s)")) - tape_vendor = WeakForeignKey(TapeVendor, related_name="format", - verbose_name = _("tape vendor")) + tape_speed = ForeignKey(TapeSpeed, related_name="format", + verbose_name = _("tape speed (cm/s)"), + blank=True, null=True, on_delete=models.SET_NULL) + tape_vendor = ForeignKey(TapeVendor, related_name="format", + verbose_name = _("tape vendor"), + blank=True, null=True, on_delete=models.SET_NULL) tape_reference = CharField(_('tape reference')) sticker_presence = BooleanField(_('sticker presence')) diff --git a/telemeta/models/location.py b/telemeta/models/location.py index 019d054b..f675c95c 100644 --- a/telemeta/models/location.py +++ b/telemeta/models/location.py @@ -38,8 +38,8 @@ class Location(ModelCore): name = CharField(_('name'), unique=True, max_length=150, required=True) type = IntegerField(_('type'), choices=TYPE_CHOICES, default=OTHER_TYPE, db_index=True) complete_type = ForeignKey('LocationType', related_name="locations", verbose_name=_('complete type')) - current_location = WeakForeignKey('self', related_name="past_names", - verbose_name=_('current location')) + current_location = ForeignKey('self', related_name="past_names", + verbose_name=_('current location'), blank=True, null=True, on_delete=models.SET_NULL) latitude = FloatField(null=True) longitude = FloatField(null=True) is_authoritative = BooleanField(_('authoritative')) -- 2.39.5