Skip to main content

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