Vai al contenuto

Tenant Features: Tutorial Operativo

Questa guida spiega come gestire fix/feature mirate per tenant dal pannello admin.

Obiettivo

  • abilitare/disabilitare comportamento per tenant specifico;
  • fare rollout graduale;
  • introdurre fix temporanei senza toccare tutti i tenant.

Dove si configura

  • Impostazioni Avanzate -> Tenant Features
  • view tecnica: TenantFeatureFlagView
  • tabella: tenant_feature_flag

Cosa fa il menu

Impostazioni Avanzate -> Tenant Features

Apre la gestione delle feature flag e fix flag per tenant, con rollout puntuale e override mirati.

Campi principali

  • tenant_key: tenant target. usa * per default globale.
  • feature_code: codice univoco (es. feature.compila.photo_v2).
  • enabled: on/off.
  • status: active, trial, readonly, disabled, expired.
  • valid_from, valid_to: finestra temporale.
  • config_json: parametri opzionali in JSON.
  • notes: motivazione/business note.

Convenzione codici

  • feature: feature.<modulo>.<nome>
  • fix: fix.<modulo>.<nome>
  • esempio:
  • feature.documentale.versioning_v2
  • fix.compila.reload_server_after_reset
  • feature.ras.extrabit_zip_export

Pattern consigliato di rollout

  1. crea record * con enabled=false (default globale spento).
  2. crea record per tenant pilota con enabled=true.
  3. valida su pilota.
  4. estendi ad altri tenant.
  5. quando stabile: abilita * e rimuovi override specifici.

Uso nel codice

Import base:

from app.modules.multitenancy.features import (
    is_feature_enabled,
    get_feature_config,
    tenant_feature_required,
)

Guard semplice:

if is_feature_enabled("feature.compila.photo_v2"):
    # nuovo comportamento
else:
    # fallback legacy

Config dinamica:

cfg = get_feature_config("feature.compila.photo_v2")
max_photos = int(cfg.get("max_photos", 3))

Protezione endpoint:

@expose("/api/new-endpoint")
@has_access
@tenant_feature_required("feature.compila.photo_v2")
def new_endpoint(self):
    ...

Per endpoint write-only:

@tenant_feature_required("feature.documentale.fast_upload", allow_readonly=False)

Esempi config_json

{"max_photos": 4, "layout": "compact"}
{"enabled_actions": ["preview", "download"], "default_page_size": 50}

Relazione con Tenant Modules

  • Tenant Modules: abilita/disabilita macro-moduli (commerciale, ras, tickets, ecc.).
  • Tenant Features: dettaglio fine su singole feature/fix dentro un modulo.

Caso consigliato per formazione:

  • module_code = formazione
  • feature flag dedicate per rollout del portale esterno o sync avanzati

Usa entrambi: - modulo spento => feature non rilevanti; - modulo acceso => feature/fix governano il comportamento puntuale.

Checklist rapida

  1. definisci feature_code con naming standard.
  2. inserisci record in Tenant Features.
  3. aggiungi guard nel codice.
  4. testa tenant pilota.
  5. monitora log/errori.
  6. estendi rollout.

Comandi utili (CLI)

Seed iniziale flag standard:

flask feature_flag_seed_defaults

Set puntuale di una feature:

flask feature_flag_set \
  --tenant-key tenant_besant \
  --feature-code feature.anagrafiche.tenant_access \
  --enabled \
  --status active

Disabilitazione rapida:

flask feature_flag_set \
  --tenant-key tenant_besant \
  --feature-code feature.anagrafiche.tenant_access \
  --disabled \
  --status disabled

Abilitare export ZIP Extrabit solo su un tenant:

flask feature_flag_set \
  --tenant-key tenant_safecondo \
  --feature-code feature.ras.extrabit_zip_export \
  --enabled \
  --status active