Switch to side-by-side view

--- a
+++ b/qiita_pet/handlers/resources.py
@@ -0,0 +1,134 @@
+from tornado.gen import coroutine, Task
+from tornado.web import authenticated, HTTPError
+import json
+import ast
+from .base_handlers import BaseHandler
+from qiita_core.qiita_settings import r_client
+from qiita_core.util import execute_as_transaction
+
+commands = 'resources:commands'
+default_col_name = "samples * columns"
+
+
+class ResourcesHandler(BaseHandler):
+    def check_admin(self):
+        if self.current_user.level != "admin":
+            raise HTTPError(403, reason="%s does not have access to portal "
+                            "editing!" % self.current_user.id)
+
+    @execute_as_transaction
+    def _get_resources(self, cname, sname, version, col_name, callback):
+        resources = {}
+        vals = [
+            ('img_mem', r_client.get),
+            ('img_time', r_client.get),
+            ('time', r_client.get),
+            ('title_mem', r_client.get),
+            ('title_time', r_client.get)
+        ]
+        for k, f in vals:
+            redis_key = 'resources$#%s$#%s$#%s$#%s:%s' % (cname, sname,
+                                                          version, col_name, k)
+            resources[k] = f(redis_key)
+        callback(resources)
+
+    @execute_as_transaction
+    def _get_commands(self, callback):
+        res = r_client.get(commands)
+        callback(res)
+
+    @authenticated
+    @coroutine
+    @execute_as_transaction
+    def get(self):
+        self.check_admin()
+        commands = yield Task(self._get_commands)
+
+        commands_str = commands.decode('utf-8')
+        commands_dict = ast.literal_eval(commands_str)
+        commands_json = json.dumps(commands_dict)
+
+        self.render('resources.html',
+                    img_mem=None, img_time=None,
+                    time=None,
+                    mk=None, ma=None, mb=None,
+                    mmodel=None, mreal=None,
+                    mcalc=None, mfail=None,
+                    tk=None, ta=None, tb=None,
+                    tmodel=None, treal=None,
+                    tcalc=None, tfail=None,
+                    commands=commands_json,
+                    initial_load=True)
+
+    @authenticated
+    @coroutine
+    @execute_as_transaction
+    def post(self):
+        try:
+            data = json.loads(self.request.body)
+            software = data.get('software')
+            version = data.get('version')
+            command = data.get('command')
+
+            resources = yield Task(self._get_resources, command, software,
+                                   version, default_col_name)
+
+            mcof, mmodel, mreal, mcalc, mfail = list(
+                map(lambda x: x.split(b": ")[1].strip().decode('utf-8'),
+                    resources['title_mem'].split(b"\n")))
+
+            tcof, tmodel, treal, tcalc, tfail = list(
+                map(lambda x: x.split(b": ")[1].strip().decode('utf-8'),
+                    resources['title_time'].split(b"\n")))
+
+            mk, ma, mb = mcof.split("||")
+            tk, ta, tb = tcof.split("||")
+
+            response_data = {
+                "status": "success",
+                "img_mem": resources[
+                    'img_mem'].decode('utf-8') if isinstance(
+                    resources['img_mem'], bytes) else resources['img_mem'],
+                "img_time": resources[
+                    'img_time'].decode('utf-8') if isinstance(
+                    resources['img_time'], bytes) else resources['img_time'],
+                "time": resources[
+                    'time'].decode('utf-8') if isinstance(
+                    resources['time'], bytes) else resources['time'],
+                "mk": mk, "ma": ma, "mb": mb,
+                "tk": tk, "ta": ta, "tb": tb,
+                "mmodel": mmodel, "mreal": mreal,
+                "mcalc": mcalc, "mfail": mfail,
+                "tcof": tcof,
+                "tmodel": tmodel, "treal": treal,
+                "tcalc": tcalc, "tfail": tfail,
+                "initial_load": False
+            }
+            self.write(json.dumps(response_data) + "\n")
+
+        except json.JSONDecodeError:
+            self.set_status(400)
+            self.finish({"error": "Invalid JSON data"})
+        except Exception as e:
+            import traceback
+            print(traceback.format_exc())
+            if resources['title_mem'] is None:
+                response_data = {
+                    "status": "no_data",
+                    "img_mem": None,
+                    "img_time": None,
+                    "time": None,
+                    "mk": None, "ma": None, "mb": None,
+                    "tk": None, "ta": None, "tb": None,
+                    "mmodel": None, "mreal": None,
+                    "mcalc": None, "mfail": None,
+                    "tcof": None,
+                    "tmodel": None, "treal": None,
+                    "tcalc": None, "tfail": None,
+                    "initial_load": False
+                }
+                self.set_status(200)
+                self.write(json.dumps(response_data) + "\n")
+            else:
+                self.set_status(500)
+                self.finish({"error": str(e)})