Loading cog/actions.py +11 −5 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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] Loading cogdb/eddb.py +7 −4 Original line number Diff line number Diff line Loading @@ -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. Loading @@ -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'): Loading cogdb/query.py +51 −1 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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. Loading cogdb/schema.py +3 −3 Original line number Diff line number Diff line Loading @@ -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) Loading tests/cogdb/test_eddb.py +2 −2 Original line number Diff line number Diff line Loading @@ -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 Loading
cog/actions.py +11 −5 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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] Loading
cogdb/eddb.py +7 −4 Original line number Diff line number Diff line Loading @@ -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. Loading @@ -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'): Loading
cogdb/query.py +51 −1 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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. Loading
cogdb/schema.py +3 −3 Original line number Diff line number Diff line Loading @@ -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) Loading
tests/cogdb/test_eddb.py +2 −2 Original line number Diff line number Diff line Loading @@ -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