From ff24aa7a2f2ca56b79920b75ed648a05ca063afb Mon Sep 17 00:00:00 2001 From: Dominic Grimm Date: Fri, 27 Jan 2023 22:12:06 +0100 Subject: [PATCH] Update --- src/lib.rs | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 76 insertions(+), 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index a9c6e33..07f91c7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -285,7 +285,7 @@ struct ApiTeachersResponse { } #[derive(Deserialize, Debug)] -pub struct ApiReportStudent { +pub struct ApiReportUser { pub name: String, #[serde(rename = "longName")] pub long_name: String, @@ -746,7 +746,7 @@ impl Client { Ok(resp.data.elements) } - pub async fn student_reports(&self, class_id: i32) -> Result> { + pub async fn student_reports(&self, class_id: i32) -> Result> { #[derive(Deserialize, Debug)] struct Data { finished: bool, @@ -816,7 +816,80 @@ impl Client { .from_reader(records.as_bytes()); Ok(reader - .deserialize::() + .deserialize::() + .collect::, _>>()?) + } + + pub async fn teacher_reports(&self, class_id: i32) -> Result> { + #[derive(Deserialize, Debug)] + struct Data { + finished: bool, + error: bool, + #[serde(rename = "messageId")] + message_id: i32, + #[serde(rename = "reportParams")] + report_params: String, + } + + #[derive(Deserialize, Debug)] + struct Response { + data: Data, + } + + let mut url = self.webuntis_url.join("reports.do")?; + url.query_pairs_mut() + .append_pair("name", "Teacher") + .append_pair("format", "csv") + .append_pair("elementsForDate", "true"); + let resp: Response = reqwest::Client::new() + .get(url) + .header(reqwest::header::USER_AGENT, &self.user_agent) + .header(reqwest::header::ACCEPT, "application/json") + .header( + reqwest::header::COOKIE, + self.session.as_ref().context("Not logged in")?, + ) + .header( + reqwest::header::AUTHORIZATION, + Client::construct_bearer(&self.authorization.as_ref().context("Not logged in")?), + ) + .send() + .await? + .json() + .await?; + if resp.data.error { + bail!("Error generating report"); + } else if !resp.data.finished { + bail!("Report not finished"); + } + + let mut records_url = self.webuntis_url.join("reports.do")?; + records_url.set_query(Some(&resp.data.report_params)); + records_url + .query_pairs_mut() + .append_pair("msgId", &resp.data.message_id.to_string()); + let records = reqwest::Client::new() + .get(records_url) + .header(reqwest::header::USER_AGENT, &self.user_agent) + .header(reqwest::header::ACCEPT, "text/csv") + .header( + reqwest::header::COOKIE, + self.session.as_ref().context("Not logged in")?, + ) + .header( + reqwest::header::AUTHORIZATION, + Client::construct_bearer(&self.authorization.as_ref().context("Not logged in")?), + ) + .send() + .await? + .text() + .await?; + let mut reader = csv::ReaderBuilder::new() + .delimiter(b'\t') + .from_reader(records.as_bytes()); + + Ok(reader + .deserialize::() .collect::, _>>()?) } }