Loading 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 +42 −0 Original line number Diff line number Diff line Loading @@ -1518,6 +1518,48 @@ 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)) # Do not allow updating time. @sqla_orm.validates('updated_at') def validate_updated_at(self, key, value): raise cog.exc.ValidationFail("Do not update this date.") @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 web/app.py +13 −2 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import os import tempfile import time import aiofiles import aiozmq import aiozmq.rpc import sanic Loading @@ -34,6 +35,9 @@ except ImportError: print("Falling back to default python loop.") import cog.util import cogdb import cogdb.query app = sanic.Sanic('cog web') ADDR = 'tcp://127.0.0.1:{}'.format(cog.util.CONF.ports.zmq) Loading Loading @@ -65,6 +69,13 @@ def init_log(): logger.addHandler(hand) @app.route('/votes', methods=['GET']) async def votes(request): fpath = cog.util.rel_to_abs('web', 'templates', 'votes.html') async with aiofiles.open(fpath, mode='r', encoding='utf-8') as fin: return sanic.response.html(await fin.read()) @app.route('/post', methods=['GET', 'POST']) async def post(request): """ Handle post requests. """ Loading @@ -79,7 +90,7 @@ async def post(request): log.info('%s %s', str(request), data) RECV.insert(0, data) RECV = RECT[:20] RECV = RECV[:20] try: log.info('Publishing for scanner %s', data['scanner']) Loading @@ -101,7 +112,7 @@ def main(): port = cog.util.CONF.ports.sanic print("Sanic server listening on:", port) print("ZMQ pub/sub binding on:", ADDR) app.run(host='0.0.0.0', port=port) app.run(host='0.0.0.0', port=port, debug=True) if __name__ == "__main__": Loading web/templates/votes.html 0 → 100644 +8 −0 Original line number Diff line number Diff line <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.5.0/Chart.min.js"></script> <h1> Hudson Vote Consolidation </h1> The current vote tracking for Hudson. {{ values }} <canvas id="voteChart" width="600" height="600"> </canvas> Loading
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 +42 −0 Original line number Diff line number Diff line Loading @@ -1518,6 +1518,48 @@ 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)) # Do not allow updating time. @sqla_orm.validates('updated_at') def validate_updated_at(self, key, value): raise cog.exc.ValidationFail("Do not update this date.") @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
web/app.py +13 −2 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import os import tempfile import time import aiofiles import aiozmq import aiozmq.rpc import sanic Loading @@ -34,6 +35,9 @@ except ImportError: print("Falling back to default python loop.") import cog.util import cogdb import cogdb.query app = sanic.Sanic('cog web') ADDR = 'tcp://127.0.0.1:{}'.format(cog.util.CONF.ports.zmq) Loading Loading @@ -65,6 +69,13 @@ def init_log(): logger.addHandler(hand) @app.route('/votes', methods=['GET']) async def votes(request): fpath = cog.util.rel_to_abs('web', 'templates', 'votes.html') async with aiofiles.open(fpath, mode='r', encoding='utf-8') as fin: return sanic.response.html(await fin.read()) @app.route('/post', methods=['GET', 'POST']) async def post(request): """ Handle post requests. """ Loading @@ -79,7 +90,7 @@ async def post(request): log.info('%s %s', str(request), data) RECV.insert(0, data) RECV = RECT[:20] RECV = RECV[:20] try: log.info('Publishing for scanner %s', data['scanner']) Loading @@ -101,7 +112,7 @@ def main(): port = cog.util.CONF.ports.sanic print("Sanic server listening on:", port) print("ZMQ pub/sub binding on:", ADDR) app.run(host='0.0.0.0', port=port) app.run(host='0.0.0.0', port=port, debug=True) if __name__ == "__main__": Loading
web/templates/votes.html 0 → 100644 +8 −0 Original line number Diff line number Diff line <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.5.0/Chart.min.js"></script> <h1> Hudson Vote Consolidation </h1> The current vote tracking for Hudson. {{ values }} <canvas id="voteChart" width="600" height="600"> </canvas>