
from django.db import migrations


class Migration(migrations.Migration):

    dependencies = [
        ("product", "0122_auto_20200828_1135"),
    ]

    operations = [
        migrations.AlterUniqueTogether(
            name="variantimage", unique_together={("variant", "image")},
        ),
    ]


from django.db import migrations
from django.db.models import Count


def remove_variant_image_duplicates(apps, schema_editor):
    ProductImage = apps.get_model("product", "ProductImage")
    VariantImage = apps.get_model("product", "VariantImage")

    duplicated_images = (
        ProductImage.objects.values("pk", "variant_images__variant")
        .annotate(variant_count=Count("variant_images__variant"))
        .filter(variant_count__gte=2)
    )

    variant_image_ids_to_remove = []
    for image_data in duplicated_images:
        ids = VariantImage.objects.filter(
            variant=image_data["variant_images__variant"], image__pk=image_data["pk"],
        )[1:].values_list("pk", flat=True)
        variant_image_ids_to_remove += ids

    VariantImage.objects.filter(pk__in=variant_image_ids_to_remove).delete()


class Migration(migrations.Migration):

    dependencies = [
        ("product", "0122_auto_20200828_1135"),
    ]

    operations = [
        migrations.RunPython(
            remove_variant_image_duplicates, migrations.RunPython.noop
        ),
        migrations.AlterUniqueTogether(
            name="variantimage", unique_together={("variant", "image")},
        ),
    ]

Drop duplicated VariantImages before migration to unique together
Drop duplicated VariantImages before migration to unique together

  
  from django.db import migrations
+ from django.db.models import Count
+ 
+ 
+ def remove_variant_image_duplicates(apps, schema_editor):
+     ProductImage = apps.get_model("product", "ProductImage")
+     VariantImage = apps.get_model("product", "VariantImage")
+ 
+     duplicated_images = (
+         ProductImage.objects.values("pk", "variant_images__variant")
+         .annotate(variant_count=Count("variant_images__variant"))
+         .filter(variant_count__gte=2)
+     )
+ 
+     variant_image_ids_to_remove = []
+     for image_data in duplicated_images:
+         ids = VariantImage.objects.filter(
+             variant=image_data["variant_images__variant"], image__pk=image_data["pk"],
+         )[1:].values_list("pk", flat=True)
+         variant_image_ids_to_remove += ids
+ 
+     VariantImage.objects.filter(pk__in=variant_image_ids_to_remove).delete()
  
  
  class Migration(migrations.Migration):
  
      dependencies = [
          ("product", "0122_auto_20200828_1135"),
      ]
  
      operations = [
+         migrations.RunPython(
+             remove_variant_image_duplicates, migrations.RunPython.noop
+         ),
          migrations.AlterUniqueTogether(
              name="variantimage", unique_together={("variant", "image")},
          ),
      ]
  
Drop duplicated VariantImages before migration to unique together
## Code Before:

from django.db import migrations


class Migration(migrations.Migration):

    dependencies = [
        ("product", "0122_auto_20200828_1135"),
    ]

    operations = [
        migrations.AlterUniqueTogether(
            name="variantimage", unique_together={("variant", "image")},
        ),
    ]

## Instruction:
Drop duplicated VariantImages before migration to unique together
## Code After:

from django.db import migrations
from django.db.models import Count


def remove_variant_image_duplicates(apps, schema_editor):
    ProductImage = apps.get_model("product", "ProductImage")
    VariantImage = apps.get_model("product", "VariantImage")

    duplicated_images = (
        ProductImage.objects.values("pk", "variant_images__variant")
        .annotate(variant_count=Count("variant_images__variant"))
        .filter(variant_count__gte=2)
    )

    variant_image_ids_to_remove = []
    for image_data in duplicated_images:
        ids = VariantImage.objects.filter(
            variant=image_data["variant_images__variant"], image__pk=image_data["pk"],
        )[1:].values_list("pk", flat=True)
        variant_image_ids_to_remove += ids

    VariantImage.objects.filter(pk__in=variant_image_ids_to_remove).delete()


class Migration(migrations.Migration):

    dependencies = [
        ("product", "0122_auto_20200828_1135"),
    ]

    operations = [
        migrations.RunPython(
            remove_variant_image_duplicates, migrations.RunPython.noop
        ),
        migrations.AlterUniqueTogether(
            name="variantimage", unique_together={("variant", "image")},
        ),
    ]
