From b0aeb6011a866b0f60ce81adbefd074e68870c8d Mon Sep 17 00:00:00 2001
From: YSelf Tool <yselftool@gmail.com>
Date: Fri, 11 Sep 2015 16:46:43 +0200
Subject: [PATCH] Added time view, single template for update javascript files

---
 modules/admin.py                         | 20 ++++++++--------
 modules/speech.py                        | 17 +++++++++-----
 server.py                                | 30 +++++++++++++++++-------
 shared.py                                |  7 +++++-
 templates/content_time.html              |  1 +
 templates/layout.html                    |  5 ++++
 templates/{update_index.js => update.js} |  7 +++---
 templates/update_show.js                 | 30 ------------------------
 8 files changed, 58 insertions(+), 59 deletions(-)
 create mode 100644 templates/content_time.html
 rename templates/{update_index.js => update.js} (76%)
 delete mode 100644 templates/update_show.js

diff --git a/modules/admin.py b/modules/admin.py
index 876457f..d18ca5c 100644
--- a/modules/admin.py
+++ b/modules/admin.py
@@ -1,11 +1,11 @@
-from flask import Blueprint, render_template, redirect, url_for, request, flash, abort, send_file, Response
+from flask import Blueprint, redirect, url_for, request, flash, abort, send_file, Response
 from flask.ext.login import login_required
 from passlib.hash import pbkdf2_sha256
 
 from models.database import User, Event
 from models.forms import AdminUserForm, NewUserForm, NewEventForm
 
-from shared import db, admin_permission
+from shared import db, admin_permission, render_layout
 
 admin = Blueprint("admin", __name__)
 
@@ -16,14 +16,14 @@ admin = Blueprint("admin", __name__)
 def index():
     users = User.query.limit(10).all()
     events = Event.query.limit(10).all()
-    return render_template("admin_index.html", users=users, events=events)
+    return render_layout("admin_index.html", users=users, events=events)
 
 @admin.route("/user/")
 @login_required
 @admin_permission.require()
 def user():
     users = User.query.all()
-    return render_template("admin_user_index.html", users=users)
+    return render_layout("admin_user_index.html", users=users)
 
 @admin.route("/user/edit", methods=["GET", "POST"])
 @login_required
@@ -38,7 +38,7 @@ def user_edit():
             db.session.commit()
             return redirect(url_for(".index"))
         else:
-            return render_template("admin_user_edit.html", form=form, id=user_id)
+            return render_layout("admin_user_edit.html", form=form, id=user_id)
     else:
         return redirect(url_for(".index"))
             
@@ -66,7 +66,7 @@ def user_new():
         db.session.add(user)
         db.session.commit()
         return redirect(url_for(".user"))
-    return render_template("admin_user_new.html", form=form)
+    return render_layout("admin_user_new.html", form=form)
 
 
 @admin.route("/event/new", methods=["GET", "POST"])
@@ -77,12 +77,12 @@ def event_new():
     if form.validate_on_submit():
         if Event.query.filter_by(name=form.name.data).count() > 0:
             flash("There already is an event with that name.", "alert-error")
-            return render_template("admin_event_new.html", form=form)
+            return render_layout("admin_event_new.html", form=form)
         event = Event(form.name.data, form.date.data)
         db.session.add(event)
         db.session.commit()
         return redirect(url_for(".event"))
-    return render_template("admin_event_new.html", form=form)
+    return render_layout("admin_event_new.html", form=form)
 
 @admin.route("/event/delete")
 @login_required
@@ -109,7 +109,7 @@ def event_edit():
             db.session.commit()
             return redirect(url_for(".index"))
         else:
-            return render_template("admin_event_edit.html", form=form, id=event_id)
+            return render_layout("admin_event_edit.html", form=form, id=event_id)
     else:
         return redirect(url_for(".index"))
 
@@ -119,4 +119,4 @@ def event_edit():
 def event():
     events = Event.query.all()
     print(events)
-    return render_template("admin_event_index.html", events=events)
+    return render_layout("admin_event_index.html", events=events)
diff --git a/modules/speech.py b/modules/speech.py
index dc76132..56b2bb4 100644
--- a/modules/speech.py
+++ b/modules/speech.py
@@ -1,14 +1,16 @@
-from flask import Blueprint, render_template, redirect, url_for, request, flash, abort, send_file, Response
+from flask import Blueprint, redirect, url_for, request, flash, abort, send_file, Response
 from flask.ext.login import login_required
 
 from models.database import User, Statement, Speaker, Event
 from models.forms import AddStatementForm
 
