feature/implementacion de gestor de informacion y archivos minIO
This commit is contained in:
@@ -1,3 +1,6 @@
|
||||
import tempfile
|
||||
|
||||
from api.utils.storage_service import storage_service
|
||||
from celery import shared_task
|
||||
from api.organization.models import Organizacion
|
||||
from django.core.files.base import ContentFile
|
||||
@@ -10,6 +13,7 @@ from api.record.models import Document
|
||||
import csv
|
||||
import os
|
||||
from django.conf import settings
|
||||
from django.core.files.uploadedfile import SimpleUploadedFile
|
||||
|
||||
@shared_task
|
||||
def generate_report_document(report_id):
|
||||
@@ -46,15 +50,19 @@ def generate_report_document(report_id):
|
||||
filename = f"{filename}.csv" if not filename.endswith('.csv') else filename
|
||||
else:
|
||||
filename = f"report_{report.id}_{timezone.now().strftime('%Y%m%d%H%M%S')}.csv"
|
||||
file_path = os.path.join(settings.MEDIA_ROOT, 'reports', filename)
|
||||
os.makedirs(os.path.dirname(file_path), exist_ok=True)
|
||||
with open(file_path, 'w', newline='', encoding='utf-8') as f:
|
||||
|
||||
with tempfile.NamedTemporaryFile(mode='w', delete=False, suffix='.csv', encoding='utf-8', newline='') as f:
|
||||
tmp_path = f.name
|
||||
|
||||
# Escribir CSV en archivo temporal
|
||||
with open(tmp_path, 'w', newline='', encoding='utf-8') as f:
|
||||
writer = csv.writer(f)
|
||||
headers = [
|
||||
'aduana', 'patente', 'regimen', 'pedimento', 'pedimento_app', 'clave_pedimento',
|
||||
'tipo_operacion_id', 'contribuyente_id', 'tipo_documento', 'numero_documento', 'estado', 'acuse_estado'
|
||||
]
|
||||
writer.writerow(headers)
|
||||
|
||||
for ped in pedimentos:
|
||||
for cove in Cove.objects.filter(pedimento=ped):
|
||||
writer.writerow([
|
||||
@@ -74,12 +82,43 @@ def generate_report_document(report_id):
|
||||
ped.clave_pedimento, ped.tipo_operacion_id, ped.contribuyente_id,
|
||||
'PARTIDA', partida.numero_partida, partida.descargado, ''
|
||||
])
|
||||
# Guardar el archivo en el modelo
|
||||
with open(file_path, 'rb') as f:
|
||||
report.file.save(filename, ContentFile(f.read()), save=True)
|
||||
report.status = 'ready'
|
||||
|
||||
# ============ NUEVO: Guardar en MinIO ============
|
||||
# Leer archivo temporal
|
||||
with open(tmp_path, 'rb') as f:
|
||||
file_content = f.read()
|
||||
|
||||
# Crear UploadedFile
|
||||
uploaded_file = SimpleUploadedFile(
|
||||
name=filename,
|
||||
content=file_content,
|
||||
content_type='text/csv'
|
||||
)
|
||||
|
||||
# Guardar en storage
|
||||
ruta = storage_service.save_report(
|
||||
file=uploaded_file,
|
||||
organizacion_id=filters.get('organizacion_id'),
|
||||
metadata={
|
||||
'report_id': str(report.id),
|
||||
'report_type': 'cumplimiento',
|
||||
'user_id': str(report.user.id) if report.user else None
|
||||
}
|
||||
)
|
||||
|
||||
if ruta:
|
||||
report.file = ruta
|
||||
report.status = 'ready'
|
||||
else:
|
||||
report.status = 'error'
|
||||
report.error_message = 'Error al guardar el archivo en storage'
|
||||
|
||||
# Limpiar temporal
|
||||
os.unlink(tmp_path)
|
||||
|
||||
report.finished_at = timezone.now()
|
||||
report.save(update_fields=['status', 'file', 'finished_at'])
|
||||
report.save(update_fields=['status', 'file', 'finished_at', 'error_message'])
|
||||
|
||||
except Exception as e:
|
||||
report.status = 'error'
|
||||
report.error_message = str(e)
|
||||
|
||||
Reference in New Issue
Block a user