Commit 53eecd8a authored by Jeremy Pallats's avatar Jeremy Pallats 💬
Browse files

FIX #121: Addum Systems Not Shown In !um

- Inject new systems added directly into db, avoids scheduler.
parent eb82c251
Loading
Loading
Loading
Loading
Loading
+11 −5
Original line number Diff line number Diff line
@@ -483,16 +483,22 @@ class Admin(Action):
                            ["UM Trigger {}%".format(reinforcement_value), reinforced_trigger],
                            ["Priority", priority]
                        ])
                        values.append({"sys_name": system.name, "power": power[0], "trigger": reinforced_trigger,
                                      "priority": priority})
                        values.append({
                            "power": power[0],
                            "priority": priority,
                            "sys_name": system.name,
                            "security": system.security.text,
                            "trigger": reinforced_trigger,
                        })
                    else:
                        found_list.append(system.name)

        if values:
            cogdb.query.um_add_system_targets(self.session, values)
            um_sheet = await um_scanner.get_batch(['D1:13'], 'COLUMNS', 'FORMULA')
            data = cogdb.scanners.UMScanner.slide_templates(um_sheet, values)
            await um_scanner.send_batch(data, input_opt='USER_ENTERED')
            self.bot.sched.schedule("hudson_undermine", 1)

            msgs = cog.util.merge_msgs_to_least(msgs)
            for msg in cog.util.merge_msgs_to_least(msgs):
                await self.bot.send_message(self.msg.channel, msg)
@@ -1263,11 +1269,11 @@ class Near(Action):
            None,
            functools.partial(
                cogdb.eddb.get_nearest_controls, eddb_session,
                centre_name=centre.name, power='%' + self.args.power
                centre_name=centre.name, power='%' + self.args.power, limit=10
            )
        )

        lines = [['System', 'Distance']] + [[x.name, "{:.2f}".format(x.dist_to(centre))] for x in systems[:10]]
        lines = [['System', 'Distance']] + [[x.name, "{:.2f}".format(x.dist_to(centre))] for x in systems]
        return "__Closest 10 Controls__\n\n" + \
            cog.tbl.format_table(lines, header=True)[0]

+7 −4
Original line number Diff line number Diff line
@@ -1772,7 +1772,7 @@ def find_route_closest_hq(session, systems):
    return find_route(session, start, systems)


def get_nearest_controls(session, *, centre_name='sol', power='%hudson'):
def get_nearest_controls(session, *, centre_name='sol', power='%hudson', limit=3):
    """
    Find nearest control systems of a particular power.

@@ -1782,16 +1782,19 @@ def get_nearest_controls(session, *, centre_name='sol', power='%hudson'):
    Kwargs:
        centre_name: The central system to find closest powers to.
        power: The power you are looking for.
        limit: The number of nearest controls to return, default 3.
    """
    centre = session.query(System).filter(System.name == centre_name).one()
    results = session.query(SystemControlV.control_id, System).\
        distinct(SystemControlV.control_id).\
        filter(SystemControlV.power.ilike(power)).\
        join(System, System.id == SystemControlV.control_id).\
        order_by(System.dist_to(centre)).\
        all()
        order_by(System.dist_to(centre))

    return [x[1] for x in results]
    if limit > 0:
        results = results.limit(limit)

    return [x[1] for x in results.all()]


def get_controls_of_power(session, *, power='%hudson'):
+51 −1
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@ import cog.util
import cogdb.eddb
from cog.util import substr_match
from cogdb.schema import (DiscordUser, FortSystem, FortPrep, FortDrop, FortUser, FortOrder,
                          EFortType, UMSystem, UMUser, UMHold, EUMSheet, KOS,
                          EFortType, UMSystem, UMUser, UMHold, EUMSheet, EUMType, KOS,
                          AdminPerm, ChannelPerm, RolePerm,
                          TrackSystem, TrackSystemCached, TrackByID, OCRTracker, OCRTrigger,
                          OCRPrep, Global, Vote)
@@ -568,6 +568,56 @@ def um_redeem_systems(session, user, systems, *, sheet_src=EUMSheet.main):
    return (holds, total)


def um_add_system_targets(session, um_systems):
    """
    Given a set of um targets, add them to the database.

    Args:
        session: A session onto the db.
        um_systems: A list of dictionary objects of form:
            {
                "sys_name": system.name,
                "power": power[0],
                "security": security,
                "trigger": reinforced_trigger,
                "priority": priority,
            }
    """
    last = session.query(UMSystem).\
        filter(UMSystem.sheet_src == EUMSheet.main).\
        order_by(UMSystem.id.desc()).\
        limit(1).\
        all()

    last_id = 1
    last_col = cog.sheets.Column("D")
    if last:
        last_id = last[0].id
        last_col = cog.sheets.Column(last[0].sheet_col)

    systems = []
    with cogdb.session_scope(cogdb.EDDBSession) as eddb_session:
        for sys in um_systems:
            nearest_controls = cogdb.eddb.get_nearest_controls(
                eddb_session, centre_name=sys['sys_name'], limit=1
            )
            last_id += 1
            # Each new system uses 2 columns past the last
            systems.append(UMSystem(
                id=last_id,
                sheet_src=EUMSheet.main,
                type=EUMType.control,
                name=sys['sys_name'],
                sheet_col=last_col.offset(2),
                close_control=nearest_controls[0].name,
                security=sys.pop('security'),
                goal=sys['trigger'],
                notes=sys['power'],
                priority=sys['priority'],
            ))
    session.add_all(systems)


def um_add_hold(session, *, sheet_src=EUMSheet.main, **kwargs):
    """
    Add or update the user's Hold, that is their UM merits held or redeemed.
+3 −3
Original line number Diff line number Diff line
@@ -657,9 +657,9 @@ class UMSystem(Base):
    security = sqla.Column(sqla.String(LEN_NAME), default='')
    notes = sqla.Column(sqla.String(LEN_NAME), default='')
    close_control = sqla.Column(sqla.String(LEN_NAME), default='')
    priority = sqla.Column(sqla.String(LEN_NAME))
    progress_us = sqla.Column(sqla.Integer)
    progress_them = sqla.Column(sqla.Float)
    priority = sqla.Column(sqla.String(LEN_NAME), default="Normal")
    progress_us = sqla.Column(sqla.Integer, default=0)
    progress_them = sqla.Column(sqla.Float, default=0.0)
    map_offset = sqla.Column(sqla.Integer, default=0)
    exp_trigger = sqla.Column(sqla.Integer, default=0)

+2 −2
Original line number Diff line number Diff line
@@ -141,11 +141,11 @@ def test_find_best_route(eddb_session):


def test_get_nearest_controls(eddb_session):
    result = [x.name for x in cogdb.eddb.get_nearest_controls(eddb_session, power='%hudson')[0:3]]
    result = [x.name for x in cogdb.eddb.get_nearest_controls(eddb_session, power='%hudson', limit=3)]

    assert result == ['Sol', 'Lung', 'Groombridge 1618']

    result = [x.name for x in cogdb.eddb.get_nearest_controls(eddb_session, centre_name='cubeo', power='%hudson')[0:3]]
    result = [x.name for x in cogdb.eddb.get_nearest_controls(eddb_session, centre_name='cubeo', power='%hudson', limit=3)]

    assert result == ['Caspatsuria', 'LTT 9472', 'Clayahu']

Loading