166 lines
4.0 KiB
Python
166 lines
4.0 KiB
Python
|
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()
|