]> git.parisson.com Git - telemeta.git/commitdiff
Remove WeakForeignKey
authorThomas Fillon <thomas@parisson.com>
Tue, 18 Jul 2017 13:03:45 +0000 (15:03 +0200)
committerThomas Fillon <thomas@parisson.com>
Tue, 18 Jul 2017 13:03:45 +0000 (15:03 +0200)
Fix #185

telemeta/migrations/0003_auto_20170718_1502.py [new file with mode: 0644]
telemeta/models/collection.py
telemeta/models/core.py
telemeta/models/identifier.py
telemeta/models/item.py
telemeta/views/admin.py

diff --git a/telemeta/migrations/0003_auto_20170718_1502.py b/telemeta/migrations/0003_auto_20170718_1502.py
new file mode 100644 (file)
index 0000000..d75ac78
--- /dev/null
@@ -0,0 +1,146 @@
+# -*- 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', '0002_auto_20170424_1110'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='mediacollection',
+            name='acquisition_mode',
+            field=telemeta.models.fields.ForeignKey(related_name='collections', on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='telemeta.AcquisitionMode', null=True, verbose_name='mode of acquisition'),
+        ),
+        migrations.AlterField(
+            model_name='mediacollection',
+            name='ad_conversion',
+            field=telemeta.models.fields.ForeignKey(related_name='collections', on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='telemeta.AdConversion', null=True, verbose_name='digitization'),
+        ),
+        migrations.AlterField(
+            model_name='mediacollection',
+            name='copy_type',
+            field=telemeta.models.fields.ForeignKey(related_name='collections', on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='telemeta.CopyType', null=True, verbose_name='copy type'),
+        ),
+        migrations.AlterField(
+            model_name='mediacollection',
+            name='legal_rights',
+            field=telemeta.models.fields.ForeignKey(related_name='collections', on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='telemeta.LegalRight', null=True, verbose_name='legal rights'),
+        ),
+        migrations.AlterField(
+            model_name='mediacollection',
+            name='media_type',
+            field=telemeta.models.fields.ForeignKey(related_name='collections', on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='telemeta.MediaType', null=True, verbose_name='media type'),
+        ),
+        migrations.AlterField(
+            model_name='mediacollection',
+            name='metadata_author',
+            field=telemeta.models.fields.ForeignKey(related_name='collections', on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='telemeta.MetadataAuthor', null=True, verbose_name='record author'),
+        ),
+        migrations.AlterField(
+            model_name='mediacollection',
+            name='metadata_writer',
+            field=telemeta.models.fields.ForeignKey(related_name='collections', on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='telemeta.MetadataWriter', null=True, verbose_name='record writer'),
+        ),
+        migrations.AlterField(
+            model_name='mediacollection',
+            name='original_format',
+            field=telemeta.models.fields.ForeignKey(related_name='collections', on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='telemeta.OriginalFormat', null=True, verbose_name='original format'),
+        ),
+        migrations.AlterField(
+            model_name='mediacollection',
+            name='physical_format',
+            field=telemeta.models.fields.ForeignKey(related_name='collections', on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='telemeta.PhysicalFormat', null=True, verbose_name='archive format'),
+        ),
+        migrations.AlterField(
+            model_name='mediacollection',
+            name='publisher',
+            field=telemeta.models.fields.ForeignKey(related_name='collections', on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='telemeta.Publisher', null=True, verbose_name='publisher'),
+        ),
+        migrations.AlterField(
+            model_name='mediacollection',
+            name='publisher_collection',
+            field=telemeta.models.fields.ForeignKey(related_name='collections', on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='telemeta.PublisherCollection', null=True, verbose_name='publisher collection'),
+        ),
+        migrations.AlterField(
+            model_name='mediacollection',
+            name='publishing_status',
+            field=telemeta.models.fields.ForeignKey(related_name='collections', on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='telemeta.PublishingStatus', null=True, verbose_name='secondary edition'),
+        ),
+        migrations.AlterField(
+            model_name='mediacollection',
+            name='recording_context',
+            field=telemeta.models.fields.ForeignKey(related_name='collections', on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='telemeta.RecordingContext', null=True, verbose_name='recording context'),
+        ),
+        migrations.AlterField(
+            model_name='mediacollection',
+            name='status',
+            field=telemeta.models.fields.ForeignKey(related_name='collections', on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='telemeta.Status', null=True, verbose_name='collection status'),
+        ),
+        migrations.AlterField(
+            model_name='mediacollectionidentifier',
+            name='type',
+            field=telemeta.models.fields.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='telemeta.IdentifierType', null=True, verbose_name='type'),
+        ),
+        migrations.AlterField(
+            model_name='mediaitem',
+            name='ethnic_group',
+            field=telemeta.models.fields.ForeignKey(related_name='items', on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='telemeta.EthnicGroup', null=True, verbose_name='population / social group'),
+        ),
+        migrations.AlterField(
+            model_name='mediaitem',
+            name='generic_style',
+            field=telemeta.models.fields.ForeignKey(related_name='items', on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='telemeta.GenericStyle', null=True, verbose_name='generic style'),
+        ),
+        migrations.AlterField(
+            model_name='mediaitem',
+            name='location',
+            field=telemeta.models.fields.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='telemeta.Location', null=True, verbose_name='location'),
+        ),
+        migrations.AlterField(
+            model_name='mediaitem',
+            name='media_type',
+            field=telemeta.models.fields.ForeignKey(related_name='items', on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='telemeta.MediaType', null=True, verbose_name='media type'),
+        ),
+        migrations.AlterField(
+            model_name='mediaitem',
+            name='organization',
+            field=telemeta.models.fields.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='telemeta.Organization', null=True, verbose_name='organization'),
+        ),
+        migrations.AlterField(
+            model_name='mediaitem',
+            name='rights',
+            field=telemeta.models.fields.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='telemeta.Rights', null=True, verbose_name='rights'),
+        ),
+        migrations.AlterField(
+            model_name='mediaitem',
+            name='topic',
+            field=telemeta.models.fields.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='telemeta.Topic', null=True, verbose_name='topic'),
+        ),
+        migrations.AlterField(
+            model_name='mediaitem',
+            name='vernacular_style',
+            field=telemeta.models.fields.ForeignKey(related_name='items', on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='telemeta.VernacularStyle', null=True, verbose_name='vernacular style'),
+        ),
+        migrations.AlterField(
+            model_name='mediaitemidentifier',
+            name='type',
+            field=telemeta.models.fields.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='telemeta.IdentifierType', null=True, verbose_name='type'),
+        ),
+        migrations.AlterField(
+            model_name='mediaitemperformance',
+            name='alias',
+            field=telemeta.models.fields.ForeignKey(related_name='performances', on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='telemeta.InstrumentAlias', null=True, verbose_name='vernacular name'),
+        ),
+        migrations.AlterField(
+            model_name='mediaitemperformance',
+            name='instrument',
+            field=telemeta.models.fields.ForeignKey(related_name='performances', on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='telemeta.Instrument', null=True, verbose_name='composition'),
+        ),
+    ]
index 60a6eb55510898b6f8083ebdaa808b5fb450832e..0adbceb20e2f2d9caaf44107849a3faa5d343b4d 100644 (file)
@@ -58,7 +58,7 @@ class MediaCollection(MediaResource):
     alt_title             = CharField(_('original title / translation'))
     creator               = CharField(_('depositor / contributor'), help_text=_('First name, Last name ; First name, Last name'))
     description           = TextField(_('description'))
