test
This commit is contained in:
@@ -2,21 +2,54 @@ 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
|
||||
from datetime import datetime
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = 'Elimina pedimentos duplicados dejando el que tiene más documentos, coves, edocs y partidas.'
|
||||
|
||||
def add_arguments(self, parser):
|
||||
parser.add_argument(
|
||||
'--organizacion',
|
||||
help='ID de la organización para procesar (opcional)',
|
||||
)
|
||||
parser.add_argument(
|
||||
'--batch-size',
|
||||
type=int,
|
||||
default=100,
|
||||
help='Número de pedimentos a procesar por lote (default: 100)',
|
||||
)
|
||||
|
||||
def handle(self, *args, **options):
|
||||
start_time = datetime.now()
|
||||
batch_size = options['batch_size']
|
||||
|
||||
# Base query
|
||||
base_query = Pedimento.objects
|
||||
if options['organizacion']:
|
||||
base_query = base_query.filter(organizacion_id=options['organizacion'])
|
||||
self.stdout.write(f'Procesando solo organización: {options["organizacion"]}')
|
||||
|
||||
# Obtener duplicados
|
||||
duplicados = (
|
||||
Pedimento.objects
|
||||
.values('pedimento')
|
||||
base_query
|
||||
.values('pedimento', 'organizacion_id')
|
||||
.annotate(total=Count('id'))
|
||||
.filter(total__gt=1)
|
||||
)
|
||||
for dup in duplicados:
|
||||
|
||||
total_duplicados = duplicados.count()
|
||||
self.stdout.write(f'Encontrados {total_duplicados} grupos de pedimentos duplicados')
|
||||
|
||||
procesados = 0
|
||||
for dup in duplicados.iterator():
|
||||
self.stdout.write(f'Procesando grupo {procesados + 1}/{total_duplicados} - Pedimento: {dup["pedimento"]} - Org: {dup["organizacion_id"]}')
|
||||
|
||||
pedimentos = (
|
||||
Pedimento.objects
|
||||
.filter(pedimento=dup['pedimento'])
|
||||
.filter(
|
||||
pedimento=dup['pedimento'],
|
||||
organizacion_id=dup['organizacion_id']
|
||||
)
|
||||
.annotate(
|
||||
num_docs=Count('documents'),
|
||||
num_coves=Count('coves'),
|
||||
@@ -25,13 +58,29 @@ class Command(BaseCommand):
|
||||
)
|
||||
.order_by('-num_docs', '-num_coves', '-num_edocs', '-num_partidas')
|
||||
)
|
||||
|
||||
# Mantener el primero, eliminar los demás
|
||||
to_delete = pedimentos[1:]
|
||||
to_keep = pedimentos.first()
|
||||
to_delete = pedimentos.exclude(id=to_keep.id)
|
||||
|
||||
self.stdout.write(f' Manteniendo pedimento {to_keep.id} con {to_keep.num_docs} docs')
|
||||
|
||||
for ped in to_delete:
|
||||
self.stdout.write(f'Eliminando pedimento {ped.id} ({ped.pedimento})')
|
||||
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.'))
|
||||
self.stdout.write(f' Eliminando pedimento {ped.id} con {ped.num_docs} docs')
|
||||
try:
|
||||
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()
|
||||
except Exception as e:
|
||||
self.stdout.write(self.style.ERROR(f'Error eliminando pedimento {ped.id}: {str(e)}'))
|
||||
|
||||
procesados += 1
|
||||
if procesados % batch_size == 0:
|
||||
self.stdout.write(f'Procesados {procesados}/{total_duplicados} grupos')
|
||||
|
||||
tiempo_total = datetime.now() - start_time
|
||||
self.stdout.write(self.style.SUCCESS(
|
||||
f'Eliminación completada. Procesados {procesados} grupos en {tiempo_total}'
|
||||
))
|
||||
Reference in New Issue
Block a user