headless_lms_server/programs/seed/seed_courses/
seed_accessibility_course.rs1use 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}