45 lines
1.3 KiB
Python
45 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)]
|