fix/T2025-09-007 corregir documentos duplicados
This commit is contained in:
@@ -273,6 +273,9 @@ class DocumentViewSet(viewsets.ModelViewSet, DocumentosFiltradosMixin):
|
||||
if ruta:
|
||||
documento.archivo = ruta
|
||||
documento.save()
|
||||
# si no agrego esto, el proceso no retorna todos los campos necesarios como id, si lo agrega a minIO pero no
|
||||
# actualiza su status.
|
||||
serializer.instance = documento
|
||||
else:
|
||||
documento.delete()
|
||||
raise ValidationError({"archivo": "Error al guardar el archivo"})
|
||||
@@ -1320,10 +1323,16 @@ class DocumentViewSet(viewsets.ModelViewSet, DocumentosFiltradosMixin):
|
||||
},
|
||||
"codigo": "bulk_storage_limit_exceeded"
|
||||
}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
|
||||
# Cargar documentos existentes del pedimento para detectar y reemplazar duplicados
|
||||
existing_docs = list(Document.objects.filter(
|
||||
pedimento_id=pedimento_id,
|
||||
organizacion=organizacion
|
||||
))
|
||||
|
||||
# Procesar cada archivo
|
||||
espacio_usado_temp = espacio_inicial
|
||||
|
||||
|
||||
for file in files:
|
||||
try:
|
||||
# Validaciones por archivo
|
||||
@@ -1331,37 +1340,67 @@ class DocumentViewSet(viewsets.ModelViewSet, DocumentosFiltradosMixin):
|
||||
failed_files.append("archivo_sin_nombre")
|
||||
errors.append("Archivo sin nombre detectado")
|
||||
continue
|
||||
|
||||
|
||||
# Obtener extensión del archivo
|
||||
extension = file.name.split('.')[-1].lower() if '.' in file.name else ''
|
||||
|
||||
# Crear el documento
|
||||
document = Document.objects.create(
|
||||
organizacion=organizacion,
|
||||
pedimento_id=pedimento_id,
|
||||
document_type=document_type,
|
||||
size=file.size,
|
||||
extension=extension
|
||||
)
|
||||
|
||||
ruta = storage_service.save_document(
|
||||
file=file,
|
||||
organizacion_id=organizacion.id,
|
||||
pedimento_app=pedimento.pedimento_app,
|
||||
metadata={'source': 'bulk_upload'}
|
||||
)
|
||||
# Detectar si ya existe un documento con el mismo nombre base + extensión.
|
||||
# storage_service agrega un sufijo UUID de 8 chars al guardar, hay que ignorarlo.
|
||||
new_name_base = re.sub(r'_[a-zA-Z0-9]{8}$', '', os.path.splitext(file.name)[0]).lower().strip('_')
|
||||
existing_doc = None
|
||||
for doc in existing_docs:
|
||||
if doc.archivo:
|
||||
doc_basename = os.path.basename(doc.archivo.name)
|
||||
doc_base = re.sub(r'_[a-zA-Z0-9]{8}$', '', os.path.splitext(doc_basename)[0]).lower().strip('_')
|
||||
doc_ext = (doc.extension or '').lower()
|
||||
if new_name_base == doc_base and extension == doc_ext:
|
||||
existing_doc = doc
|
||||
break
|
||||
|
||||
if ruta:
|
||||
document.archivo = ruta
|
||||
document.save()
|
||||
if existing_doc:
|
||||
# Reemplazar archivo del documento existente
|
||||
if existing_doc.archivo:
|
||||
storage_service.delete_file(existing_doc.archivo.name)
|
||||
ruta = storage_service.save_document(
|
||||
file=file,
|
||||
organizacion_id=organizacion.id,
|
||||
pedimento_app=pedimento.pedimento_app,
|
||||
metadata={'source': 'bulk_upload_replace'}
|
||||
)
|
||||
if ruta:
|
||||
existing_doc.archivo = ruta
|
||||
existing_doc.size = file.size
|
||||
existing_doc.extension = extension
|
||||
existing_doc.save()
|
||||
else:
|
||||
raise Exception(f"Error al guardar archivo: {file.name}")
|
||||
document = existing_doc
|
||||
else:
|
||||
document.delete()
|
||||
raise Exception(f"Error al guardar archivo: {file.name}")
|
||||
|
||||
# Crear nuevo documento
|
||||
document = Document.objects.create(
|
||||
organizacion=organizacion,
|
||||
pedimento_id=pedimento_id,
|
||||
document_type=document_type,
|
||||
size=file.size,
|
||||
extension=extension
|
||||
)
|
||||
ruta = storage_service.save_document(
|
||||
file=file,
|
||||
organizacion_id=organizacion.id,
|
||||
pedimento_app=pedimento.pedimento_app,
|
||||
metadata={'source': 'bulk_upload'}
|
||||
)
|
||||
if ruta:
|
||||
document.archivo = ruta
|
||||
document.save()
|
||||
else:
|
||||
document.delete()
|
||||
raise Exception(f"Error al guardar archivo: {file.name}")
|
||||
|
||||
# Actualizar espacio usado
|
||||
espacio_usado_temp += file.size
|
||||
total_space_used += file.size
|
||||
|
||||
|
||||
uploaded_documents.append({
|
||||
"id": str(document.id),
|
||||
"filename": file.name,
|
||||
@@ -1369,12 +1408,12 @@ class DocumentViewSet(viewsets.ModelViewSet, DocumentosFiltradosMixin):
|
||||
"extension": extension,
|
||||
"document_type": document_type.nombre
|
||||
})
|
||||
|
||||
|
||||
except Exception as e:
|
||||
failed_files.append(file.name)
|
||||
errors.append(f"Error al procesar {file.name}: {str(e)}")
|
||||
continue
|
||||
|
||||
|
||||
# Actualizar el uso de almacenamiento final
|
||||
uso.espacio_utilizado = espacio_usado_temp
|
||||
uso.save()
|
||||
|
||||
Reference in New Issue
Block a user