38 lines
1.6 KiB
Python
38 lines
1.6 KiB
Python
from django.core.management.base import BaseCommand
|
|
from django.db.models import Count
|
|
from api.customs.models import Pedimento, Cove, EDocument, Partida
|
|
from api.record.models import Document
|
|
|
|
class Command(BaseCommand):
|
|
help = 'Elimina pedimentos duplicados dejando el que tiene más documentos, coves, edocs y partidas.'
|
|
|
|
def handle(self, *args, **options):
|
|
duplicados = (
|
|
Pedimento.objects
|
|
.values('pedimento_app')
|
|
.annotate(total=Count('id'))
|
|
.filter(total__gt=1)
|
|
)
|
|
for dup in duplicados:
|
|
pedimentos = (
|
|
Pedimento.objects
|
|
.filter(pedimento_app=dup['pedimento_app'])
|
|
.annotate(
|
|
num_docs=Count('documents'),
|
|
num_coves=Count('coves'),
|
|
num_edocs=Count('documentos'),
|
|
num_partidas=Count('partidas')
|
|
)
|
|
.order_by('-num_docs', '-num_coves', '-num_edocs', '-num_partidas')
|
|
)
|
|
# Mantener el primero, eliminar los demás
|
|
to_delete = pedimentos[1:]
|
|
for ped in to_delete:
|
|
self.stdout.write(f'Eliminando pedimento {ped.id} ({ped.pedimento_app})')
|
|
Cove.objects.filter(pedimento=ped).delete()
|
|
EDocument.objects.filter(pedimento=ped).delete()
|
|
Partida.objects.filter(pedimento=ped).delete()
|
|
Document.objects.filter(pedimento=ped).delete()
|
|
ped.delete()
|
|
self.stdout.write(self.style.SUCCESS('Eliminación de duplicados completada.'))
|