Fix reversing URLs on Local Site with template caching turned on.

A while back on RBCommons, we hit a bug after enabling template caching
where URLs weren't reversing properly. Reversing would seem to work at
times, and at other times, the page would break due to a lookup failure.
In these cases, it was always failing to find a URL with local_site_name
in the kwargs.

This turns out to be due to a bug on our end, and not something due to
us overriding the url template tag.

When building the cached nodes and rendering the first time, all would
be well, but then we'd set url_node.kwargs to equal self.kwargs in our
custom template tag. Future renders would re-use the instances of our
tag, and therefore the kwargs and the url_node attributes. kwargs would
be populated with a 'local_site_name' key, and all would fail from there
on out.

We just need to copy our args/kwargs when setting url_node, and not
assign directly.
Allow setting a review request's status with just the can_change_status permission.

The review request API didn't allow changing a review request's status
by users other than the submitter when they had the 'can_change_status'
permission, unless they also had the 'can_edit_reviewrequest'
permission. 'can_edit_reviewrequest' should not have been required.

The API is now more careful about when it returns a 403, based on the
permissions and the data provided in the request.
Add support for permissions specific to Local Sites.

Local Sites had no equivalent of our custom permissions, like
can_change_status or can_submit_as_another_user. It also didn't grant
these abilities to administrators of Local Sites.

Now, a LocalSiteProfile defines a permissions dictionary, which contains
all granted permissions for the user. Local Site administrators
automatically have all permissions for a Local Site.

To do this, we make use of an AuthBackend's ability to do custom
permission lookups. The main function for this, has_perm, can take a
parameter for the object permissions are being looked up on.

This parameter is unused by defaut and in fact not allowed on any
built-in backends. Django doesn't make any real use of it. The intent
appears to be to pass an object like a ReviewRequest to it, but there's
no real rules governing this.

For our usage, passing a LocalSite as the object will have it look up
that permission in the user's list of permissions for the LocalSite. All
callers must then do when checking permissions is to pass the LocalSite
(or None) when calling has_perm.

The 'perms' context variable for templates has also been replaced with a
version that will pass the LocalSite for these requests.
Revert "Add support for permissions specific to Local Sites."

This reverts commit 63a9f97a9600800e8c41bfd961361c14643f1671.

Accidentally committed this instead of another branch. Still waiting for
review.
Fix showing private review requests in a couple lists.

The submitters page and the group review requests page weren't factoring
in the viewing user, preventing private review requests from showing up
for that user. The queries for these pages now pass in the viewing user.
Factor in the "Blocks" list for the review request cache key.

When setting the Depends On field of a review request, the listed
review requests won't have their caches invalidated. Navigating to those
review requests won't show any entries for "Blocks" until you
shift-reload.

We now include the Blocks list as part of the ETag for caching the page.
Fix fetching the list of blocks for a draft.

My recent change had a problem with drafts. It attempted to always
access 'blocks', but this isn't available on drafts. Now we only grab it
from the review request.
Show the blocks list on review UIs and the diff viewer.

The new 'blocks' variable wasn't provided on review UI pages or on the
diff viewer. Now, make_review_request_context will provide it if the
caller does not.
Add support for permissions specific to Local Sites.

Local Sites had no equivalent of our custom permissions, like
can_change_status or can_submit_as_another_user. It also didn't grant
these abilities to administrators of Local Sites.

Now, a LocalSiteProfile defines a permissions dictionary, which contains
all granted permissions for the user. Local Site administrators
automatically have all permissions for a Local Site.

To do this, we make use of an AuthBackend's ability to do custom
permission lookups. The main function for this, has_perm, can take a
parameter for the object permissions are being looked up on.

This parameter is unused by default and in fact not allowed on any
built-in backends. Django doesn't make any real use of it. The intent
appears to be to pass an object like a ReviewRequest to it, but there's
no real rules governing this.

For our usage, passing a LocalSite as the object will have it look up
that permission in the user's list of permissions for the LocalSite. All
callers must then do when checking permissions is to pass the LocalSite
(or None) when calling has_perm.

The 'perms' context variable for templates has also been replaced with a
version that will pass the LocalSite for these requests.