Merge pull request #154 from stijndcl/deadlines

Filter out irrelevant deadlines
pull/155/head
Stijn De Clercq 2022-11-05 22:31:08 +01:00 committed by GitHub
commit 8f8f7fed4a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 34 additions and 11 deletions

View File

@ -1,3 +1,4 @@
import datetime
from typing import Optional from typing import Optional
from zoneinfo import ZoneInfo from zoneinfo import ZoneInfo
@ -24,13 +25,15 @@ async def add_deadline(session: AsyncSession, course_id: int, name: str, date_st
await session.commit() await session.commit()
async def get_deadlines(session: AsyncSession, *, course: Optional[UforaCourse] = None) -> list[Deadline]: async def get_deadlines(
"""Get a list of all deadlines that are currently known session: AsyncSession, *, after: Optional[datetime.date] = None, course: Optional[UforaCourse] = None
) -> list[Deadline]:
This includes deadlines that have passed already """Get a list of all upcoming deadlines"""
"""
statement = select(Deadline) statement = select(Deadline)
if after is not None:
statement = statement.where(Deadline.deadline > after)
if course is not None: if course is not None:
statement = statement.where(Deadline.course_id == course.course_id) statement = statement.where(Deadline.course_id == course.course_id)

View File

@ -15,7 +15,7 @@ from didier.data.embeds.schedules import Schedule, get_schedule_for_day
from didier.exceptions import HTTPException, NotInMainGuildException from didier.exceptions import HTTPException, NotInMainGuildException
from didier.utils.discord.converters.time import DateTransformer from didier.utils.discord.converters.time import DateTransformer
from didier.utils.discord.flags.school import StudyGuideFlags from didier.utils.discord.flags.school import StudyGuideFlags
from didier.utils.discord.users import to_main_guild_member from didier.utils.discord.users import has_course, to_main_guild_member
from didier.utils.types.datetime import skip_weekends, tz_aware_today from didier.utils.types.datetime import skip_weekends, tz_aware_today
@ -30,8 +30,12 @@ class School(commands.Cog):
@commands.hybrid_command(name="deadlines") @commands.hybrid_command(name="deadlines")
async def deadlines(self, ctx: commands.Context): async def deadlines(self, ctx: commands.Context):
"""Show upcoming deadlines.""" """Show upcoming deadlines."""
async with ctx.typing():
async with self.client.postgres_session as session: async with self.client.postgres_session as session:
deadlines = await get_deadlines(session) deadlines = await get_deadlines(session, after=tz_aware_today())
member = to_main_guild_member(self.client, ctx.author)
deadlines = list(filter(lambda d: has_course(member, d.course), deadlines))
embed = Deadlines(deadlines).to_embed() embed = Deadlines(deadlines).to_embed()
await ctx.reply(embed=embed, mention_author=False, ephemeral=False) await ctx.reply(embed=embed, mention_author=False, ephemeral=False)

View File

@ -2,10 +2,26 @@ from typing import Union
import discord import discord
from database.schemas import UforaCourse
from didier import Didier from didier import Didier
from didier.exceptions import NotInMainGuildException from didier.exceptions import NotInMainGuildException
__all__ = ["to_main_guild_member"] __all__ = ["has_course", "to_main_guild_member"]
def has_course(member: discord.Member, course: UforaCourse) -> bool:
"""Check if a member is taking a Ufora course"""
for role in member.roles:
if role.id == course.role_id:
return True
if course.overarching_role_id is not None and course.overarching_role_id == role.id:
return True
if course.alternative_overarching_role_id is not None and course.alternative_overarching_role_id == role.id:
return True
return False
def to_main_guild_member(client: Didier, user: Union[discord.User, discord.Member]) -> discord.Member: def to_main_guild_member(client: Didier, user: Union[discord.User, discord.Member]) -> discord.Member: