partsdb

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

commit 04f0866bea02ea8c4ace6d860ff8b092dae2d432
parent 47d6d147c08c11e1a64ad888841908c7bce075cd
Author: Paco Esteban <paco@e1e0.net>
Date:   Sun,  8 Oct 2023 17:39:45 +0200

add basic edit part function

Diffstat:
Mpartsdb/database.py | 47+++++++++++++++++++++++++++++++++++++++++++++++
Mpartsdb/partsdb.py | 27+++++++++++++++++++++++++++
Mschema.sql | 6+++---
3 files changed, 77 insertions(+), 3 deletions(-)

diff --git a/partsdb/database.py b/partsdb/database.py @@ -51,6 +51,23 @@ INSERT_PART_QUERY = """ ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?) """ +UPDATE_PART_QUERY = """ + UPDATE parts + SET + pn = ?, + mpn = ?, + manufacturer = ?, + description = ?, + specs = ?, + footprint = ?, + category_id = ?, + storage_id = ?, + quantity = ?, + part_type = ?, + update_date = datetime('now','localtime') + WHERE + id = ? +""" GET_PART_QUERY = """ SELECT p.*, c.name as cat, s.name as storage FROM parts as p, categories as c, storages as s @@ -103,11 +120,21 @@ class PartsDB: c.execute(GET_CATEGORIES_QUERY) return c.fetchall() + def get_category_by_name(self, cat_name): + c = self.conn.cursor() + c.execute(f"{GET_CATEGORIES_QUERY} WHERE name = ?", (cat_name,)) + return c.fetchone() + def get_storages(self): c = self.conn.cursor() c.execute(GET_STORAGES_QUERY) return c.fetchall() + def get_storage_by_name(self, sto_name): + c = self.conn.cursor() + c.execute(f"{GET_STORAGES_QUERY} WHERE name = ?", (sto_name,)) + return c.fetchone() + def list_parts(self): c = self.conn.cursor() c.execute(LIST_PARTS_QUERY) @@ -171,6 +198,26 @@ class PartsDB: c.execute(DELETE_HISTORY_QUERY, (part_id,)) c.execute(DELETE_PART_QUERY, (part_id,)) + def update_part(self, part): + with self.conn: + cat_id = self.get_category_by_name(part["cat"])["id"] + sto_id = self.get_storage_by_name(part["storage"])["id"] + c = self.conn.cursor() + update_tuple = ( + part["pn"], + part["mpn"], + part["manufacturer"], + part["description"], + part["specs"], + part["footprint"], + cat_id, + sto_id, + part["quantity"], + part["part_type"], + part["id"], + ) + c.execute(UPDATE_PART_QUERY, update_tuple) + def get_image(self, part_id): c = self.conn.cursor() c.execute(GET_IMAGE_QUERY, (part_id,)) diff --git a/partsdb/partsdb.py b/partsdb/partsdb.py @@ -4,8 +4,10 @@ import argparse import os +import subprocess import sys import urllib.request +import yaml from partsdb import database as pdb from partsdb import exports @@ -171,6 +173,26 @@ def delete_part(part_id): db.delete_part(part_id) +def edit_part(part_id): + # load part into a tmp yaml + part = db.get_part(part_id) + part_tmp_file = f"/tmp/partsdb_edit_part{part_id}.yaml" + with open(part_tmp_file, mode="w+") as fp: + yaml.dump(dict(part), fp) + + # call vim to edit, load the resulting yaml and update db + with open(part_tmp_file, mode="r") as fp: + subprocess.call(["nvim", fp.name]) + try: + edited_part = yaml.safe_load(fp) + db.update_part(edited_part) + except yaml.YAMLError as exc: + print(exc) + + # clean up + os.remove(part_tmp_file) + + def adjust_stock(part_id, stock_mod, comment): db.new_part_history_event(part_id, stock_mod, comment) db.update_part_qty(part_id, stock_mod) @@ -251,6 +273,9 @@ def main(): # delete ap_delete = asp.add_parser("delete", help="Delete a part") ap_delete.add_argument("part_id", help="Part Id", type=int) + # edit + ap_edit = asp.add_parser("edit", help="Edit a part") + ap_edit.add_argument("part_id", help="Part Id", type=int) # stock ap_stock = asp.add_parser("stock", help="Modifies a part stock") ap_stock.add_argument("part_id", help="Part Id", type=int) @@ -285,6 +310,8 @@ def main(): open_image(args.part_id) elif args.command == "delete": delete_part(args.part_id) + elif args.command == "edit": + edit_part(args.part_id) elif args.command == "stock": adjust_stock(args.part_id, args.stock_mod, args.comment) elif args.command == "export": diff --git a/schema.sql b/schema.sql @@ -25,8 +25,8 @@ CREATE TABLE IF NOT EXISTS parts ( datasheet blob, image blob, part_type text, - insert_date text NOT NULL DEFAULT CURRENT_TIMESTAMP, - update_date text NOT NULL DEFAULT CURRENT_TIMESTAMP, + insert_date text NOT NULL DEFAULT (datetime('now','localtime')), + update_date text NOT NULL DEFAULT (datetime('now','localtime')), FOREIGN KEY (category_id) REFERENCES categories (id), FOREIGN KEY (storage_id) REFERENCES storages (id) ); @@ -35,7 +35,7 @@ CREATE TABLE IF NOT EXISTS parts ( CREATE TABLE IF NOT EXISTS parts_history ( id integer PRIMARY KEY, part_id integer NOT NULL, - insert_date text NOT NULL DEFAULT CURRENT_TIMESTAMP, + insert_date text NOT NULL DEFAULT (datetime('now','localtime')), movement integer NOT NULL, mcomment text, FOREIGN KEY (part_id) REFERENCES parts (id)