From b0fb6e8ac3aa5b114b84146d6156f4079f09a0f7 Mon Sep 17 00:00:00 2001 From: Denys Konovalov Date: Wed, 15 Dec 2021 20:35:21 +0100 Subject: [PATCH] - combined class 11 / class 12 (Oberstufe fix) --- src/indiware_connector.rs | 346 +++++++++++++++++++++++++++++++++++++- 1 file changed, 341 insertions(+), 5 deletions(-) diff --git a/src/indiware_connector.rs b/src/indiware_connector.rs index 22d7988..bbc3f75 100644 --- a/src/indiware_connector.rs +++ b/src/indiware_connector.rs @@ -6,7 +6,7 @@ use quickxml_to_serde::{xml_string_to_json, Config}; use serde_derive::{Deserialize, Serialize}; use serde_json::{json, Map}; -#[derive(Queryable, Serialize, Insertable, Deserialize)] +#[derive(Queryable, Serialize, Insertable, Deserialize, Clone)] #[table_name = "timetable"] pub struct Timetable { pub date: String, @@ -56,6 +56,7 @@ async fn get_timetable_xml_data(url: &str) -> Vec { .unwrap() .as_array() .unwrap(); + dbg!(&classes); classes.to_owned() } @@ -147,11 +148,168 @@ pub async fn get_timetable(_conn: DbConn, url: String) -> Vec { .as_str() .unwrap(), ), - timetable_data: serde_json::from_str(&json!(response).to_string()).unwrap(), + timetable_data: json!(response), }; timetable.push(timetable_element) } - timetable + let normal_classes: Vec = timetable + .to_vec() + .into_iter() + .filter(|e| !e.class.contains("11") && !e.class.contains("12")) + .collect(); + let eleven_classes: Vec = timetable + .to_vec() + .into_iter() + .filter(|e| e.class.contains("11")) + .collect(); + let twelve_classes: Vec = timetable + .to_vec() + .into_iter() + .filter(|e| e.class.contains("12")) + .collect(); + let eleven_timetable_data = { + let mut courses: Vec = Vec::new(); + let mut info: String = String::new(); + for i in eleven_classes { + courses.extend( + i.timetable_data + .as_object() + .unwrap() + .get("courses") + .unwrap() + .as_array() + .unwrap() + .to_owned(), + ); + info = i + .timetable_data + .as_object() + .unwrap() + .get("info") + .unwrap() + .as_str() + .unwrap() + .to_owned(); + } + courses.sort_by(|a, b| { + let n1 = a.as_object().unwrap().get("St").unwrap().as_i64().unwrap(); + let sb1 = a.as_object().unwrap().get("Fa").unwrap().as_str().unwrap(); + let n2 = b.as_object().unwrap().get("St").unwrap().as_i64().unwrap(); + let sb2 = b.as_object().unwrap().get("Fa").unwrap().as_str().unwrap(); + if n1 == n2 { + sb1.cmp(&sb2) + } else { + n1.cmp(&n2) + } + }); + TimetableData { + count: courses.len(), + courses, + info, + } + }; + let eleven = Timetable { + date: String::from( + xml.as_object() + .unwrap() + .get("VpMobil") + .unwrap() + .get("Kopf") + .unwrap() + .get("DatumPlan") + .unwrap() + .as_str() + .unwrap(), + ), + updated: String::from( + xml.as_object() + .unwrap() + .get("VpMobil") + .unwrap() + .get("Kopf") + .unwrap() + .get("zeitstempel") + .unwrap() + .as_str() + .unwrap(), + ), + class: String::from("11"), + timetable_data: json!(eleven_timetable_data), + }; + let twelve_timetable_data = { + let mut courses: Vec = Vec::new(); + let mut info: String = String::new(); + for i in twelve_classes { + courses.extend( + i.timetable_data + .as_object() + .unwrap() + .get("courses") + .unwrap() + .as_array() + .unwrap() + .to_owned(), + ); + info = i + .timetable_data + .as_object() + .unwrap() + .get("info") + .unwrap() + .as_str() + .unwrap() + .to_owned(); + } + courses.sort_by(|a, b| { + let n1 = a.as_object().unwrap().get("St").unwrap().as_i64().unwrap(); + let sb1 = a.as_object().unwrap().get("Fa").unwrap().as_str().unwrap(); + let n2 = b.as_object().unwrap().get("St").unwrap().as_i64().unwrap(); + let sb2 = b.as_object().unwrap().get("Fa").unwrap().as_str().unwrap(); + if n1 == n2 { + sb1.cmp(&sb2) + } else { + n1.cmp(&n2) + } + }); + TimetableData { + count: courses.len(), + courses, + info, + } + }; + let twelve = Timetable { + date: String::from( + xml.as_object() + .unwrap() + .get("VpMobil") + .unwrap() + .get("Kopf") + .unwrap() + .get("DatumPlan") + .unwrap() + .as_str() + .unwrap(), + ), + updated: String::from( + xml.as_object() + .unwrap() + .get("VpMobil") + .unwrap() + .get("Kopf") + .unwrap() + .get("zeitstempel") + .unwrap() + .as_str() + .unwrap(), + ), + class: String::from("12"), + timetable_data: json!(twelve_timetable_data), + }; + let mut timetable_refactored: Vec = Vec::new(); + timetable_refactored.extend(normal_classes); + timetable_refactored.push(eleven); + timetable_refactored.push(twelve); + timetable_refactored } pub async fn get_class_timetable(_conn: DbConn, class: String, url: String) -> TimetableData { @@ -219,6 +377,85 @@ pub async fn get_class_timetable(_conn: DbConn, class: String, url: String) -> T } } break; + } else if class == String::from("11") + && i.as_object() + .unwrap() + .get("Kurz") + .unwrap() + .as_str() + .unwrap() + .replace("/", "_") + .contains(&class) + { + let nothing = json!([""]); + let std = i + .as_object() + .unwrap() + .get("Pl") + .unwrap() + .as_object() + .unwrap() + .get("Std") + .unwrap_or(¬hing); + let mut plan = vec![]; + if std.is_array() { + plan.extend(std.as_array().unwrap().iter().cloned()) + } else if std.is_object() { + plan.push(std.clone()) + } + for i in plan { + if i.as_object() != None { + response.courses.push(i.to_owned()); + } else { + dbg!("Failed: {:?}", &i); + } + } + response.count = response.courses.len(); + } else if class == String::from("12") + && i.as_object() + .unwrap() + .get("Kurz") + .unwrap() + .as_str() + .unwrap() + .replace("/", "_") + .contains(&class) + { + let nothing = json!([""]); + let std = i + .as_object() + .unwrap() + .get("Pl") + .unwrap() + .as_object() + .unwrap() + .get("Std") + .unwrap_or(¬hing); + let mut plan = vec![]; + if std.is_array() { + plan.extend(std.as_array().unwrap().iter().cloned()) + } else if std.is_object() { + plan.push(std.clone()) + } + for i in plan { + if i.as_object() != None { + response.courses.push(i.to_owned()); + } else { + dbg!("Failed: {:?}", &i); + } + } + response.courses.sort_by(|a, b| { + let n1 = a.as_object().unwrap().get("St").unwrap().as_i64().unwrap(); + let sb1 = a.as_object().unwrap().get("Fa").unwrap().as_str().unwrap(); + let n2 = b.as_object().unwrap().get("St").unwrap().as_i64().unwrap(); + let sb2 = b.as_object().unwrap().get("Fa").unwrap().as_str().unwrap(); + if n1 == n2 { + sb1.cmp(&sb2) + } else { + n1.cmp(&n2) + } + }); + response.count = response.courses.len(); } } response @@ -228,14 +465,42 @@ pub async fn get_classes() -> Vec { let classes = get_timetable_xml_data(&String::from("Klassen.xml")).await; let mut class_list: Vec = Vec::new(); for i in classes.iter() { - class_list.push(String::from( + if String::from( i.as_object() .unwrap() .get("Kurz") .unwrap() .as_str() .unwrap(), - )) + ) + .contains("11") + { + if !class_list.contains(&"11".to_string()) { + class_list.push("11".to_string()); + } + } else if String::from( + i.as_object() + .unwrap() + .get("Kurz") + .unwrap() + .as_str() + .unwrap(), + ) + .contains("12") + { + if !class_list.contains(&"12".to_string()) { + class_list.push("12".to_string()); + } + } else { + class_list.push(String::from( + i.as_object() + .unwrap() + .get("Kurz") + .unwrap() + .as_str() + .unwrap(), + )); + } } class_list } @@ -279,7 +544,78 @@ pub async fn get_class_lessons(class: String) -> Vec { id: lesson.get("#text").unwrap().as_i64().unwrap(), }) } + } else if class == String::from("11") + && i.as_object() + .unwrap() + .get("Kurz") + .unwrap() + .as_str() + .unwrap() + .replace("/", "_") + .contains(&class) + { + let class_lessons = i + .as_object() + .unwrap() + .get("Unterricht") + .unwrap() + .as_object() + .unwrap() + .get("Ue") + .unwrap_or(&empty_list) + .as_array() + .unwrap(); + for lesson in class_lessons.iter() { + let lesson = lesson + .as_object() + .unwrap() + .get("UeNr") + .unwrap() + .as_object() + .unwrap(); + lesson_list.push(Lesson { + subject: lesson.get("@UeFa").unwrap().as_str().unwrap().to_string(), + teacher: lesson.get("@UeLe").unwrap().as_str().unwrap().to_string(), + id: lesson.get("#text").unwrap().as_i64().unwrap(), + }) + } + } else if class == String::from("12") + && i.as_object() + .unwrap() + .get("Kurz") + .unwrap() + .as_str() + .unwrap() + .replace("/", "_") + .contains(&class) + { + let class_lessons = i + .as_object() + .unwrap() + .get("Unterricht") + .unwrap() + .as_object() + .unwrap() + .get("Ue") + .unwrap_or(&empty_list) + .as_array() + .unwrap(); + for lesson in class_lessons.iter() { + let lesson = lesson + .as_object() + .unwrap() + .get("UeNr") + .unwrap() + .as_object() + .unwrap(); + lesson_list.push(Lesson { + subject: lesson.get("@UeFa").unwrap().as_str().unwrap().to_string(), + teacher: lesson.get("@UeLe").unwrap().as_str().unwrap().to_string(), + id: lesson.get("#text").unwrap().as_i64().unwrap(), + }) + } } } + lesson_list.sort_by(|a, b| a.subject.cmp(&b.subject)); lesson_list }