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:
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user