Commit ae42855e authored by Jeremy Pallats's avatar Jeremy Pallats 💬
Browse files

FIX: Users for snipe and um sheets checked separately.

- FIX: Tests for inara with emoji to fetch from config.
parent 38ea1183
Loading
Loading
Loading
Loading
Loading
+17 −4
Original line number Diff line number Diff line
@@ -73,7 +73,7 @@ async def check_mentions(coro, *args, **kwargs):
        await coro(*args, **kwargs)


def check_sheet(scanner_name, attr, user_cls):
def check_sheet(scanner_name, attr, user_cls, sheet_src=None):
    """ Check if user present in sheet. """
    @decorator.decorator
    async def inner(coro, *args, **kwargs):
@@ -84,8 +84,10 @@ def check_sheet(scanner_name, attr, user_cls):
                          self.duser.display_name, user_cls.__name__, self.duser.pref_name)
            sheet = cogdb.query.add_sheet_user(
                self.session, cls=user_cls, discord_user=self.duser,
                start_row=get_scanner(scanner_name).user_row
                start_row=get_scanner(scanner_name).user_row, sheet_src=sheet_src
            )
            if sheet_src:
                sheet.sheet_src = sheet_src

            self.payloads += get_scanner(scanner_name).__class__.update_sheet_user_dict(
                sheet.row, sheet.cry, sheet.name)
@@ -1058,8 +1060,14 @@ class Hold(Action):
        return ([hold], response)

    @check_mentions
    @check_sheet('hudson_undermine', 'um_user', UMUser)
    @check_sheet('hudson_undermine', 'um_user', UMUser, sheet_src=EUMSheet.main)
    async def before_execute(self):
        """
        Decorate this async func to avoid multiple decorators.
        """

    async def execute(self):
        await self.before_execute()
        self.log.info('HOLD %s - Matched self.duser with id %s and sheet name %s.',
                      self.duser.display_name, self.duser.id, self.undermine)

@@ -1110,7 +1118,12 @@ class SnipeHold(Hold):
    """
    SnipeHold, same as Hold but for snipe sheet.
    """
    pass
    @check_mentions
    @check_sheet('hudson_snipe', 'snipe_user', UMUser, sheet_src=EUMSheet.snipe)
    async def before_execute(self):
        """
        Decorate this async func to avoid multiple decorators.
        """


class KOS(Action):
+14 −6
Original line number Diff line number Diff line
@@ -167,20 +167,27 @@ def check_pref_name(session, new_name):
        pass


def next_sheet_row(session, *, cls, start_row):
def next_sheet_row(session, *, cls, start_row, sheet_src=None):
    """
    Find the next available row to add in the sheet based on entries.
    """
    next_row = start_row
    rows = [x[0] for x in session.query(cls.row).order_by(cls.row).all()]
    query = session.query(cls.row)
    if sheet_src:
        query = query.filter(cls.sheet_src == sheet_src)
    query = query.order_by(cls.row)
    rows = [x[0] for x in query.all()]

    if rows:
        complete_list = list(range(rows[0], rows[-1] + 2))
        next_row = sorted(list(set(complete_list) - set(rows)))[0]
        # Add 2 to the last row selected to ensure there is always 1 unallocated row in set
        complete_set = set(range(rows[0], rows[-1] + 2))
        complete_diff = list(complete_set - set(rows))
        next_row = complete_diff[0]

    return next_row


def add_sheet_user(session, *, cls, discord_user, start_row):
def add_sheet_user(session, *, cls, discord_user, start_row, sheet_src=None):
    """
    Add a fort sheet user to system based on a Member.

@@ -188,8 +195,9 @@ def add_sheet_user(session, *, cls, discord_user, start_row):
        cls: The class of the sheet user like FortUser.
        duser: The DiscordUser object of the requesting user.
        start_row: Starting row if none inserted.
        sheet_src: Optionally, the sheet_src to filter UMUsers against.
    """
    next_row = next_sheet_row(session, cls=cls, start_row=start_row)
    next_row = next_sheet_row(session, cls=cls, start_row=start_row, sheet_src=sheet_src)
    user = cls(name=discord_user.pref_name, cry=discord_user.pref_cry, row=next_row)
    session.add(user)
    session.commit()
