diff --git a/docs/en_us/data/source/conf.py b/docs/en_us/data/source/conf.py
index f198016b49..adb88d2c05 100644
--- a/docs/en_us/data/source/conf.py
+++ b/docs/en_us/data/source/conf.py
@@ -3,10 +3,23 @@
import sys, os
+# on_rtd is whether we are on readthedocs.org, this line of code grabbed from docs.readthedocs.org
on_rtd = os.environ.get('READTHEDOCS', None) == 'True'
-sys.path.append(os.path.abspath('../../../../'))
+if not on_rtd: # only import and set the theme if we're building docs locally
+ import sphinx_rtd_theme
+ html_theme = 'sphinx_rtd_theme'
+ html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
+
+
+
+
+
+
+
+
sys.path.append(os.path.abspath('../../../'))
+sys.path.append(os.path.abspath('../../'))
from docs.shared.conf import *
@@ -23,7 +36,7 @@ templates_path.append('source/_templates')
html_static_path.append('source/_static')
project = u'edX Data Documentation'
-copyright = u'2013, edX Documentation Team'
+copyright = u'2013, edX'
# The short X.Y version.
version = ''
@@ -31,4 +44,4 @@ version = ''
release = ''
#Added to turn off smart quotes so users can copy JSON values without problems.
-html_use_smartypants = False
+html_use_smartypants = False
\ No newline at end of file
diff --git a/docs/en_us/data/source/course_data_formats/course_xml.rst b/docs/en_us/data/source/course_data_formats/course_xml.rst
index 9523c10857..2eac698dd3 100644
--- a/docs/en_us/data/source/course_data_formats/course_xml.rst
+++ b/docs/en_us/data/source/course_data_formats/course_xml.rst
@@ -294,7 +294,7 @@ This video has been encoded at 4 different speeds: `0.75x`, `1x`, `1.25x`, and `
More on `url_name`
==================
-Every content element (within a course) should have a unique id. This id is formed as `{category}/{url_name}`, or automatically generated from the content if `url_name` is not specified. Categories are the different tag types ('chapter', 'problem', 'html', 'sequential', etc). Url_name is a string containing a-z, A-Z, dot (.), underscore (_), and ':'. This is what appears in urls that point to this object.
+Every content element (within a course) should have a unique id. This id is formed as `{category}/{url_name}`, or automatically generated from the content if `url_name` is not specified. Categories are the different tag types ('chapter', 'problem', 'html', 'sequential', etc). Url_name is a string containing a-z, A-Z, 0-9, dot (.), underscore (_), and ':'. This is what appears in urls that point to this object.
Colon (':') is special--when looking for the content definition in an xml, ':' will be replaced with '/'. This allows organizing content into folders. For example, given the pointer tag
@@ -567,7 +567,77 @@ If you want to customize the courseware tabs displayed for your course, specify
*********
Textbooks
*********
-Support is currently provided for HTML-based and PDF-based textbooks. In addition to enabling the display of textbooks in tabs (see above), specific information about the location of textbook content must be configured.
+Support is currently provided for image-based, HTML-based and PDF-based textbooks. In addition to enabling the display of textbooks in tabs (see above), specific information about the location of textbook content must be configured.
+
+Image-based Textbooks
+=====================
+
+Configuration
+-------------
+
+Image-based textbooks are configured at the course level in the XML markup. Here is an example:
+
+.. code-block:: xml
+
+
+
+
+
+
+
+
+
+Each `textbook` element is displayed on a different tab. The `title` attribute is used as the tab's name, and the `book_url` attribute points to the remote directory that contains the images of the text. Note the trailing slash on the end of the `book_url` attribute.
+
+The images must be stored in the same directory as the `book_url`, with filenames matching `pXXX.png`, where `XXX` is a three-digit number representing the page number (with leading zeroes as necessary). Pages start at `p001.png`.
+
+Each textbook must also have its own table of contents. This is read from the `book_url` location, by appending `toc.xml`. This file contains a `table_of_contents` parent element, with `entry` elements nested below it. Each `entry` has attributes for `name`, `page_label`, and `page`, as well as an optional `chapter` attribute. An arbitrary number of levels of nesting of `entry` elements within other `entry` elements is supported, but you're likely to only want two levels. The `page` represents the actual page to link to, while the `page_label` matches the displayed page number on that page. Here's an example:
+
+.. code-block:: xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Linking from Content
+--------------------
+
+It is possible to add links to specific pages in a textbook by using a URL that encodes the index of the textbook and the page number. The URL is of the form `/course/book/${bookindex}/$page}`. If the page is omitted from the URL, the first page is assumed.
+
+You can use a `customtag` to create a template for such links. For example, you can create a `book` template in the `customtag` directory, containing:
+
+.. code-block:: xml
+
+
More information given in the text.
+
+The course content can then link to page 25 using the `customtag` element:
+
+.. code-block:: xml
+
+
HTML-based Textbooks
diff --git a/docs/en_us/data/source/internal_data_formats/sql_schema.rst b/docs/en_us/data/source/internal_data_formats/sql_schema.rst
index da4ac6d23f..198f7fc1a1 100644
--- a/docs/en_us/data/source/internal_data_formats/sql_schema.rst
+++ b/docs/en_us/data/source/internal_data_formats/sql_schema.rst
@@ -528,7 +528,38 @@ The `courseware_studentmodule` table holds all courseware state for a given user
The hierarchy goes: `course > chapter > (problemset | sequential | videosequence)`
`combinedopenended`
- TODO: More details to come.
+ JSON data that shows the status of Open Response Assessment problems.
+
+ The problem can be in one of four states:
+
+ * **initial**
+ * **assessing**
+ * **post_assessment**
+ * **done**
+
+ Following is an example of a problem in **done** state:
+
+ ::
+
+ {
+ "ready_to_reset": false, "state": "done", "task_states": [
+ "{"child_created": false, "child_attempts": 1, "version": 1, "child_history": [
+ {"answer": "This is a test.", "post_assessment": "[1, 1]", "score": 2}],
+ "max_score": 2, "child_state": "done"}"],
+ "current_task_number": 0, "student_attempts": 0}
+ }
+
+ Following is an example of a problem in **assessing** state:
+
+ ::
+
+ {
+ "ready_to_reset": false, "state": "assessing", "task_states": [
+ "{"child_created": false, "child_attempts": 0, "version": 1,
+ "child_history": [], "max_score": 2, "child_state": "initial"}"],
+ "current_task_number": 0, "student_attempts": 0}
+ }
+
`conditional`
Conditionals don't actually store any state, so this value is always an empty JSON dictionary (`'{}'`). We should probably remove these entries altogether.