That’s one of my current projects at work. We were using a home-grown course management solution in the Computer Science department, because the faculty here (and elsewhere, I hear) aren’t fond of Blackboard, and they also know that there’s a good bit of in-house PHP knowledge, so we built our own at first. Unfortunately, they wanted it kinda quickly, so we (again, unfortunately) hired a student to code it. The result was not pretty, and from the very first semester we used it, we were looking for a ready-made alternative.
Around September I started playing with Moodle. Around mid-October I started hacking it, and by mid-November I had most of the required features for our department working. I had to add a new assignment type that allowed professors to specify a list of files to be associated with a given assignment, mark them as optional or not, and then accept/manage uploads of these files from the students of the course.
The learning curve involved in getting to know moodle is a little bit steep at first. It took me about a week, full time, to get to where I was comfortable that I was not only getting things to work, but that I was doing it “the right way”. Thanks to Moodle’s really nice API and uber-modular design (not only are assignments modules, but each type of assignment is yet a separate submodule, for example), my new type is able to be completely isolated from the rest of the system, while at the same time doing just about everything using only API calls.
Moodle isn’t the fastest or most feature-packed app I’ve ever seen, but the API allows for such simple extension of the base functionality that I went with it just based on that. I’d recommend it to a friend.