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