From 72dbee1127c6e12b7e19ffc9b691d0a696bf38ef Mon Sep 17 00:00:00 2001
From: Robert Czechowski <robert+git@czecho.de>
Date: Thu, 14 May 2020 11:35:32 +0200
Subject: [PATCH] Make teacher information page configurable in config file

---
 src/config.rs               | 5 +++++
 src/core.rs                 | 8 ++++++--
 src/main.rs                 | 1 +
 src/webfw_iron.rs           | 5 ++++-
 templates/jwinf/teacher.hbs | 6 +++++-
 5 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/src/config.rs b/src/config.rs
index 3005d7d0..80e735cf 100644
--- a/src/config.rs
+++ b/src/config.rs
@@ -18,6 +18,7 @@ pub struct Config {
     pub cookie_signing_secret: Option<String>,
     pub disable_results_page: Option<bool>,
     pub server_message: Option<String>,
+    pub teacher_page: Option<String>,
 }
 
 #[derive(StructOpt, Debug)]
@@ -58,6 +59,10 @@ pub struct Opt {
     /// Disable results page to reduce load on the server
     #[structopt(long = "disable-results-page")]
     pub disableresultspage: bool,
+
+    /// Teacher page in task directory
+    #[structopt(short = "t", long = "teacherpage")]
+    pub teacherpage: Option<String>,
 }
 
 pub fn read_config_from_file(file: &Path) -> Config {
diff --git a/src/core.rs b/src/core.rs
index 018985ae..732d1d79 100644
--- a/src/core.rs
+++ b/src/core.rs
@@ -1030,7 +1030,7 @@ pub fn edit_profile<T: MedalConnection>(conn: &T, session_token: &str, user_id:
     Ok(result)
 }
 
-pub fn teacher_infos<T: MedalConnection>(conn: &T, session_token: &str) -> MedalValueResult {
+pub fn teacher_infos<T: MedalConnection>(conn: &T, session_token: &str, teacher_page: Option<&str>) -> MedalValueResult {
     let session = conn.get_session(&session_token).ensure_logged_in().ok_or(MedalError::NotLoggedIn)?;
     if !session.is_teacher {
         return Err(MedalError::AccessDenied);
@@ -1038,7 +1038,11 @@ pub fn teacher_infos<T: MedalConnection>(conn: &T, session_token: &str) -> Medal
 
     let mut data = json_val::Map::new();
     fill_user_data(&session, &mut data);
-    
+
+    if let Some(teacher_page) = teacher_page {
+        data.insert("teacher_page".to_string(), to_json(&teacher_page));
+    }
+
     Ok(("teacher".to_string(), data))
 }
 
diff --git a/src/main.rs b/src/main.rs
index 3620885c..341ce86b 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -202,6 +202,7 @@ fn main() {
     // Let options override config values
     opt.databasefile.map(|x| config.database_file = Some(x));
     opt.databaseurl.map(|x| config.database_url = Some(x));
+    opt.teacherpage.map(|x| config.teacher_page = Some(x));
     opt.port.map(|x| config.port = Some(x));
     config.no_contest_scan = if opt.nocontestscan { Some(true) } else { config.no_contest_scan };
     config.open_browser = if opt.openbrowser { Some(true) } else { config.open_browser };
diff --git a/src/webfw_iron.rs b/src/webfw_iron.rs
index 43e11d96..97b66100 100644
--- a/src/webfw_iron.rs
+++ b/src/webfw_iron.rs
@@ -875,7 +875,10 @@ fn teacherinfos<C>(req: &mut Request) -> IronResult<Response>
     where C: MedalConnection + std::marker::Send + 'static {
     let session_token = req.expect_session_token()?;
 
-    let (template, data) = with_conn![core::teacher_infos, C, req, &session_token].aug(req)?;
+    let config = req.get::<Read<SharedConfiguration>>().unwrap();
+
+    let (template, data) = with_conn![core::teacher_infos, C, req, &session_token, config.teacher_page.as_ref().map(|x| &**x)].aug(req)?;
+    // .as_ref().map(|x| &**x) can be written as .as_deref() since rust 1.40
 
     let mut resp = Response::new();
     resp.set_mut(Template::new(&template, data)).set_mut(status::Ok);
diff --git a/templates/jwinf/teacher.hbs b/templates/jwinf/teacher.hbs
index 0395a861..60967842 100644
--- a/templates/jwinf/teacher.hbs
+++ b/templates/jwinf/teacher.hbs
@@ -2,7 +2,11 @@
   <div class="columns">
     <div class="column is-8 is-offset-2">
       <h3 class="title is-4">Lehrer-Informationen</h3>
-      <iframe src="/tasks/teacher/index.html" style="height: calc(100vh - 550px); min-height:200px;"></iframe>
+      {{#if teacher_page }}
+        <iframe src="/tasks/{{ teacher_page  }}" style="height: calc(100vh - 550px); min-height:200px;"></iframe>
+      {{else}}
+        <em>Noch keine Informationen vorhanden</em>
+      {{/if}}
     </div>
   </div>
 {{/inline}}
-- 
GitLab