-from shared import db, admin_permission, user_permission
+from shared import db, admin_permission, user_permission, render_layout
 
 from datetime import datetime
 import json
 
+import config
+
 speech = Blueprint("speech", __name__)
 
 def transpose(arr):
@@ -41,7 +43,7 @@ def index():
             form.event.data = event.id
             meta.append((query_statements(mode, event.id), form, event))
         event_id = -1
-    return render_template("speech_index.html", meta=meta, event_id=event_id)
+    return render_layout("speech_index.html", meta=meta, event_id=event_id)
 
 @speech.route("/show")
 def show():
@@ -54,7 +56,7 @@ def show():
     else:
         for event in Event.query.all():
             meta.append((query_statements(mode, event.id), event))
-    return render_template("speech_show.html", mode=mode, meta=meta, event_id=event_id)
+    return render_layout("speech_show.html", mode=mode, meta=meta, event_id=event_id)
 
 @speech.route("/update")
 def update():
@@ -67,7 +69,7 @@ def update():
     else:
         for event in Event.query.all():
             meta.append((query_statements(mode, event.id), event))
-    return render_template("speech_content_show.html", mode=mode, meta=meta)
+    return render_layout("speech_content_show.html", mode=mode, meta=meta)
 
 
 @speech.route("/add", methods=["GET", "POST"])
@@ -130,7 +132,10 @@ def done():
 
 @speech.route("/update_show.js")
 def update_show_js():
+    update_interval = config.UPDATE_SHOW_INTERVAL or 1
+    div = "rede-content-div"
     mode = request.args.get("mode", "pending")
     event_id = request.args.get("event", -1)
-    return render_template("update_show.js", mode=mode, event_id=event_id)
+    target_url = url_for(".update", mode=mode, event=event_id)
+    return render_layout("update.js", update_interval=update_interval, div=div, target_url=target_url)
 
diff --git a/server.py b/server.py
index d1a7a22..42c4241 100755
--- a/server.py
+++ b/server.py
@@ -1,12 +1,12 @@
 #!/usr/bin/env python3
 
-from flask import Flask, g, current_app, request, render_template, session, flash, redirect, url_for, abort
+from flask import Flask, g, current_app, request, session, flash, redirect, url_for, abort
 from flask.ext.login import login_user, logout_user, login_required, current_user
 from flask.ext.principal import Principal, Identity, AnonymousIdentity, identity_changed, identity_loaded, UserNeed, RoleNeed
 from passlib.hash import pbkdf2_sha256
 
 import config
-from shared import db, login_manager
+from shared import db, login_manager, render_layout
 from models.forms import LoginForm, NewUserForm
 from models.database import User, Statement, Speaker, Event
 
@@ -41,7 +41,7 @@ def index():
         no_speaker = Speaker("No Speaker", event)
         no_statement = Statement(no_speaker, event)
         meta.append((ls[0] if len(ls) > 0 else (no_statement, no_speaker, ()), event))
-    return render_template("index.html", meta=meta)
+    return render_layout("index.html", meta=meta)
 
 @app.route("/update")
 def update():
@@ -52,11 +52,25 @@ def update():
         no_speaker = Speaker("No Speaker", event)
         no_statement = Statement(no_speaker, event)
         meta.append((ls[0] if len(ls) > 0 else (no_statement, no_speaker, ()), event))
-    return render_template("content_index.html", meta=meta)
+    return render_layout("content_index.html", meta=meta)
 
 @app.route("/update.js")
 def update_js():
-    return render_template("update_index.js")
+    update_interval = config.UPDATE_INDEX_INTERVAL or 1
+    div = "rede-content-div"
+    target_url = url_for(".update")
+    return render_layout("update.js", update_interval=update_interval, div=div, target=target_url)
+
+@app.route("/update_time")
+def update_time():
+    return render_layout("content_time.html")
+
+@app.route("/update_time.js")
+def update_time_js():
+    update_interval = config.UPDATE_TIME_INTERVAL or 10
+    div = "rede-time-div"
+    target_url = url_for("update_time")
+    return render_layout("update.js", update_interval=update_interval, div=div, target_url=target_url)
 
 @app.route("/login", methods=["GET", "POST"])
 def login():
@@ -70,7 +84,7 @@ def login():
             return redirect(request.args.get("next") or url_for(".index"))
         else:
             flash("Invalid username or wrong password", "alert-error")
-    return render_template("login.html", form=form)
+    return render_layout("login.html", form=form)
 
 @app.route("/logout", methods=["GET", "POST"])
 @login_required
@@ -89,14 +103,14 @@ def register():
         length = len(db.session.query(User).filter_by(username=form.username.data).all())
         if length > 0:
             flash("There already is a user with that name.")
