diff --git a/api/namespace.py b/api/namespace.py
index 263db29..894857b 100644
--- a/api/namespace.py
+++ b/api/namespace.py
@@ -1,6 +1,6 @@
import logging as log
import datetime
-
+import json
from google.appengine.api import namespace_manager
from core.handlers.base import ProtectedRequestHandler
@@ -16,3 +16,10 @@ def persist_namespace(self):
def get(self):
log.info("User {} set namespace to be {}".format(self.current_user_email, self.request.get("namespace")))
self.redirect("/")
+
+
+class NamespaceAPIList(ProtectedRequestHandler):
+ def get(self):
+ context = self._extra_context({})
+ self.response.write(json.dumps(context['available_namespaces']))
+
diff --git a/core/handlers/base.py b/core/handlers/base.py
index 9b51d68..bd66acb 100644
--- a/core/handlers/base.py
+++ b/core/handlers/base.py
@@ -1,6 +1,7 @@
import os
import logging as log
from copy import copy
+import datetime
from google.appengine.api.namespace_manager import namespace_manager
import jinja2
@@ -52,6 +53,7 @@ def namespace(self):
def persist_namespace(self):
namespace_from_cookies = self.request.cookies.get("namespace", None)
namespace = namespace_from_cookies or "production"
+ self.response.set_cookie('namespace', namespace, expires=datetime.datetime.now() + datetime.timedelta(days=365))
namespace_manager.set_namespace(namespace)
@staticmethod
diff --git a/static/css/base.css b/static/css/base.css
index 5991e60..0bf0bbb 100644
--- a/static/css/base.css
+++ b/static/css/base.css
@@ -100,4 +100,9 @@ html {
.btn-round {border-radius: 50%;}
.btn-fade {opacity: 0.5;}
-#err {color: #FFA081;}
\ No newline at end of file
+#err {color: #FFA081;}
+
+
+.namespace-active{background-color: #42B5FF;margin-right:10px;color:#FFF;padding:0 5px;border-radius: 2px;}
+.namespace-inactive{color: black;margin-right:10px;}
+
diff --git a/static/js/base.js b/static/js/base.js
index 1562f74..9eea486 100644
--- a/static/js/base.js
+++ b/static/js/base.js
@@ -70,11 +70,54 @@ var Err = React.createClass({
}
});
+
+var NameSpaceChecker = React.createClass({
+ getInitialState: function() {
+ return {namespace: getNamespace(), availableNamespaces: []}
+ },
+ getNamespaceFromCookie: function() {
+ var ns = getNamespace();
+ console.log(ns);
+ this.setState({namespace: ns})
+ },
+ getFromServer: function() {
+ $.ajax({
+ url: "/api/namespace/list",
+ dataType: 'json',
+ cache: false,
+ success: function(data) {
+ this.setState({availableNamespaces: data});
+ }.bind(this),
+ error: function(xhr, status, err) {
+ console.error(this.props.url, status, err.toString());
+ }.bind(this)
+ });
+ },
+ componentDidMount: function() {
+ this.getFromServer();
+ setInterval(this.getNamespaceFromCookie, 5000);
+ },
+ render: function() {
+ var el = {
+ this.state.availableNamespaces.map(function(ns){
+ var url = "/api/namespace/?namespace=" + ns;
+ var cName = (this.state.namespace == ns) ? "namespace-active" : "namespace-inactive";
+ return {ns}
+ }.bind(this))
+ };
+
+ return el
+ }
+});
+
+
if (React.render) {
React.render(