Release Djblets 0.6.31.
Merge branch 'release-0.6.x' into release-0.7.x
Release Djblets 0.7.21.
Merge branch 'release-0.7.x'
Add support for JavaScript extensions.

Extensions in Djblets can now define their JavaScript counterparts,
which, like the Python versions, can attach to hooks and augment
functionality. It is up to the consumer of Djblets to define hooks to
use.

This functionality requires Backbone.js and Underscore.js (or
compatible). These are not provided by Djblets.

The consumer must also call the init_js_extensions template tag at the
end of the body tag in all applicable templates, in order to initialize
extensions.
Allow a max number of newlines to be passed to {% condense %}.

The {% condense %} template tag is no longer hard-coded to 3 newlines.
It can be passed the number of newlines it should condense down to.
Add formal support for looking up static files for extensions.

This introduces support for checking an extension's static/ directory
for static media lookups. If provided, the contents will be checked when
looking up a static URL beginning with the extension's ID. This will
match regardless of the filesystem path for the extension, meaning it
will work nicely without copying files or symlinking during the
development of an extension.

There's a new static media finder, ExtensionFinder, that must be placed
in STATICFILES_FINDERS. This finder is responsible for looking up
files prefixed by an extension ID.

In a production setup, it's important to install media files into a
common place when enabling an extension, so that the web server can
serve them up without going through Django's static files registry.
For that, when enabling an extension, the static files will be copied
over, but only when settings.DEBUG is False. In a development setup,
/static/ is based on the finders and not the filesystem (so long as a
static/ directory does not exist), so it will just use ExtensionFinder
to look up, and not look through the static/ directory.