Loading cogdb/query.py +14 −1 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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() cogdb/scanners.py +2 −1 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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 Loading cogdb/schema.py +37 −0 Original line number Diff line number Diff line Loading @@ -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. Loading tests/cogdb/test_query.py +5 −0 Original line number Diff line number Diff line Loading @@ -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] tests/conftest.py +29 −1 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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
cogdb/query.py +14 −1 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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()
cogdb/scanners.py +2 −1 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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 Loading
cogdb/schema.py +37 −0 Original line number Diff line number Diff line Loading @@ -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. Loading
tests/cogdb/test_query.py +5 −0 Original line number Diff line number Diff line Loading @@ -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]
tests/conftest.py +29 −1 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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()