Jump to >

Djblets 0.9 Release Notes

Release date: October 28, 2015

This release contains all bug fixes and features found in Djblets version 0.8.23.


To install this release, run the following:

$ sudo easy_install \
    -f http://downloads.reviewboard.org/releases/Djblets/0.9/ \
    -U Djblets

Compatibility Changes

  • Added initial support for Django 1.8.

    This release of Djblets is experimentally compatible with Django 1.8. For the time being we still recommend using Django 1.6, but would appreciate bug reports if you do hit problems using newer versions.

  • Upgraded to jQuery 1.11.

    This release of jQuery offers performance and feature improvements we’ll be relying upon.


  • Added a function for returning the best Gravatar for the display, given a Gravatar URL.

    Djblets.getGravatarForDisplay() will take a Gravatar URL and return a new URL containing the Gravatar best suited for the display’s pixel ratio multiplier. For instance, when running on a Retina display, the size of the Gravatar will be doubled.

  • $.getExtents() now returns fractional values.

    Previously, only integer values were returned, which were not always an accurate representation of the extents.


  • Enhanced the cache_memoize() implementation to be usable with generators.

    When trying to cache data that’s being created via a generator, the new cache_memoize_iter() method will populate the cache without gathering up everything into a list first. Pulling data out of the cache will also operate as an iterator rather than preprocessing everything at once.

    Caching large data has also been optimized for speed.


  • Added a responsive UI mode for datagrids.

    When the datagrid is rendered on a small (<= 720px) screen, it now goes into a mobile mode. In this mode, the contents of the datagrid become more vertical in order to make better use of the space without making text too small.

  • Added an AlphanumericDataGrid subclass for paginating lists of results alphanumerically.

    This can be used like any other datagrid, but will handle pagination based on the first letter, number, or symbol of the value of the given field.

    This was built for use when paginating through lists of users, but can be used for many other cases.

    Patch by Ryan Done.

  • Datagrids can now build their own paginators by implementing build_paginator(). This is particularly useful when creating a datagrid that integrates with Haystack.

  • Datagrids can now work with simpler QuerySet-like objects.

    Datagrids are now less tightly bound to Django’s QuerySet, and can now use QuerySet-like objects such as Haystack’s SearchQuerySet.

  • Added various blocks to the datagrid templates for better extensibility.

    Rather than just having a big blank white spot, datagrids can now show some custom HTML by overriding the datagrid_empty block.

    The new datagrid_titlebox block can be used to provide additional content before, after, or in place of the titlebox.

    Finally, the paginator block wraps the paginator, allowing it to be removed or replaced.

  • The column customization menu now has an animated sliding effect when showing or dismissing the menu.

  • Optimized database queries, leading to faster datagrids.

  • Improved performance when setting up the datagrid.

  • Improved positioning and scrolling of datagrid menus.

  • Fixed numerous display bugs and made some small visual tweaks.

    This includes fixes for inconsistencies between the column headers and the colmn data, jumps in the display of those headers when first rendering the datagrid, and alignment issues when dragging columns.

  • Fixed problems with pagination links and the gridonly query string parameter. (Bug #3794)

    Patch by Griffin Myers.

  • Fixed CheckboxColumn to not render links around the checkbox.


  • Extension state is now properly cleaned up when the process ends.

    Previously, we let the Python garbage collector handle the cleanup of extension state, but this would result in some errors when using certain hooks, such as SignalHook. We now handle the cleanup manually.

  • Added sandboxing to TemplateHook.applies_to() in the {% template_hook_point %} template tag.

    If this function ever raises an exception for any reason, the exception will be caught, and the failure information logged.

    Patch by Justin Maillet.


  • Added djblets.mail.message.EmailMessage.

    This provides a number of additional benefits over Django’s default e-mail support:

    • Built-in support for a number of sender/recipient-related headers (Sender, X-Sender, In-Reply-To, References, and Reply-To)

    • Auto-generated status headers (Auto-Submitted)

    • Disabling of auto-responses (X-Auto-Response-Suppress)

    • Ability to set multiple headers with the same name but different values.

    • Easier support for setting HTML content.

    • Convenience methods for working with recipients.


The new djblets.markdown module contains a bunch of useful utilities for dealing with Markdown text, including:

  • Functions for escaping content for direct inclusion in a Markdown document, and unescaping pre-escaped content.

  • A WYSIWYG-style renderer, which outputs rendered Markdown that looks as close as possible to the source text.

  • A variation of the WISYWIG-style renderer for use in e-mails. This contains works the same way, but uses inline styles instead of requiring an external CSS file.

These functions were previously part of the Review Board codebase, but are useful beyond Review Board and have been moved here.


  • Added a mixin for pre-compiling fixtures to reduce test times.

    The new FixturesCompilerMixin can be mixed into a test case to compile each listed fixture up-front, significantly reducing the time needed for tests to run.


  • Improved performance of the {% crop_image %} and {% thumbnail %} template tags.

    These template tags no longer write to a temporary file before writing to storage, and instead write to storage directly. This will improve performance when working with storage backends, like Amazon S3.

  • Added height-for-width sizing to the thumbnail() template tag.

    When being used from Python, the thumbnail tag can now be passed a 2-tuple instead of a string to represent the size. If the height is omitted, it will be calculated to preserve the image’s aspect ratio.

  • Added a new querystring_with() tag to help with building links.

    When creating links that modify query parameters, it’s often useful to build a new query that contains all of the previous parameters but with the value of one of them changed. This new tag helps with that.

  • Functions decorated by simple_decorator() and basictag() now show up in Sphinx documentation.

    They were previously missing the correct __module__ value, resulting in them being filtered out by Sphinx.


  • Added support for returning only certain fields or links in the API.

    API resources now support a couple new query arguments for limiting the results in a payload, in order to reduce database queries and payload sizes.

    The ?only-fields= query argument limits the returned fields in the payload to the comma-separated list of field names. If the value is blank, then no fields will be returned, leaving only links.

    Likewise, the ?only-links= query argument limits the returned links in the payload. It behaves exactly like ?only-fields=.

    Resources that inject custom fields into the payload outside of WebAPIResource.serialize_object can call get_only_fields() and get_only_links() to determine whether to include specific fields.

  • Links can now be serialized by subclasses.

    WebAPIResource subclasses can now provide a serialize_<linkname>_link() function that will take an object and serialize a link for it. This is useful for links that need to contain additional metadata about the link would be helpful to consumers.

  • Added support for generating and using API tokens for authentication.

    API tokens are a safer way of authenticating with an API, without needing to supply a username or password to a service or script. These tokens can be created and deleted at any time without affecting the user’s account.

    Tokens can also have an access policy assigned, which will limit what operations can be performed on what parts of the API tree.

    Consumers need to use the TokenAuthBackendMixin Django authentication backend, the WebAPITokenAuthBackend API authentication backend, and the ResourceAPITokenMixin mixin for resource subclasses in order to accept API tokens. They must also define a model for storing API token data, inheriting from BaseWebAPIToken.

  • Added a mixin for helping with range-based database queries.

    The new APIQueryUtilsMixin can be used in a resource subclass to help with range-based queries (<, <=, >, >=) coming from the caller, translating them into an appropriate database query.

  • Added an UpdateFormMixin for connecting a WebAPIResource subclass to a Django ModelForm.

    This mixin provides a create_form() method that resources can use to create forms for either creating or updating model instances, giving all the advantages of form validation and consistent instance creation.

  • Added resource-bound utility functions for retrieving the URL to an item or list resource, given a set of URL arguments.

    Each WebAPIResource class now provides get_list_url(), get_item_url(), and build_resource_url() functions that can generate URLs suitable for the resource, given arguments for the URL.

  • Added a class for handling the registration and lookup of API resources.

    ResourcesRegistry makes it easy to lazily register model-to-resource mappings and to handle lookups of resources without running into import loops or other problems. It’s meant to be subclassed and populated.

  • Added utilities for writing unit tests for APIs.

    The new djblets.webapi.testing module includes decorators and mixins for writing complete and comprehensive test suites for an API. That consists of helpers for docstrings and functions for performing API requests and validating results,

  • Added a new DUPLICATE_ITEM error code.

    This is a generic error code that can be used to indicate error states when duplicate constraints are violated.

    Patch by Vincent Le.

  • webapi_request_fields() now passes all parsed arguments from the caller to the function as a parsed_request_fields dictionary.

  • Reorganized the authentication and resources code.

    The djblets.webapi.auth and djblets.webapi.resources modules have been split into multiple modules in preparation for adding some new features. The old names still work, but will show a DeprecationWarning.


  • Replaced spinners with FontAwesome.

    The old animated GIF spinner has been replaced with the spinner in the icon font FontAwesome.

Changes Since 0.9 RC 1


  • Ensure all e-mail headers are bytes, rather than unicode. This fixes UnicodeDecodeErrors when sending a message that contains non-ASCII headers.


  • Fixed encoding for API resources using the expand parameter that would create a circular reference.

    This had previously been fixed, but regressed with the addition of field limiting.

  • Fixed lookups for resources when using deferred models (such as those returned by QuerySet.only).


  • Barret Rennie

  • Christian Hammond

  • David Trowbridge

  • Griffin Myers

  • Justin Maillet

  • Ryan Done

  • Vincent Le