edx/edx-platform — pull request #5779 by bradenmacdonald (2014-10-29 07:33:50+00:00)
Title: (WIP) Content libraries prototype

This is a WIP pull request so interested developers can comment on the code and/or architecture. This branch may be rebased and its history rewritten at any time.

**Background**: This is an early-stage prototype implementation of [Content Libraries](https://openedx.atlassian.net/wiki/display/SOL/Content+Libraries) ([SOL-11](https://openedx.atlassian.net/browse/SOL-11)). Once this PR is ready, it is intended to be merged so that it can be used as a common basis for further work on the feature. It is not intended for use on production instances anytime soon, so is disabled by default using a feature flag.

**Discussion**: Architecture discussed extensively on [the wiki](https://openedx.atlassian.net/wiki/display/SOL/Content+Libraries) and in meetings, then the revised proposal was presented to the [Arch Council](https://openedx.atlassian.net/wiki/display/AC/Architecture+Council) on Oct. 21 and given thumbs up. [Some open questions remain](https://openedx.atlassian.net/wiki/display/SOL/10-22-2014+Architect+Council+Review+of+Content+Libraries).

**Partner information**: 3rd party-hosted open edX instance, for an edX solutions client.

**Merge deadline**: TBD

**Dependencies**: Requires edx/opaque-keys#46

**Status**: Demonstrates the very basic features of libraries.

**Yet to do**:
- [ ] Tests
- [ ] Handle `Scope.settings` as designed (store in definitions), allow overrides
- [ ] Test with child objects - e.g. putting an A/B test or randomize or vertical in the library
- [ ] Test performance (can we have 1,000 problems in the library? 10,000?)

**Future**: The following will *not* be part of this PR:
* UI/UX improvements, including pagination
* filtering/tagging
* Support of libraries from non-split courses

**Testing Instructions**:

1. Check out this branch and do `paver install_python_prereqs`
2. As 'edxapp' user, edit `~/cms.env.json` and add `"ENABLE_CONTENT_LIBRARIES": true` to the `FEATURES` object.
3. Edit `~/cms.auth.json`. Go to `MODULESTORE` > `default` > `OPTIONS` > `stores` - it should contain two or three entries. Re-order the entries so that the store with `"NAME": "split",` comes first in the `stores` list. (This makes [split](https://github.com/edx/edx-platform/wiki/Split:-the-versioning,-structure-saving-DAO) the default modulestore for any new courses.)
4. Start `paver devstack studio` and go to `localhost:8001` in your browser.
5. Log in as staff, and create a new library (a new "New library" button should appear at top right of studio home page).
6. Add some content to the library.
7. Go to studio home and go into a course or create a new course.
8. Go to Settings > Advanced Settings and add `"library_content"` to advanced_modules.
9. Go to Content > Outline. Create a new section and subsection, then edit it. Click "Advanced" and add a new "library_content" block.
10. Once the block is added, click "Edit" to edit its settings. Most are explained on the settings editor. For the "Library" setting, you must click "Add", then paste the LibraryLocator of your library. This looks like `library-v1:ProblemX+PR0B`. (It's in the URL when you go to the library in studio). Hit Save.
11. Click "Update now with latest components from the library".
12. Optional: Click "View >" to preview all the blocks found in the library.
13. Hit "Publish", then start up the LMS and go to `localhost:8000`. Browse into the course, and you should see that the block is replaced by random blocks from the library. To test the randomization, click the lowest "STAFF DEBUG INFO" link underneath the module, then click "Delete Student State", then refresh the page.