funkwhale/api/funkwhale_api/music/migrations/0005_deduplicate.py

45 wiersze
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)]