Commit 072000ac authored by Jeremy Pallats's avatar Jeremy Pallats 💬
Browse files

Add ability to track consolidation and forts/um.

- Need more extensive testing in due time.
parent 7569542b
Loading
Loading
Loading
Loading
Loading
+121 −15
Original line number Diff line number Diff line
"""
Module to parse and import data from new json source.
Module to parse and import data from spying squirrel.
"""
import datetime
import time
@@ -29,6 +29,42 @@ POWER_ID_MAP = {
MAX_SPY_MERITS = 99999


class SpyVote(Base):
    """
    Record current vote by power.
    """
    __tablename__ = 'spy_votes'

    header = ["Power", "Consolidation"]

    power_id = sqla.Column(sqla.Integer, sqla.ForeignKey('powers.id'), primary_key=True)
    vote = sqla.Column(sqla.Integer, default=0)
    updated_at = sqla.Column(sqla.Integer, onupdate=sqla.func.unix_timestamp())

    # Relationships
    power = sqla.orm.relationship(
        'Power', uselist=False, lazy='select', viewonly=True,
        primaryjoin='foreign(Power.id) == SpyVote.power_id',
    )

    def __repr__(self):
        keys = ['power_id', 'vote', '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 "{power}: {vote}%, updated at {date}".format(
            vote=self.vote, power=self.power.text, date=self.updated_at)

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

    def __hash__(self):
        return hash(f"{self.power_id}")


class SpyPrep(Base):
    """
    Store Prep triggers by systems.
@@ -38,18 +74,18 @@ class SpyPrep(Base):
    header = ["ID", "Power", "System", "Merits"]

    id = sqla.Column(sqla.Integer, primary_key=True)
    system_id = sqla.Column(sqla.Integer, sqla.ForeignKey('systems.id'), primary_key=True)
    power_id = sqla.Column(sqla.Integer, sqla.ForeignKey('powers.id'), primary_key=True)
    system_id = sqla.Column(sqla.Integer, sqla.ForeignKey('systems.id'))
    power_id = sqla.Column(sqla.Integer, sqla.ForeignKey('powers.id'))
    merits = sqla.Column(sqla.Integer, default=0)
    updated_at = sqla.Column(sqla.Integer, onupdate=sqla.func.unix_timestamp())

    # Relationships
    system = sqla.orm.relationship(
        'System', uselist=False, lazy='select',
        'System', uselist=False, lazy='select', viewonly=True,
        primaryjoin='foreign(System.id) == SpyPrep.system_id',
    )
    power = sqla.orm.relationship(
        'Power', uselist=False, lazy='select',
        'Power', uselist=False, lazy='select', viewonly=True,
        primaryjoin='foreign(Power.id) == SpyPrep.power_id',
    )

@@ -108,6 +144,57 @@ class SpyPrep(Base):
        #  return value


class SpySystem(Base):
    """
    Store information on active fort and um of systems.
    """
    __tablename__ = 'spy_systems'

    id = sqla.Column(sqla.Integer, primary_key=True)
    system_id = sqla.Column(sqla.Integer, sqla.ForeignKey('systems.id'))
    power_id = sqla.Column(sqla.Integer, sqla.ForeignKey('powers.id'))
    # Base

    # Refined
    forts = sqla.Column(sqla.Integer, default=0)
    um = sqla.Column(sqla.Integer, default=0)
    is_expansion = sqla.Column(sqla.Boolean, default=False)
    updated_at = sqla.Column(sqla.Integer, onupdate=sqla.func.unix_timestamp())

    # Relationships
    system = sqla.orm.relationship(
        'System', uselist=False, lazy='select', viewonly=True,
        primaryjoin='foreign(System.id) == SpySystem.system_id',
    )
    power = sqla.orm.relationship(
        'Power', uselist=False, lazy='select', viewonly=True,
        primaryjoin='foreign(Power.id) == SpySystem.power_id',
    )

    def __repr__(self):
        keys = ['id', 'power_id', 'system_id', 'forts', 'um', 'is_expansion', '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. """
        if self.is_expansion:
            return "Expansion for {power} to {system}: {forts} | {um}, updated at {date}".format(
                forts=self.forts, um=self.um, power=self.power.text, system=self.system.name, date=self.updated_at)
        else:
            return "{power} {system}: {forts} | {um}, updated at {date}".format(
                forts=self.forts, um=self.um, power=self.power.text, system=self.system.name, date=self.updated_at)

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

    def __hash__(self):
        return hash(f"{self.power_id}_{self.system_id}")




def load_base_json(base):
    """ Load the base json and parse all information from it.

@@ -126,11 +213,11 @@ def load_base_json(base):
        # TODO: Design db objects to hook
        for sys_addr, data in bundle['systemAddr'].items():
            system = {
                'id': sys_addr,
                'system_id': sys_addr,
                'state': sys_state,
                'um_trigger': data['thrAgainst'],
                'fort_trigger': data['thrFor'],
                'income': data['income'],
                'tAgainst': data['thrAgainst'],
                'tFor': data['thrFor'],
                'upkeep': data['upkeepCurrent'],
                'upkeep_default': data['upkeepDefault'],
            }
@@ -153,7 +240,7 @@ def load_refined_json(refined):
    Returns:
        A dictionary mapping powers by name onto the systems they control and their status.
    """
    updated_at = time.time()
    updated_at = refined["lastModified"]

    with cogdb.session_scope(cogdb.EDDBSession) as session:
        eddb_power_names_to_id = {power.text: power.id for power in session.query(Power).all()}
@@ -162,13 +249,32 @@ def load_refined_json(refined):
            for power_id, power_name in POWER_ID_MAP.items()
        }

    db_preps = []
    db_preps, db_votes, db_sys = [], [], []
    for bundle in refined["preparation"]:
        power_id = json_powers_to_eddb_id[bundle['power_id']]
        preps = [
            {'power_id': power_id, 'system_id': id, 'merits': total, 'updated_at': updated_at}
            for id, total in bundle['rankedSystems']
        db_votes += [SpyVote(power_id=power_id, vote=bundle['consolidation']['rank'], updated_at=updated_at)]
        db_preps += [
            SpyPrep(power_id=power_id, system_id=system_id, merits=merits, updated_at=updated_at)
            for system_id, merits in bundle['rankedSystems']
        ]
        db_preps += [SpyPrep(**kwargs) for kwargs in preps]

    return db_preps
    for bundle in refined["gainControl"]:
        db_sys += [SpySystem(
            power_id=json_powers_to_eddb_id[bundle['power_id']],
            system_id=bundle['systemAddr'],
            forts=bundle['qtyFor'],
            um=bundle['qtyAgainst'],
            is_expansion=True,
            updated_at=updated_at,
        )]
    for bundle in refined["fortifyUndermine"]:
        db_sys += [SpySystem(
            power_id=json_powers_to_eddb_id[bundle['power_id']],
            system_id=bundle['systemAddr'],
            forts=bundle['qtyFor'],
            um=bundle['qtyAgainst'],
            is_expansion=False,
            updated_at=updated_at,
        )]

    return db_preps, db_votes, db_sys
+17 −9
Original line number Diff line number Diff line
@@ -39,20 +39,20 @@ def refined_json():

def test_base_loads(base_json):
    expect_control = {
        'id': '10477373803',
        'system_id': '10477373803',
        'income': 122,
        'state': 'control',
        'tAgainst': 33998,
        'tFor': 5211,
        'um_trigger': 33998,
        'fort_trigger': 5211,
        'upkeep': 0,
        'upkeep_default': 21
    }
    expect_taking = {
        'id': '11665533904241',
        'system_id': '11665533904241',
        'income': 0,
        'state': 'takingControl',
        'tAgainst': 7198,
        'tFor': 4872,
        'um_trigger': 7198,
        'fort_trigger': 4872,
        'upkeep': 0,
        'upkeep_default': 0
    }
@@ -63,7 +63,15 @@ def test_base_loads(base_json):


def test_refined_loads(refined_json):
    expect = spy.SpyPrep(power_id=9, system_id=2557887812314, merits=14140)
    preps = spy.load_refined_json(refined_json)
    expect_prep = spy.SpyPrep(power_id=9, system_id=2557887812314, merits=14140)
    expect_vote = spy.SpyVote(power_id=11, vote=78)
    expect_expo = spy.SpySystem(power_id=6, system_id=2106438158699, forts=1247, um=53820, is_expansion=True)
    expect_sys = spy.SpySystem(power_id=11, system_id=22958210698120, forts=464, um=900, is_expansion=False)

    assert expect in preps

    preps, votes, systems = spy.load_refined_json(refined_json)

    assert expect_prep in preps
    assert expect_vote in votes
    assert expect_expo in systems
    assert expect_sys in systems