Add a minimum height to the actions bar for a review request.

When not logged in, and with no actions on the actions bar, the bar
would have a height of about 1px, and would look weird and slightly
broken. We now give it a minimum height that corresponds well enough to
what we have when there's content.
Make UserSession always available, and move global variables to it.

UserSession is now instantiated whether or not the user is
authenticated. An 'authenticated' attribute is set to indicate the
authentication state.

Along with this, some global variables used for user state (gUserName,
gUserFullName, gUserURL, and gOpenAnIssue) are now part of the
UserSession.

This required some updates to various unit tests in order to not trip
the asserts for an existing UserSession.

A side benefit to this work is that unit tests can now be run reliably
regardless of whether the tester is logged in (as some code would check
JavaScript variables that weren't set for anonymous users).
Prevent new resource instances from readying the parentObject.

When we destroyed a new object, we checked if the parentObject was
ready. This wasn't really necessary, since we didn't have a URL we
needed to destroy or anything. Our destruction was internal only.

By removing the parentObject.ready call in this case, we get faster
destruction for unsaved/unloaded objects, and we also prevent a problem
where we may not be in a position to even fetch the parent object.

The case I refer to is the destruction of draft comments on draft
reviews, when not logged in. I have a fix I'll put out after this, which
prevents trying to get the draft review if not logged in. In this case,
we'd error out, which would break the ready() call. We don't even want
to hit that case for new objects, though. New objects should be
destroyable without the parent object being fetchable.

As part of this, I've standardized the call to the parent destroy
function and the success callback to it, so that we make sure to reset
the state in all cases.
Fix the comment dialog when not logged in.

The comment dialog has been broken for a little while when not logged
in.

We were attempting to fetch the review draft when unauthenticated. This
triggered the browser's HTTP Auth login dialog, which is not what we
wanted. Instead, we want to see that we're not authenticated and error
out.

This combined with my object destruction and UserSession changes fixes
breakages for logged out users trying to make comments. We cleanly tell
the user now that they need to log in, without popping up any broken
login dialogs.

Unit tests were added here to ensure that that works. Part of this
involves moving our comment dialog template inline to give it access to
our UserSession, so we can test against the different states.
Fix the comment dialog overwriting a user's comment on load.

The comment dialog ensures the comment is ready before display by
loading it. It's always done this. However, when latency is high,
there's a window of time where the user can type a comment and then have
it overwritten.

This is annoying, but it got worse with this rewrite. Calling ready()
would load the parent (which didn't used to happen for new comments),
and after that loaded, we'd set the text from the comment (which would
be blank by default). So, we'd end up clearing the comment the user
entered.

This change fixes both cases. We no longer load the text from the
server, since we already have it on page load. We trust that what we
have on page load is correct. It's possible this is wrong (if the user's
editing on two different tabs at once), but in the vast majority of
cases it should be completely safe.

We still load the parentObject. We just don't make immediate use of it.
This has a neat side-benefit, though. Comment saving for the first
comment will appear to be faster, since we won't be loading it at save
time. It will just happen on the initial comment, silently in the
background.

Along with this, I discovered that the Delete button wasn't always
visible when it should be. I've changed the logic to check isNew()
instead of loaded.
Set the cookie path to be SITE_ROOT.

The cookie path was being set to SITE_ROOT, but too soon, before
SITE_ROOT was set in settings_local. Now it's set after we've loaded
settingS_local.
Fix the PYTHONPATH issue for good (hopefully).

The latest change to set PYTHONPATH to be limited to the location of the
settings_local.py file broke virtualenvs, which no longer set PYTHONPATH
correctly and break rbssh.

PYTHONPATH seems to be a complicated beast when virtualenvs and
pkg_resources comes in, so we're just going to stop dealing with it
here. Instead, we're using a new variable, RBSITE_PYTHONPATH, which will
point to any paths we have within a site that we care about. For now,
this is the conf/ directory. rbssh will specifically look for this and
add the values to sys.path.
Rewrite the file attachment thumbnail code to be a Backbone view.

The new FileAttachmentThumbnail view can be used with pre-rendered
file attachment thumbnails (loaded in from the review request
template) and also with newly uploaded files.

It also replaces the old file attachment thumbnail placeholder code.
It recognizes when we haven't yet finished an upload of a file, and
will show a spinner in that case, eventually replacing it with the
contents when it's loaded.
Convert ReviewRequest to Backbone.js.

This introduces a new RB.ReviewRequest and a RB.DraftReviewRequest,
both based on BaseResource. These are the last resource classes that
needed to be converted.

RB.ReviewRequest operates on a review request and provides operations
like closing a review request, reopening, checking for updates, and
creating child objects. It has a 'draft' parameter pointing to a
DraftReviewRequest.

DraftReviewRequest handles setting of fields on a review request and
publishing the draft.

All the hacky .cid checks have been removed, meaning we can now rely on
new-style objects for resources.

Some additional work had to be done to transition our editors over to
the new class. These will end up looking nicer when that code is also
transitioned to new classes. For now, they operate on some raw data
(passing API field names to options.data instead of using attribute
names). This is considered temporary.
Move the remaining RB.apiCall support into utils/apiUtils.js.

This is just a straight move of the functions from datastore.js to
apiUtils.js. No logic has changed. datastore.js is now no more.
Fix the PYTHONPATH issue for good (hopefully).

The latest change to set PYTHONPATH to be limited to the location of the
settings_local.py file broke virtualenvs, which no longer set PYTHONPATH
correctly and break rbssh.

PYTHONPATH seems to be a complicated beast when virtualenvs and
pkg_resources comes in, so we're just going to stop dealing with it
here. Instead, we're using a new variable, RBSITE_PYTHONPATH, which will
point to any paths we have within a site that we care about. For now,
this is the conf/ directory. rbssh will specifically look for this and
add the values to sys.path.
Allow specifying the MySQL port in rb-site.

When configuring a site using 'rb-site install', the hostname of a MySQL
database can be specified in hostname:port format. This works for the
wizard and for the --db-port option.

Reviewed at http://reviews.reviewboard.org/r/3923/
Release Review Board 1.7.7.
Merge branch 'release-1.7.x'
Fixed the default for the web server port in rb-site.

The default was an integer, which broke generation of some files. It's
now a string, like all other parameters.
Move the Review Board release notes directory up a level.

This was done previously on master, but it looks like the moved file
info wasn't tracked by git. That made updating release notes on 1.7 and
merging painful.

This attempts to fix the situation by redoing the merge on 1.7.x. Master
will then be fixed appropriately.
Merge branch 'release-1.7.x'
Release Review Board 1.7.7.1.
Merge branch 'release-1.7.x'
Require Django Evolution 0.6.9 or higher.

0.6.9 fixes some significant issues some people have hit when upgrading
old installations. It's better at handling larger upgrades where new
models may be created and then change in evolution files.