From 6c5e5568ea646231e160fef29671d20e823fc093 Mon Sep 17 00:00:00 2001 From: crudo Date: Fri, 24 Mar 2017 21:04:10 +0100 Subject: [PATCH] Database schema change. Implement ProductCategory. * The user can now create product categories with the 'category add' command. * The user can now add products to categories with the 'product add --category INT' command. --- cli.py | 76 +++++++++++++++++++++++++++++++++++++++++++++---- pos/database.py | 14 +++++++++ 2 files changed, 84 insertions(+), 6 deletions(-) diff --git a/cli.py b/cli.py index 00bc4c0..fdb4315 100755 --- a/cli.py +++ b/cli.py @@ -5,7 +5,8 @@ from datetime import datetime from pos.config import Config from pos.logging import init_logging, get_logger -from pos.database import Database, User, Event, Product, Transaction +from pos.database import Database, User, Event, ProductCategory, Product,\ + Transaction config = Config() conf_db = config.core['DATABASE'] @@ -30,6 +31,14 @@ def cli(): pass +@cli.command('initdb') +def initdb(): + with db.get_session() as session: + categories = session.query(ProductCategory).count() + if not categories: + session.add(ProductCategory(name='Default')) + + @cli.group('user') def user(): pass @@ -218,15 +227,60 @@ def event_set(event_uid, name, start, end): print(tabulate_events([event])) +@cli.group('category') +def category(): + pass + + +@category.command('add') +@click.option('-s', '--sort', type=click.INT) +@click.argument('name') +def category_add(name, sort): + category = ProductCategory(name=name) + + if sort: + category.sort = sort + + with db.get_session() as session: + session.add(category) + print("Category successfully added.") + + +def tabulate_categories(categories): + tab = [["UID", "Name", "Sort", "Created at"]] + for c in categories: + tab.append([c.uid, c.name, c.sort, c.created_at]) + return tabulate(tab, headers='firstrow') + + +@category.command('list') +@click.option('-s', '--sort', is_flag=True) +def category_list(sort): + with db.get_session() as session: + categories = session.query(ProductCategory) + + if sort: + categories = categories.order_by(ProductCategory.sort.asc()) + + categories = categories.all() + + if categories: + print(tabulate_categories(categories)) + else: + print("No categories found.") + + @cli.group('product') def product(): pass def tabulate_products(products): - tab = [["UID", "Name", "Price", "Sort", "Enabled", "Created at"]] + tab = [["UID", "Name", "Price", "Sort", "Category", + "Enabled", "Created at"]] for p in products: - tab.append([p.uid, p.name, p.price, p.sort, p.is_active, p.created_at]) + tab.append([p.uid, p.name, p.price, p.sort, p.category.name, + p.is_active, p.created_at]) return tabulate(tab, headers='firstrow') @@ -234,12 +288,18 @@ def tabulate_products(products): @click.argument('name') @click.argument('price') @click.option('-s', '--sort', type=click.INT) -def product_add(name, price, sort): +@click.option('-c', '--category', type=click.INT) +def product_add(name, price, sort, category): product = Product(name=name, price=price) if sort: product.sort = sort + if category: + product.category_uid = category + else: + product.category_uid = 1 + with db.get_session() as session: session.add(product) print("Product successfully added.") @@ -266,8 +326,9 @@ def product_list(sort): @click.option('-n', '--name') @click.option('-p', '--price', type=click.INT) @click.option('-s', '--sort', type=click.INT) +@click.option('-c', '--category', type=click.INT) @click.argument('product_uid') -def product_set(product_uid, name, price, sort): +def product_set(product_uid, name, price, sort, category): with db.get_session() as session: product = session.query(Product).get(product_uid) @@ -284,7 +345,10 @@ def product_set(product_uid, name, price, sort): if sort: product.sort = sort - if any([name, price, sort]): + if category: + product.category_uid = category + + if any([name, price, sort, category]): with db.get_session() as session: session.add(product) print("Event successfully edited.") diff --git a/pos/database.py b/pos/database.py index 6e17049..1f7daa0 100644 --- a/pos/database.py +++ b/pos/database.py @@ -113,15 +113,29 @@ class Event(Base): transactions = relationship('Transaction', lazy='joined') +class ProductCategory(Base): + __tablename__ = 'product_categories' + uid = Column(Integer, primary_key=True) + name = Column(String, nullable=False) + sort = Column(Integer, nullable=False, server_default='0') + created_at = Column(DateTime, nullable=False, default=datetime.now) + + products = relationship('Product', lazy='joined') + + class Product(Base): __tablename__ = 'products' uid = Column(Integer, primary_key=True) name = Column(String, nullable=False) price = Column(Integer, nullable=False) sort = Column(Integer, nullable=False, server_default='0') + category_uid = Column(Integer, ForeignKey('product_categories.uid'), + nullable=False) is_active = Column(Boolean, nullable=False, server_default='1') created_at = Column(DateTime, nullable=False, default=datetime.now) + category = relationship('ProductCategory', lazy='joined') + order_entry_association = Table( 'order_entry_associations', Base.metadata,