From: Thomas Fillon Date: Tue, 18 Jul 2017 13:03:45 +0000 (+0200) Subject: Remove WeakForeignKey X-Git-Tag: 1.7.0~2^2~21^2^2~5^2~4 X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=cc857f647c2dadfd5995c280366f3c8b4d4ee88b;p=telemeta.git Remove WeakForeignKey Fix #185 --- diff --git a/telemeta/migrations/0003_auto_20170718_1502.py b/telemeta/migrations/0003_auto_20170718_1502.py new file mode 100644 index 00000000..d75ac786 --- /dev/null +++ b/telemeta/migrations/0003_auto_20170718_1502.py @@ -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'), + ), + ] diff --git a/telemeta/models/collection.py b/telemeta/models/collection.py index 60a6eb55..0adbceb2 100644 --- a/telemeta/models/collection.py +++ b/telemeta/models/collection.py @@ -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)')) diff --git a/telemeta/models/core.py b/telemeta/models/core.py index d0612797..8ac633a6 100644 --- a/telemeta/models/core.py +++ b/telemeta/models/core.py @@ -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): diff --git a/telemeta/models/identifier.py b/telemeta/models/identifier.py index ca8ac927..f614d8d9 100644 --- a/telemeta/models/identifier.py +++ b/telemeta/models/identifier.py @@ -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')) diff --git a/telemeta/models/item.py b/telemeta/models/item.py index 103d36c4..41c96e48 100644 --- a/telemeta/models/item.py +++ b/telemeta/models/item.py @@ -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')) diff --git a/telemeta/views/admin.py b/telemeta/views/admin.py index e4119e31..b0593905 100644 --- a/telemeta/views/admin.py +++ b/telemeta/views/admin.py @@ -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()