manage.get.gov/docs/developer/adding-feature-flags.md
2024-04-30 13:07:26 -06:00

2.3 KiB

Adding feature flags

Feature flags are booleans (stored in our DB as the WaffleFlag object) that programmatically disable/enable "features" (such as DNS hosting) for a specified set of users.

We use django-waffle for our feature flags. Waffle makes using flags fairly straight forward.

Adding feature flags through django admin

  1. On the app, navigate to \admin.
  2. Under models, click Waffle flags.
  3. Click Add waffle flag.
  4. Add the model as you would normally. Refer to waffle's documentation regarding attributes for more information on them.

Adding feature flags when migrations are ran

Given that we store waffle flags as a predefined list, this means that we need to create a new migration file when we want to add a set of feature flags programatically this way. Note that if WAFFLE_CREATE_MISSING_FLAGS is set to True, you may not need this step.

Follow these steps to achieve this:

  1. Navigate to registrar/models/waffle_flag.py.
  2. Modify the get_default_waffle_flags and add the desired name of your feature flag to the default_flags array.
  3. Navigate to registrar/migrationdata.
  4. Copy the migration named 0091_create_waffle_flags_v01.
  5. Rename the copied migration to match the increment. For instance, if 0091_create_waffle_flags_v01 exists, you will rename your migration to 0091_create_waffle_flags_v02.
  6. Modify the migration dependency to match the last migration in the stack.

Modifying an existing feature flag through the CLI

Waffle comes with built in management commands that you can use to update records remotely. Read here for information on how to use them.

Using feature flags as boolean values

Waffle provides a boolean called flag_is_active that you can use as you otherwise would a boolean. This boolean requires a request object and the flag name.

Using feature flags to disable/enable views

Waffle provides a decorator that you can use to enable/disable views. When disabled, the view will return a 404 if said user tries to navigate to it.