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_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}