Flexible Crosslistings

The University of Chicago's Snapshot Preprocessor

At the UofC we've slowly developed a very complex but powerful concept of crosslisting classes. We took a basic concept of "link the enrollments from multiple registrar classes into a single course on Blackboard" and expanded it to numerous uses. Currently our snapshot preprocessor uses crosslistings in the following ways:

Evolution

The original concept was to use a flat file that we got in a feed from the Registrar to automatically combine classes that the Registar considered one course, although they had multiple numbers. For example, a single course might be "Imperial China: 900-1100AD" but it may have two separate Registrar numbers, History 237 and East Asian Languages 274. Courses like these are common at the UofC, not only between departments but also within a department. The same course might be taught to graduate students as well as undergrads. While they meet at the same time, the different classes of students will have different assignments. While in this case the Registar still considers them separate classes for grading purposes, they are "crosslisted" together in our feed, which I imagine was originally set up that way for room reservations and scheduling.

The feed we receive from the registar looks like this.

The Registrar style of Course numbering (YYYY/QQDDDCCCCCSS, Year/Quarter Dept Course Section e.g. 2005/011162170011) is slightly different than the ones we use on Blackboard, primarily because you can't use /'s in Blackboard course IDs. Our Blackboard style is YYYY.QQ.DDDCCCCCSS (e.g. 2005.01.1162170011). The preprocessor scripts simply convert the format when it loads up the registrar file.

We soon (even before this went into production) realized that the exact same code could load up a second crosslisting file that we create. The first use of this was to handle Blackboard courses where the instructor(s) wanted all sections of the course to be in the same Blackboard course. This is particularly common in science classes, where the "sections" are usually only for Labs and everyone enrolled in the course meets for the same lectures.

Here is an example of our custom crosslisting file.

Originally we only had two types of entries, section XX, and section AB (or any other letter combination). We used XX to signify all sections of a course, and AB to be some subset. If two different instructors teaching multiple different sections of a course wanted all of their sections linked together, the first to request it would get section AB, the second CD, and so on.

For a while we simply expanded upon this. The code didn't change, but the ways we used it did. The first new style of crosslisting was really basic... normal numbers. Occasionally an instructor would forget to mention that he/she wanted multiple sections. Rather than renaming the class (which involves copying the class and deleting the original) we'd simply use the custom file to add all of the needed sections to the originally requested course.

When a program that teaches the same class every quarter wanted a single Blackboard for the whole school year (in order to allow students who have already completed the course to participate in the discussion boards), we simply put it into the crosslisting file, and invented the new name format YYYY-YY.DDDCCCCCSS (e.g. 2004-05.1162370001). And when a department wanted every student who is taking a class in their department to be in a departmental Blackboard course, we had them send us a list of all of their courses, and then put it into the crosslisting file.

After this point, the uses of the crosslisting function didn't change but the implementation did. Rather than having to manually add an entry for every crosslisted course we automated the common cases. Now, any course with the YYYY-YY syntax is automatically expanded into the individual quarters, and any course ending in XX automatically includes all sections of a course (unless it is in the custom crosslisting file, in which case that entry is used instead).

The Code

I make no claims that this is good code, but it is functional. The code originated as bourne scripts back in the CourseInfo 4.X days, and evolved with our system ever since. At some point when the scripts were taking about 45 minutes to run, they were converted into perl. Even though we have much more going on now it only took a few minutes to run.... until we added automated categorizations. Now it takes a bit over 10 minutes to complete. I'm sure it could be tuned to be faster, but it is fine for our purposes.

The output of all this code is a bunch of files in the correct format (and directory) for Blackboard's Snapshot Controller (a separate piece of code that Blackboard will probably give you if you ask nicely) to pick up and actually run snapshot on.

The Code Itself

Example Data Files

While I've made some attempt to keep the code commented and readable, it is still quite obtuse. If you have any questions or comments, feel free to contact me at swilson (at) uchicago.edu.