feature/implementacion de gestor de informacion y archivos minIO
This commit is contained in:
@@ -1,3 +1,8 @@
|
||||
import atexit
|
||||
import tempfile
|
||||
|
||||
from api.utils.storage_service import storage_service
|
||||
from config import settings
|
||||
from rest_framework.pagination import PageNumberPagination
|
||||
from api.customs.models import Pedimento, TipoOperacion, Regimen
|
||||
from django.shortcuts import render
|
||||
@@ -112,18 +117,65 @@ class DataStageViewSet(LoggingMixin, viewsets.ModelViewSet, OrganizacionFiltrada
|
||||
def download_datastage(self, request, pk=None):
|
||||
"""
|
||||
Endpoint para descargar el archivo asociado a un DataStage.
|
||||
Soporta tanto archivos en MinIO como archivos locales antiguos.
|
||||
"""
|
||||
try:
|
||||
datastage = self.get_object()
|
||||
if not datastage.archivo:
|
||||
raise Http404("No hay archivo asociado a este DataStage.")
|
||||
file_path = datastage.archivo.path
|
||||
if not os.path.exists(file_path):
|
||||
raise Http404("El archivo no existe en el servidor.")
|
||||
response = FileResponse(open(file_path, 'rb'), as_attachment=True, filename=os.path.basename(file_path))
|
||||
return response
|
||||
|
||||
# Detectar si es ruta de MinIO o local
|
||||
is_minio_path = datastage.archivo.startswith('org_')
|
||||
|
||||
if is_minio_path:
|
||||
import tempfile
|
||||
|
||||
with tempfile.NamedTemporaryFile(delete=False) as tmp:
|
||||
tmp_path = tmp.name
|
||||
|
||||
success = storage_service.download_file(datastage.archivo, tmp_path)
|
||||
|
||||
if not success:
|
||||
raise Http404("No se pudo descargar el archivo de MinIO")
|
||||
|
||||
filename = os.path.basename(datastage.archivo)
|
||||
|
||||
response = FileResponse(
|
||||
open(tmp_path, 'rb'),
|
||||
as_attachment=True,
|
||||
filename=filename
|
||||
)
|
||||
|
||||
import atexit
|
||||
atexit.register(lambda: os.unlink(tmp_path) if os.path.exists(tmp_path) else None)
|
||||
|
||||
return response
|
||||
|
||||
else:
|
||||
file_path = os.path.join(settings.MEDIA_ROOT, str(datastage.archivo))
|
||||
|
||||
if not os.path.exists(file_path):
|
||||
raise Http404(f"El archivo no existe: {file_path}")
|
||||
|
||||
filename = os.path.basename(file_path)
|
||||
|
||||
response = FileResponse(
|
||||
open(file_path, 'rb'),
|
||||
as_attachment=True,
|
||||
filename=filename
|
||||
)
|
||||
return response
|
||||
|
||||
except Exception as e:
|
||||
return Response({'detail': str(e)}, status=404)
|
||||
|
||||
def perform_destroy(self, instance):
|
||||
"""
|
||||
Al eliminar un DataStage, también eliminar su archivo asociado.
|
||||
"""
|
||||
if instance.archivo:
|
||||
storage_service.delete_file(instance.archivo)
|
||||
instance.delete()
|
||||
|
||||
@action(detail=True, methods=['post'], url_path='procesar')
|
||||
def procesar(self, request, pk=None):
|
||||
|
||||
Reference in New Issue
Block a user