From 7bbabc00e4edaedd40ffdeca7ed7e8a02ab63c2c Mon Sep 17 00:00:00 2001
From: "Wade Fagen (waf)" <waf@illinois.edu>
Date: Mon, 16 Jan 2017 17:44:35 -0600
Subject: [PATCH] Add "New Discovery" feature

---
 static/templates/mainPage.html | 93 +++++++++++++++++++++++++++-------
 workbook.py                    | 20 +++++++-
 workbook_utilities.py          | 27 ++++++++++
 3 files changed, 120 insertions(+), 20 deletions(-)

diff --git a/static/templates/mainPage.html b/static/templates/mainPage.html
index 61fa460..203343f 100644
--- a/static/templates/mainPage.html
+++ b/static/templates/mainPage.html
@@ -1,24 +1,76 @@
 {% extends "static/templates/base.html" %}
 {% block content %}
 
+<script>
+var updateNewProjectForm = function() {
+  // Read project name, return if empty
+  var projectName = $("#inputProjectName").val();
+  if (projectName == "") {
+    $("#dirName").html("&mdash;");
+    $("#hiddenDirName").val("");
+    return;
+  }
+
+
+  // Read project type, fix it for directory type
+  var projectType = $("#selectProjectType option:selected").val();
+  if (projectType == "Personal") { projectType = "per"; }
+  else if (projectType == "Demo") { projectType = "demo"; }
+  else if (projectType == "Experience") { projectType = "exp"; }
+  else if (projectType == "Project") { projectType = "proj"; }
+
+
+  // Create the directory name
+  var dirName = projectType + "_" + projectName;
+  // Remove spaces
+  dirName = dirName.replace(/\s+/g, '');
+  // Remove any non-words
+  dirName = dirName.replace(/[^\w]/gi, '')
+
+
+  // Update HTML
+  $("#dirName").html(dirName);
+  $("#hiddenDirName").val(dirName);
+};
+</script>
+
 <div class="row">
   <div class="col-sm-4">
-    <h3>Add New Project</h3>
-    <form class="form-horizontal">
+    <h3>Add New Discovery</h3>
+
+    <p>
+      <i>
+        This form simply populates a new directory with a base set of files for
+        a CS 205 &quot;Discovery&quot;.  You can use it to quickly set up a
+        new directory for working on a new discovery.
+      </i>
+    </p>
+    <hr>
+    <form class="form-horizontal" action="/" method="post">
+      {% if error %}
+      <div class="alert alert-danger" role="alert">
+        {{error | safe}}
+      </div>
+      {% endif %}
+      {% if success %}
+      <div class="alert alert-success" role="alert">
+        {{success | safe}}
+      </div>
+      {% endif %}
       <div class="form-group">
         <label for="inputProjectName" class="col-sm-2 control-label">Name:</label>
         <div class="col-sm-10">
-          <input type="text" class="form-control" id="inputProjectName" placeholder="Project Name">
+          <input oninput="updateNewProjectForm()" type="text" class="form-control" name="projectName" id="inputProjectName" placeholder="Project Name">
         </div>
       </div>
       <div class="form-group">
-        <label for="inputProjectName" class="col-sm-2 control-label">Type:</label>
+        <label for="selectProjectType" class="col-sm-2 control-label">Type:</label>
         <div class="col-sm-10">
-          <select class="form-control">
-            <option>Personal</option>
-            <option>Demo</option>
-            <option>Experience</option>
-            <option>Project</option>
+          <select class="form-control" id="selectProjectType" name="projectType" onchange="updateNewProjectForm()">
+            <option value="Personal">Personal</option>
+            <option value="Demo">Demo</option>
+            <option value="Experience">Experience</option>
+            <option value="Project">Project</option>
           </select>
         </div>
       </div>
@@ -27,24 +79,28 @@
           <b>Dir.:</b>
         </div>
         <div class="col-sm-10">
-          <tt class="dirName">
-            #dirName
-          </tt>
+          <tt id="dirName">&mdash;</tt>
+          <input type="hidden" id="hiddenDirName" name="dirName" value="">
         </div>
       </div>
       <div class="form-group">
         <div class="col-sm-6 col-sm-push-6">
-          <button type="submit" class="btn btn-primary form-control">
+          <button type="submit" class="btn btn-primary form-control" id="buttonSubmit">
             <span class="glyphicon glyphicon-plus-sign"></span>&nbsp;
             Create Project
           </button>
         </div>
       </div>
     </form>