+1 −9
Original line number Diff line number Diff line
@@ -352,7 +352,7 @@ class UMScanner(FortScanner):
        Drop the main um entries in the um part of the database.
        """
        for cls in self.db_classes:
            session.query(cls).filter(cls.id < SNIPE_FIRST_ID).delete()
            session.query(cls).filter(cls.sheet_src == self.sheet_src).delete()
            session.commit()

    def users(self, *, row_cnt=None, first_id=1, cls=UMUser):
@@ -637,14 +637,6 @@ class SnipeScanner(UMScanner):
    def __repr__(self):
        return super().__repr__().replace('FortScanner', 'SnipeScanner')

    def drop_db_entries(self, session):
        """
        Drop the snipe entries in the um part of the database.
        """
        for cls in self.db_classes:
            session.query(cls).filter(cls.id >= SNIPE_FIRST_ID).delete()
            session.commit()

    def users(self, *, row_cnt=None, first_id=SNIPE_FIRST_ID, cls=UMUser):
        """
        Scan the users in the sheet and return sheet user objects.
+10 −2
Original line number Diff line number Diff line
@@ -67,11 +67,19 @@ class DiscordUser(Base):
    )
    um_user = sqla.orm.relationship(
        'UMUser', uselist=False, viewonly=True,
        primaryjoin='foreign(DiscordUser.pref_name) == UMUser.name'
        primaryjoin="and_(foreign(DiscordUser.pref_name) == UMUser.name, UMUser.sheet_src == 'main')"
    )
    um_merits = sqla_orm.relationship(
        'UMHold', lazy='select', uselist=True, viewonly=True,
        primaryjoin='and_(foreign(DiscordUser.pref_name) == remote(UMUser.name), foreign(UMUser.id) == UMHold.user_id)'
        primaryjoin="and_(foreign(DiscordUser.pref_name) == remote(UMUser.name), foreign(UMUser.id) == UMHold.user_id, UMUser.sheet_src == 'main')"
    )
    snipe_user = sqla.orm.relationship(
        'UMUser', uselist=False, viewonly=True,
        primaryjoin="and_(foreign(DiscordUser.pref_name) == UMUser.name, UMUser.sheet_src == 'snipe')"
    )
    snipe_merits = sqla_orm.relationship(
        'UMHold', lazy='select', uselist=True, viewonly=True,
        primaryjoin="and_(foreign(DiscordUser.pref_name) == remote(UMUser.name), foreign(UMUser.id) == UMHold.user_id, UMUser.sheet_src == 'snipe')"
    )

    def __repr__(self):
+3 −3
Original line number Diff line number Diff line
@@ -92,7 +92,7 @@ async def test_friendly_detector_already_in_kos(f_bot):
async def test_friendly_detector_canceled(f_bot):
    api = cog.inara.InaraApi()
    f_msg = fake_msg_gears('!whois Prozer')
    emoji_cancel = "\u274C"
    emoji_cancel = cog.util.CONF.emojis._no
    f_bot.wait_for.async_return_value = emoji_cancel, None
    cmdr = {"name": "Prozer", "allegiance": "Federation"}
    is_friendly_returned, squad_returned = await api.friendly_detector(cmdr, False, [], f_msg)
@@ -104,7 +104,7 @@ async def test_friendly_detector_canceled(f_bot):
async def test_friendly_detector_friendly_no_squad(f_bot):
    api = cog.inara.InaraApi()
    f_msg = fake_msg_gears('!whois Prozer')
    emoji_friendly = "\U0001F7E2"
    emoji_friendly = cog.util.CONF.emojis._friendly
    f_bot.wait_for.async_return_value = emoji_friendly, None
    cmdr = {"name": "Prozer", "allegiance": "Federation"}
    is_friendly_returned, squad_returned = await api.friendly_detector(cmdr, False, [], f_msg)
@@ -116,7 +116,7 @@ async def test_friendly_detector_friendly_no_squad(f_bot):
@pytest.mark.asyncio
async def test_friendly_detector_hostile_with_squad(f_bot):
    api = cog.inara.InaraApi()
    emoji_hostile = "\U0001F534"
    emoji_hostile = cog.util.CONF.emojis._hostile
    f_bot.wait_for.async_return_value = emoji_hostile, None
    f_msg = fake_msg_gears('!whois Akeno')
    cmdr = {"name": "Akeno", "allegiance": "Empire", "squad": "Test"}
Loading