test
This commit is contained in:
@@ -2,21 +2,54 @@ from django.core.management.base import BaseCommand
|
|||||||
from django.db.models import Count
|
from django.db.models import Count
|
||||||
from api.customs.models import Pedimento, Cove, EDocument, Partida
|
from api.customs.models import Pedimento, Cove, EDocument, Partida
|
||||||
from api.record.models import Document
|
from api.record.models import Document
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
class Command(BaseCommand):
|
class Command(BaseCommand):
|
||||||
help = 'Elimina pedimentos duplicados dejando el que tiene más documentos, coves, edocs y partidas.'
|
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):
|
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 = (
|
duplicados = (
|
||||||
Pedimento.objects
|
base_query
|
||||||
.values('pedimento')
|
.values('pedimento', 'organizacion_id')
|
||||||
.annotate(total=Count('id'))
|
.annotate(total=Count('id'))
|
||||||
.filter(total__gt=1)
|
.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 = (
|
pedimentos = (
|
||||||
Pedimento.objects
|
Pedimento.objects
|
||||||
.filter(pedimento=dup['pedimento'])
|
.filter(
|
||||||
|
pedimento=dup['pedimento'],
|
||||||
|
organizacion_id=dup['organizacion_id']
|
||||||
|
)
|
||||||
.annotate(
|
.annotate(
|
||||||
num_docs=Count('documents'),
|
num_docs=Count('documents'),
|
||||||
num_coves=Count('coves'),
|
num_coves=Count('coves'),
|
||||||
@@ -25,13 +58,29 @@ class Command(BaseCommand):
|
|||||||
)
|
)
|
||||||
.order_by('-num_docs', '-num_coves', '-num_edocs', '-num_partidas')
|
.order_by('-num_docs', '-num_coves', '-num_edocs', '-num_partidas')
|
||||||
)
|
)
|
||||||
|
|
||||||
# Mantener el primero, eliminar los demás
|
# 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:
|
for ped in to_delete:
|
||||||
self.stdout.write(f'Eliminando pedimento {ped.id} ({ped.pedimento})')
|
self.stdout.write(f' Eliminando pedimento {ped.id} con {ped.num_docs} docs')
|
||||||
Cove.objects.filter(pedimento=ped).delete()
|
try:
|
||||||
EDocument.objects.filter(pedimento=ped).delete()
|
Cove.objects.filter(pedimento=ped).delete()
|
||||||
Partida.objects.filter(pedimento=ped).delete()
|
EDocument.objects.filter(pedimento=ped).delete()
|
||||||
Document.objects.filter(pedimento=ped).delete()
|
Partida.objects.filter(pedimento=ped).delete()
|
||||||
ped.delete()
|
Document.objects.filter(pedimento=ped).delete()
|
||||||
self.stdout.write(self.style.SUCCESS('Eliminación de duplicados completada.'))
|
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