-    recording_context     = WeakForeignKey('RecordingContext', related_name="collections", verbose_name=_('recording context'))
+    recording_context     = ForeignKey('RecordingContext', related_name="collections", verbose_name=_('recording context'), blank=True, null=True, on_delete=models.SET_NULL)
     recorded_from_year    = IntegerField(_('recording year (from)'), help_text=_('YYYY'))
     recorded_to_year      = IntegerField(_('recording year (until)'), help_text=_('YYYY'))
     year_published        = IntegerField(_('year published'), help_text=_('YYYY'))
@@ -69,29 +69,29 @@ class MediaCollection(MediaResource):
 
     # Legal notices
     collector             = CharField(_('recordist'), help_text=_('First name, Last name ; First name, Last name'))
-    publisher             = WeakForeignKey('Publisher', related_name="collections", verbose_name=_('publisher'))
-    publisher_collection  = WeakForeignKey('PublisherCollection', related_name="collections", verbose_name=_('publisher collection'))
+    publisher             = ForeignKey('Publisher', related_name="collections", verbose_name=_('publisher'), blank=True, null=True, on_delete=models.SET_NULL)
+    publisher_collection  = ForeignKey('PublisherCollection', related_name="collections", verbose_name=_('publisher collection'), blank=True, null=True, on_delete=models.SET_NULL)
     publisher_serial      = CharField(_('publisher serial number'))
     booklet_author        = CharField(_('booklet author'), blank=True)
     reference             = CharField(_('publisher reference'))
     external_references   = TextField(_('bibliographic references'))
 
     auto_period_access    = BooleanField(_('automatic access after a rolling period'), default=True)
