partsdb

electronic parts inventory
git clone https://git.e1e0.net/partsdb.git
Log | Files | Refs

commit b13fab7fa881a5702588e44863c3ed67961101a7
parent 0b52bc8af2274035d4b5d81dd0546dbad538db00
Author: Paco Esteban <paco@e1e0.net>
Date:   Sun,  4 Apr 2021 17:43:39 +0200

basic html export functionality

Diffstat:
Aexports/__init__.py | 0
Aexports/templates/cat.html | 41+++++++++++++++++++++++++++++++++++++++++
Aexports/templates/index.html | 22++++++++++++++++++++++
Aexports/templates/part.html | 66++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aexports/templates/style.css | 17+++++++++++++++++
Mhelpers.py | 24++++++++++++++++++++++++
Mpartsdb.py | 18+++++++++++++++++-
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 }} &rarr; {{ 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():