diff --git a/classes/election_cycle.py b/classes/election.py similarity index 92% rename from classes/election_cycle.py rename to classes/election.py index 6b3dc89..6ff2011 100644 --- a/classes/election_cycle.py +++ b/classes/election.py @@ -31,9 +31,9 @@ from utils import ( REQUIRED_VOTES_TO_BE_ELECTED = 3 -class ElectionCycle: +class Election: """ - ElectionCycle class. + Election class. This class represents all the dates required for an election cycle along with all the functions needed to operate the cycle. @@ -183,7 +183,7 @@ class ElectionCycle: # create new entry into database. with Session(engine) as session: new_cycle = ElectionInformation( - ElectionCycle=quarter_name, + ElectionName=quarter_name, ThreadId=thread.id, CouncilNominationMsgId=nominate_msg.id, ) @@ -206,9 +206,7 @@ class ElectionCycle: ) with Session(engine) as session: - stmt = select(ElectionInformation).where( - ElectionInformation.ElectionCycle == get_election_name(self.config) - ) + stmt = select(ElectionInformation).where(ElectionInformation.ElectionName == get_election_name(self.config)) info = session.scalar(stmt) info.CouncilVoteMsgId = vote_msg.id session.commit() @@ -231,7 +229,7 @@ class ElectionCycle: with Session(engine) as session: # remove vote button from vote message - stmt = select(ElectionInformation).where(ElectionInformation.ElectionCycle == election_name) + stmt = select(ElectionInformation).where(ElectionInformation.ElectionName == election_name) info = session.scalar(stmt) vote_msg: nextcord.Message = await election_thread.fetch_message(info.CouncilVoteMsgId) await vote_msg.edit(view=None) @@ -243,7 +241,7 @@ class ElectionCycle: # add the highcouncil role to everyone with 3 or more votes. set elected to true in database stmt = ( select(Votes.VotedForId) - .where(Votes.ElectionCycle == election_name) + .where(Votes.ElectionName == election_name) .where(Votes.Type == VoteType.COUNCIL) ) vote_count = collections.Counter(session.scalars(stmt)) @@ -252,7 +250,7 @@ class ElectionCycle: if votes >= REQUIRED_VOTES_TO_BE_ELECTED: stmt = ( select(CouncilMembers) - .where(CouncilMembers.ElectionCycle == election_name) + .where(CouncilMembers.ElectionName == election_name) .where(CouncilMembers.MemberId == user_id) ) council_member = session.scalar(stmt) @@ -277,9 +275,7 @@ class ElectionCycle: ) with Session(engine) as session: - stmt = select(ElectionInformation).where( - ElectionInformation.ElectionCycle == get_election_name(self.config) - ) + stmt = select(ElectionInformation).where(ElectionInformation.ElectionName == get_election_name(self.config)) info = session.scalar(stmt) info.HighCouncilVoteMsgId = vote_msg.id session.commit() @@ -295,13 +291,13 @@ class ElectionCycle: elect_role: nextcord.Role = self.guild.get_role(self.config.params.clan_council_elect_role_id) council_role: nextcord.Role = self.guild.get_role(self.config.params.clan_council_role_id) - election_cycle = get_election_name(self.config) + election_name = get_election_name(self.config) with Session(engine) as session: # role management stmt = ( select(CouncilMembers.MemberId) - .where(CouncilMembers.ElectionCycle == election_cycle) + .where(CouncilMembers.ElectionName == election_name) .where(CouncilMembers.Elected == true()) ) @@ -320,13 +316,13 @@ class ElectionCycle: # ties are undefined behavior. stmt = ( select(Votes.VotedForId) - .where(Votes.ElectionCycle == election_cycle) + .where(Votes.ElectionName == election_name) .where(Votes.Type == VoteType.DISCORDMANAGER) ) dm_votes = collections.Counter(session.scalars(stmt)) stmt = ( select(Votes.VotedForId) - .where(Votes.ElectionCycle == election_cycle) + .where(Votes.ElectionName == election_name) .where(Votes.Type == VoteType.CLANLEADER) ) cl_votes = collections.Counter(session.scalars(stmt)) @@ -335,7 +331,7 @@ class ElectionCycle: dm_winner = max(dm_votes, key=dm_votes.get) stmt = ( update(CouncilMembers) - .where(CouncilMembers.ElectionCycle == election_cycle) + .where(CouncilMembers.ElectionName == election_name) .where(CouncilMembers.MemberId == dm_winner) .values(DiscordManager=True) ) @@ -346,7 +342,7 @@ class ElectionCycle: cl_winner = max(cl_votes, key=cl_votes.get) stmt = ( update(CouncilMembers) - .where(CouncilMembers.ElectionCycle == election_cycle) + .where(CouncilMembers.ElectionName == election_name) .where(CouncilMembers.MemberId == cl_winner) .values(ClanLeader=True) ) @@ -360,7 +356,7 @@ class ElectionCycle: # clear view from vote message stmt = select(ElectionInformation.HighCouncilVoteMsgId).where( - ElectionInformation.ElectionCycle == get_election_name(self.config) + ElectionInformation.ElectionName == get_election_name(self.config) ) vote_msg_id = session.scalar(stmt) vote_msg: nextcord.Message = await election_thread.fetch_message(vote_msg_id) @@ -383,9 +379,7 @@ class ElectionCycle: ElectionInformation: The information from the database about the current election. """ with Session(engine) as session: - stmt = select(ElectionInformation).where( - ElectionInformation.ElectionCycle == get_election_name(self.config) - ) + stmt = select(ElectionInformation).where(ElectionInformation.ElectionName == get_election_name(self.config)) return session.scalar(stmt) async def election_reminder(self) -> None: diff --git a/classes/nominate_highcouncil_views.py b/classes/nominate_highcouncil_views.py index 9fdbcc8..620bde9 100644 --- a/classes/nominate_highcouncil_views.py +++ b/classes/nominate_highcouncil_views.py @@ -58,10 +58,10 @@ class NominateDMModal(nextcord.ui.Modal): with Session(engine) as session: # user already in table - cycle = get_election_name(self.config) + election_name = get_election_name(self.config) stmt = ( select(CouncilMembers) - .where(CouncilMembers.ElectionCycle == cycle) + .where(CouncilMembers.ElectionName == election_name) .where(CouncilMembers.MemberId == self.usr_id) ) council_elect = session.scalar(stmt) @@ -120,10 +120,10 @@ class NominateCLModal(nextcord.ui.Modal): with Session(engine) as session: # user already in table - cycle = get_election_name(self.config) + election_name = get_election_name(self.config) stmt = ( select(CouncilMembers) - .where(CouncilMembers.ElectionCycle == cycle) + .where(CouncilMembers.ElectionName == election_name) .where(CouncilMembers.MemberId == self.usr_id) ) council_elect = session.scalar(stmt) @@ -170,13 +170,13 @@ class NominateHighCouncilView(nextcord.ui.View): ) return - cycle = get_election_name(self.config) + election_name = get_election_name(self.config) usr_nominated = False speech_content = "" with Session(engine) as session: stmt = ( select(CouncilMembers) - .where(CouncilMembers.ElectionCycle == cycle) + .where(CouncilMembers.ElectionName == election_name) .where(CouncilMembers.MemberId == interaction.user.id) ) obj = session.scalar(stmt) @@ -215,13 +215,13 @@ class NominateHighCouncilView(nextcord.ui.View): ) return - cycle = get_election_name(self.config) + election_name = get_election_name(self.config) usr_nominated = False speech_content = "" with Session(engine) as session: stmt = ( select(CouncilMembers) - .where(CouncilMembers.ElectionCycle == cycle) + .where(CouncilMembers.ElectionName == election_name) .where(CouncilMembers.MemberId == interaction.user.id) ) obj = session.scalar(stmt) diff --git a/classes/nominate_views.py b/classes/nominate_views.py index b6d8578..f704420 100644 --- a/classes/nominate_views.py +++ b/classes/nominate_views.py @@ -50,13 +50,14 @@ class NominateModal(nextcord.ui.Modal): """ speech = decorate_nomination(interaction.user.id, self.speech.value) + election_name = get_election_name(self.config) with Session(engine) as session: if not self.usr_nominated: msg = await interaction.channel.send(speech) council_member = CouncilMembers( - ElectionCycle=get_election_name(self.config), + ElectionName=election_name, MemberId=interaction.user.id, SpeechMsgId=msg.id, ) @@ -64,10 +65,9 @@ class NominateModal(nextcord.ui.Modal): session.commit() else: # user already nominated, just need to update the election speech - cycle = get_election_name(self.config) stmt = ( select(CouncilMembers) - .where(CouncilMembers.ElectionCycle == cycle) + .where(CouncilMembers.ElectionName == election_name) .where(CouncilMembers.MemberId == self.usr_id) ) obj = session.scalar(stmt) @@ -91,7 +91,7 @@ class NominateView(nextcord.ui.View): ) async def nominate(self, button: nextcord.ui.Button, interaction: nextcord.Interaction) -> None: # noqa: ARG002 """ - Button to nominate onself for Clan Council. + Button to nominate oneself for Clan Council. Gathers previous information about the user if they have already nominated themselves, then launches the nomination modal to get their speech. @@ -108,13 +108,13 @@ class NominateView(nextcord.ui.View): ) return - cycle = get_election_name(self.config) + election_name = get_election_name(self.config) usr_nominated = False speech_content = "" with Session(engine) as session: stmt = ( select(CouncilMembers) - .where(CouncilMembers.ElectionCycle == cycle) + .where(CouncilMembers.ElectionName == election_name) .where(CouncilMembers.MemberId == interaction.user.id) ) obj = session.scalar(stmt) diff --git a/classes/voting_highcouncil_views.py b/classes/voting_highcouncil_views.py index 98d3b1e..e3497b2 100644 --- a/classes/voting_highcouncil_views.py +++ b/classes/voting_highcouncil_views.py @@ -41,14 +41,14 @@ class VoteSelect(nextcord.ui.StringSelect): election_name: str = get_election_name(self.config) with Session(engine) as session: stmt = select(ElectionInformation.HighCouncilVoteMsgId).where( - ElectionInformation.ElectionCycle == election_name + ElectionInformation.ElectionName == election_name ) vote_msg_id = session.scalar(stmt) voted_for = None if self.values[0] == "Abstain" else int(self.values[0]) new_vote = Votes( - ElectionCycle=election_name, + ElectionName=election_name, VoterId=interaction.user.id, VotedForId=voted_for, Type=self.election_type, @@ -63,7 +63,7 @@ class VoteSelect(nextcord.ui.StringSelect): session.rollback() stmt = ( update(Votes) - .where(Votes.ElectionCycle == election_name) + .where(Votes.ElectionName == election_name) .where(Votes.VoterId == interaction.user.id) .where(Votes.Type == self.election_type) .values(VotedForId=voted_for) @@ -118,7 +118,7 @@ class VoteHighcouncilView(nextcord.ui.View): with Session(engine) as session: stmt = ( select(Votes.VotedForId) - .where(Votes.ElectionCycle == election_name) + .where(Votes.ElectionName == election_name) .where(Votes.VoterId == interaction.user.id) .where(Votes.Type == VoteType.CLANLEADER) ) @@ -126,7 +126,7 @@ class VoteHighcouncilView(nextcord.ui.View): stmt = ( select(CouncilMembers.MemberId) - .where(CouncilMembers.ElectionCycle == election_name) + .where(CouncilMembers.ElectionName == election_name) .filter(CouncilMembers.ClanLeaderSpeechId.is_not(None)) ) @@ -190,7 +190,7 @@ class VoteHighcouncilView(nextcord.ui.View): with Session(engine) as session: stmt = ( select(Votes.VotedForId) - .where(Votes.ElectionCycle == election_name) + .where(Votes.ElectionName == election_name) .where(Votes.VoterId == interaction.user.id) .where(Votes.Type == VoteType.DISCORDMANAGER) ) @@ -198,7 +198,7 @@ class VoteHighcouncilView(nextcord.ui.View): stmt = ( select(CouncilMembers.MemberId) - .where(CouncilMembers.ElectionCycle == election_name) + .where(CouncilMembers.ElectionName == election_name) .filter(CouncilMembers.DiscordManagerSpeechId.is_not(None)) ) diff --git a/classes/voting_views.py b/classes/voting_views.py index 09dd647..4a51238 100644 --- a/classes/voting_views.py +++ b/classes/voting_views.py @@ -39,15 +39,13 @@ class VoteSelect(nextcord.ui.StringSelect): """ election_name = get_election_name(self.config) with Session(engine) as session: - stmt = select(ElectionInformation.CouncilVoteMsgId).where( - ElectionInformation.ElectionCycle == election_name - ) + stmt = select(ElectionInformation.CouncilVoteMsgId).where(ElectionInformation.ElectionName == election_name) vote_msg_id = session.scalar(stmt) voted_for = None if self.values[0] == "Abstain" else int(self.values[0]) new_vote = Votes( - ElectionCycle=election_name, + ElectionName=election_name, VoterId=interaction.user.id, VotedForId=voted_for, Type=VoteType.COUNCIL, @@ -61,7 +59,7 @@ class VoteSelect(nextcord.ui.StringSelect): session.rollback() stmt = ( update(Votes) - .where(Votes.ElectionCycle == election_name) + .where(Votes.ElectionName == election_name) .where(Votes.VoterId == interaction.user.id) .where(Votes.Type == VoteType.COUNCIL) .values(VotedForId=voted_for) @@ -106,18 +104,18 @@ class VoteView(nextcord.ui.View): ) return - election: str = get_election_name(self.config) + election_name: str = get_election_name(self.config) with Session(engine) as session: stmt = ( select(Votes.VotedForId) - .where(Votes.ElectionCycle == election) + .where(Votes.ElectionName == election_name) .where(Votes.VoterId == interaction.user.id) .where(Votes.Type == VoteType.COUNCIL) ) voted_for = session.scalar(stmt) - stmt = select(CouncilMembers.MemberId).where(CouncilMembers.ElectionCycle == election) + stmt = select(CouncilMembers.MemberId).where(CouncilMembers.ElectionName == election_name) options = [ SelectOption( diff --git a/cogs/commands/test.py b/cogs/commands/test.py index c8dd53e..9226496 100644 --- a/cogs/commands/test.py +++ b/cogs/commands/test.py @@ -5,7 +5,7 @@ from typing import TYPE_CHECKING import nextcord from nextcord.ext import application_checks, commands -from classes.election_cycle import ElectionCycle +from classes.election import Election from utils import GUILDS, get_current_election_cycle if TYPE_CHECKING: @@ -45,7 +45,7 @@ class TestCog(commands.Cog, name="Test commands."): interaction (nextcord.Interaction): Interaction with the message. """ config: DakinyConfig = self.bot.config - cycle = ElectionCycle( + cycle = Election( get_current_election_cycle(config), config, self.bot.get_guild(config.params.guild_id), @@ -63,7 +63,7 @@ class TestCog(commands.Cog, name="Test commands."): interaction (nextcord.Interaction): Interaction with the message. """ config: DakinyConfig = self.bot.config - cycle = ElectionCycle( + cycle = Election( get_current_election_cycle(config), config, self.bot.get_guild(config.params.guild_id), @@ -81,7 +81,7 @@ class TestCog(commands.Cog, name="Test commands."): interaction (nextcord.Interaction): Interaction with the message. """ config: DakinyConfig = self.bot.config - cycle = ElectionCycle( + cycle = Election( get_current_election_cycle(config), config, self.bot.get_guild(config.params.guild_id), @@ -99,7 +99,7 @@ class TestCog(commands.Cog, name="Test commands."): interaction (nextcord.Interaction): Interaction with the message. """ config: DakinyConfig = self.bot.config - cycle = ElectionCycle( + cycle = Election( get_current_election_cycle(config), config, self.bot.get_guild(config.params.guild_id), @@ -117,7 +117,7 @@ class TestCog(commands.Cog, name="Test commands."): interaction (nextcord.Interaction): Interaction with the message. """ config: DakinyConfig = self.bot.config - cycle = ElectionCycle( + cycle = Election( get_current_election_cycle(config), config, self.bot.get_guild(config.params.guild_id), @@ -135,7 +135,7 @@ class TestCog(commands.Cog, name="Test commands."): interaction (nextcord.Interaction): Interaction with the message. """ config: DakinyConfig = self.bot.config - cycle = ElectionCycle( + cycle = Election( get_current_election_cycle(config), config, self.bot.get_guild(config.params.guild_id), @@ -153,7 +153,7 @@ class TestCog(commands.Cog, name="Test commands."): interaction (nextcord.Interaction): Interaction with the message. """ config: DakinyConfig = self.bot.config - cycle = ElectionCycle( + cycle = Election( get_current_election_cycle(config), config, self.bot.get_guild(config.params.guild_id), diff --git a/cogs/commands/view.py b/cogs/commands/view.py index 25f0892..96a9ef4 100644 --- a/cogs/commands/view.py +++ b/cogs/commands/view.py @@ -149,7 +149,7 @@ class ViewCog(commands.Cog, name="View Commands"): election_name (str): Is SlashOption. The name of the election to view votes for. election_type(str): Is SlashOption. The type of election to search for. Choice from StrEnum VoteType. """ - stmt = select(Votes).where(Votes.ElectionCycle == election_name).where(Votes.Type == election_type) + stmt = select(Votes).where(Votes.ElectionName == election_name).where(Votes.Type == election_type) with Session(engine) as session: # Check if election exists. @@ -178,7 +178,7 @@ class ViewCog(commands.Cog, name="View Commands"): election_name (str): String to run autocomplete on. """ with Session(engine) as session: - stmt = select(Votes.ElectionCycle).distinct() + stmt = select(Votes.ElectionName).distinct() elections = session.scalars(stmt) # if empty compare string diff --git a/cogs/loops/daily_loop.py b/cogs/loops/daily_loop.py index c250629..61b6c45 100644 --- a/cogs/loops/daily_loop.py +++ b/cogs/loops/daily_loop.py @@ -9,7 +9,7 @@ from pytz import timezone from sqlalchemy import select from sqlalchemy.orm import Session -from classes.election_cycle import ElectionCycle +from classes.election import Election from database_setup.sql_data_classes import UserBirthday, engine from main import birthday_list from utils import get_current_election_cycle @@ -43,7 +43,7 @@ class DailyLoop(commands.Cog, name="Daily Loop"): election is over to delete the current election object. """ if self.current_election is None: - self.current_election = self.get_election_cycle() + self.current_election = self.get_election() if self.current_election is not None: await self.current_election.check_date() @@ -65,16 +65,16 @@ class DailyLoop(commands.Cog, name="Daily Loop"): await self.bot.wait_until_ready() # Bot needs to know guilds to get the current cycle. - self.current_election = self.get_election_cycle() + self.current_election = self.get_election() - def get_election_cycle(self) -> ElectionCycle: + def get_election(self) -> Election: """ Creates an object for the current election cycle if one is active. An election is considered active between the election start and the term start. Returns: - ElectionCycle: Current election cycle, None if there is no election happening. + Election: Current election cycle, None if there is no election happening. """ config: DakinyConfig = self.bot.config cycle = get_current_election_cycle(config) @@ -83,7 +83,7 @@ class DailyLoop(commands.Cog, name="Daily Loop"): if cycle is None: return None - return ElectionCycle(cycle, config, self.bot.get_guild(config.params.guild_id)) + return Election(cycle, config, self.bot.get_guild(config.params.guild_id)) def update_birthdays(self) -> None: """Goes through database to collect all birthdays that are today. Adds user's id to birthday list.""" diff --git a/config.py b/config.py index c7746da..3ba32f1 100644 --- a/config.py +++ b/config.py @@ -27,7 +27,7 @@ class Params: @dataclass -class ElectionCycle: +class Election: """Class defines relevant election dates.""" election_start: str @@ -45,5 +45,5 @@ class ElectionCycle: class DakinyConfig: """Class defines all configs required for Dakiny Bot.""" - election_cycles: list[ElectionCycle] + election_cycles: list[Election] params: Params diff --git a/utils.py b/utils.py index d093b6a..e5a7b73 100644 --- a/utils.py +++ b/utils.py @@ -148,7 +148,7 @@ def build_votes_str(config: DakinyConfig, guild: nextcord.Guild) -> str: election_name = get_election_name(config) with Session(engine) as session: - stmt = select(CouncilMembers).where(CouncilMembers.ElectionCycle == election_name) + stmt = select(CouncilMembers).where(CouncilMembers.ElectionName == election_name) for nominee in sorted( session.scalars(stmt), @@ -156,7 +156,7 @@ def build_votes_str(config: DakinyConfig, guild: nextcord.Guild) -> str: ): votes[nominee.MemberId] = 0 - stmt = select(Votes).where(Votes.ElectionCycle == election_name).where(Votes.Type == VoteType.COUNCIL) + stmt = select(Votes).where(Votes.ElectionName == election_name).where(Votes.Type == VoteType.COUNCIL) for vote in session.scalars(stmt): if vote.VotedForId is not None: @@ -187,7 +187,7 @@ def build_highcouncil_votes_str(config: DakinyConfig, guild: nextcord.Guild) -> with Session(engine) as session: stmt = ( select(CouncilMembers) - .where(CouncilMembers.ElectionCycle == election_name) + .where(CouncilMembers.ElectionName == election_name) .filter(CouncilMembers.ClanLeaderSpeechId.is_not(None)) ) @@ -197,7 +197,7 @@ def build_highcouncil_votes_str(config: DakinyConfig, guild: nextcord.Guild) -> ): cl_votes[nominee.MemberId] = 0 - stmt = select(Votes).where(Votes.ElectionCycle == election_name).where(Votes.Type == VoteType.CLANLEADER) + stmt = select(Votes).where(Votes.ElectionName == election_name).where(Votes.Type == VoteType.CLANLEADER) for vote in session.scalars(stmt): if vote.VotedForId is not None: @@ -205,7 +205,7 @@ def build_highcouncil_votes_str(config: DakinyConfig, guild: nextcord.Guild) -> stmt = ( select(CouncilMembers) - .where(CouncilMembers.ElectionCycle == election_name) + .where(CouncilMembers.ElectionName == election_name) .filter(CouncilMembers.DiscordManagerSpeechId.is_not(None)) ) @@ -215,7 +215,7 @@ def build_highcouncil_votes_str(config: DakinyConfig, guild: nextcord.Guild) -> ): dm_votes[nominee.MemberId] = 0 - stmt = select(Votes).where(Votes.ElectionCycle == election_name).where(Votes.Type == VoteType.DISCORDMANAGER) + stmt = select(Votes).where(Votes.ElectionName == election_name).where(Votes.Type == VoteType.DISCORDMANAGER) for vote in session.scalars(stmt): if vote.VotedForId is not None: @@ -512,23 +512,23 @@ async def edit_clan_council_info(guild: nextcord.Guild, config: DakinyConfig) -> """ clan_info_channel: nextcord.TextChannel = await guild.fetch_channel(config.params.clan_info_channel_id) - election = get_election_name(config) + election_name = get_election_name(config) with Session(engine) as session: stmt = ( select(CouncilMembers.MemberId) - .where(CouncilMembers.ElectionCycle == election) + .where(CouncilMembers.ElectionName == election_name) .where(CouncilMembers.DiscordManager == true()) ) discord_manager = session.scalar(stmt) stmt = ( select(CouncilMembers.MemberId) - .where(CouncilMembers.ElectionCycle == election) + .where(CouncilMembers.ElectionName == election_name) .where(CouncilMembers.ClanLeader == true()) ) clan_leader = session.scalar(stmt) stmt = ( select(CouncilMembers.MemberId) - .where(CouncilMembers.ElectionCycle == election) + .where(CouncilMembers.ElectionName == election_name) .where(CouncilMembers.Elected == true()) )