Skip to content

Commit

Permalink
Update state_deriver
Browse files Browse the repository at this point in the history
  • Loading branch information
nygrenh committed Mar 18, 2024
1 parent eb22e20 commit 88ef87a
Show file tree
Hide file tree
Showing 12 changed files with 444 additions and 103 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,7 @@ import {
fetchPeerReviewDataByExerciseId,
postPeerReviewSubmission,
} from "../../../../../services/backend"
import {
CourseMaterialPeerReviewQuestionAnswer,
NewProposedBlockEdit,
} from "../../../../../shared-module/bindings"
import { CourseMaterialPeerReviewQuestionAnswer } from "../../../../../shared-module/bindings"
import ErrorBanner from "../../../../../shared-module/components/ErrorBanner"
import PeerReviewProgress from "../../../../../shared-module/components/PeerReview/PeerReviewProgress"
import Spinner from "../../../../../shared-module/components/Spinner"
Expand All @@ -22,7 +19,6 @@ import useToastMutation from "../../../../../shared-module/hooks/useToastMutatio
import { narrowContainerWidthPx } from "../../../../../shared-module/styles/constants"
import getGuestPseudonymousUserId from "../../../../../shared-module/utils/getGuestPseudonymousUserId"
import { exerciseTaskGradingToExerciseTaskGradingResult } from "../../../../../shared-module/utils/typeMappter"
import InnerBlocks from "../../../util/InnerBlocks"
import ExerciseTaskIframe from "../ExerciseTaskIframe"

