macao-pos/cli.py

174 lines
3.9 KiB
Python
Raw Normal View History

2017-03-23 19:11:41 +01:00
#!/usr/bin/env python3
2017-03-21 11:26:25 +01:00
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, Transaction
2017-03-21 11:26:25 +01:00
config = Config()
conf_db = config.core['DATABASE']
init_logging(config.logging)
log = get_logger('cli')
db = Database(**conf_db)
2017-03-23 19:11:41 +01:00
def get_total(transaction):
return sum(o.product.price * o.quantity
for o in transaction.orders)
def get_income(event):
return sum(get_total(t) for t in event.transactions)
2017-03-21 11:26:25 +01:00
@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():
with db.get_session() as session:
users = session.query(User).all()
2017-03-23 19:11:41 +01:00
if users:
print(tabulate_users(users))
else:
2017-03-21 11:26:25 +01:00
print("No users found.")
@cli.group('event')
def event():
pass
def tabulate_events(events):
tab = [["UID", "Name", "Starts at", "Ends at", "Income", "Created at"]]
2017-03-23 19:11:41 +01:00
2017-03-21 11:26:25 +01:00
for e in events:
2017-03-23 19:11:41 +01:00
tab.append([e.uid, e.name, e.starts_at,
e.ends_at, get_income(e), e.created_at])
2017-03-21 11:26:25 +01:00
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)
2017-03-23 19:11:41 +01:00
2017-03-21 11:26:25 +01:00
with db.get_session() as session:
session.add(event)
print("Event succesfully added.")
@event.command('list')
def event_list():
with db.get_session() as session:
events = session.query(Event).all()
2017-03-23 19:11:41 +01:00
if events:
print(tabulate_events(events))
else:
2017-03-21 11:26:25 +01:00
print("No events found.")
@cli.group('product')
def product():
pass
def tabulate_products(products):
tab = [["UID", "Name", "Price", "Enabled", "Created at"]]
2017-03-21 11:26:25 +01:00
for p in products:
tab.append([p.uid, p.name, p.price, p.is_active, p.created_at])
2017-03-21 11:26:25 +01:00
return tabulate(tab, headers='firstrow')
@product.command('add')
@click.argument('name')
@click.argument('price')
def product_add(name, price):
product = Product(name=name, price=price)
2017-03-21 11:26:25 +01:00
with db.get_session() as session:
session.add(product)
print("Product succesfully added.")
@product.command('list')
def product_list():
with db.get_session() as session:
products = session.query(Product).all()
2017-03-23 19:11:41 +01:00
if products:
print(tabulate_products(products))
else:
2017-03-21 11:26:25 +01:00
print("No products found.")
@cli.group('transaction')
def transaction():
2017-03-21 11:26:25 +01:00
pass
def tabulate_orders(orders):
tab = [["Product", "Price", "Quantity", "Total"]]
2017-03-21 11:26:25 +01:00
for o in orders:
2017-03-23 19:11:41 +01:00
if o.quantity > 0:
tab.append([o.product.name, o.product.price, o.quantity,
o.product.price * o.quantity])
return tabulate(tab, headers='firstrow')
def print_transactions(transactions):
for t in transactions:
print("Listing transaction #{} ({}):".format(t.uid, t.created_at))
print(tabulate_orders(t.orders))
2017-03-23 19:11:41 +01:00
print("Total:", get_total(t))
print()
@transaction.command('list')
def transaction_list():
2017-03-21 11:26:25 +01:00
with db.get_session() as session:
transactions = session.query(Transaction).all()
2017-03-23 19:11:41 +01:00
if transactions:
print_transactions(transactions)
else:
print("No transactions found.")
2017-03-21 11:26:25 +01:00
if __name__ == '__main__':
cli()