Skip to main content

Django REST Framework plugin that simplifies the management of third party integrations

Project description

DRF Integrations Framework

pre-commit Build Status

DRF Integrations Framework is a toolkit that plugs in to Django REST Framework and simplifies the management of third party integrations. If you find yourself connecting to multiple services with different sets of credentials, or handling multiple inbound requests from third party services, DRF Integrations Framework will probably simplify that for you. DRF Integrations Framework will help you split the responsibilities between the source/destiny of events, how these requests are authenticated and the business logic associated to them.

Requirements

  • Python 3.7+
  • Django 2.2+
  • Django REST Framework 3.9.2+
  • Django OAuth Toolkit 1.3-1.4

Installation

The following library is required in order to build on Linux systems. It fixes the problem where Error: pg_config executable not found. is given when installing psycopg2 via poetry install

sudo apt install libpq-dev

Install from PyPi:

pip install drf-integrations-framework

Or install from source:

pip install https://github.com/yoyowallet/drf-integrations-framework/archive/v0.7.1.tar.gz

Add the apps to your INSTALLED_APPS:

INSTALLED_APPS = [
    ...,
    "rest_framework",
    "oauth2_provider",
    "drf_integrations",
]

If you are going to configure any inbound integration, you will want to add the integration URLs to your urls.py:

from drf_integrations import integrations

urlpatterns = [
    ...
] + integrations.get_urls()

Configuration

Settings

DRF Integrations Framework relies on Django OAuth Toolkit to manage third party applications. In order to be able to use it, first you'll need to configure DOT by setting (at least) the model references in your settings.

OAUTH2_PROVIDER_APPLICATION_MODEL = "drf_integrations.Application"
OAUTH2_PROVIDER_ACCESS_TOKEN_MODEL = "drf_integrations.AccessToken"
OAUTH2_PROVIDER_GRANT_MODEL = "drf_integrations.Grant"
OAUTH2_PROVIDER_REFRESH_TOKEN_MODEL = "drf_integrations.RefreshToken"

Then, similarly, you will have to configure the model for the integrations.

INTEGRATIONS_APPLICATION_INSTALLATION_MODEL = "drf_integrations.ApplicationInstallation"

You will also have to configure how the integrations are stored in the database. On the one hand, you will have to set the type of JSON field your DB uses. On the other hand, you will have to set the name of the attribute where you want to relate the integrations.

DB_BACKEND_JSON_FIELD = "django.db.models.JSONField"
INTEGRATIONS_APPLICATION_INSTALLATION_INSTALL_ATTRIBUTE = "target_id"

Finally, you have to set the list of integrations that are available in your system (see the following section to learn about creating integrations).

INSTALLED_INTEGRATIONS = [
    "example.drf_integrations_example.api.integrations.APIClientIntegration",
]

Creating integrations

An integration is represented by an extension of BaseIntegration. Then, the integration will be available to be installed to different clients (as related with the previously configured INTEGRATIONS_APPLICATION_INSTALLATION_INSTALL_ATTRIBUTE) once it is stored into an Application. This can be done in two different ways:

  1. Internal integrations (or non-local integrations) are those that can be configured once and installed to different clients with different parameters. For example, your system may connect to Mixpanel, the connections and interactions with the service are all the same, only the secret in the connection changes.

    These will only have 1 Application object in the database, and it can be related to multiple installations. They can also be automatically created by using the syncregistry management command.

    python manage.py syncregistry
    
  2. Local integrations are those that are specific to just one client. For example, OAuth clients are local, there is 1 application per client, which will have the specific credentials for them, so they can only be installed once. These are usually created on demand as required by clients.

An integration broadly has 3 functions:

  1. Generates a list of URLs that a third party represented by this integration can connect to. Mainly used for inward integrations.
  2. Returns a client that can connect to the third party it represents. Mainly used for outward integrations.
  3. Produce queryset filter lookups to search for installations of the integration.

Once you have a class inheriting from BaseIntegration that represents a third party, simply add it to INSTALLED_INTEGRATIONS in your settings and the sky is the limit! You can create custom authentication backends, permissions, event hooks... Take a look at the example to see some basic examples of how you can make use of DRF Integrations Framework.

Preconfigured

There are some features that DRF Integrations Framework provides out of the box.

  • Admin model for ApplicationInstallation that already handles integration-specific configuration via dynamic forms.
  • Automatic form validation for integrations that have one.
  • An authentication backend for local OAuth2 integrations (drf_integrations.auth_backends.IntegrationOAuth2Authentication).

Running the tests

To run the tests you need to have a postgresql server running on localhost and have a postgres user/role defined. To create the postgres user and role you can use the following:

psql -c 'CREATE ROLE postgres WITH LOGIN SUPERUSER'

To run the tests execute the following

make tests

If running tests under pycharm ensure that python tests -> pytest is used and set the Additional Arguments to --no-migrations

Failing to specify --no-migrations will result in the following error:

ValueError: Related model 'oauth2_provider.idtoken' cannot be resolved

Changelog

See Releases

Authors

DRF Integrations Framework is an original idea by @jianyuan, developed and maintained by the platform team at @yoyowallet.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

drf_integrations_framework-0.8.7.tar.gz (22.7 kB view details)

Uploaded Source

Built Distribution

drf_integrations_framework-0.8.7-py3-none-any.whl (29.5 kB view details)

Uploaded Python 3

File details

Details for the file drf_integrations_framework-0.8.7.tar.gz.

File metadata

  • Download URL: drf_integrations_framework-0.8.7.tar.gz
  • Upload date:
  • Size: 22.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.3 CPython/3.11.0 Linux/6.5.0-1025-azure

File hashes

Hashes for drf_integrations_framework-0.8.7.tar.gz
Algorithm Hash digest
SHA256 78eda163f53981dc379631a9a9767c70bfda9920664460656d8db62265c89a84
MD5 b9099e0be62d692c9315d979792fc727
BLAKE2b-256 a1f58cd7b8a59840cbd8b42ea56151cd030eda5ad20f9956a4f8fe5b1787e7ab

See more details on using hashes here.

File details

Details for the file drf_integrations_framework-0.8.7-py3-none-any.whl.

File metadata

File hashes

Hashes for drf_integrations_framework-0.8.7-py3-none-any.whl
Algorithm Hash digest
SHA256 18d4acbf500899cc3dd0d03c2b0fc036157f0816fbfb4d63e7369f077832873d
MD5 f653b2934c9c2cd108cc9e87cbbb4e2e
BLAKE2b-256 e54896c2ee86913da927edd6c221212bac5d90bfcf3a93d61f097ad73d79ac1d

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page