From f31a0c4c22cd7116913c1906b1f958d2c31d9b12 Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Fri, 25 Jan 2019 19:33:49 -0600 Subject: [PATCH] Convert `enabled` for Client, Probe to use datetime instead of boolean value is null if disabled, else timestamp of when it was last enabled --- .../fd1df160539a_make_enabled_datetime.py | 80 +++++++++++++++++++ rattail_tempmon/db/model.py | 18 +++-- rattail_tempmon/problems.py | 6 +- rattail_tempmon/server.py | 2 +- 4 files changed, 96 insertions(+), 10 deletions(-) create mode 100644 rattail_tempmon/db/alembic/versions/fd1df160539a_make_enabled_datetime.py diff --git a/rattail_tempmon/db/alembic/versions/fd1df160539a_make_enabled_datetime.py b/rattail_tempmon/db/alembic/versions/fd1df160539a_make_enabled_datetime.py new file mode 100644 index 0000000..1a327f9 --- /dev/null +++ b/rattail_tempmon/db/alembic/versions/fd1df160539a_make_enabled_datetime.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8; -*- +"""make enabled datetime + +Revision ID: fd1df160539a +Revises: a2676d3dfc1e +Create Date: 2019-01-25 18:41:01.652823 + +""" + +from __future__ import unicode_literals, absolute_import + +# revision identifiers, used by Alembic. +revision = 'fd1df160539a' +down_revision = 'a2676d3dfc1e' +branch_labels = None +depends_on = None + +import datetime +from alembic import op +import sqlalchemy as sa +import rattail.db.types + + + +def upgrade(): + + now = datetime.datetime.utcnow() + + # client + op.add_column('client', sa.Column('new_enabled', sa.DateTime(), nullable=True)) + client = sa.sql.table('client', + sa.sql.column('enabled'), + sa.sql.column('new_enabled')) + op.execute(client.update()\ + .where(client.c.enabled == True)\ + .values({'new_enabled': now})) + op.drop_column('client', 'enabled') + op.alter_column('client', 'new_enabled', new_column_name='enabled') + + # probe + op.add_column('probe', sa.Column('new_enabled', sa.DateTime(), nullable=True)) + probe = sa.sql.table('probe', + sa.sql.column('enabled'), + sa.sql.column('new_enabled')) + op.execute(probe.update()\ + .where(probe.c.enabled == True)\ + .values({'new_enabled': now})) + op.drop_column('probe', 'enabled') + op.alter_column('probe', 'new_enabled', new_column_name='enabled') + + +def downgrade(): + + # probe + op.add_column('probe', sa.Column('old_enabled', sa.Boolean(), nullable=True)) + probe = sa.sql.table('probe', + sa.sql.column('enabled'), + sa.sql.column('old_enabled')) + op.execute(probe.update()\ + .where(probe.c.enabled != None)\ + .values({'old_enabled': True})) + op.execute(probe.update()\ + .where(probe.c.enabled == None)\ + .values({'old_enabled': False})) + op.drop_column('probe', 'enabled') + op.alter_column('probe', 'old_enabled', new_column_name='enabled', nullable=False) + + # client + op.add_column('client', sa.Column('old_enabled', sa.Boolean(), nullable=True)) + client = sa.sql.table('client', + sa.sql.column('enabled'), + sa.sql.column('old_enabled')) + op.execute(client.update()\ + .where(client.c.enabled != None)\ + .values({'old_enabled': True})) + op.execute(client.update()\ + .where(client.c.enabled == None)\ + .values({'old_enabled': False})) + op.drop_column('client', 'enabled') + op.alter_column('client', 'old_enabled', new_column_name='enabled', nullable=False) diff --git a/rattail_tempmon/db/model.py b/rattail_tempmon/db/model.py index 181f064..985de17 100644 --- a/rattail_tempmon/db/model.py +++ b/rattail_tempmon/db/model.py @@ -111,11 +111,11 @@ class Client(Base): Any arbitrary notes for the client. """) - enabled = sa.Column(sa.Boolean(), nullable=False, default=False, doc=""" - Whether the client should be considered enabled (active). If set, the - client will be expected to take readings (but only for "enabled" probes) - and the server will monitor them to ensure they are within the expected - range etc. + enabled = sa.Column(sa.DateTime(), nullable=True, doc=""" + This will either be the date/time when the client was most recently + enabled, or null if it is not currently enabled. If set, the client will + be expected to take readings (but only for "enabled" probes) and the server + will monitor them to ensure they are within the expected range etc. """) online = sa.Column(sa.Boolean(), nullable=False, default=False, doc=""" @@ -191,7 +191,13 @@ class Probe(Base): """) device_path = sa.Column(sa.String(length=255), nullable=True) - enabled = sa.Column(sa.Boolean(), nullable=False, default=True) + + enabled = sa.Column(sa.DateTime(), nullable=True, doc=""" + This will either be the date/time when the probe was most recently enabled, + or null if it is not currently enabled. If set, the client will be + expected to take readings for this probe, and the server will monitor them + to ensure they are within the expected range etc. + """) critical_temp_max = sa.Column(sa.Integer(), nullable=False, doc=""" Maximum high temperature; when a reading is greater than or equal to this diff --git a/rattail_tempmon/problems.py b/rattail_tempmon/problems.py index edb28af..087ceb1 100644 --- a/rattail_tempmon/problems.py +++ b/rattail_tempmon/problems.py @@ -37,13 +37,13 @@ def disabled_probes(config, progress=None): tempmon_session = TempmonSession() clients = tempmon_session.query(tempmon.Client)\ .filter(tempmon.Client.archived == False)\ - .filter(tempmon.Client.enabled == False)\ + .filter(tempmon.Client.enabled == None)\ .all() probes = tempmon_session.query(tempmon.Probe)\ .join(tempmon.Client)\ .filter(tempmon.Client.archived == False)\ - .filter(tempmon.Client.enabled == True)\ - .filter(tempmon.Probe.enabled == False)\ + .filter(tempmon.Client.enabled != None)\ + .filter(tempmon.Probe.enabled == None)\ .all() if clients or probes: send_email(config, 'tempmon_disabled_probes', { diff --git a/rattail_tempmon/server.py b/rattail_tempmon/server.py index af4039e..c63ed39 100644 --- a/rattail_tempmon/server.py +++ b/rattail_tempmon/server.py @@ -71,7 +71,7 @@ class TempmonServerDaemon(Daemon): try: clients = session.query(tempmon.Client)\ - .filter(tempmon.Client.enabled == True)\ + .filter(tempmon.Client.enabled != None)\ .filter(tempmon.Client.archived == False) for client in clients: self.check_readings_for_client(session, client)