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