Commit 29d87dab authored by Jeremy Pallats's avatar Jeremy Pallats 💬
Browse files

Proto of consolidation tracking.

parent a6aeb366
Loading
Loading
Loading
Loading
Loading
+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

+42 −0
Original line number Diff line number Diff line
@@ -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.
+13 −2
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import os
import tempfile
import time

import aiofiles
import aiozmq
import aiozmq.rpc
import sanic
@@ -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)
@@ -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. """
@@ -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'])
@@ -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__":
+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>