import PeerReviewQuestion from "./PeerReviewQuestion"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -558,6 +558,7 @@ const ExerciseBlock: React.FC<
parentExerciseQuery={getCourseMaterialExercise}
/>
)}
{reviewingStage === "SelfReview" && <div>{t("self-review")}</div>}
{(reviewingStage === "WaitingForPeerReviews" ||
reviewingStage === "ReviewedAndLocked") && (
<div
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ const Exam: React.FC<React.PropsWithChildren<ExamProps>> = ({ query }) => {
const examId = query.id
const [pageState, pageStateDispatch] = useReducer(
pageStateReducer,
// We don't pass a refetch function here on purpose because refetching during an exam is risky because we don't want to accidentally lose unsubitted answers
// We don't pass a refetch function here on purpose because refetching during an exam is risky because we don't want to accidentally lose unsubmitted answers
getDefaultPageState(undefined),
)
const now = useTime(5000)
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions services/headless-lms/models/src/library/peer_reviewing.rs
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,7 @@ async fn update_peer_review_giver_exercise_progress(
UserExerciseStateUpdateAlreadyLoadedRequiredData {
current_user_exercise_state: Some(user_exercise_state),
exercise: Some(exercise.clone()),
peer_review_information: Some(UserExerciseStateUpdateAlreadyLoadedRequiredDataPeerReviewInformation {
peer_or_self_review_information: Some(UserExerciseStateUpdateAlreadyLoadedRequiredDataPeerReviewInformation {
peer_review_queue_entry: Some(Some(peer_review_queue_entry)),
latest_exercise_slide_submission_received_peer_review_question_submissions:
Some(received_peer_review_question_submissions),
Expand Down Expand Up @@ -323,7 +323,7 @@ async fn update_peer_review_receiver_exercise_status(
UserExerciseStateUpdateAlreadyLoadedRequiredData {
current_user_exercise_state: Some(user_exercise_state),
exercise: Some(exercise.clone()),
peer_review_information: Some(UserExerciseStateUpdateAlreadyLoadedRequiredDataPeerReviewInformation {
peer_or_self_review_information: Some(UserExerciseStateUpdateAlreadyLoadedRequiredDataPeerReviewInformation {
peer_review_queue_entry: Some(Some(peer_review_queue_entry)),
latest_exercise_slide_submission_received_peer_review_question_submissions:
Some(received_peer_review_question_submissions),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ pub(super) async fn load_required_data(
let UserExerciseStateUpdateAlreadyLoadedRequiredData {
exercise,
current_user_exercise_state,
peer_review_information,
peer_or_self_review_information,
latest_teacher_grading_decision,
user_exercise_slide_state_grading_summary,
} = already_loaded_internal_dependencies;
Expand All @@ -39,9 +39,9 @@ pub(super) async fn load_required_data(
let loaded_exercise = load_exercise(conn, exercise, &loaded_user_exercise_state).await?;

Ok(UserExerciseStateUpdateRequiredData {
peer_review_information: load_peer_review_information(
peer_or_self_review_information: load_peer_or_self_review_information(
conn,
peer_review_information,
peer_or_self_review_information,
&loaded_user_exercise_state,
&loaded_exercise,
)
Expand Down Expand Up @@ -125,29 +125,36 @@ async fn load_exercise(
}
}

async fn load_peer_review_information(
async fn load_peer_or_self_review_information(
conn: &mut PgConnection,
already_loaded_peer_review_information: Option<
already_loaded_peer_or_self_review_information: Option<
UserExerciseStateUpdateAlreadyLoadedRequiredDataPeerReviewInformation,
>,
loaded_user_exercise_state: &UserExerciseState,
loaded_exercise: &Exercise,
) -> ModelResult<Option<UserExerciseStateUpdateRequiredDataPeerReviewInformation>> {
info!("Loading peer review information");
if loaded_exercise.needs_peer_review {
info!("Exercise needs peer review");
// Destruct the contents of already_loaded_peer_review_information so that we can use the fields of the parent struct independently
info!("Loading peer or self review information");
if loaded_exercise.needs_peer_review || loaded_exercise.needs_self_review {
if loaded_exercise.needs_peer_review {
info!("Exercise needs peer review");
}
if loaded_exercise.needs_self_review {
info!("Exercise needs self review");
}

// Destruct the contents of already_loaded_peer_or_self_review_information so that we can use the fields of the parent struct independently
let UserExerciseStateUpdateAlreadyLoadedRequiredDataPeerReviewInformation {
given_peer_review_submissions,
given_self_review_submission,
latest_exercise_slide_submission,
latest_exercise_slide_submission_received_peer_review_question_submissions,
peer_review_queue_entry,
peer_review_config,
peer_review_questions,
} = if let Some(already_loaded_peer_review_information) =
already_loaded_peer_review_information
} = if let Some(already_loaded_peer_or_self_review_information) =
already_loaded_peer_or_self_review_information
{
already_loaded_peer_review_information
already_loaded_peer_or_self_review_information
} else {
Default::default()
};
Expand All @@ -170,6 +177,12 @@ async fn load_peer_review_information(
loaded_user_exercise_state,
)
.await?,
given_self_review_submission: load_given_self_review_submission(
conn,
given_self_review_submission,
loaded_user_exercise_state,
)
.await?,
latest_exercise_slide_submission_received_peer_review_question_submissions:
load_latest_exercise_slide_submission_received_peer_review_question_submissions(
conn,
Expand All @@ -194,7 +207,7 @@ async fn load_peer_review_information(
},
))
} else {
info!("Exercise does not need peer review");
info!("Exercise does not need peer or self review");
// Peer review disabled for the exercise, no need to load any information related to peer reviews.
Ok(None)
}
Expand Down Expand Up @@ -380,6 +393,27 @@ async fn load_given_peer_review_submissions(
}
}

async fn load_given_self_review_submission(
conn: &mut PgConnection,
already_loaded_given_self_review_submission: Option<Option<PeerReviewSubmission>>,
loaded_user_exercise_state: &UserExerciseState,
) -> ModelResult<Option<PeerReviewSubmission>> {
if let Some(given_self_review_submission) = already_loaded_given_self_review_submission {
info!("Using already loaded given self review submission");
Ok(given_self_review_submission)
} else {
info!("Loading given self review submission");
Ok(
peer_review_submissions::get_self_review_submission_by_user_and_exercise(
conn,
loaded_user_exercise_state.user_id,
loaded_user_exercise_state.exercise_id,
)
.await?,
)
}
}

#[cfg(test)]
mod tests {
use super::*;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,20 +24,24 @@ use crate::{
use std::default::Default;

/// Visible only in the current module (and submodules) to prevent misuse.
#[derive(Debug)]
pub struct UserExerciseStateUpdateRequiredData {
pub exercise: Exercise,
pub current_user_exercise_state: UserExerciseState,
/// None if peer review is not enabled for the exercise
pub peer_review_information: Option<UserExerciseStateUpdateRequiredDataPeerReviewInformation>,
pub peer_or_self_review_information:
Option<UserExerciseStateUpdateRequiredDataPeerReviewInformation>,
/// None if a teacher has not made a grading decision yet.
pub latest_teacher_grading_decision: Option<TeacherGradingDecision>,
/// The grades summed up from all the user exercise slide states. Note that multiple slides can give points, and they are all aggregated here.
pub user_exercise_slide_state_grading_summary: UserExerciseSlideStateGradingSummary,
}

/// Visible only in the current module (and submodules) to prevent misuse.
#[derive(Debug)]
pub struct UserExerciseStateUpdateRequiredDataPeerReviewInformation {
pub given_peer_review_submissions: Vec<PeerReviewSubmission>,
pub given_self_review_submission: Option<PeerReviewSubmission>,
pub latest_exercise_slide_submission_received_peer_review_question_submissions:
Vec<PeerReviewQuestionSubmission>,
pub peer_review_queue_entry: Option<PeerReviewQueueEntry>,
Expand All @@ -52,7 +56,7 @@ Same as `UserExerciseStateUpdateRequiredData` but public and everything is optio
pub struct UserExerciseStateUpdateAlreadyLoadedRequiredData {
pub exercise: Option<Exercise>,
pub current_user_exercise_state: Option<UserExerciseState>,
pub peer_review_information:
pub peer_or_self_review_information:
Option<UserExerciseStateUpdateAlreadyLoadedRequiredDataPeerReviewInformation>,
/// The outer option is to indicate whether this cached value is provided or not, and the inner option is to tell whether a teacher has made a grading decision or not.
pub latest_teacher_grading_decision: Option<Option<TeacherGradingDecision>>,
Expand All @@ -65,6 +69,7 @@ Same as `UserExerciseStateUpdateRequiredDataPeerReviewInformation` but public an
#[derive(Default)]
pub struct UserExerciseStateUpdateAlreadyLoadedRequiredDataPeerReviewInformation {
pub given_peer_review_submissions: Option<Vec<PeerReviewSubmission>>,
pub given_self_review_submission: Option<Option<PeerReviewSubmission>>,
pub latest_exercise_slide_submission: Option<ExerciseSlideSubmission>,
pub latest_exercise_slide_submission_received_peer_review_question_submissions:
Option<Vec<PeerReviewQuestionSubmission>>,
Expand Down
Loading

0 comments on commit 88ef87a

Please sign in to comment.