-    legal_rights          = WeakForeignKey('LegalRight', related_name="collections", verbose_name=_('legal rights'))
+    legal_rights          = ForeignKey('LegalRight', related_name="collections", verbose_name=_('legal rights'), blank=True, null=True, on_delete=models.SET_NULL)
 
     # Archiving data
     code                  = CharField(_('code'), unique=True, required=True, validators=[is_valid_collection_code])
     old_code              = CharField(_('old code'), unique=False, null=True, blank=True)
-    acquisition_mode      = WeakForeignKey('AcquisitionMode', related_name="collections", verbose_name=_('mode of acquisition'))
+    acquisition_mode      = ForeignKey('AcquisitionMode', related_name="collections", verbose_name=_('mode of acquisition'), blank=True, null=True, on_delete=models.SET_NULL)
     cnrs_contributor      = CharField(_('CNRS depositor'))
-    copy_type             = WeakForeignKey('CopyType', related_name="collections", verbose_name=_('copy type'))
-    metadata_author       = WeakForeignKey('MetadataAuthor', related_name="collections", verbose_name=_('record author'))
+    copy_type             = ForeignKey('CopyType', related_name="collections", verbose_name=_('copy type'), blank=True, null=True, on_delete=models.SET_NULL)
+    metadata_author       = ForeignKey('MetadataAuthor', related_name="collections", verbose_name=_('record author'), blank=True, null=True, on_delete=models.SET_NULL)
     booklet_description   = TextField(_('related documentation'))
-    publishing_status     = WeakForeignKey('PublishingStatus', related_name="collections", verbose_name=_('secondary edition'))
-    status                = WeakForeignKey('Status', related_name="collections", verbose_name=_('collection status'))
+    publishing_status     = ForeignKey('PublishingStatus', related_name="collections", verbose_name=_('secondary edition'), blank=True, null=True, on_delete=models.SET_NULL)
+    status                = ForeignKey('Status', related_name="collections", verbose_name=_('collection status'), blank=True, null=True, on_delete=models.SET_NULL)
     alt_copies            = TextField(_('copies'))
     comment               = TextField(_('comment'))
-    metadata_writer       = WeakForeignKey('MetadataWriter', related_name="collections", verbose_name=_('record writer'))
+    metadata_writer       = ForeignKey('MetadataWriter', related_name="collections", verbose_name=_('record writer'), blank=True, null=True, on_delete=models.SET_NULL)
     archiver_notes        = TextField(_('archiver notes'))
     items_done            = CharField(_('items finished'))
     collector_is_creator  = BooleanField(_('recordist identical to depositor'))
@@ -99,12 +99,12 @@ class MediaCollection(MediaResource):
     conservation_site     = CharField(_('conservation site'))
 
     # Technical data
-    media_type            = WeakForeignKey('MediaType', related_name="collections", verbose_name=_('media type'))
+    media_type            = ForeignKey('MediaType', related_name="collections", verbose_name=_('media type'), blank=True, null=True, on_delete=models.SET_NULL)
     approx_duration       = DurationField(_('estimated duration'), help_text='hh:mm:ss')
     physical_items_num    = IntegerField(_('number of components (medium / piece)'))
-    original_format       = WeakForeignKey('OriginalFormat', related_name="collections", verbose_name=_('original format'))
-    physical_format       = WeakForeignKey('PhysicalFormat', related_name="collections", verbose_name=_('archive format'))
-    ad_conversion         = WeakForeignKey('AdConversion', related_name='collections', verbose_name=_('digitization'))
+    original_format       = ForeignKey('OriginalFormat', related_name="collections", verbose_name=_('original format'), blank=True, null=True, on_delete=models.SET_NULL)
+    physical_format       = ForeignKey('PhysicalFormat', related_name="collections", verbose_name=_('archive format'), blank=True, null=True, on_delete=models.SET_NULL)
+    ad_conversion         = ForeignKey('AdConversion', related_name='collections', verbose_name=_('digitization'), blank=True, null=True, on_delete=models.SET_NULL)
 
     # No more used old fields
     alt_ids               = CharField(_('copies (obsolete field)'))
index d06127975b3b1adc853e932e7018857050214d31..8ac633a64a0071ee8bf076cd40324afe53de81dc 100644 (file)
@@ -72,55 +72,7 @@ app_name = 'telemeta'
 strict_code = getattr(settings, 'TELEMETA_STRICT_CODE', False)
 
 
-class EnhancedQuerySet(models.query.QuerySet):
-    """QuerySet with added functionalities such as WeakForeignKey handling"""
-
-    def delete(self):
-        CHUNK=1024
-        objects = [f for f in self.model._meta.get_fields()
-                   if (f.one_to_many or f.one_to_one)
-                   and f.auto_created and not f.concrete
-        ]
-        ii = self.count()
-        values = self.values_list('pk')
-        for related in objects:
-            i = 0
-            while i < ii:
-                ids = [v[0] for v in values[i:i + CHUNK]]
-                filter = {related.field.name + '__pk__in': ids}
-                q = related.model.objects.filter(**filter)
-                if isinstance(related.field, WeakForeignKey):
-                    update = {related.field.name: None}
-                    q.update(**update)
-                else:
-                    q.delete()
-
-                i += CHUNK
-
-        super(EnhancedQuerySet, self).delete()
-
-
-class EnhancedManager(models.Manager):
-    """Manager which is bound to EnhancedQuerySet"""
-    def get_query_set(self):
-        return EnhancedQuerySet(self.model)
-
-
-class EnhancedModel(models.Model):
-    """Base model class with added functionality. See EnhancedQuerySet"""
-
-    objects = EnhancedManager()
-
-    def delete(self):
-        if not self.pk:
-            raise Exception("Can't delete without a primary key")
-        self.__class__.objects.filter(pk=self.pk).delete()
-
-    class Meta:
-        abstract = True
-
-
-class ModelCore(EnhancedModel, DirtyFieldsMixin):
+class ModelCore(models.Model, DirtyFieldsMixin):
 
     @classmethod
     def required_fields(cls):
@@ -205,7 +157,7 @@ class MetaCore:
 
 
 
-class CoreQuerySet(EnhancedQuerySet):
+class CoreQuerySet(models.query.QuerySet):
     "Base class for all query sets"
 
     def none(self): # redundant with none() in recent Django svn
@@ -232,7 +184,7 @@ class CoreQuerySet(EnhancedQuerySet):
         return qs
 
 
-class CoreManager(EnhancedManager):
+class CoreManager(models.Manager):
     "Base class for all models managers"
 
     def none(self, *args, **kwargs):
index ca8ac92740d49649263c8e7df07e261b68eb57d2..f614d8d90c59d1dc808181dd92cdc0624a5d298a 100644 (file)
@@ -32,7 +32,7 @@ class Identifier(ModelCore):
     """Resource identifier"""
 
     identifier = models.CharField(_('identifier'), max_length=255, blank=True, unique=True)
-    type = WeakForeignKey('IdentifierType', verbose_name=_('type'))
+    type = ForeignKey('IdentifierType', verbose_name=_('type'), blank=True, null=True, on_delete=models.SET_NULL)
     date_add = models.DateTimeField(_('date added'), auto_now_add=True)
     date_first = models.DateTimeField(_('date of first attribution'))
     date_last = models.DateTimeField(_('date of last attribution'))
index 103d36c49146582aed1da7554c7c1020043783c9..41c96e48561a60a52b2ca96ec2e6152a24ded819 100644 (file)
@@ -59,24 +59,24 @@ class MediaItem(MediaResource):
     public_access         = CharField(_('access type'), choices=ITEM_PUBLIC_ACCESS_CHOICES, max_length=16, default="metadata")
 
     # Geographic and cultural informations
-    location              = WeakForeignKey('Location', verbose_name=_('location'))
+    location              = ForeignKey('Location', verbose_name=_('location'), blank=True, null=True, on_delete=models.SET_NULL)
     location_comment      = CharField(_('location details'))
     cultural_area         = CharField(_('cultural area'))
     language              = CharField(_('language'))
     language_iso          = ForeignKey('Language', related_name="items", verbose_name=_('Language (ISO norm)'), blank=True, null=True, on_delete=models.SET_NULL)
