import click from tabulate import tabulate 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, Order config = Config() conf_db = config.core['DATABASE'] init_logging(config.logging) log = get_logger('cli') db = Database(**conf_db) @click.group() def cli(): pass @cli.group('user') def user(): pass def tabulate_users(users): tab = [["UID", "Username", "Enabled", "Created at"]] for u in users: tab.append([u.uid, u.username, u.is_active, u.created_at]) return tabulate(tab, headers='firstrow') @user.command('add') @click.argument('username') @click.argument('password') def user_add(username, password): user = User(username=username, password=password) with db.get_session() as session: session.add(user) print("User succesfully added.") @user.command('list') def user_list(): users = None with db.get_session() as session: users = session.query(User).all() if len(users) == 0: print("No users found.") return print(tabulate_users(users)) @cli.group('event') def event(): pass def tabulate_events(events): tab = [["UID", "Name", "Starts at", "Ends at", "Income", "Created at"]] for e in events: sum = 0 for order in e.orders: for entry in order.entries: sum += entry.product.price * entry.quantity tab.append([e.uid, e.name, e.starts_at, e.ends_at, sum, e.created_at]) return tabulate(tab, headers='firstrow') @event.command('add') @click.argument('name') @click.option('--start') @click.option('--end') def event_add(name, start, end): start = datetime.strptime(start, "%Y-%m-%d %H:%M") end = datetime.strptime(end, "%Y-%m-%d %H:%M") event = Event(name=name, starts_at=start, ends_at=end) with db.get_session() as session: session.add(event) print("Event succesfully added.") @event.command('list') def event_list(): events = None with db.get_session() as session: events = session.query(Event).all() if len(events) == 0: print("No events found.") return print(tabulate_events(events)) @cli.group('product') def product(): pass def tabulate_products(products): tab = [["UID", "Name", "Price", "Currency", "Enabled", "Created at"]] for p in products: tab.append([p.uid, p.name, p.price, p.currency, p.is_active, p.created_at]) return tabulate(tab, headers='firstrow') @product.command('add') @click.argument('name') @click.argument('price') @click.option('--currency') def product_add(name, price, currency): product = Product(name=name, currency=currency, price=price) with db.get_session() as session: session.add(product) print("Product succesfully added.") @product.command('list') def product_list(): products = None with db.get_session() as session: products = session.query(Product).all() if len(products) == 0: print("No products found.") return print(tabulate_products(products)) @cli.group('order') def order(): pass def tabulate_orders(orders): text = [] for o in orders: text.append("Listing order #{} ({}):".format(o.uid, o.created_at)) tab = [["Product", "Quantity", "Total"]] total = 0 for e in o.entries: if e.quantity != 0: tab.append([e.product.name, e.quantity, e.product.price * e.quantity]) total += e.product.price * e.quantity text.append(tabulate(tab, headers='firstrow')) text.append("Total: {}".format(total)) text.append('\n') return '\n'.join(text) @order.command('list') def order_list(): orders = None with db.get_session() as session: orders = session.query(Order).all() if len(orders) == 0: print("No orders found.") return print(tabulate_orders(orders)) if __name__ == '__main__': cli()