fix: filtrado de partidas por nomenclatura de documento (core/partida_docs)

Frontera (_|.|$) tras vu_PT_{app}_{numero} para cubrir los 3 formatos sin
confundir partida 1 con 11/100. Fuente unica en core/partida_docs.py, reusada
por get_documentos, handlers de borrado/descarga y fix_partidas_error.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-24 07:31:07 -06:00
parent d732602775
commit 244bbcb21c
6 changed files with 316 additions and 43 deletions

View File

@@ -33,6 +33,7 @@ from core.permissions import (
user_has_permission,
IsInternalService,
)
from core.partida_docs import patron_regex_partida
import logging
logger = logging.getLogger(__name__)
@@ -718,12 +719,18 @@ class DocumentViewSet(viewsets.ModelViewSet, DocumentosFiltradosMixin):
status=status.HTTP_404_NOT_FOUND
)
# Buscar documentos vu_PT_ asociados a cada partida por pedimento + numero_partida
# Buscar documentos asociados a cada partida por nombre de archivo con
# frontera real (core.partida_docs). Sin filtro de tipo: barre tanto la
# respuesta (1) como REQUEST/ERROR (17/18) de la partida.
# incluir_legacy=False: el borrado es destructivo, no se elimina por match difuso.
doc_ids = []
for partida in partidas:
docs = Document.objects.filter(
pedimento_id=partida.pedimento.id,
archivo__icontains=f'vu_pt_{partida.pedimento.pedimento_app}_{partida.numero_partida}_'
pedimento_id=partida.pedimento_id,
archivo__iregex=patron_regex_partida(
partida.pedimento.pedimento_app, partida.numero_partida,
incluir_legacy=False,
),
).values_list('id', flat=True)
doc_ids.extend(docs)
@@ -1997,11 +2004,16 @@ class DocumentViewSet(viewsets.ModelViewSet, DocumentosFiltradosMixin):
if not partidas.exists():
return Response({"error": "No se encontraron partidas"}, status=status.HTTP_404_NOT_FOUND)
# Mismo matching por frontera que el borrado, pero incluir_legacy=True:
# la descarga no es destructiva, así que sí incluye archivos legacy.
doc_ids = []
for partida in partidas:
docs = Document.objects.filter(
pedimento_id=partida.pedimento.id,
archivo__icontains=f'vu_pt_{partida.pedimento.pedimento_app}_{partida.numero_partida}_'
pedimento_id=partida.pedimento_id,
archivo__iregex=patron_regex_partida(
partida.pedimento.pedimento_app, partida.numero_partida,
incluir_legacy=True,
),
).values_list('id', flat=True)
doc_ids.extend(docs)