headless_lms_server/programs/seed/seed_courses/
seed_course_with_peer_review.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::module::ModuleBuilder;
6use crate::programs::seed::builder::page::PageBuilder;
7use crate::programs::seed::seed_courses::CommonCourseData;
8use crate::programs::seed::seed_helpers::paragraph;
9use anyhow::Result;
10use chrono::Utc;
11
12use headless_lms_models::peer_or_self_review_configs::{
13 CmsPeerOrSelfReviewConfig, PeerReviewProcessingStrategy,
14};
15use headless_lms_models::peer_or_self_review_questions::CmsPeerOrSelfReviewQuestion;
16use headless_lms_models::roles::UserRole;
17use serde_json::json;
18use tracing::info;
19use uuid::Uuid;
20
21use super::super::seed_users::SeedUsersResult;
22
23pub async fn seed_peer_review_course(
24 course_id: Uuid,
25 course_name: &str,
26 course_slug: &str,
27 common_course_data: CommonCourseData,
28 seed_users_result: SeedUsersResult,
29) -> Result<Uuid> {
30 let CommonCourseData {
31 db_pool,
32 organization_id: org,
33 teacher_user_id,
34 student_user_id: _student,
35 langs_user_id: _langs_user_id,
36 example_normal_user_ids: _users,
37 jwt_key: _jwt_key,
38 base_url: _base_url,
39 } = common_course_data;
40
41 let mut conn = db_pool.acquire().await?;
42 let cx = SeedContext {
43 teacher: teacher_user_id,
44 org,
45 base_course_ns: course_id,
46 };
47
48 info!("Inserting sample course {}", course_name);
49 let course = CourseBuilder::new(course_name, course_slug)
50 .desc("Sample course for testing reject and reset-feature in manual review after peer review.")
51 .chatbot(false)
52 .course_id(course_id)
53 .instance(CourseInstanceConfig {
54 name: None,
55 description: None,
56 support_email: None,
57 teacher_in_charge_name: "admin".to_string(),
58 teacher_in_charge_email: "admin@example.com".to_string(),
59 opening_time: None,
60 closing_time: None,
61 instance_id: Some(cx.v5(b"instance:default")),
62 })
63 .role(seed_users_result.teacher_user_id, UserRole::Teacher)
64 .module(
65 ModuleBuilder::new()
66 .order(0)
67 .register_to_open_university(false)
68 .automatic_completion(Some(1), Some(1), false)
69 .chapter(
70 ChapterBuilder::new(1, "The Basics")
71 .opens(Utc::now())
72 .fixed_ids(cx.v5(b"chapter:1"), cx.v5(b"chapter:1:instance"))
73 .page(
74 PageBuilder::new("/chapter-1/page-1", "Page One")
75 .block(paragraph(
76 "This is a simple introduction to the basics.",
77 cx.v5(b"page:1:1:block:intro"),
78 ))
79 .exercise(ExerciseBuilder::example_exercise(
80 "Simple multiple choice",
81 ExerciseIds {
82 exercise_id: cx.v5(b"exercise:1:1:e"),
83 slide_id: cx.v5(b"exercise:1:1:s"),
84 task_id: cx.v5(b"exercise:1:1:t"),
85 block_id: cx.v5(b"exercise:1:1:b"),
86 },
87 vec![paragraph(
88 "What is 2 + 2?",
89 cx.v5(b"exercise:1:1:prompt"),
90 )],
91 json!([
92 {
93 "name": "3",
94 "correct": false,
95 "id": cx.v5(b"exercise:1:1:option:1")
96 },
97 {
98 "name": "4",
99 "correct": true,
100 "id": cx.v5(b"exercise:1:1:option:2")
101 },
102 {
103 "name": "5",
104 "correct": false,
105 "id": cx.v5(b"exercise:1:1:option:3")
106 }
107 ]),
108 true,
109 Some(CmsPeerOrSelfReviewConfig {
110 id: cx.v5(b"peer-review:1"),
111 course_id,
112 exercise_id: Some(cx.v5(b"exercise:1:1:e")),
113 peer_reviews_to_give: 2,
114 peer_reviews_to_receive: 1,
115 accepting_threshold: 2.1,
116 processing_strategy:
117 PeerReviewProcessingStrategy::AutomaticallyGradeOrManualReviewByAverage,
118 points_are_all_or_nothing: true,
119 review_instructions: None,
120 }),
121 Some(vec![CmsPeerOrSelfReviewQuestion {
122 id: cx.v5(b"peer-review:1:q1"),
123 peer_or_self_review_config_id: cx.v5(b"peer-review:1"),
124 order_number: 1,
125 question: "Good answer?".to_string(),
126 question_type: headless_lms_models::peer_or_self_review_questions::PeerOrSelfReviewQuestionType::Scale,
127 answer_required: true,
128 weight: 0.0,
129 }]),
130 )),
131 ),
132 ),
133 );
134 let (course, _default_instance, _last_module) = course.seed(&mut conn, &cx).await?;
135 Ok(course.id)
136}