Informes patológicos: flujo en UI, permisos y firma digital¶
Documentación técnica de las mejoras en Step 06 (generación de informes) desplegadas en main a partir de mayo 2026.
Commits de referencia:
55d7f86— bloque «Informe patológico» en detalle de protocolo y estado de procesamiento0eb3c69— firma digital obligatoria para elaborar/finalizar/descargar PDF
Resumen funcional¶
| Capa | Comportamiento |
|---|---|
| Rol | personal_lab o histopatologo (y admin como lab staff) acceden a recepción/procesamiento |
| Permiso | LaboratoryStaff.can_create_reports («Puede crear informes») habilita el flujo de informes |
| Firma | LaboratoryStaff.signature_image obligatoria antes de crear, finalizar o generar PDF |
| Responsable del informe | FK Report.laboratory_staff (profesional que firma el PDF) |
El rol no implica automáticamente informes ni firma: el admin configura perfil + permisos en Django Admin.
Acciones en detalle de protocolo y procesamiento¶
Context builder¶
src/protocols/protocol_detail_context.py:
build_protocol_report_action_context()— flags del bloque de informebuild_protocol_detail_action_context()— acciones de laboratorio + veterinario + informe
Plantillas¶
| Plantilla | Uso |
|---|---|
_protocol_report_workflow.html |
Card «Informe patológico» (CTA principal, cola pendiente, PDF) |
_protocol_detail_actions.html |
Acciones de lab y vet |
protocol_detail.html |
Incluye ambos bloques si aplica |
processing/protocol_status.html |
Mismo bloque de informe + enlace «Ver protocolo» |
_protocol_report_images_preview.html |
Miniatura de imágenes en detalle de protocolo / procesamiento |
reports/protocol_images_gallery.html |
Galería completa (/protocols/<id>/informe/imagenes/) |
reports/protocol_image_detail.html |
Detalle de una imagen con navegación anterior/siguiente |
Imágenes microscópicas (ReportImage)¶
- Modelo
ReportImageconImageField→ almacenamiento en default storage (Garage/S3 en producción,media/en local). - Subida en editar informe (
ReportEditView+ReportImageFormSet,enctype="multipart/form-data"). - Inclusión en el PDF al finalizar (misma generación que
persist_report_pdf). - Visualización desde detalle de protocolo (preview + enlace a galería) y desde informe / acciones laterales.
- Permisos: personal de lab ve imágenes en borrador; veterinario solo en informes
finalized/sentde sus protocolos.
URLs:
| Ruta | Nombre |
|---|---|
/protocols/<pk>/informe/imagenes/ |
protocols:protocol_report_images |
/protocols/<pk>/informe/imagenes/<image_pk>/ |
protocols:protocol_report_image_detail |
Tests locales: make test-with-sqlite ARGS="protocols.tests_report_images protocols.tests_protocol_detail_context".
Cuándo se muestra el bloque de informe¶
- Usuario lab staff con
can_create_reports=True - Protocolo en
readyoreport_sent, o ya existe un informe - Si falta firma del usuario actual: aviso ámbar con enlace a carga de firma (sin CTAs de elaboración)
CTAs principales (según estado)¶
| Estado | Acción principal |
|---|---|
ready, sin informe |
Elaborar informe → protocols:report_create |
Informe draft |
Continuar elaboración → protocols:report_edit |
Informe finalized |
Enviar al veterinario → protocols:report_send |
| Informe existente | Ver informe → protocols:report_detail |
Firma digital obligatoria¶
URL de carga¶
- Ruta:
/accounts/lab-staff/signature/ - Nombre:
accounts:lab_staff_signature - Vista:
LabStaffSignatureView(src/accounts/views.py) - Formulario:
LaboratoryStaffSignatureForm(src/accounts/forms.py)
Redirección automática¶
ReportSignatureRequiredMixin (src/accounts/mixins.py) se aplica a:
ReportPendingListViewReportHistoryViewReportCreateViewReportEditViewReportFinalizeViewReportSendView
ReportPDFView valida firma del usuario lab staff en dispatch y del firmante asignado al informe en get.
Helpers¶
src/accounts/report_access.py:
get_laboratory_staff_for_reports(user)— consulta directa aLaboratoryStaff(evita conflictos con properties deUser)user_requires_report_signature(user)—Truesi puede crear informes pero no tiene imagen de firma- Mensajes en español para UI y redirects
PDF (pdf_service.py)¶
report.get_signer()—laboratory_staffohistopathologistlegacyreport.signer_has_signature()— usahas_signature()del perfil- Sin firmante o sin firma →
PDFGenerationError(mensaje en español, sinAttributeError)
Creación de informe (report_service.py)¶
create_report()exigeLaboratoryStaffconhas_signature()- Asigna
Report.laboratory_staffdesde el formulario (campo obligatorio enReportCreateForm) - Validación en
clean_laboratory_staff()del formulario
Fix de perfil (User.laboratory_staff_profile)¶
La property ahora resuelve con LaboratoryStaff.objects.filter(user=self).first() en lugar de un accessor incorrecto (self.laboratory_staff), que podía dejar informes sin responsable asignado.
Matriz de permisos (referencia rápida)¶
| Usuario | Recepción / procesamiento | Ver bloque informe | Crear/editar informe | PDF / finalizar |
|---|---|---|---|---|
| Vet dueño | No | No (ve sus informes finalizados) | No | Sí si informe finalizado y firmante OK |
Lab sin can_create_reports |
Sí | Mensaje gris (permiso) | No | No |
| Lab con permiso, sin firma | Sí | Aviso «Cargar firma» | Redirect a firma | Redirect / error |
| Lab con permiso y firma | Sí | Bloque completo | Sí | Sí |
| Admin | Según perfil LaboratoryStaff |
Igual que lab | Igual que lab | Igual que lab |
Órdenes de trabajo: siguen requiriendo User.is_staff=True además del rol; no dependen de la firma de informes.
Administración en Django Admin¶
- Usuarios → rol
personal_lab/histopatologo - Personal de laboratorio (
LaboratoryStaff): can_create_reports— habilita informessignature_image— puede subirse desde admin o el usuario desde/accounts/lab-staff/signature/is_active— debe estar activo
Migración histórica 0008_migrate_histopathologists_to_laboratory_staff creó perfiles unificados con can_create_reports=True para histopatólogos existentes.
Tests¶
| Archivo | Cobertura |
|---|---|
accounts/tests_report_access.py |
Firma obligatoria, formulario, PDF sin firmante |
protocols/tests_protocol_detail_context.py |
Contexto del bloque de informe (con firma en setUp) |
protocols/tests.py (ReportViewsTest) |
Vistas de informe con laboratory_staff y firma |
Ejecutar:
make test-with-sqlite ARGS="accounts.tests_report_access protocols.tests_protocol_detail_context protocols.tests.ReportViewsTest"
Despliegue en producción¶
Tras git pull y rebuild de contenedores:
- Personal con permiso de informes sin firma será redirigido al cargar la firma la primera vez que intente elaborar un informe.
- Informes antiguos sin
laboratory_staffasignado: editar responsable en admin o reasignar desde el formulario de edición; el PDF fallará con mensaje claro hasta corregirlo. - Verificar en admin que cada histopatólogo activo tenga registro
LaboratoryStaff+ firma cargada.