Commit 6d0bbd7f authored by Jeremy Pallats's avatar Jeremy Pallats 💬
Browse files

Prototype consolidation tracking.

- Track consolidation values on every OCR POST.
- Using chart.js and sanic, render a chart to users.
- Also provide the data directly, possibly make chart update live later.
parent a964af29
Loading
Loading
Loading
Loading
Loading
+14 −1
Original line number Diff line number Diff line
@@ -2,6 +2,7 @@
Module should handle logic related to querying/manipulating tables from a high level.
"""
import copy
import datetime
import logging
import os
import tempfile
@@ -19,7 +20,7 @@ from cogdb.schema import (DiscordUser, FortSystem, FortPrep, FortDrop, FortUser,
                          EFortType, UMSystem, UMUser, UMHold, EUMSheet, EUMType, KOS,
                          AdminPerm, ChannelPerm, RolePerm,
                          TrackSystem, TrackSystemCached, TrackByID, OCRTracker, OCRTrigger,
                          OCRPrep, Global, Vote)
                          OCRPrep, Global, Vote, Consolidation)
from cogdb.scanners import FortScanner


@@ -1510,3 +1511,15 @@ def get_snipe_members_holding(session, guild):
        reply += template_msg.format(mention, hold.held, hold.system.name)

    return reply


def get_consolidation_this_week(session):
    """
    Return all consolidation tracking data since the last tick.
    """
    last_tick = cog.util.next_weekly_tick(datetime.datetime.utcnow(), -1)

    return session.query(Consolidation.amount, Consolidation.updated_at).\
        filter(Consolidation.updated_at > last_tick).\
        order_by(Consolidation.updated_at.asc()).\
        all()
+2 −1
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@ import cog.sheets
import cog.util
import cogdb
from cogdb.schema import (FortSystem, FortPrep, FortDrop, FortUser,
                          UMSystem, UMUser, UMHold, KOS, EUMSheet,
                          UMSystem, UMUser, UMHold, KOS, EUMSheet, Consolidation,
                          kwargs_fort_system, kwargs_um_system)


@@ -895,6 +895,7 @@ class OCRScanner(FortScanner):
        globe = cogdb.query.get_current_global(session)
        try:
            globe.consolidation = int(self.cells_row_major[self.prep_consolidation_row][self.prep_col])
            session.add(Consolidation(amount=globe.consolidation))
        except ValueError:
            pass

+37 −0
Original line number Diff line number Diff line
@@ -1518,6 +1518,43 @@ class Vote(Base):
        return value


class Consolidation(Base):
    """
    Track the consolidation vote changes over time.
    """
    __tablename__ = 'consolidation_tracker'

    id = sqla.Column(sqla.BigInteger, primary_key=True)
    amount = sqla.Column(sqla.Integer, default=0)
    updated_at = sqla.Column(sqla.DateTime, default=datetime.datetime.utcnow())  # All dates UTC

    def __repr__(self):
        keys = ['id', 'amount', 'updated_at']
        kwargs = ['{}={!r}'.format(key, getattr(self, key)) for key in keys]

        return "{}({})".format(self.__class__.__name__, ', '.join(kwargs))

    def __str__(self):
        """ A pretty one line to give all information. """
        return "Consolidation {amount}% at {date}.".format(amount=self.amount, date=self.updated_at)

    def __eq__(self, other):
        return isinstance(other, Consolidation) and hash(self) == hash(other)

    def __hash__(self):
        return hash("{}-{}".format(self.id, self.vote))

    @sqla_orm.validates('amount')
    def validate_amount(self, key, value):
        try:
            if value < 0 or value > 100:
                raise cog.exc.ValidationFail("Bounds check failed for: {} with value {}".format(key, value))
        except TypeError:
            pass

        return value


def kwargs_um_system(cells, sheet_col, *, sheet_src=EUMSheet.main):
    """
    Return keyword args parsed from cell frame.
+5 −0
Original line number Diff line number Diff line
@@ -940,3 +940,8 @@ def test_get_snipe_members_holding(session, f_bot, f_dusers, f_um_testbed):
    expected = 'User3 is holding 5000 merits in ToSnipe\n'
    results = cogdb.query.get_snipe_members_holding(session, f_bot.guilds[0])
    assert results == expected


def test_get_consolidation_this_week(session, f_cons_data):
    values = cogdb.query.get_consolidation_this_week(session)
    assert [x[0] for x in values] == [66, 67, 65, 64, 67, 68]
+29 −1
Original line number Diff line number Diff line
@@ -28,7 +28,8 @@ from cogdb.schema import (DiscordUser, FortSystem, FortPrep, FortDrop, FortUser,
                          UMSystem, UMExpand, UMOppose, UMUser, UMHold, EUMSheet, KOS,
                          AdminPerm, ChannelPerm, RolePerm,
                          TrackSystem, TrackSystemCached, TrackByID,
                          OCRTracker, OCRTrigger, OCRPrep, Global, Vote, EVoteType)
                          OCRTracker, OCRTrigger, OCRPrep, Global, Vote, EVoteType,
                          Consolidation)
from tests.data import CELLS_FORT, CELLS_FORT_FMT, CELLS_UM


@@ -844,3 +845,30 @@ def f_vote_testbed(session):
    for cls in (Vote,):
        session.query(cls).delete()
    session.commit()


@pytest.fixture
def f_cons_data(session):
    """
    Setup the database with dummy data for consolidation tracker.
    """
    updated_at = datetime.datetime.utcnow()
    delta = datetime.timedelta(hours=1)
    three = datetime.timedelta(hours=3)
    cons = (
        Consolidation(id=1, amount=66, updated_at=updated_at),
        Consolidation(id=2, amount=67, updated_at=updated_at + delta),
        Consolidation(id=3, amount=65, updated_at=updated_at + delta + delta),
        Consolidation(id=4, amount=64, updated_at=updated_at + three),
        Consolidation(id=5, amount=67, updated_at=updated_at + three + delta),
        Consolidation(id=6, amount=68, updated_at=updated_at + three + delta + delta),
    )
    session.add_all(cons)
    session.commit()

    yield cons

    session.rollback()
    for cls in (Consolidation,):
        session.query(cls).delete()
    session.commit()
Loading