headless_lms_server/programs/seed/seed_courses/
seed_accessibility_course.rs

1use crate::programs::seed::builder::chapter::ChapterBuilder;
2use crate::programs::seed::builder::context::SeedContext;
3use crate::programs::seed::builder::course::{CourseBuilder, CourseInstanceConfig};
4use crate::programs::seed::builder::exercise::{ExerciseBuilder, ExerciseIds};
5use crate::programs::seed::builder::json_source::JsonSource;
6use crate::programs::seed::builder::module::ModuleBuilder;
7use crate::programs::seed::builder::page::PageBuilder;
8use crate::programs::seed::seed_courses::CommonCourseData;
9use anyhow::Result;
10use headless_lms_models::roles::UserRole;
11use headless_lms_utils::{attributes, document_schema_processor::GutenbergBlock};
12use serde_json::json;
13use tracing::info;
14use uuid::Uuid;
15
16pub async fn seed_accessibility_course(
17    course_id: Uuid,
18    course_name: &str,
19    course_slug: &str,
20    common_course_data: CommonCourseData,
21) -> Result<Uuid> {
22    let CommonCourseData {
23        db_pool,
24        organization_id: org,
25        teacher_user_id,
26        student_user_id: _student,
27        langs_user_id: _langs_user_id,
28        example_normal_user_ids: _users,
29        jwt_key: _jwt_key,
30        base_url: _base_url,
31    } = common_course_data;
32
33    let mut conn = db_pool.acquire().await?;
34    let cx = SeedContext {
35        teacher: teacher_user_id,
36        org,
37        base_course_ns: course_id,
38    };
39
40    info!("inserting accessibility course {}", course_name);
41
42    let course = CourseBuilder::new(course_name, course_slug)
43        .desc("Course for testing accessibility features.")
44        .course_id(course_id)
45        .instance(CourseInstanceConfig {
46            name: None,
47            description: None,
48            support_email: None,
49            teacher_in_charge_name: "admin".to_string(),
50            teacher_in_charge_email: "admin@example.com".to_string(),
51            opening_time: None,
52            closing_time: None,
53            instance_id: Some(cx.v5(b"7344f1c8-b7ce-4c7d-ade2-5f39997bd454")),
54        })
55        .role(teacher_user_id, UserRole::Teacher)
56        .module(
57            ModuleBuilder::new().order(0).chapter(
58                ChapterBuilder::new(1, "Chapter 1")
59                    .fixed_ids(
60                        cx.v5(b"a1b2c3d4-e5f6-7890-abcd-ef1234567890"),
61                        cx.v5(b"b2c3d4e5-f6a7-8901-bcde-f12345678901"),
62                    )
63                    .page(
64                        PageBuilder::new("/chapter-1/choose-n-exercise", "Choose N Exercise")
65                            .exercise(ExerciseBuilder::quizzes(
66                                "Choose N exercise",
67                                ExerciseIds {
68                                    exercise_id: cx.v5(b"b8c9d0e1-f2a3-4567-6789-678901234567"),
69                                    slide_id: cx.v5(b"c9d0e1f2-a3b4-5678-7890-789012345678"),
70                                    task_id: cx.v5(b"d0e1f2a3-b4c5-6789-8901-890123456789"),
71                                    block_id: cx.v5(b"e1f2a3b4-c5d6-7890-9012-901234567890"),
72                                },
73                                false,
74                                None,
75                                JsonSource::Inline(json!({
76                                  "version": "2",
77                                  "title": "Choose N Exercise",
78                                  "body": "Select 2 options from the list below.",
79                                  "awardPointsEvenIfWrong": false,
80                                  "grantPointsPolicy": "grant_whenever_possible",
81                                  "quizItemDisplayDirection": "vertical",
82                                  "submitMessage": "",
83                                  "items": [
84                                    {
85                                      "type": "choose-n",
86                                      "id": "d4e5f6a7-b8c9-0123-def4-234567890123",
87                                      "failureMessage": "",
88                                      "options": [
89                                        {
90                                          "order": 1,
91                                          "additionalCorrectnessExplanationOnModelSolution": "",
92                                          "body": "",
93                                          "correct": true,
94                                          "id": "e5f6a7b8-c9d0-1234-ef45-345678901234",
95                                          "messageAfterSubmissionWhenSelected": "",
96                                          "title": "Option 1"
97                                        },
98                                        {
99                                          "order": 2,
100                                          "additionalCorrectnessExplanationOnModelSolution": "",
101                                          "body": "",
102                                          "correct": true,
103                                          "id": "f6a7b8c9-d0e1-2345-f456-456789012345",
104                                          "messageAfterSubmissionWhenSelected": "",
105                                          "title": "Option 2"
106                                        },
107                                        {
108                                          "order": 3,
109                                          "additionalCorrectnessExplanationOnModelSolution": "",
110                                          "body": "",
111                                          "correct": false,
112                                          "id": "a7b8c9d0-e1f2-3456-5678-567890123456",
113                                          "messageAfterSubmissionWhenSelected": "",
114                                          "title": "Option 3"
115                                        }
116                                      ],
117                                      "order": 0,
118                                      "successMessage": "",
119                                      "title": "Choose 2 options",
120                                      "body": "",
121                                      "n": 2
122                                    }
123                                  ]
124                                })),
125                                vec![],
126                            )),
127                    )
128                    .page(
129                        PageBuilder::new("/chapter-1/flip-card", "Flip Card").block(
130                            GutenbergBlock::block_with_name_attributes_and_inner_blocks(
131                                "moocfi/flip-card",
132                                attributes! {
133                                    "size": "m"
134                                },
135                                vec![
136                                    GutenbergBlock::block_with_name_attributes_and_inner_blocks(
137                                        "moocfi/front-card",
138                                        attributes! {},
139                                        vec![GutenbergBlock::paragraph("Front side content")],
140                                    )
141                                    .with_id(cx.v5(b"f1a2b3c4-d5e6-7890-1234-567890abcdef")),
142                                    GutenbergBlock::block_with_name_attributes_and_inner_blocks(
143                                        "moocfi/back-card",
144                                        attributes! {},
145                                        vec![GutenbergBlock::paragraph("Back side content")],
146                                    )
147                                    .with_id(cx.v5(b"a1b2c3d4-e5f6-7890-abcd-ef1234567890")),
148                                ],
149                            )
150                            .with_id(cx.v5(b"12345678-1234-5678-9012-123456789abc")),
151                        ),
152                    ),
153            ),
154        );
155
156    let (course, _default_instance, _last_module) = course.seed(&mut conn, &cx).await?;
157
158    Ok(course.id)
159}