Add typer equivalents for rattail
commands
This commit is contained in:
parent
d8b865da71
commit
9a39db4546
|
@ -2,7 +2,7 @@
|
||||||
################################################################################
|
################################################################################
|
||||||
#
|
#
|
||||||
# Rattail -- Retail Software Framework
|
# Rattail -- Retail Software Framework
|
||||||
# Copyright © 2010-2017 Lance Edgar
|
# Copyright © 2010-2024 Lance Edgar
|
||||||
#
|
#
|
||||||
# This file is part of Rattail.
|
# This file is part of Rattail.
|
||||||
#
|
#
|
||||||
|
@ -24,19 +24,139 @@
|
||||||
Tempmon commands
|
Tempmon commands
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from __future__ import unicode_literals, absolute_import
|
|
||||||
|
|
||||||
import datetime
|
import datetime
|
||||||
import logging
|
import logging
|
||||||
|
from enum import Enum
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
from rattail import commands
|
import typer
|
||||||
from rattail.time import localtime, make_utc
|
from typing_extensions import Annotated
|
||||||
|
|
||||||
|
from rattail.commands import rattail_typer, Subcommand, ImportSubcommand
|
||||||
|
from rattail.commands.typer import importer_command, typer_get_runas_user
|
||||||
|
from rattail.commands.importing import ImportCommandHandler
|
||||||
|
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class ExportHotCooler(commands.ImportSubcommand):
|
class ServiceAction(str, Enum):
|
||||||
|
start = 'start'
|
||||||
|
stop = 'stop'
|
||||||
|
|
||||||
|
|
||||||
|
@rattail_typer.command()
|
||||||
|
@importer_command
|
||||||
|
def export_hotcooler(
|
||||||
|
ctx: typer.Context,
|
||||||
|
**kwargs
|
||||||
|
):
|
||||||
|
"""
|
||||||
|
Export data from Rattail-Tempmon to HotCooler
|
||||||
|
"""
|
||||||
|
config = ctx.parent.rattail_config
|
||||||
|
progress = ctx.parent.rattail_progress
|
||||||
|
handler = ImportCommandHandler(
|
||||||
|
config,
|
||||||
|
import_handler_spec='rattail_tempmon.hotcooler.importing.tempmon:FromTempmonToHotCooler')
|
||||||
|
kwargs['user'] = typer_get_runas_user(ctx)
|
||||||
|
handler.run(kwargs, progress=progress)
|
||||||
|
|
||||||
|
|
||||||
|
@rattail_typer.command()
|
||||||
|
def purge_tempmon(
|
||||||
|
ctx: typer.Context,
|
||||||
|
keep_days: Annotated[
|
||||||
|
int,
|
||||||
|
typer.Option('--keep',
|
||||||
|
help="Number of days for which data should be kept.")] = ...,
|
||||||
|
dry_run: Annotated[
|
||||||
|
bool,
|
||||||
|
typer.Option('--dry-run',
|
||||||
|
help="Go through the full motions and allow logging etc. to "
|
||||||
|
"occur, but rollback (abort) the transaction at the end.")] = False,
|
||||||
|
):
|
||||||
|
"""
|
||||||
|
Purge stale data from Tempmon database
|
||||||
|
"""
|
||||||
|
config = ctx.parent.rattail_config
|
||||||
|
progress = ctx.parent.rattail_progress
|
||||||
|
do_purge(config, keep_days, dry_run=dry_run, progress=progress)
|
||||||
|
|
||||||
|
|
||||||
|
@rattail_typer.command()
|
||||||
|
def tempmon_client(
|
||||||
|
ctx: typer.Context,
|
||||||
|
action: Annotated[
|
||||||
|
ServiceAction,
|
||||||
|
typer.Argument(help="Action to perform for the service.")] = ...,
|
||||||
|
pid_file: Annotated[
|
||||||
|
Path,
|
||||||
|
typer.Option('--pidfile', '-p',
|
||||||
|
help="Path to PID file.")] = None,
|
||||||
|
# TODO: deprecate / remove this
|
||||||
|
daemonize: Annotated[
|
||||||
|
bool,
|
||||||
|
typer.Option('--daemonize',
|
||||||
|
help="Daemonize when starting.")] = False,
|
||||||
|
):
|
||||||
|
"""
|
||||||
|
Manage the tempmon-client daemon
|
||||||
|
"""
|
||||||
|
from rattail_tempmon.client import make_daemon
|
||||||
|
|
||||||
|
config = ctx.parent.rattail_config
|
||||||
|
daemon = make_daemon(config, pidfile)
|
||||||
|
if action == 'start':
|
||||||
|
daemon.start(daemonize)
|
||||||
|
elif action == 'stop':
|
||||||
|
daemon.stop()
|
||||||
|
|
||||||
|
|
||||||
|
@rattail_typer.command()
|
||||||
|
def tempmon_problems(
|
||||||
|
ctx: typer.Context,
|
||||||
|
):
|
||||||
|
"""
|
||||||
|
Email report(s) of various Tempmon data problems
|
||||||
|
"""
|
||||||
|
from rattail_tempmon import problems
|
||||||
|
|
||||||
|
config = ctx.parent.rattail_config
|
||||||
|
progress = ctx.parent.rattail_progress
|
||||||
|
problems.disabled_probes(config, progress=progress)
|
||||||
|
|
||||||
|
|
||||||
|
@rattail_typer.command()
|
||||||
|
def tempmon_server(
|
||||||
|
ctx: typer.Context,
|
||||||
|
action: Annotated[
|
||||||
|
ServiceAction,
|
||||||
|
typer.Argument(help="Action to perform for the service.")] = ...,
|
||||||
|
pid_file: Annotated[
|
||||||
|
Path,
|
||||||
|
typer.Option('--pidfile', '-p',
|
||||||
|
help="Path to PID file.")] = None,
|
||||||
|
# TODO: deprecate / remove this
|
||||||
|
daemonize: Annotated[
|
||||||
|
bool,
|
||||||
|
typer.Option('--daemonize',
|
||||||
|
help="Daemonize when starting.")] = False,
|
||||||
|
):
|
||||||
|
"""
|
||||||
|
Manage the tempmon-server daemon
|
||||||
|
"""
|
||||||
|
from rattail_tempmon.server import make_daemon
|
||||||
|
|
||||||
|
config = ctx.parent.rattail_config
|
||||||
|
daemon = make_daemon(config, pidfile)
|
||||||
|
if action == 'start':
|
||||||
|
daemon.start(daemonize)
|
||||||
|
elif action == 'stop':
|
||||||
|
daemon.stop()
|
||||||
|
|
||||||
|
|
||||||
|
class ExportHotCooler(ImportSubcommand):
|
||||||
"""
|
"""
|
||||||
Export data from Rattail-Tempmon to HotCooler
|
Export data from Rattail-Tempmon to HotCooler
|
||||||
"""
|
"""
|
||||||
|
@ -45,7 +165,7 @@ class ExportHotCooler(commands.ImportSubcommand):
|
||||||
handler_spec = 'rattail_tempmon.hotcooler.importing.tempmon:FromTempmonToHotCooler'
|
handler_spec = 'rattail_tempmon.hotcooler.importing.tempmon:FromTempmonToHotCooler'
|
||||||
|
|
||||||
|
|
||||||
class PurgeTempmon(commands.Subcommand):
|
class PurgeTempmon(Subcommand):
|
||||||
"""
|
"""
|
||||||
Purge stale data from Tempmon database
|
Purge stale data from Tempmon database
|
||||||
"""
|
"""
|
||||||
|
@ -60,34 +180,34 @@ class PurgeTempmon(commands.Subcommand):
|
||||||
"occur, but rollback (abort) the transaction at the end.")
|
"occur, but rollback (abort) the transaction at the end.")
|
||||||
|
|
||||||
def run(self, args):
|
def run(self, args):
|
||||||
from rattail_tempmon.db import Session as TempmonSession, model as tempmon
|
do_purge(self.config, args.keep, dry_run=args.dry_run, progress=self.progress)
|
||||||
|
|
||||||
cutoff = localtime(self.config).date() - datetime.timedelta(days=args.keep)
|
|
||||||
cutoff = localtime(self.config, datetime.datetime.combine(cutoff, datetime.time(0)))
|
|
||||||
session = TempmonSession()
|
|
||||||
|
|
||||||
readings = session.query(tempmon.Reading)\
|
def do_purge(self, config, keep_days, dry_run=False, progress=None):
|
||||||
.filter(tempmon.Reading.taken < make_utc(cutoff))
|
from rattail_tempmon.db import Session, model
|
||||||
count = readings.count()
|
from rattail.db.util import finalize_session
|
||||||
|
|
||||||
|
app = config.get_app()
|
||||||
|
cutoff = app.today() - datetime.timedelta(days=keep_days)
|
||||||
|
cutoff = app.localtime(datetime.datetime.combine(cutoff, datetime.time(0)))
|
||||||
|
session = Session()
|
||||||
|
|
||||||
|
readings = session.query(model.Reading)\
|
||||||
|
.filter(model.Reading.taken < app.make_utc(cutoff))\
|
||||||
|
.all()
|
||||||
|
|
||||||
def purge(reading, i):
|
def purge(reading, i):
|
||||||
session.delete(reading)
|
session.delete(reading)
|
||||||
if i % 200 == 0:
|
if i % 200 == 0:
|
||||||
session.flush()
|
session.flush()
|
||||||
|
|
||||||
self.progress_loop(purge, readings, count=count, message="Purging stale readings")
|
app.progress_loop(purge, readings, progress,
|
||||||
log.info("deleted {} stale readings".format(count))
|
message="Purging stale readings")
|
||||||
|
log.info("deleted %s stale readings", len(readings))
|
||||||
if args.dry_run:
|
finalize_session(session, dry_run=dry_run)
|
||||||
session.rollback()
|
|
||||||
log.info("dry run, so transaction was rolled back")
|
|
||||||
else:
|
|
||||||
session.commit()
|
|
||||||
log.info("transaction was committed")
|
|
||||||
session.close()
|
|
||||||
|
|
||||||
|
|
||||||
class TempmonClient(commands.Subcommand):
|
class TempmonClient(Subcommand):
|
||||||
"""
|
"""
|
||||||
Manage the tempmon-client daemon
|
Manage the tempmon-client daemon
|
||||||
"""
|
"""
|
||||||
|
@ -117,7 +237,7 @@ class TempmonClient(commands.Subcommand):
|
||||||
daemon.stop()
|
daemon.stop()
|
||||||
|
|
||||||
|
|
||||||
class TempmonServer(commands.Subcommand):
|
class TempmonServer(Subcommand):
|
||||||
"""
|
"""
|
||||||
Manage the tempmon-server daemon
|
Manage the tempmon-server daemon
|
||||||
"""
|
"""
|
||||||
|
@ -147,7 +267,7 @@ class TempmonServer(commands.Subcommand):
|
||||||
daemon.stop()
|
daemon.stop()
|
||||||
|
|
||||||
|
|
||||||
class TempmonProblems(commands.Subcommand):
|
class TempmonProblems(Subcommand):
|
||||||
"""
|
"""
|
||||||
Email report(s) of various Tempmon data problems
|
Email report(s) of various Tempmon data problems
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -40,6 +40,9 @@ rattail.subcommands =
|
||||||
tempmon-problems = rattail_tempmon.commands:TempmonProblems
|
tempmon-problems = rattail_tempmon.commands:TempmonProblems
|
||||||
tempmon-server = rattail_tempmon.commands:TempmonServer
|
tempmon-server = rattail_tempmon.commands:TempmonServer
|
||||||
|
|
||||||
|
rattail.typer_imports =
|
||||||
|
rattail_tempmon = rattail_tempmon.commands
|
||||||
|
|
||||||
rattail.config.extensions =
|
rattail.config.extensions =
|
||||||
tempmon = rattail_tempmon.config:TempmonConfigExtension
|
tempmon = rattail_tempmon.config:TempmonConfigExtension
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue