Add a module for creating and managing integrations with other services.

Review Request #7947 — Created Feb. 6, 2016 and submitted — Latest diff uploaded

Information

Djblets
release-0.10.x

Reviewers

Modern web applications often need to integrate with other services,
such as chat services. Each generally needs to be able to support any
number of user-provided configurations, efficiently.

This change adds a framework for more easily producing these
integrations. Consuming applications just need to set up some classes
and URLs, and will then be able to define integrations or, if they
support extensions, will allow others to define integrations.

A single integration can have any number of configurations, which
applications can choose to bind to users, organizations, or anything
else they choose. Configurations can be enabled or disabled, can have a
name, and can have arbitrary settings configured.

Integrations are instantiated when registered, but their logic and state
are only initialized once there's one or more enabled configurations in
the database for that integration. This allows a large number of
integrations to be registered, without them having to take up any
processing time unless used.

An integration will generally listen to signals or other events, and may
want to register into parts of the application. This overlaps a great
deal with the needs of extensions, and so they've been written to be
hook owners, allowing the user of ExtensionHooks. Like an extension,
these hooks are bound to the lifecycle of an integration instance.

There are built-in views available for listing all integrations (and
their configurations), and creating/editing/deleting configurations.
These can be used in the administration UI, or in other pages, depending
on the needs of the application. To facilitate this, there are base
classes for the views and there are administration-specific subclasses.

Djblets just provides the foundation for integrations. Consuming
applications are expected to subclass some of the classes to provide
additional information, such as an instance of an IntegrationManager
or additional configuration data.

Unit tests pass.

Modified rbslack to use integrations, and tested that they work.

Verified manually that integrations are only enabled when there are
enabled configurations, and that this state is recomputed properly when
enabling/disabling/creating/deleting integrations.

Read through the docs and checked links.