-    ethnic_group          = WeakForeignKey('EthnicGroup', related_name="items", verbose_name=_('population / social group'))
+    ethnic_group          = ForeignKey('EthnicGroup', related_name="items", verbose_name=_('population / social group'), blank=True, null=True, on_delete=models.SET_NULL)
     context_comment       = TextField(_('Ethnographic context'))
 
     # Musical informations
     moda_execut           = CharField(_('implementing rules'))
-    vernacular_style      = WeakForeignKey('VernacularStyle', related_name="items", verbose_name=_('vernacular style'))
-    generic_style         = WeakForeignKey('GenericStyle', related_name="items", verbose_name=_('generic style'))
+    vernacular_style      = ForeignKey('VernacularStyle', related_name="items", verbose_name=_('vernacular style'), blank=True, null=True, on_delete=models.SET_NULL)
+    generic_style         = ForeignKey('GenericStyle', related_name="items", verbose_name=_('generic style'), blank=True, null=True, on_delete=models.SET_NULL)
     author                = CharField(_('author / compositor'), help_text=_('First name, Last name ; First name, Last name'))
 
     # Legal mentions
-    organization          = WeakForeignKey('Organization', verbose_name=_('organization'))
+    organization          = ForeignKey('Organization', verbose_name=_('organization'), blank=True, null=True, on_delete=models.SET_NULL)
     depositor             = CharField(_('depositor'))
-    rights                = WeakForeignKey('Rights', verbose_name=_('rights'))
+    rights                = ForeignKey('Rights', verbose_name=_('rights'), blank=True, null=True, on_delete=models.SET_NULL)
 
     # Archiving data
     code                  = CharField(_('code'), unique=True, blank=True, required=True, help_text=_('CollectionCode_ItemCode'))
@@ -90,7 +90,7 @@ class MediaItem(MediaResource):
     comment               = TextField(_('remarks'))
 
     # Technical data
-    media_type            = WeakForeignKey('MediaType', related_name="items", verbose_name=_('media type'))
+    media_type            = ForeignKey('MediaType', related_name="items", verbose_name=_('media type'), blank=True, null=True, on_delete=models.SET_NULL)
     approx_duration       = DurationField(_('approximative duration'), blank=True, help_text=_('hh:mm:ss'))
     mimetype              = CharField(_('mime type'), max_length=255, blank=True)
     file                  = FileField(_('file'), upload_to='items/%Y/%m/%d', db_column="filename", max_length=1024)
@@ -102,7 +102,7 @@ class MediaItem(MediaResource):
     digitization_date     = DateField(_('digitization date'))
     publishing_date       = DateField(_('publishing date'))
     scientist             = CharField(_('scientist'), help_text=_('First name, Last name ; First name, Last name'))
-    topic                 = WeakForeignKey('Topic', verbose_name=_('topic'))
+    topic                 = ForeignKey('Topic', verbose_name=_('topic'), blank=True, null=True, on_delete=models.SET_NULL)
     summary               = TextField(_('summary'))
     contributor           = CharField(_('contributor'))
 
@@ -372,8 +372,8 @@ class MediaItemKeyword(ModelCore):
 class MediaItemPerformance(ModelCore):
     "Item performance"
     media_item      = ForeignKey('MediaItem', related_name="performances", verbose_name=_('item'))
-    instrument      = WeakForeignKey('Instrument', related_name="performances", verbose_name=_('composition'))
-    alias           = WeakForeignKey('InstrumentAlias', related_name="performances", verbose_name=_('vernacular name'))
+    instrument      = ForeignKey('Instrument', related_name="performances", verbose_name=_('composition'), blank=True, null=True, on_delete=models.SET_NULL)
+    alias           = ForeignKey('InstrumentAlias', related_name="performances", verbose_name=_('vernacular name'), blank=True, null=True, on_delete=models.SET_NULL)
     instruments_num = CharField(_('number'))
     musicians       = CharField(_('interprets'))
 
index e4119e314a7d4d37a78e5bf895884a5af0ac0f9f..b0593905bc0049944d1996445d5592350a732216 100644 (file)
@@ -163,7 +163,7 @@ class AdminView(object):
         from_record = enumeration.objects.get(id__exact=value_id)
         to_record = enumeration.objects.get(id__exact=to_value_id)
         links = [rel.get_accessor_name() for rel in from_record._meta.get_all_related_objects()]
-        field_type = WeakForeignKey
+        field_type = ForeignKey
 
         for link in links:
             objects = getattr(from_record, link).all()