se modifico auditor creador de partidas
This commit is contained in:
@@ -43,25 +43,25 @@ python manage.py cleanup_media_fast [opciones]
|
|||||||
### 1. Análisis Inicial (Siempre hacer primero)
|
### 1. Análisis Inicial (Siempre hacer primero)
|
||||||
```bash
|
```bash
|
||||||
# Escaneo rápido para obtener una estimación
|
# Escaneo rápido para obtener una estimación
|
||||||
docker exec -it EFC_backend_dev bash -c "cd /app && python manage.py cleanup_media_fast --quick-scan --dry-run --verbose"
|
docker exec -it backend bash -c "cd /app && python manage.py cleanup_media_fast --quick-scan --dry-run --verbose"
|
||||||
|
|
||||||
# O escaneo completo para números exactos (puede tomar tiempo)
|
# O escaneo completo para números exactos (puede tomar tiempo)
|
||||||
docker exec -it EFC_backend_dev bash -c "cd /app && python manage.py cleanup_media_fast --dry-run --verbose"
|
docker exec -it backend bash -c "cd /app && python manage.py cleanup_media_fast --dry-run --verbose"
|
||||||
```
|
```
|
||||||
|
|
||||||
### 2. Limpieza por Lotes (Recomendado para grandes volúmenes)
|
### 2. Limpieza por Lotes (Recomendado para grandes volúmenes)
|
||||||
```bash
|
```bash
|
||||||
# Limpiar muestra de 10,000 archivos
|
# Limpiar muestra de 10,000 archivos
|
||||||
docker exec -it EFC_backend_dev bash -c "cd /app && python manage.py cleanup_media_fast --quick-scan --verbose"
|
docker exec -it backend bash -c "cd /app && python manage.py cleanup_media_fast --quick-scan --verbose"
|
||||||
|
|
||||||
# Limpiar hasta 5,000 archivos específicos
|
# Limpiar hasta 5,000 archivos específicos
|
||||||
docker exec -it EFC_backend_dev bash -c "cd /app && python manage.py cleanup_media_fast --limit 5000 --verbose"
|
docker exec -it backend bash -c "cd /app && python manage.py cleanup_media_fast --limit 5000 --verbose"
|
||||||
```
|
```
|
||||||
|
|
||||||
### 3. Limpieza Completa
|
### 3. Limpieza Completa
|
||||||
```bash
|
```bash
|
||||||
# Eliminar todos los archivos huérfanos (CUIDADO: puede tomar mucho tiempo)
|
# Eliminar todos los archivos huérfanos (CUIDADO: puede tomar mucho tiempo)
|
||||||
docker exec -it EFC_backend_dev bash -c "cd /app && python manage.py cleanup_media_fast --verbose"
|
docker exec -it backend bash -c "cd /app && python manage.py cleanup_media_fast --verbose"
|
||||||
```
|
```
|
||||||
|
|
||||||
## Ejemplos de Salida
|
## Ejemplos de Salida
|
||||||
@@ -96,28 +96,28 @@ Eliminados 2763 archivos huérfanos (51.32 MB)
|
|||||||
### Caso 1: Primera vez ejecutando el comando
|
### Caso 1: Primera vez ejecutando el comando
|
||||||
```bash
|
```bash
|
||||||
# 1. Hacer análisis inicial
|
# 1. Hacer análisis inicial
|
||||||
docker exec -it EFC_backend_dev bash -c "cd /app && python manage.py cleanup_media_fast --quick-scan --dry-run"
|
docker exec -it backend bash -c "cd /app && python manage.py cleanup_media_fast --quick-scan --dry-run"
|
||||||
|
|
||||||
# 2. Si hay pocos archivos (<5000), eliminar todos
|
# 2. Si hay pocos archivos (<5000), eliminar todos
|
||||||
docker exec -it EFC_backend_dev bash -c "cd /app && python manage.py cleanup_media_fast --quick-scan"
|
docker exec -it backend bash -c "cd /app && python manage.py cleanup_media_fast --quick-scan"
|
||||||
|
|
||||||
# 3. Si hay muchos archivos, eliminar por lotes
|
# 3. Si hay muchos archivos, eliminar por lotes
|
||||||
docker exec -it EFC_backend_dev bash -c "cd /app && python manage.py cleanup_media_fast --limit 10000"
|
docker exec -it backend bash -c "cd /app && python manage.py cleanup_media_fast --limit 10000"
|
||||||
```
|
```
|
||||||
|
|
||||||
### Caso 2: Mantenimiento regular
|
### Caso 2: Mantenimiento regular
|
||||||
```bash
|
```bash
|
||||||
# Escaneo rápido y limpieza
|
# Escaneo rápido y limpieza
|
||||||
docker exec -it EFC_backend_dev bash -c "cd /app && python manage.py cleanup_media_fast --quick-scan"
|
docker exec -it backend bash -c "cd /app && python manage.py cleanup_media_fast --quick-scan"
|
||||||
```
|
```
|
||||||
|
|
||||||
### Caso 3: Limpieza masiva después de migración de datos
|
### Caso 3: Limpieza masiva después de migración de datos
|
||||||
```bash
|
```bash
|
||||||
# 1. Análisis completo primero
|
# 1. Análisis completo primero
|
||||||
docker exec -it EFC_backend_dev bash -c "cd /app && python manage.py cleanup_media_fast --dry-run"
|
docker exec -it backend bash -c "cd /app && python manage.py cleanup_media_fast --dry-run"
|
||||||
|
|
||||||
# 2. Limpieza por lotes grandes
|
# 2. Limpieza por lotes grandes
|
||||||
docker exec -it EFC_backend_dev bash -c "cd /app && python manage.py cleanup_media_fast --limit 50000"
|
docker exec -it backend bash -c "cd /app && python manage.py cleanup_media_fast --limit 50000"
|
||||||
```
|
```
|
||||||
|
|
||||||
## Consideraciones de Seguridad
|
## Consideraciones de Seguridad
|
||||||
@@ -126,10 +126,10 @@ docker exec -it EFC_backend_dev bash -c "cd /app && python manage.py cleanup_med
|
|||||||
Siempre haz un backup de tu directorio `/media/` antes de ejecutar eliminaciones masivas:
|
Siempre haz un backup de tu directorio `/media/` antes de ejecutar eliminaciones masivas:
|
||||||
```bash
|
```bash
|
||||||
# Backup del directorio media
|
# Backup del directorio media
|
||||||
docker exec EFC_backend_dev tar -czf /tmp/media_backup.tar.gz /app/media/
|
docker exec backend tar -czf /tmp/media_backup.tar.gz /app/media/
|
||||||
|
|
||||||
# Copiar backup al host
|
# Copiar backup al host
|
||||||
docker cp EFC_backend_dev:/tmp/media_backup.tar.gz ./media_backup_$(date +%Y%m%d_%H%M%S).tar.gz
|
docker cp backend:/tmp/media_backup.tar.gz ./media_backup_$(date +%Y%m%d_%H%M%S).tar.gz
|
||||||
```
|
```
|
||||||
|
|
||||||
### ✅ Buenas Prácticas
|
### ✅ Buenas Prácticas
|
||||||
@@ -149,19 +149,19 @@ docker cp EFC_backend_dev:/tmp/media_backup.tar.gz ./media_backup_$(date +%Y%m%d
|
|||||||
### Error: "Too many open files"
|
### Error: "Too many open files"
|
||||||
```bash
|
```bash
|
||||||
# Aumentar límite de archivos abiertos
|
# Aumentar límite de archivos abiertos
|
||||||
docker exec -it EFC_backend_dev bash -c "ulimit -n 65536 && cd /app && python manage.py cleanup_media_fast --quick-scan"
|
docker exec -it backend bash -c "ulimit -n 65536 && cd /app && python manage.py cleanup_media_fast --quick-scan"
|
||||||
```
|
```
|
||||||
|
|
||||||
### Proceso muy lento
|
### Proceso muy lento
|
||||||
```bash
|
```bash
|
||||||
# Usar modo quick-scan en lugar de escaneo completo
|
# Usar modo quick-scan en lugar de escaneo completo
|
||||||
docker exec -it EFC_backend_dev bash -c "cd /app && python manage.py cleanup_media_fast --quick-scan --dry-run"
|
docker exec -it backend bash -c "cd /app && python manage.py cleanup_media_fast --quick-scan --dry-run"
|
||||||
```
|
```
|
||||||
|
|
||||||
### Verificar que el comando existe
|
### Verificar que el comando existe
|
||||||
```bash
|
```bash
|
||||||
# Listar comandos disponibles
|
# Listar comandos disponibles
|
||||||
docker exec -it EFC_backend_dev bash -c "cd /app && python manage.py help"
|
docker exec -it backend bash -c "cd /app && python manage.py help"
|
||||||
```
|
```
|
||||||
|
|
||||||
## Automatización
|
## Automatización
|
||||||
@@ -169,7 +169,7 @@ docker exec -it EFC_backend_dev bash -c "cd /app && python manage.py help"
|
|||||||
Para automatizar la limpieza regular, puedes crear un cron job:
|
Para automatizar la limpieza regular, puedes crear un cron job:
|
||||||
```bash
|
```bash
|
||||||
# Ejecutar limpieza semanal los domingos a las 2 AM
|
# Ejecutar limpieza semanal los domingos a las 2 AM
|
||||||
0 2 * * 0 docker exec EFC_backend_dev bash -c "cd /app && python manage.py cleanup_media_fast --quick-scan" >> /var/log/media_cleanup.log 2>&1
|
0 2 * * 0 docker exec backend bash -c "cd /app && python manage.py cleanup_media_fast --quick-scan" >> /var/log/media_cleanup.log 2>&1
|
||||||
```
|
```
|
||||||
|
|
||||||
## Monitoreo
|
## Monitoreo
|
||||||
@@ -177,8 +177,8 @@ Para automatizar la limpieza regular, puedes crear un cron job:
|
|||||||
Para monitorear el efecto de la limpieza:
|
Para monitorear el efecto de la limpieza:
|
||||||
```bash
|
```bash
|
||||||
# Antes de limpiar
|
# Antes de limpiar
|
||||||
docker exec EFC_backend_dev du -sh /app/media/
|
docker exec backend du -sh /app/media/
|
||||||
|
|
||||||
# Después de limpiar (verificar el cambio)
|
# Después de limpiar (verificar el cambio)
|
||||||
docker exec EFC_backend_dev du -sh /app/media/
|
docker exec backend du -sh /app/media/
|
||||||
```
|
```
|
||||||
@@ -44,6 +44,8 @@ def auditar_procesamiento_remesas(organizacion_id):
|
|||||||
def auditar_partidas(organizacion_id):
|
def auditar_partidas(organizacion_id):
|
||||||
pedimentos = Pedimento.objects.filter(organizacion_id=organizacion_id)
|
pedimentos = Pedimento.objects.filter(organizacion_id=organizacion_id)
|
||||||
for pedimento in pedimentos:
|
for pedimento in pedimentos:
|
||||||
|
# Validar que numero_partidas no sea None y sea mayor que 0
|
||||||
|
if pedimento.numero_partidas is not None and pedimento.numero_partidas > 0:
|
||||||
partidas_descargadas = pedimento.documents.filter(document_type=1)
|
partidas_descargadas = pedimento.documents.filter(document_type=1)
|
||||||
|
|
||||||
partidas = {str(documento.archivo).split('_')[-1].split('.')[0]: documento.archivo for documento in partidas_descargadas}
|
partidas = {str(documento.archivo).split('_')[-1].split('.')[0]: documento.archivo for documento in partidas_descargadas}
|
||||||
@@ -87,30 +89,73 @@ def auditar_acuse_edocuments(organizacion_id):
|
|||||||
@shared_task
|
@shared_task
|
||||||
def crear_partidas(organizacion_id):
|
def crear_partidas(organizacion_id):
|
||||||
pedimentos = obtener_pedimentos(organizacion_id)
|
pedimentos = obtener_pedimentos(organizacion_id)
|
||||||
|
total_pedimentos = pedimentos.count()
|
||||||
|
pedimentos_procesados = 0
|
||||||
|
total_partidas_agregadas = 0
|
||||||
|
|
||||||
|
print(f"Iniciando procesamiento de {total_pedimentos} pedimentos para organización {organizacion_id}")
|
||||||
|
|
||||||
for pedimento in pedimentos:
|
for pedimento in pedimentos:
|
||||||
|
pedimentos_procesados += 1
|
||||||
|
partidas_agregadas_pedimento = 0
|
||||||
|
|
||||||
|
# Validar que numero_partidas no sea None y sea mayor que 0
|
||||||
|
if pedimento.numero_partidas is not None and pedimento.numero_partidas > 0:
|
||||||
|
partidas_existentes = pedimento.partidas.count()
|
||||||
|
if pedimento.numero_partidas > partidas_existentes:
|
||||||
|
print(f"Procesando pedimento {pedimento.id} ({pedimentos_procesados}/{total_pedimentos}) - Partidas existentes: {partidas_existentes}, Requeridas: {pedimento.numero_partidas}")
|
||||||
|
|
||||||
if pedimento.numero_partidas > pedimento.partidas.count():
|
|
||||||
for i in range(1, pedimento.numero_partidas + 1):
|
for i in range(1, pedimento.numero_partidas + 1):
|
||||||
from api.customs.models import Partida
|
from api.customs.models import Partida
|
||||||
Partida.objects.get_or_create(
|
partida, created = Partida.objects.get_or_create(
|
||||||
pedimento=pedimento,
|
pedimento=pedimento,
|
||||||
numero_partida=i,
|
numero_partida=i,
|
||||||
organizacion_id=organizacion_id
|
organizacion_id=organizacion_id
|
||||||
)
|
)
|
||||||
|
if created:
|
||||||
|
partidas_agregadas_pedimento += 1
|
||||||
|
total_partidas_agregadas += 1
|
||||||
|
|
||||||
|
print(f" → Partidas agregadas para pedimento {pedimento.id}: {partidas_agregadas_pedimento}")
|
||||||
|
else:
|
||||||
|
print(f"Pedimento {pedimento.id} ya tiene todas sus partidas ({partidas_existentes}/{pedimento.numero_partidas})")
|
||||||
|
else:
|
||||||
|
print(f"Pedimento {pedimento.id} omitido - numero_partidas: {pedimento.numero_partidas} (inválido)")
|
||||||
|
|
||||||
|
print(f"\n=== RESUMEN ===")
|
||||||
|
print(f"Pedimentos procesados: {pedimentos_procesados}")
|
||||||
|
print(f"Total de partidas agregadas: {total_partidas_agregadas}")
|
||||||
|
print(f"Procesamiento completado para organización {organizacion_id}")
|
||||||
|
|
||||||
@shared_task
|
@shared_task
|
||||||
def crear_partidas_por_pedimento(pedimento_id):
|
def crear_partidas_por_pedimento(pedimento_id):
|
||||||
try:
|
try:
|
||||||
pedimento = Pedimento.objects.get(id=pedimento_id)
|
pedimento = Pedimento.objects.get(id=pedimento_id)
|
||||||
except Pedimento.DoesNotExist:
|
except Pedimento.DoesNotExist:
|
||||||
|
print(f"Error: Pedimento con ID {pedimento_id} no encontrado")
|
||||||
return
|
return
|
||||||
|
|
||||||
if pedimento.numero_partidas > pedimento.partidas.count():
|
print(f"Procesando pedimento individual {pedimento_id}...")
|
||||||
|
partidas_agregadas = 0
|
||||||
|
|
||||||
|
# Validar que numero_partidas no sea None y sea mayor que 0
|
||||||
|
if pedimento.numero_partidas is not None and pedimento.numero_partidas > 0:
|
||||||
|
partidas_existentes = pedimento.partidas.count()
|
||||||
|
if pedimento.numero_partidas > partidas_existentes:
|
||||||
|
print(f"Pedimento {pedimento_id} - Partidas existentes: {partidas_existentes}, Requeridas: {pedimento.numero_partidas}")
|
||||||
|
|
||||||
for i in range(1, pedimento.numero_partidas + 1):
|
for i in range(1, pedimento.numero_partidas + 1):
|
||||||
from api.customs.models import Partida
|
from api.customs.models import Partida
|
||||||
Partida.objects.get_or_create(
|
partida, created = Partida.objects.get_or_create(
|
||||||
pedimento=pedimento,
|
pedimento=pedimento,
|
||||||
numero_partida=i,
|
numero_partida=i,
|
||||||
organizacion_id=pedimento.organizacion_id
|
organizacion_id=pedimento.organizacion_id
|
||||||
)
|
)
|
||||||
|
if created:
|
||||||
|
partidas_agregadas += 1
|
||||||
|
|
||||||
|
print(f"✓ Partidas agregadas para pedimento {pedimento_id}: {partidas_agregadas}")
|
||||||
|
else:
|
||||||
|
print(f"Pedimento {pedimento_id} ya tiene todas sus partidas ({partidas_existentes}/{pedimento.numero_partidas})")
|
||||||
|
else:
|
||||||
|
print(f"Error: Pedimento {pedimento_id} tiene numero_partidas inválido: {pedimento.numero_partidas}")
|
||||||
Reference in New Issue
Block a user