diff --git a/app/agents/scrapers/sample.py b/app/agents/scrapers/sample.py index bad5ab3..97e4d4f 100644 --- a/app/agents/scrapers/sample.py +++ b/app/agents/scrapers/sample.py @@ -51,6 +51,7 @@ class Meta: courseCode = factory.LazyFunction( lambda: f"{fake.random_letter().upper()}{fake.random_letter().upper()}{fake.random_letter().upper()} {fake.random_int(min=100, max=499)}" ) + professorName = factory.Faker('name') credit = factory.LazyFunction(lambda: random.choice([3, 4])) sessions = factory.LazyFunction(lambda: [SessionFactory() for _ in range(random.randint(1, 3))]) diff --git a/app/agents/scrapers/simon_fraser_university.py b/app/agents/scrapers/simon_fraser_university.py index 4ac4fc2..6500de8 100644 --- a/app/agents/scrapers/simon_fraser_university.py +++ b/app/agents/scrapers/simon_fraser_university.py @@ -144,6 +144,7 @@ async def fetch_courses(self) -> CourseListingModel: current_course: CourseModel = { "courseName": course.get('title'), "courseCode": f"{program['programCode']} {course.get('text')}", + "professorName": None, # Will be updated from detail "credit": None, # Credit info not available in API "sessions": [] } @@ -164,6 +165,17 @@ async def fetch_courses(self) -> CourseListingModel: if not detail: continue + # Get professor name from instructor info + instructors = detail.get('instructor', []) + if instructors: + # Get primary instructor if available, otherwise first instructor + primary_instructor = next( + (i for i in instructors if i.get('roleCode') == 'PI'), + instructors[0] if instructors else None + ) + if primary_instructor: + current_course["professorName"] = primary_instructor.get('name') + schedule = detail.get('courseSchedule', []) for block in schedule: diff --git a/app/models/course.py b/app/models/course.py index 4f41d03..c624b13 100644 --- a/app/models/course.py +++ b/app/models/course.py @@ -19,6 +19,7 @@ class SessionModel(TypedDict): class CourseModel(TypedDict): courseName: Optional[str] # e.g. "Operating Systems" courseCode: Optional[str] # e.g. "CMPT 300 D100" + professorName: Optional[str] # e.g. "John Doe" credit: Optional[int] sessions: List[SessionModel]