-            return render_template("register.html", form=form)
+            return render_layout("register.html", form=form)
         password = pbkdf2_sha256.encrypt(form.password.data, rounds=200000, salt_size=16)
         user = User(fullname, username, password, [])
         db.session.add(user)
         db.session.commit()
         flash("Your account has been created, you may now log in with it.")
         return redirect(url_for(".login"))
-    return render_template("register.html", form=form)
+    return render_layout("register.html", form=form)
 
 @identity_loaded.connect_via(app)
 def on_identity_loaded(sender, identity):
diff --git a/shared.py b/shared.py
index dcb2bc7..9235757 100644
--- a/shared.py
+++ b/shared.py
@@ -1,7 +1,8 @@
-from flask import abort
+from flask import abort, render_template
 from flask.ext.sqlalchemy import SQLAlchemy
 from flask.ext.login import LoginManager
 from flask.ext.principal import Permission, RoleNeed
+from datetime import datetime
 
 db = SQLAlchemy()
 login_manager = LoginManager()
@@ -9,3 +10,7 @@ login_manager = LoginManager()
 admin_permission = Permission(RoleNeed("admin"))
 user_permission = Permission(RoleNeed("user"))
 roles = ["user", "admin"]
+
+def render_layout(template, **kwargs):
+    current_time = datetime.now()
+    return render_template(template, current_time=current_time, **kwargs)
diff --git a/templates/content_time.html b/templates/content_time.html
new file mode 100644
index 0000000..475a692
--- /dev/null
+++ b/templates/content_time.html
@@ -0,0 +1 @@
+{{ current_time.strftime("%H:%M") }}
diff --git a/templates/layout.html b/templates/layout.html
index 41c8ead..ddb82e4 100644
--- a/templates/layout.html
+++ b/templates/layout.html
@@ -12,6 +12,7 @@
     <meta name="mobile-web-app-capable" content="yes">
     <link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}" />
     <title>{% block title %}Unknown Page{% endblock %} - Redeleitsystem</title>
+    <script src="{{ url_for("update_time_js") }}" async></script>
     {% block additional_js %}
     <!-- Place to insert more .js-files -->
     {% endblock %}
@@ -23,6 +24,10 @@
         <div class="mdl-layout__header-row">
             <a href="{{ url_for('index') }}"><span class="mdl-layout-title">Redeleitsystem</span></a>
             <div class="mdl-layout-spacer"></div>
+            <span id="rede-time-div" class="mdl-layout-title">
+                {% include "content_time.html" %}
+            </span>
+            <div class="mdl-layout-spacer"></div>
             <button class="mdl-button mdl-js-button mdl-js-ripple-effet mdl-button--icon" id="hdrbtn">
                 <i class="material-icons">more_vert</i>
             </button>
diff --git a/templates/update_index.js b/templates/update.js
similarity index 76%
rename from templates/update_index.js
rename to templates/update.js
index ee2e39c..c6634de 100644
--- a/templates/update_index.js
+++ b/templates/update.js
@@ -11,20 +11,19 @@ function request() {
             update(xmlhttp.responseText);
         }
     };
-    var target = "{{ url_for('.update') }}";
+    var target = "{{ target_url }}";
     xmlhttp.open("GET", target, true);
     xmlhttp.send();
 }
 
 function update(data) {
     if (data != last_content) {
-        document.getElementById("rede-content-div").innerHTML = data;
+        document.getElementById("{{ div }}").innerHTML = data;
         last_content = data;
     }
 }
 
 window.onload=function() {
-    window.setInterval(request, 1000);
+    window.setInterval(request, 1000 * {{ update_interval }});
 }
 
-
diff --git a/templates/update_show.js b/templates/update_show.js
deleted file mode 100644
index 54ec839..0000000
--- a/templates/update_show.js
+++ /dev/null
@@ -1,30 +0,0 @@
-var returned = true;
-var last_content = "";
-function request() {
-    if (!returned)
-        return;
-    returned = false;
-    var xmlhttp = new XMLHttpRequest();
-    xmlhttp.onreadystatechange=function() {
-        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
-            returned = true;
-            update(xmlhttp.responseText);
-        }
-    };
-    var target = "{{ url_for('.update', mode=mode, event=event_id) }}";
-    xmlhttp.open("GET", target, true);
-    xmlhttp.send();
-}
-
-function update(data) {
-    if (data != last_content) {
-        document.getElementById("rede-content-div").innerHTML = data;
-        last_content = data;
-    }
-}
-
-window.onload=function() {
-    window.setInterval(request, 1000);
-}
-
-
-- 
GitLab