From 27db22d8c8ed7cea13f01f3964320f446d2ca2b5 Mon Sep 17 00:00:00 2001 From: "Fabian P. Schmidt" Date: Wed, 9 Dec 2015 03:37:25 +0100 Subject: [PATCH] CLI: Rename 'db.stats' to 'show.devices.stats' --- README.md | 7 +++-- ogn/commands/__init__.py | 2 ++ ogn/commands/database.py | 28 +------------------- ogn/commands/showdevices.py | 53 +++++++++++++++++++++++++++++++++++++ 4 files changed, 61 insertions(+), 29 deletions(-) create mode 100644 ogn/commands/showdevices.py diff --git a/README.md b/README.md index df97cb9..563d220 100644 --- a/README.md +++ b/README.md @@ -64,11 +64,14 @@ available commands: [gateway] run Run the aprs client. - + [logbook] compute Compute takeoffs and landings. show Show a logbook for located at given position. - + + [show.devices] + stats Show some stats on registered devices. + [show.receiver] hardware_stats Show some statistics of receiver hardware. list_all Show a list of all receivers. diff --git a/ogn/commands/__init__.py b/ogn/commands/__init__.py index e695cbc..15aad59 100644 --- a/ogn/commands/__init__.py +++ b/ogn/commands/__init__.py @@ -1,5 +1,6 @@ from .database import manager as database_manager from .showreceiver import manager as show_receiver_manager +from .showdevices import manager as show_devices_manager from .logbook import manager as logbook_manager from manager import Manager @@ -8,4 +9,5 @@ manager = Manager() manager.merge(database_manager, namespace='db') manager.merge(show_receiver_manager, namespace='show.receiver') +manager.merge(show_devices_manager, namespace='show.devices') manager.merge(logbook_manager, namespace='logbook') diff --git a/ogn/commands/database.py b/ogn/commands/database.py index 1be5dfb..7eb11d5 100644 --- a/ogn/commands/database.py +++ b/ogn/commands/database.py @@ -11,6 +11,7 @@ manager = Manager() @manager.command def init(): """Initialize the database.""" + Base.metadata.create_all(engine) print("Done.") @@ -34,31 +35,4 @@ def update_ddb_file(): @manager.command -def stats(): - """Show some devices stats.""" - sq_nt = session.query(Device.address) \ - .filter(and_(Device.tracked == false(), Device.identified == true())) \ - .subquery() - sq_ni = session.query(Device.address) \ - .filter(and_(Device.tracked == true(), Device.identified == false())) \ - .subquery() - - sq_ntni = session.query(Device.address) \ - .filter(and_(Device.tracked == false(), Device.identified == false())) \ - .subquery() - - query = session.query(Device.address_origin, func.count(Device.id), func.count(sq_nt.c.address), func.count(sq_ni.c.address), func.count(sq_ntni.c.address)) \ - .outerjoin(sq_nt, sq_nt.c.address == Device.address) \ - .outerjoin(sq_ni, sq_ni.c.address == Device.address) \ - .outerjoin(sq_ntni, sq_ntni.c.address == Device.address) \ - .group_by(Device.address_origin) - - print('--- Devices ---') - for [address_origin, device_count, nt_count, ni_count, ntni_count] in query.all(): - print('{:12s} Total:{:5d} - not tracked:{:3d}, not identified:{:3d}, not tracked & not identified: {:3d}' - .format(AddressOrigin(address_origin).name(), - device_count, - nt_count, - ni_count, - ntni_count)) diff --git a/ogn/commands/showdevices.py b/ogn/commands/showdevices.py new file mode 100644 index 0000000..9b245d7 --- /dev/null +++ b/ogn/commands/showdevices.py @@ -0,0 +1,53 @@ +from ogn.commands.dbutils import engine, session +from ogn.model import AddressOrigin, Device +from sqlalchemy import func, and_, true, false + +from manager import Manager +manager = Manager() + + +def get_devices_stats(session): + sq_nt = session.query(Device.address) \ + .filter(and_(Device.tracked == false(), Device.identified == true())) \ + .subquery() + + sq_ni = session.query(Device.address) \ + .filter(and_(Device.tracked == true(), Device.identified == false())) \ + .subquery() + + sq_ntni = session.query(Device.address) \ + .filter(and_(Device.tracked == false(), Device.identified == false())) \ + .subquery() + + query = session.query(Device.address_origin, + func.count(Device.id), + func.count(sq_nt.c.address), + func.count(sq_ni.c.address), + func.count(sq_ntni.c.address)) \ + .outerjoin(sq_nt, sq_nt.c.address == Device.address) \ + .outerjoin(sq_ni, sq_ni.c.address == Device.address) \ + .outerjoin(sq_ntni, sq_ntni.c.address == Device.address) \ + .group_by(Device.address_origin) + + stats = {} + for [address_origin, device_count, nt_count, ni_count, ntni_count] in query.all(): + origin = AddressOrigin(address_origin).name() + stats[origin] = {'device_count': device_count, + 'nt_count': nt_count, + 'ni_count': ni_count, + 'ntni_count': ntni_count} + return stats + + +@manager.command +def stats(): + """Show some stats on registered devices.""" + print('--- Devices ---') + stats = get_devices_stats(session) + for origin in stats: + print('{:12s} Total:{:5d} - not tracked:{:3d}, not identified:{:3d}, not tracked & not identified: {:3d}' + .format(origin, + stats[origin]['device_count'], + stats[origin]['nt_count'], + stats[origin]['ni_count'], + stats[origin]['ntni_count']))