diff --git a/carpi_data_model/models.py b/carpi_data_model/models.py index 6eefe8c..1411171 100644 --- a/carpi_data_model/models.py +++ b/carpi_data_model/models.py @@ -37,6 +37,11 @@ class SemesterEnum(str, PyEnum): SUMMER = "SUMMER" +class PrerequisiteNestingTypeEnum(str, PyEnum): + AND = "AND" + OR = "OR" + + RELATIONSHIP_TYPE_ENUM = SQLEnum( RelationshipTypeEnum, name="relationship_type", native_enum=True ) @@ -47,6 +52,11 @@ class SemesterEnum(str, PyEnum): RestrictionTypeEnum, name="restriction_type", native_enum=True ) SEMESTER_ENUM = SQLEnum(SemesterEnum, name="semester", native_enum=True) +PREREQUISITE_NESTING_TYPE_ENUM = SQLEnum( + PrerequisiteNestingTypeEnum, + name="prerequisite_nesting_type", + native_enum=True, +) class Subject(Base): @@ -194,3 +204,55 @@ class Course_Faculty(Base): ], ), ) + + +class Prerequisite_Nesting(Base): + __tablename__ = "prerequisite_nesting" + + og_subj_code: Mapped[str] = mapped_column(VARCHAR(4), primary_key=True) + og_code_num: Mapped[str] = mapped_column(VARCHAR(4), primary_key=True) + id: Mapped[int] = mapped_column(SMALLINT, primary_key=True) + relationship: Mapped[PrerequisiteNestingTypeEnum | None] = mapped_column( + PREREQUISITE_NESTING_TYPE_ENUM, + nullable=True, + ) + parent_id: Mapped[int | None] = mapped_column(SMALLINT, nullable=True) + + __table_args__ = ( + ForeignKeyConstraint( + ["og_subj_code", "og_code_num"], + ["course.subj_code", "course.code_num"], + ), + ForeignKeyConstraint( + ["og_subj_code", "og_code_num", "parent_id"], + [ + "prerequisite_nesting.og_subj_code", + "prerequisite_nesting.og_code_num", + "prerequisite_nesting.id", + ], + ), + ) + + +class Prerequisite_Course(Base): + __tablename__ = "prerequisite_course" + + og_subj_code: Mapped[str] = mapped_column(VARCHAR(4), primary_key=True) + og_code_num: Mapped[str] = mapped_column(VARCHAR(4), primary_key=True) + parent_id: Mapped[int] = mapped_column(SMALLINT, primary_key=True) + new_subj_code: Mapped[str] = mapped_column(VARCHAR(4), primary_key=True) + new_code_num: Mapped[str] = mapped_column(VARCHAR(4), primary_key=True) + + __table_args__ = ( + ForeignKeyConstraint( + ["og_subj_code", "og_code_num", "parent_id"], + [ + "prerequisite_nesting.og_subj_code", + "prerequisite_nesting.og_code_num", + "prerequisite_nesting.id", + ], + ), + ForeignKeyConstraint( + ["new_subj_code", "new_code_num"], ["course.subj_code", "course.code_num"] + ), + ) diff --git a/pyproject.toml b/pyproject.toml index 4b9fd90..464f79e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,13 +7,16 @@ name = "carpi-data-model" version = "1.0" dependencies = ["SQLAlchemy>=2.0.0"] requires-python = ">=3.10" -authors = [{ name = "Raymond Chen" }, { name = "Jack Zgombic" }] +authors = [ + { name = "Raymond Chen" }, + { name = "Jack Zgombic" }, + { name = "Nick Wang" }, +] maintainers = [{ name = "Raymond Chen" }] description = "The MySQL database schema used in Project CARPI." readme = "README.md" license = "MIT" license-files = ["LICENSE"] -keywords = ["egg", "bacon", "sausage", "tomatoes", "Lobster Thermidor"] classifiers = [ "Programming Language :: Python :: 3", "Operating System :: OS Independent", diff --git a/tests/test_models.py b/tests/test_models.py index d3a4b68..abae33f 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -13,6 +13,8 @@ Course_Relationship, Course_Restriction, Faculty, + Prerequisite_Course, + Prerequisite_Nesting, Restriction, Subject, ) @@ -50,7 +52,7 @@ def test_create_tables(engine): errors. Ensures the tables actually exist in the database catalog. """ inspector = inspect(engine) - existing_tables = inspector.get_table_names() + existing_tables = set(inspector.get_table_names()) assert Subject.__tablename__ in existing_tables assert Attribute.__tablename__ in existing_tables @@ -62,6 +64,8 @@ def test_create_tables(engine): assert Course_Restriction.__tablename__ in existing_tables assert Course_Offering.__tablename__ in existing_tables assert Course_Faculty.__tablename__ in existing_tables + assert Prerequisite_Nesting.__tablename__ in existing_tables + assert Prerequisite_Course.__tablename__ in existing_tables def test_insert_and_query(engine):