Skip to content

feat: agregar justificaciones y revisión múltiple de resultados - #16

Draft
vcntttt wants to merge 3 commits into
mainfrom
feat/justificaciones-preguntas
Draft

vcntttt wants to merge 3 commits into
mainfrom
feat/justificaciones-preguntas

Conversation

@vcntttt

@vcntttt vcntttt commented Oct 12, 2026

Copy link
Copy Markdown
Member

Resumen

  • Agrega justificaciones opcionales en Markdown y LaTeX a las preguntas de bancos, con edición, importación, exportación y visualización al revisar resultados.
  • Delimita las justificaciones en el Markdown exportado para preservar encabezados y listas al reimportarlo.
  • Conserva justificaciones existentes cuando un cliente omite ese campo en un PATCH; null las elimina explícitamente.
  • Permite configurar si los estudiantes pueden volver a consultar los resultados de un quiz; por defecto pueden verlos una vez.

Migraciones

  • 20261011000000_question-justification.sql
  • 20261011010000_quiz-results-multiple-views.sql

Verificación

  • cargo fmt --all -- --check
  • cargo clippy --workspace --all-targets --all-features -- -D warnings (con CARGO_TARGET_DIR temporal)
  • corepack pnpm run lint
  • corepack pnpm run check
  • CSpell: 33 archivos, 0 avisos

No ejecuté tests. Preparé pools locales por unidad con 151 preguntas justificadas para validación manual; están fuera de este repositorio. La PR queda en Draft mientras se realiza esa prueba.


/// Trims the justification and stores `None` when nothing is left, so blank
/// explanations are treated as absent.
fn normalize_justification(justification: Option<&str>) -> Option<String> {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Para mantener los patrones del proyecto es preferible anexar este tipo de funciones como método de la struct y no de forma libre en el módulo.

}
}

fn build_question(

@MrRevillod MrRevillod Oct 15, 2026 •

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

De paso podrías eliminar/mover esta función, al parecer por descuido quedó fuera y solo se utiliza una vez durante la construcción del banco. No es que aporte demasiado estando fuera del Service.

La construcción de la Question puede ser inline en el ciclo.

pub options: Vec<String>,
#[serde(default, skip_serializing_if = "PatchField::is_missing")]
#[validate(custom(function = "validate_justification_update"))]
pub justification: PatchField<String>,

@MrRevillod MrRevillod Oct 15, 2026 •

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Entiendo el por qué la decisión de utilizar un enum custom en este caso, si bien es más idiomático lo que generalmente se suele utilizar es el crate serde_with con un doble Option: Option<Option<T>>.

En caso de mantener el enum, lo más adecuado sería mantenerlo en shared/ ya que a futuro puede utilizarse en otros dtos.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants