Project Link

Status

This project used to be live and publicly accessible but is currently archived.

Description

By senior year of college I had honed my class scheduling workflow. I used it every semester and it spanned four browser tabs:

  1. CUNY DegreeAudit to see what courses I still need to take in my college career, including core and major requirements.
  2. CUNYFirst for next semester’s course catalog. I mainly used the course search and primarily needed course session dates, times, and session professors.
  3. RateMyProfessors for professor ratings. When choosing a session I needed to factor which professor was teaching it in addition to the session date/time because, when possible, it was worth comprimising on date for a better instructor.
  4. Free College Schedule Maker for a simple interface to experiment with different schedules and keep track of chosen sessions.

Working across many tabs and experiencing CUNYFirst’s objectively bad user experience made the class scheduling process a cumbersome chore. With the skills I had accumulated by my last year of college, I decided to make a web app that integrated these three services in one experience.


Say hi to CU-me.

CU-me is a one-stop for class scheduling for all CUNY students. It works for all 22 campuses for undergraduate and graduate students. Using your CUNY login you get access to a single-page application with degree requirements on the left side, course search on the right side, and a schedule canvas in the middle. Course search results include RateMyProfessors ratings. Underlying the visual experience is a publicly queryable REST API for course searching. Without further ado, here’s a gallery:

Login page

Login page


First-time tutorial modal

First-time tutorial modal


Main page

Main interface


Search results with RateMyProfessors ratings

Course search results with RateMyProfessors ratings


Class added to schedule

A course session added to the schedule


Tech writeup

This is a Django application with a PostgreSQL database.

Database

The database stores a user’s saved schedule by linking a Django user with selected courses. User actions trigger background AJAX requests, which update database entries, so changes are automatically saved.

Database diagram

Database diagram

API

The REST API has one GET endpoint for CUNY class searching. It wraps the CUNYFirst search API without requiring login.

I tried finding various ways to query CUNYFirst without using an automated browser, but could only find an unauthenticated page that allows interactive search. I use Selenium to interact with the form on this page filling in values from the GET params of the search request. I then scrape, format, and return the results as JSON.

Frontend

When a user logs in with their CUNY credentials, I use them to log into DegreeWorks using Selenium and scrape all degree requirements that I then present on the main screen. This is also when the user’s schedule data is fetched from the database or initialized if the user is new. The Selenium process takes a long time, so I utilize Celery, an asynchronous task queue, to run it as a background task with progress status updates to the user. The login process still takes a long time, but progress is communicated transparently to the user.

The main schedule consists of multiple overlaid HTML canvases with mouse event listeners. The schedule can be downloaded as an image at the click of a button.


A more complete tech description is available here.