-    <hr />
-    This form does the same thing as creating a directory and creating <tt>project.json</tt>,
-    <tt>web</tt>, <tt>py</tt>, and <tt>res</tt> directories.
-
+  </div>
+  <div class="col-sm-4">
+    <h3>Personal</h3>
+    <ul>
+      {% for item in navigation.personal|sort(attribute="index") %}
+      <li><a href="/{{item.dir}}/">{{item.title}}</a></li>
+      {% endfor %}
+    </ul>
+    <hr>
     <h3>Demos</h3>
     <ul>
       {% for item in navigation.demos|sort(attribute="index") %}
@@ -59,8 +115,7 @@
       <li><a href="/{{item.dir}}/">{{item.title}}</a></li>
       {% endfor %}
     </ul>
-  </div>
-  <div class="col-sm-4">
+    <hr>
     <h3>Projects</h3>
     <ul>
       {% for item in navigation.projects|sort(attribute="index") %}
diff --git a/workbook.py b/workbook.py
index 0eb8858..3aa9f6f 100644
--- a/workbook.py
+++ b/workbook.py
@@ -4,7 +4,7 @@ import logging
 logger = logging.getLogger("workbook")
 
 # helper functions
-from workbook_utilities import run_compute_py, read_project_json, construct_navigation, read_metadata_json
+from workbook_utilities import run_compute_py, read_project_json, construct_navigation, read_metadata_json, create_new_dir
 
 # flask
 from flask import Flask, render_template, jsonify, send_file, send_from_directory, request
@@ -30,6 +30,22 @@ app.logger.setLevel(logging.ERROR)
 #
 # Route the base URL to the main page
 #
+@app.route('/', methods=["POST"])
+def home_createDir():
+    logger.info("Processing index POST...")
+    error = None
+    success = None
+
+    newDirName = request.form["dirName"]
+    if os.path.isdir(newDirName):
+        error = "Directory <b>" + newDirName + "</b> already exists!"
+    else:
+        create_new_dir(newDirName, request.form["projectName"], request.form["projectType"])
+        success = "New directory <b>" + newDirName + "</b> created!"
+
+    navigation = construct_navigation()
+    return render_template('static/templates/mainPage.html', navigation=navigation, error=error, success=success)
+
 @app.route('/')
 def home():
     navigation = construct_navigation()
@@ -81,6 +97,8 @@ def fetchExercise(projectDir):
 
     # Get the project info
     projectInfo = read_project_json(projectDir)
+    if projectInfo == None:
+        return "No project.json found."
     metadata = read_metadata_json(projectDir)
 
     # Figure out what to do based on the value of `show`
diff --git a/workbook_utilities.py b/workbook_utilities.py
index 5be5f8a..1d17262 100644
--- a/workbook_utilities.py
+++ b/workbook_utilities.py
@@ -7,6 +7,29 @@ logger = logging.getLogger("workbook")
 # save the starting cwd
 basecwd = os.getcwd()
 
+
+def create_new_dir(newDirName, projectName, projectType):
+    import datetime
+    import shutil
+
+    # copy files
+    os.chdir(basecwd)
+    shutil.copytree("static/newDirFiles", newDirName)
+
+    # replace project.json with accurate info
+    with open( os.path.join(basecwd, newDirName, "project.json") ) as f:
+        file_str = f.read()
+
+    file_str = file_str.replace("{{TITLE}}", projectName)
+    file_str = file_str.replace("{{TYPE}}", projectType)
+
+    d = datetime.date.today()
+    file_str = file_str.replace("{{INDEX}}", d.strftime("%Y%m%d"))
+
+    with open(os.path.join(basecwd, newDirName, "project.json"), "w") as f:
+        f.write(file_str)
+
+
 def load_src(name, fpath):
     logger.info("-:Loading Python script:%s", fpath)
 
@@ -33,6 +56,10 @@ def read_project_json(dir, project_data = {}):
     project_data["dir"] = dir
 
     fileName = os.path.join(basecwd, dir, "project.json")
+    if not os.path.isfile(fileName):
+        logger.debug("%s:No project.json", dir)
+        return None
+
     logger.debug("%s:Reading project.json", dir)
     with open(fileName) as json_file:
         json_data = json.load(json_file)
-- 
GitLab