commit b13fab7fa881a5702588e44863c3ed67961101a7
parent 0b52bc8af2274035d4b5d81dd0546dbad538db00
Author: Paco Esteban <paco@e1e0.net>
Date: Sun, 4 Apr 2021 17:43:39 +0200
basic html export functionality
Diffstat:
7 files changed, 187 insertions(+), 1 deletion(-)
diff --git a/exports/__init__.py b/exports/__init__.py
diff --git a/exports/templates/cat.html b/exports/templates/cat.html
@@ -0,0 +1,41 @@
+<!doctype html>
+
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+
+ <title>partsdb >> "{{ category.name }}" index</title>
+ <meta name="description" content="partsdb category index">
+ <meta name="author" content="e1e0">
+
+ <link rel="stylesheet" href="style.css?v=1.0">
+</head>
+<body>
+ <p><a href="index.html">Index</a></p>
+ <p>{{ category.name }}</p>
+ <table>
+ <tr>
+ <th>ID</th>
+ <th>PN</th>
+ <th>MPN</th>
+ <th>Manufacturer</th>
+ <th>Desc</th>
+ <th>Footprint</th>
+ <th>Type</th>
+ <th>Qty</th>
+ </tr>
+ {% for p in parts %}
+ <tr>
+ <td>{{ p.id }}</td>
+ <td><a href="part_{{ p.id }}.html">{{ p.pn }}</a></td>
+ <td><a href="part_{{ p.id }}.html">{{ p.mpn }}</a></td>
+ <td>{{ p.manufacturer }}</td>
+ <td>{{ p.description[:40] }}</td>
+ <td>{{ p.footprint }}</td>
+ <td>{{ p.part_type }}</td>
+ <td>{{ p.quantity }}</td>
+ </tr>
+ {% endfor %}
+ </table>
+</body>
+</html>
diff --git a/exports/templates/index.html b/exports/templates/index.html
@@ -0,0 +1,22 @@
+<!doctype html>
+
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+
+ <title>partsdb category index</title>
+ <meta name="description" content="partsdb category index">
+ <meta name="author" content="e1e0">
+
+ <link rel="stylesheet" href="style.css?v=1.0">
+</head>
+<body>
+ <h1>PartsDB</h1>
+ <p>Categories:</p>
+ <ul>
+ {% for c in cat %}
+ <li><a href="cat_list_{{ c.id }}.html">{{ c.name }}</a></li>
+ {% endfor %}
+ </ul>
+</body>
+</html>
diff --git a/exports/templates/part.html b/exports/templates/part.html
@@ -0,0 +1,66 @@
+<!doctype html>
+
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+
+ <title>partsdb >> {{ part.pn }}</title>
+ <meta name="description" content="partsdb part description">
+ <meta name="author" content="e1e0">
+
+ <link rel="stylesheet" href="style.css?v=1.0">
+</head>
+<body>
+ <p><a href="index.html">Index</a> || <a href="cat_list_{{ part.category_id }}.html">{{ part.cat }}</a></p>
+ <p>{{ part.pn }}</p>
+ <table>
+ <tbody>
+ <tr>
+ <td><span class="field">Id:</span> {{ part.id }}</td>
+ <td><span class="field">PN:</span> {{ part.pn }}</td>
+ <td><span class="field">Manufacturer:</span> {{ part.manufacturer }}</td>
+ </tr>
+ <tr>
+ <td><span class="field">Category:</span> {{ part.cat }}</td>
+ <td><span class="field">Type:</span> {{ part.type }}</td>
+ <td><span class="field">Footprint:</span> {{ part.footprint }}</td>
+ </tr>
+ <tr>
+ <td><span class="field">Storage:</span> {{ part.storage }}</td>
+ <td><span class="field">Created:</span> {{ part.insert_date }}</td>
+ <td><span class="field">Updated:</span> {{ part.update_date }}</td>
+ </tr>
+ <tr>
+ <td colspan="3">
+ <span class="field">Description:</span> <br />
+ {{ part.description }}
+ </td>
+ </tr>
+ <tr>
+ <td colspan="3">
+ <span class="field">Specs:</span> <br />
+ {{ part.specs }}
+ </td>
+ </tr>
+ <tr>
+ <td colspan="3">
+ <a href="" >Datasheet</a>
+ <a href="" >Image</a>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="3">
+ <span class="field">Stock Quantity:</span> {{ part.quantity }}
+ <br />
+ <span class="field">History:</span><br />
+ <ul>
+ {% for h in history %}
+ <li>{{ h.insert_date }} → {{ h.movement }} ({{ h.mcomment }})</li>
+ {% endfor %}
+ </ul>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+</body>
+</html>
diff --git a/exports/templates/style.css b/exports/templates/style.css
@@ -0,0 +1,17 @@
+table, th, td {
+ border: 1px solid black;
+ border-collapse: collapse;
+}
+
+th, td {
+ padding: 15px;
+ /* text-align: left; */
+}
+
+h1 {
+ text-decoration: underline;
+}
+
+.field {
+ font-weight: bold;
+}
diff --git a/helpers.py b/helpers.py
@@ -101,3 +101,27 @@ def open_file(content, extension):
f.write(content)
subprocess.Popen(['xdg-open', f.name], start_new_session=True)
time.sleep(2)
+
+
+def html_main_index(dest_folder, categories, env):
+ tpl = env.get_template('index.html')
+ with open(f'{dest_folder}/index.html', 'w') as f:
+ f.write(tpl.render(cat=categories))
+
+
+def html_category_index(dest_folder, category, parts, env):
+ tpl = env.get_template('cat.html')
+ with open(f"{dest_folder}/cat_list_{category['id']}.html", 'w') as f:
+ f.write(tpl.render(category=category, parts=parts))
+
+
+def html_part(dest_folder, part, part_history, env):
+ tpl = env.get_template('part.html')
+ with open(f"{dest_folder}/part_{part['id']}.html", 'w') as f:
+ f.write(tpl.render(part=part, history=part_history))
+
+
+def html_css(dest_folder, env):
+ tpl = env.get_template('style.css')
+ with open(f"{dest_folder}/style.css", 'w') as f:
+ f.write(tpl.render())
diff --git a/partsdb.py b/partsdb.py
@@ -7,6 +7,8 @@ import os
import sys
import urllib.request
+from jinja2 import Environment, PackageLoader, select_autoescape
+
from database import PartsDB
from helpers import *
from octopart import OctopartClient
@@ -170,7 +172,21 @@ def adjust_stock(part_id, stock_mod, comment):
def export_db(dest_folder):
- pass
+ env = Environment(
+ loader=PackageLoader('exports', 'templates'),
+ autoescape=select_autoescape(['html', 'xml'])
+ )
+ categories = db.get_categories()
+ html_main_index(dest_folder, categories, env)
+ for c in categories:
+ parts = db.list_parts_by_category(c['name'])
+ html_category_index(dest_folder, c, parts, env)
+ parts = db.list_parts()
+ for p in parts:
+ part = db.get_part(p['id'])
+ history = db.get_part_history(p['id'])
+ html_part(dest_folder, part, history, env)
+ html_css(dest_folder, env)
def list_categories():