diff --git a/packages/server/src/core/degree_status/mod.rs b/packages/server/src/core/degree_status/mod.rs index c9dae71b..0560695b 100644 --- a/packages/server/src/core/degree_status/mod.rs +++ b/packages/server/src/core/degree_status/mod.rs @@ -71,7 +71,7 @@ impl DegreeStatus { pub struct DegreeStatusHandler<'a> { degree_status: &'a mut DegreeStatus, course_banks: Vec, - catalog: Catalog, + catalog: &'a Catalog, courses: HashMap, credit_overflow_map: HashMap, missing_credit_map: HashMap, @@ -109,7 +109,7 @@ impl DegreeStatus { DegreeStatusHandler { degree_status: self, course_banks, - catalog, + catalog: &catalog, courses, credit_overflow_map: HashMap::new(), missing_credit_map: HashMap::new(), @@ -118,6 +118,6 @@ impl DegreeStatus { .compute_status(); // process the data after degree status computation - self.postprocess(); + self.postprocess(&catalog); } } diff --git a/packages/server/src/core/degree_status/postprocessing.rs b/packages/server/src/core/degree_status/postprocessing.rs index ce3dd0d2..2d4ffd91 100644 --- a/packages/server/src/core/degree_status/postprocessing.rs +++ b/packages/server/src/core/degree_status/postprocessing.rs @@ -1,13 +1,22 @@ -use crate::{core::messages, resources::course::Grade}; +use crate::{ + core::messages, + resources::{catalog::Catalog, course::Grade}, +}; use super::DegreeStatus; pub const TECHNICAL_ENGLISH_ADVANCED_B: &str = "324033"; const EXEMPT_COURSES_COUNT_DEMAND: usize = 2; const ADVANCED_B_COURSES_COUNT_DEMAND: usize = 1; +const MINIMAL_YEAR_FOR_ENGLISH_REQUIREMENT: usize = 2021; impl DegreeStatus { - fn check_english_requirement(&mut self) { + fn check_english_requirement(&mut self, year: usize) { + // English requirement is not relevant for students that started their studies before 2021 + if year < MINIMAL_YEAR_FOR_ENGLISH_REQUIREMENT { + return; + } + let completed_english_content_courses_count = self .course_statuses .iter() @@ -44,7 +53,7 @@ impl DegreeStatus { _ => {} } } - pub fn postprocess(&mut self) { - self.check_english_requirement(); + pub fn postprocess(&mut self, catalog: &Catalog) { + self.check_english_requirement(catalog.year()); } } diff --git a/packages/server/src/core/tests.rs b/packages/server/src/core/tests.rs index 6d240238..9f3ec0fe 100644 --- a/packages/server/src/core/tests.rs +++ b/packages/server/src/core/tests.rs @@ -17,7 +17,22 @@ use std::str::FromStr; use super::types::Requirement; use super::*; -pub const COMPUTER_SCIENCE_3_YEARS_18_19_CATALOG_ID: &str = "61a102bb04c5400b98e6f401"; // catalog id from database +pub const COMPUTER_SCIENCE_3_YEARS_19_20_CATALOG_ID: &str = "61a102bb04c5400b98e6f401"; // catalog id from database +pub const COMPUTER_SCIENCE_3_YEARS_21_22_CATALOG_ID: &str = "61ec835f015bedeab20397a4"; // catalog id from database + +#[test] +async fn test_year_catalog() { + dotenv().ok(); + let db = Db::new().await; + let catalog = db + .get::( + bson::oid::ObjectId::from_str(COMPUTER_SCIENCE_3_YEARS_19_20_CATALOG_ID) + .expect("failed to create oid"), + ) + .await + .unwrap(); + assert_eq!(catalog.year(), 2019); +} #[test] async fn test_pdf_parser() { @@ -319,7 +334,7 @@ async fn test_irrelevant_course() { async fn test_restore_irrelevant_course() { let mut degree_status = run_degree_status_full_flow( "pdf_ctrl_c_ctrl_v_4.txt", - COMPUTER_SCIENCE_3_YEARS_18_19_CATALOG_ID, + COMPUTER_SCIENCE_3_YEARS_19_20_CATALOG_ID, ) .await; @@ -332,7 +347,7 @@ async fn test_restore_irrelevant_course() { degree_status = run_degree_status( degree_status, - get_catalog(COMPUTER_SCIENCE_3_YEARS_18_19_CATALOG_ID).await, + get_catalog(COMPUTER_SCIENCE_3_YEARS_19_20_CATALOG_ID).await, ) .await; degree_status.course_statuses.push(CourseStatus { @@ -353,7 +368,7 @@ async fn test_restore_irrelevant_course() { degree_status = run_degree_status( degree_status, - get_catalog(COMPUTER_SCIENCE_3_YEARS_18_19_CATALOG_ID).await, + get_catalog(COMPUTER_SCIENCE_3_YEARS_19_20_CATALOG_ID).await, ) .await; @@ -449,7 +464,7 @@ async fn test_modified() { async fn test_duplicated_courses() { let mut degree_status = run_degree_status_full_flow( "pdf_ctrl_c_ctrl_v_4.txt", - COMPUTER_SCIENCE_3_YEARS_18_19_CATALOG_ID, + COMPUTER_SCIENCE_3_YEARS_19_20_CATALOG_ID, ) .await; @@ -473,7 +488,7 @@ async fn test_duplicated_courses() { degree_status = run_degree_status( degree_status, - get_catalog(COMPUTER_SCIENCE_3_YEARS_18_19_CATALOG_ID).await, + get_catalog(COMPUTER_SCIENCE_3_YEARS_19_20_CATALOG_ID).await, ) .await; @@ -539,7 +554,7 @@ async fn run_degree_status_full_flow(file_name: &str, catalog: &str) -> DegreeSt async fn test_missing_credit() { let degree_status = run_degree_status_full_flow( "pdf_ctrl_c_ctrl_v.txt", - COMPUTER_SCIENCE_3_YEARS_18_19_CATALOG_ID, + COMPUTER_SCIENCE_3_YEARS_19_20_CATALOG_ID, ) .await; //FOR VIEWING IN JSON FORMAT @@ -661,7 +676,7 @@ async fn test_missing_credit() { async fn test_overflow_credit() { let degree_status = run_degree_status_full_flow( "pdf_ctrl_c_ctrl_v_2.txt", - COMPUTER_SCIENCE_3_YEARS_18_19_CATALOG_ID, + COMPUTER_SCIENCE_3_YEARS_19_20_CATALOG_ID, ) .await; //FOR VIEWING IN JSON FORMAT @@ -761,9 +776,10 @@ async fn test_overflow_credit() { async fn test_postprocessing_english_requirement() { let mut degree_status = run_degree_status_full_flow( "pdf_ctrl_c_ctrl_v_2.txt", - COMPUTER_SCIENCE_3_YEARS_18_19_CATALOG_ID, + COMPUTER_SCIENCE_3_YEARS_21_22_CATALOG_ID, ) .await; + //FOR VIEWING IN JSON FORMAT // std::fs::write( // "degree_status.json", @@ -789,7 +805,7 @@ async fn test_postprocessing_english_requirement() { degree_status = run_degree_status( degree_status, - get_catalog(COMPUTER_SCIENCE_3_YEARS_18_19_CATALOG_ID).await, + get_catalog(COMPUTER_SCIENCE_3_YEARS_21_22_CATALOG_ID).await, ) .await; @@ -810,12 +826,10 @@ async fn test_postprocessing_english_requirement() { degree_status = run_degree_status( degree_status, - get_catalog(COMPUTER_SCIENCE_3_YEARS_18_19_CATALOG_ID).await, + get_catalog(COMPUTER_SCIENCE_3_YEARS_21_22_CATALOG_ID).await, ) .await; - println!("{:#?}", degree_status.overflow_msgs); - assert_eq!(degree_status.overflow_msgs.len(), 3); } @@ -918,7 +932,7 @@ async fn test_software_engineer_itinerary() { #[test] async fn test_catalog_validations() { - let mut catalog = get_catalog(COMPUTER_SCIENCE_3_YEARS_18_19_CATALOG_ID).await; + let mut catalog = get_catalog(COMPUTER_SCIENCE_3_YEARS_19_20_CATALOG_ID).await; assert!(validate_catalog(&catalog).is_ok()); // Add credit transfer between בחירה חופשית to רשימה א to close a cycle diff --git a/packages/server/src/resources/catalog.rs b/packages/server/src/resources/catalog.rs index dc610f6d..c6683de7 100644 --- a/packages/server/src/resources/catalog.rs +++ b/packages/server/src/resources/catalog.rs @@ -4,6 +4,7 @@ use crate::{ resources::course::CourseBank, }; use bson::{doc, Document}; +use regex::Regex; use serde::{self, Deserialize, Serialize}; use std::collections::HashMap; @@ -26,6 +27,15 @@ pub struct Catalog { } impl Catalog { + pub fn year(&self) -> usize { + let default_year = 2018; + Regex::new(r"(?P\d{4})") + .unwrap() + .captures(&self.name) + .map(|cap| cap["year"].parse::().unwrap_or(default_year)) + .unwrap_or(default_year) + } + pub fn get_course_list(&self, name: &str) -> Vec { let mut course_list_for_bank = Vec::new(); for (course_id, bank_name) in &self.course_to_bank {