41 lines
1.3 KiB
Python
41 lines
1.3 KiB
Python
# -*- coding: utf-8 -*-
|
|
from __future__ import unicode_literals
|
|
|
|
from django.db import migrations, models
|
|
|
|
|
|
def get_duplicates(model):
|
|
return [i['mbid'] for i in model.objects.values('mbid').annotate(idcount=models.Count('mbid')).order_by('-idcount') if i['idcount'] > 1]
|
|
|
|
def deduplicate(apps, schema_editor):
|
|
Artist = apps.get_model("music", "Artist")
|
|
Album = apps.get_model("music", "Album")
|
|
Track = apps.get_model("music", "Track")
|
|
|
|
for mbid in get_duplicates(Artist):
|
|
ref = Artist.objects.filter(mbid=mbid).order_by('pk').first()
|
|
duplicates = Artist.objects.filter(mbid=mbid).exclude(pk=ref.pk)
|
|
Album.objects.filter(artist__in=duplicates).update(artist=ref)
|
|
Track.objects.filter(artist__in=duplicates).update(artist=ref)
|
|
duplicates.delete()
|
|
|
|
for mbid in get_duplicates(Album):
|
|
ref = Album.objects.filter(mbid=mbid).order_by('pk').first()
|
|
duplicates = Album.objects.filter(mbid=mbid).exclude(pk=ref.pk)
|
|
Track.objects.filter(album__in=duplicates).update(album=ref)
|
|
duplicates.delete()
|
|
|
|
def rewind(*args, **kwargs):
|
|
pass
|
|
|
|
|
|
class Migration(migrations.Migration):
|
|
|
|
dependencies = [
|
|
('music', '0004_track_tags'),
|
|
]
|
|
|
|
operations = [
|
|
migrations.RunPython(deduplicate, rewind),
|
|
]
|