Skip to main content

headless_lms_models/library/
custom_view_exercises.rs

1use crate::{
2    exercise_task_submissions::{AnswerFile, AnswerKind},
3    exercises::Exercise,
4    prelude::*,
5    user_course_exercise_service_variables::UserCourseExerciseServiceVariable,
6};
7use utoipa::ToSchema;
8
9#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, ToSchema)]
10
11pub struct CustomViewExerciseTaskGrading {
12    pub id: Uuid,
13    pub created_at: DateTime<Utc>,
14    pub exercise_id: Uuid,
15    pub exercise_task_id: Uuid,
16    pub feedback_json: Option<serde_json::Value>,
17    pub feedback_text: Option<String>,
18}
19
20#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, ToSchema)]
21
22pub struct CustomViewExerciseTaskSpec {
23    pub id: Uuid,
24    pub public_spec: Option<serde_json::Value>,
25    pub order_number: i32,
26}
27
28#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, ToSchema)]
29
30pub struct CustomViewExerciseTaskSubmission {
31    pub id: Uuid,
32    pub created_at: DateTime<Utc>,
33    pub exercise_slide_submission_id: Uuid,
34    pub exercise_slide_id: Uuid,
35    pub exercise_task_id: Uuid,
36    pub exercise_task_grading_id: Option<Uuid>,
37    pub answer_kind: AnswerKind,
38    /// The plugin's own JSON: the whole answer for a `json` answer, the plugin's metadata about the
39    /// files for a `file` one. A custom view is handed this row as its `user_answer`, so this is
40    /// where a plugin reads the answer from.
41    pub data_json: Option<serde_json::Value>,
42    /// The files the answer consists of, in grading order. Omitted when it has none.
43    #[serde(skip_serializing_if = "Option::is_none")]
44    pub data_files: Option<Vec<AnswerFile>>,
45}
46
47#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, ToSchema)]
48
49pub struct CustomViewExerciseSubmissions {
50    pub exercise_tasks: CustomViewExerciseTasks,
51    pub exercises: Vec<Exercise>,
52    pub user_variables: Vec<UserCourseExerciseServiceVariable>,
53}
54
55#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, ToSchema)]
56
57pub struct CustomViewExerciseTasks {
58    pub exercise_tasks: Vec<CustomViewExerciseTaskSpec>,
59    pub task_submissions: Vec<CustomViewExerciseTaskSubmission>,
60    pub task_gradings: Vec<CustomViewExerciseTaskGrading>,
61}