From 1f786c1cef72cfbf385dbacc306f9dcfd0e572ce Mon Sep 17 00:00:00 2001
From: Benjamin Bertrand <benjamin.bertrand@esss.se>
Date: Sat, 2 Dec 2017 00:11:38 +0100
Subject: [PATCH] Refactor QR Codes page

---
 app/main/views.py          | 21 +++++++++++----------
 app/templates/base.html    |  2 +-
 app/templates/qrcodes.html | 16 ++++++++++------
 3 files changed, 22 insertions(+), 17 deletions(-)

diff --git a/app/main/views.py b/app/main/views.py
index 5c3d708..99fb980 100644
--- a/app/main/views.py
+++ b/app/main/views.py
@@ -102,17 +102,18 @@ def view_item(ics_id):
     return render_template('view_item.html', item=item.to_dict(long=True))
 
 
-@bp.route('/qrcodes')
+@bp.route('/qrcodes/<kind>')
 @login_required
-def qrcodes():
-    codes = {}
-    for model in (models.Action, models.Manufacturer, models.Model, models.Location, models.Status):
-        items = db.session.query(model).order_by(model.name)
-        images = [{'name': item.name,
-                   'data': utils.image_to_base64(item.image())}
-                  for item in items]
-        codes[model.__name__] = images
-    return render_template('qrcodes.html', codes=codes)
+def qrcodes(kind='Action'):
+    try:
+        model = getattr(models, kind)
+    except AttributeError:
+        raise utils.CSEntryError(f"Unknown model '{kind}'", status_code=422)
+    items = db.session.query(model).order_by(model.name)
+    images = [{'name': item.name,
+               'data': utils.image_to_base64(item.image())}
+              for item in items]
+    return render_template('qrcodes.html', kind=kind, images=images)
 
 
 @bp.route('/attributes', methods=('GET', 'POST'))
diff --git a/app/templates/base.html b/app/templates/base.html
index df8eea2..7d40c2c 100644
--- a/app/templates/base.html
+++ b/app/templates/base.html
@@ -26,7 +26,7 @@
           <a class="nav-item nav-link {{ is_active(path.startswith("/items")) }}" href="{{ url_for('main.list_items') }}">Items</a>
           <a class="nav-item nav-link {{ is_active(path.startswith("/hosts")) }}" href="{{ url_for('main.list_hosts') }}">Hosts</a>
           <a class="nav-item nav-link {{ is_active(path.startswith("/attributes")) }}" href="{{ url_for('main.attributes') }}">Attributes</a>
-          <a class="nav-item nav-link {{ is_active(path.startswith("/qrcodes")) }}" href="{{ url_for('main.qrcodes') }}">QR Codes</a>
+          <a class="nav-item nav-link {{ is_active(path.startswith("/qrcodes")) }}" href="{{ url_for('main.qrcodes', kind='Action') }}">QR Codes</a>
           {% if current_user.is_authenticated and current_user.is_admin %}
             <a class="nav-item nav-link" href="{{ url_for('admin.index') }}">Admin</a>
           {% endif %}
diff --git a/app/templates/qrcodes.html b/app/templates/qrcodes.html
index 91aa071..d725bf4 100644
--- a/app/templates/qrcodes.html
+++ b/app/templates/qrcodes.html
@@ -3,10 +3,16 @@
 {% block title %}QR Codes - CSEntry{% endblock %}
 
 {% block main %}
-  {% for name, images in codes.items() %}
-  <div class="row">
-    <h2>{{ name }} codes</h2>
-  </div>
+  <ul class="nav nav-tabs">
+    {% for item in ('Action', 'Manufacturer', 'Model', 'Location', 'Status') %}
+    <li class="nav-item">
+      <a class="nav-link {% if kind == item %}active{% endif %}" href="{{ url_for('main.qrcodes', kind=item) }}">{{ item }}</a>
+    </li>
+    {% endfor %}
+  </ul>
+
+  <br>
+
   <div class="row">
     {% for image in images %}
     <div class="col-md-3">
@@ -19,6 +25,4 @@
     </div>
     {% endfor %}
   </div>
-  <hr class="separator">
-  {% endfor %}
 {%- endblock %}
-- 
GitLab