From c79c478ab49127936af8927dc594eb8fb382f42b Mon Sep 17 00:00:00 2001 From: stijndcl Date: Sun, 25 Sep 2022 00:09:28 +0200 Subject: [PATCH] Start working on new roles --- ...39bb90_add_second_role_to_ufora_courses.py | 32 ++++ database/schemas.py | 2 + database/scripts/db01_ufora_courses_22_23.py | 160 ++++++++++++++++++ didier/data/embeds/schedules.py | 15 +- 4 files changed, 208 insertions(+), 1 deletion(-) create mode 100644 alembic/versions/11388e39bb90_add_second_role_to_ufora_courses.py create mode 100644 database/scripts/db01_ufora_courses_22_23.py diff --git a/alembic/versions/11388e39bb90_add_second_role_to_ufora_courses.py b/alembic/versions/11388e39bb90_add_second_role_to_ufora_courses.py new file mode 100644 index 0000000..81672bc --- /dev/null +++ b/alembic/versions/11388e39bb90_add_second_role_to_ufora_courses.py @@ -0,0 +1,32 @@ +"""Add second role to ufora courses + +Revision ID: 11388e39bb90 +Revises: a64876b41af2 +Create Date: 2022-09-25 00:09:06.625622 + +""" +import sqlalchemy as sa + +from alembic import op + +# revision identifiers, used by Alembic. +revision = "11388e39bb90" +down_revision = "a64876b41af2" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table("ufora_courses", schema=None) as batch_op: + batch_op.add_column(sa.Column("alternative_overarching_role_id", sa.BigInteger(), nullable=True)) + + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table("ufora_courses", schema=None) as batch_op: + batch_op.drop_column("alternative_overarching_role_id") + + # ### end Alembic commands ### diff --git a/database/schemas.py b/database/schemas.py index 3fd8ce4..e5322c1 100644 --- a/database/schemas.py +++ b/database/schemas.py @@ -254,6 +254,8 @@ class UforaCourse(Base): compulsory: bool = Column(Boolean, server_default="1", nullable=False) role_id: Optional[int] = Column(BigInteger, nullable=True, unique=False) overarching_role_id: Optional[int] = Column(BigInteger, nullable=True, unique=False) + # This is not the greatest fix, but there can only ever be two, so it will do the job + alternative_overarching_role_id: Optional[int] = Column(BigInteger, nullable=True, unique=False) log_announcements: bool = Column(Boolean, server_default="0", nullable=False) announcements: list[UforaAnnouncement] = relationship( diff --git a/database/scripts/db01_ufora_courses_22_23.py b/database/scripts/db01_ufora_courses_22_23.py new file mode 100644 index 0000000..3be21ec --- /dev/null +++ b/database/scripts/db01_ufora_courses_22_23.py @@ -0,0 +1,160 @@ +from sqlalchemy.ext.asyncio import AsyncSession + +from database.engine import DBSession +from database.schemas import UforaCourse, UforaCourseAlias + +__all__ = ["main"] + + +async def main(): + """Add the Ufora courses for the 2022-2023 academic year""" + session: AsyncSession + async with DBSession() as session: + """3rd Bachelor""" + artificiele_intelligentie = UforaCourse( + code="C003756", + name="Artificiële Intelligentie", + year=3, + compulsory=True, + role_id=891743671022673920, + overarching_role_id=891743208248324196, + ) + + algoritmen_datastructuren_3 = UforaCourse( + code="C003782", + name="Algoritmen en Datastructuren 3", + year=3, + compulsory=True, + role_id=891743791466307654, + overarching_role_id=891743208248324196, + ) + + automaten_berekenbaarheid_complexiteit = UforaCourse( + code="C003785", + name="Automaten, Berekenbaarheid en Complexiteit", + year=3, + compulsory=True, + role_id=891744082404200539, + overarching_role_id=891743208248324196, + ) + + besturingssystemen = UforaCourse( + code="E019010", + name="Besturingssystemen", + year=3, + compulsory=True, + role_id=891743898291032114, + overarching_role_id=891743208248324196, + ) + + computationele_biologie = UforaCourse( + code="C003789", + name="Computationele Biologie", + year=3, + compulsory=True, + role_id=891744050988847135, + overarching_role_id=891743208248324196, + ) + + logisch_programmeren = UforaCourse( + code="C003783", + name="Logisch Programmeren", + year=3, + compulsory=True, + role_id=891743966482034800, + overarching_role_id=891743208248324196, + ) + + software_engineering_lab_2 = UforaCourse( + code="C003784", + name="Software Engineering Lab 2", + year=3, + compulsory=True, + role_id=891744007300980737, + overarching_role_id=891743208248324196, + ) + + modelleren_en_simuleren = UforaCourse( + course_id=636139, + code="C003786", + name="Modelleren en Simuleren", + year=3, + compulsory=True, + overarching_role_id=891744461405687808, + log_announcements=True, + ) + + informatiebeveiliging = UforaCourse( + code="E019400", + name="Informatiebeveiliging", + year=3, + compulsory=True, + role_id=1023333190678626314, + overarching_role_id=891744461405687808, + alternative_overarching_role_id=1023278462733127710, + ) + + parallelle_computersystemen = UforaCourse( + code="E034140", + name="Parallelle Computersystemen", + year=3, + compulsory=True, + role_id=1023300295918358691, + overarching_role_id=891744461405687808, + alternative_overarching_role_id=1023278462733127710, + ) + + session.add_all( + [ + artificiele_intelligentie, + algoritmen_datastructuren_3, + automaten_berekenbaarheid_complexiteit, + besturingssystemen, + computationele_biologie, + logisch_programmeren, + software_engineering_lab_2, + modelleren_en_simuleren, + informatiebeveiliging, + parallelle_computersystemen, + ] + ) + await session.commit() + + """Aliases""" + ai = UforaCourseAlias(course_id=artificiele_intelligentie.course_id, alias="AI") + ad3 = UforaCourseAlias(course_id=algoritmen_datastructuren_3.course_id, alias="AD3") + abc = (UforaCourseAlias(course_id=automaten_berekenbaarheid_complexiteit.course_id, alias="ABC"),) + bs = UforaCourseAlias(course_id=besturingssystemen.course_id, alias="BS") + compbio = UforaCourseAlias(course_id=computationele_biologie.course_id, alias="Compbio") + logprog = UforaCourseAlias(course_id=logisch_programmeren.course_id, alias="LogProg") + prolog = UforaCourseAlias(course_id=logisch_programmeren.course_id, alias="Prolog") + sel2 = UforaCourseAlias(course_id=software_engineering_lab_2.course_id, alias="SEL2") + selab2 = UforaCourseAlias(course_id=software_engineering_lab_2.course_id, alias="SELab2") + modsim = UforaCourseAlias(course_id=modelleren_en_simuleren.course_id, alias="ModSim") + infosec = UforaCourseAlias(course_id=informatiebeveiliging.course_id, alias="InfoSec") + information_security = UforaCourseAlias(course_id=informatiebeveiliging.course_id, alias="Information Security") + pcs = UforaCourseAlias(course_id=parallelle_computersystemen.course_id, alias="PCS") + parallel_computer_systems = UforaCourseAlias( + parallelle_computersystemen.course_id, alias="Parallel Computer Systems" + ) + + session.add_all( + [ + ai, + ad3, + abc, + bs, + compbio, + logprog, + prolog, + sel2, + selab2, + modsim, + infosec, + information_security, + pcs, + parallel_computer_systems, + ] + ) + + await session.commit() diff --git a/didier/data/embeds/schedules.py b/didier/data/embeds/schedules.py index 1c32bbf..98a7a51 100644 --- a/didier/data/embeds/schedules.py +++ b/didier/data/embeds/schedules.py @@ -54,8 +54,16 @@ class Schedule(EmbedBaseModel): personal_slots = set() for slot in self.slots: + alt_id = slot.alternative_overarching_role_id + + # Check if the user has a course selected in their roles role_found = slot.role_id is not None and slot.role_id in roles - overarching_role_found = slot.overarching_role_id is not None and slot.overarching_role_id in roles + + # Some engineering master courses are present in multiple different places, + # so this is necessary + overarching_role_found = (slot.overarching_role_id is not None and slot.overarching_role_id in roles) or ( + alt_id is not None and alt_id in roles + ) if role_found or overarching_role_found: personal_slots.add(slot) @@ -131,6 +139,11 @@ class ScheduleSlot: # so this is guaranteed to be unique self._hash = hash(f"{self.course.course_id} {str(self.start_time)}") + @property + def alternative_overarching_role_id(self) -> Optional[int]: + """Shortcut to getting the alternative overarching role id for this slot""" + return self.course.alternative_overarching_role_id + @property def overarching_role_id(self) -> Optional[int]: """Shortcut to getting the overarching role id for this slot"""