Il existe un générateur definition
:
bundle exec rails g definition
La checklist globale:
- Ajouter le ou les entrée(s) dans les fichiers de config ;
- Ajouter et configurer le modèle (avec sa factory et son test) ;
- Configurer les formulations via l'I18n ;
- Ajouter la vue de complétion côté demandeur ;
- Ajouter un test d'intégration Cucumber ;
- Importer les données existantes.
Disclaimer: La procédure est amené à évoluer rapidement, et certains parties seront peut-être obsolètes. Il y a par ailleurs des refactorisations logiques, mais potentiellement prématurés: il faut attendre d'intégrer plus de sources pour être sûr d'effectuer les refactorisations nécessaires.
Une demande d'habilitation (le modèle) est lié à 1 ou plusieurs formulaires. Il faut à minima en remplir 1 de chaque et qu'ils soient liés.
D'un point de vue de la couche modèle il y a :
AuthorizationDefinition
, qui est un modèle statique, qui définie les attributs du type d'habilitation ;AuthorizationRequestForm
, qui est un modèle statique, qui définie les attributs d'un formulaire associé à un type d'habilitation ;AuthorizationRequest
, modèle en db, qui représente la demande effective associé à une association. Celle-ci référence la définition et le modèle associé au formulaire
Pour la configuration de la définition (1.):
# Il s'agit du nom de la classe en underscore. Ici `MonAPI`
mon_api:
# Nom affiché dans l'index des formulaires et en titre par défaut de chaque
# formulaire exploitant cette habilitation
name: Mon API
# Description affichée dans l'index des habilitations.
description: Une description
# ID du provider (cf 1.1 plus bas)
provider: dinum
# Optionel. Lien pour en savoir plus. Par défaut le lien du fournisseur est pris
link: https://mon-api.gouv.fr
# Lien vers les CGU
cgu_link: https://mon-api.gouv.fr/cgu.pdf
# Type de service. Valeurs possibles: api, service.
# Cette valeur sert principalement à personnaliser les textes, notamment sur la page de
# démarrage d'une demande.
kind: 'api'
# Optionnel. Affiche ou non cette source de données dans l'index des formulaires. Par défaut à `true`
public: true
# Optionnel. Détermine si il ne peut y avoir qu'un seul formulaire par organisation. Par défaut à `false`
unique: false
# Optionel. Détermine si ce formulaire peut être démarrer à l'initiative de
# l'utilisateur. Cet attribut sert principalement aux habilitations en 2
# étapes (bac à sable puis production), lorsque la 1ere est validé la 2e est
# crée par le système. Par défaut à `true`
startable_by_applicant: false
# Optionel. Permet de définir des étapes (ex: sandbox -> production)
stage:
# Type: sandbox / production
type: sandbox
# Information concernant l'étape suivante, clé obligatoire si le type est sandbox
next:
id: api_impot_particulier
form_id: api-impot-particulier
# Information concernant les étapes précédentes. Clé obligatoire si le
# type est production. Cette information mimique le comportement
# d'ActiveRecord qui implémente la réversabilité et permet ainsi de plus
# simplement faire les liens entre les modèles. Pour plus d'infos
# effectuer un `git blame` sur ces lignes
previouses:
- id: api_impot_particulier_sandbox
form_id: api-impot-particulier-sandbox
- id: api_impot_particulier_sandbox
form_id: api-impot-particulier-sandbox-editor
# Liste des diverses données débrayable pour la source de données
scopes:
# Nom humanisé de la donnée
- name: Nom de famille
# Nom technique de la donnée
value: family_name
# Nom du groupe pour cette donnée afin d'effectuer
# un regroupement visuel
group: Identité pivot
# Optionnel. Lien vers des détails sur la donnée. Affiche un lien pour
# en savoir plus sur cette donnée.
link: https://mon-api.gouv.fr/documentation/nom-de-famille
# Optionnel. Détermine si la donnée est forcément incluse. Cela permet
# d'afficher des données grisés et cochés à l'utilisateur pour l'informer
# que ces données seront disponibles avec son habilitation. Par défaut à
# false
included: true
# Liste des blocs à afficher dans le résumé
# Ces blocs peuvent correspondre aux 'steps' des formulaires définis
# ci-dessous, mais ce n'est pas une obligation. Chaque bloc doit être défini
# dans app/views/authorization_requests/shared/blocks/
blocks:
- name: basic_infos
- name: personal_data
Pour la configuration d'un formulaire (2.):
# Identifiant unique qui sera utilisé dans les URLs
mon-api-form:
# Nom affiché en titre du formulaire. Par défaut celui de l'habilitation est
# prise
name: Mon API dans le formulaire
# Description affichée au début du formulaire. Par défaut celui de
# l'habilitation est prise.
description: Une description du formulaire
# Nom de la classe du modèle associé (défini dans l'étape 2). Permet de
# faire le lien avec la définition plus haut
authorization_request: MonAPI
# Optionnel: Permet de spécifier la vue à utiliser dans le cas d'un
# formulaire sur une seule page. Cette vue doit être placée dans `app/views/authorization_request_forms`
single_page_view: 'api_entreprise_through_editor'
# Optionnel. Prend celui de l'habilitation par défaut (même définition
# qu'au dessus)
public: true
# Optionnel. Prend celui de l'habilitation par défaut (même définition
# qu'au dessus)
startable_by_applicant: true
# Optionnel. Identifiant (actuellement lié à aucune autre modèle) permettant
# de potentiellement effectuer des filtres avec des liens direct
# ( exemple: https://api-entreprise.v2.datapass.api.gouv.fr/demandes/api_entreprise/formulaires?use_case=marches_publics )
# Celui-ci sera plus exploité dans des itérations futures (en l'associant à
# un vrai modèle)
use_case: 'marches_publics'
# Optionnel. Identifiant associé à un fournisseur de données (défini en 1.1
# ci-dessous)
service_provider_id: mon-fournisseur
# Optionnel. Permet d'avoir un texte d'introduction avant de commencer le
# formulaire. Celui-ci s'affiche après le choix du formulaire et avant la
# première étape. La page où se situe cette introduction est
# systématiquement affichée, si l'introduction du formulaire est vide la
# section est vide.
# Il est possible d'utiliser les variables `service_provider_name` et `form_name`, de
# la manière suivante: "L'éditeur %{service_provider_name}"
introduction: |
Je suis une introduction permettant d'introduire le formulaire dans ses
détails.
# Optionnel. Permet de définir des options sur les scopes de la définition
# au sein du formulaire.
scopes_config:
# Optionnel. Scopes (par valeur) qui auront leur checkbox désactivés. A
# noter que le scope peut-être présent (grace à la clé `data`) ci-dessous.
disabled:
- scope1
- scope2
# Optionnel. Scopes (par valeur) qui seront affichés. Si cette clé est
# omise l'ensemble des scopes de la définition sont affichés.
displayed:
- scope3
- scope4
# Optionnel. Détermine les étapes ordonnées pour remplir ce formulaire. Si
# ce champ n'est pas défini le formulaire sera sur une seule page pour le
# demandeur. La dernière étape est
# systématiquement le récapitulatif et les cases à cocher des CGUs.
steps:
- name: basic_infos
- name: personal_data
# Détermine les blocs qui sont statiques, à afficher dans le résumé.
# Un bloc statique est un bloc qui n'a pas vocation a être modifié par le
# demandeur, par exemple dans le cas de formulaires d'éditeurs, certaines
# infos comme les infos du projet sont déjà connues et fixes.
# Ces blocs doivent matcher sur la clé `name` avec les `blocks` des
# définitions ci-dessus
static_blocks:
- name: basic_infos
# Optionnel. Données pré-rempli au démarrage du formulaire.
data:
intitule: "Mon intitulé"
Si il s'agit d'un nouveau fournisseur, il faut l'ajouter dans
config/data_providers.yml
Le format:
# Identifiant unique du fournisseur, utilisé dans le form au dessus
mon-fournisseur:
name: Mon Fournisseur
logo: mon-fournisseur.png
link: https://mon-fournisseur.gouv.fr
En reprenant l'exemple ci-dessus, il faut créer le fichier
app/models/authorization_request/mon_api.rb
avec le contenu (minimal) suivant:
class AuthorizationRequest::MonAPI < AuthorizationRequest
end
Certains formulaires possèdent des blocs communs, certains de ces blocs ont été
identifiés et placés dans le dossier
app/models/concerns/authorization_extensions
.
De manière plus bas niveau, une liste de méthode disponibles pour ajouter des attributs au formulaire:
add_attribute :attribut1
pour ajouter un attribut ayant pour nomattribut1
de type texte ;add_document :document1, validation_options
pour ajouter un document ayant pour nomdocument1
contact :mon_contact
pour ajouter un nouveau contact. Cette méthode va créer les attributsmon_contact_family_name
,mon_contact_given_name
,mon_contact_email
,mon_contact_phone_number
,mon_contact_job_title
add_scopes
, qui permet d'activer les scopes (basé sur le fichier de config)
Il est fortement conseillé d'utiliser les blocs dans un premier temps, et ces méthodes outils dans un second temps, qui permettent de dynamiquement accepter les modifications lors du cycle de vie de la demande, et de pré-configurer plus rapidement les vues.
Exemple:
class AuthorizationRequest::MonAPI < AuthorizationRequest
include AuthorizationExtensions::CadreJuridique
add_attribute :intitule
validates :intitule, presence: true
contact :responsable_technique
add_document :maquette_projet, content_type: ['application/pdf'], size: { less_than: 10.megabytes }
end
Vis-à-vis de la factory, il faut se rendre dans le fichier
spec/factories/authorization_requests.rb
et compléter avec le nom de la classe en underscore.
Il faut à minima définir les noms des attributs définis dans le modèle. Cela se
passe dans le fichier de locale activerecord.fr.yml
).
Ceux-ci servent quand il y a des problèmes de validation sur les attributs.
Concernant les formulaires, l'affichage tire les valeurs dans cet ordre:
- Dans le fichier de traduction
authorization_request_forms.fr.yml
, clé correspondant au type de formulaire (exemple:mon-api-form
) ; - Dans le fichier de traduction
authorization_request_forms.fr.yml
, clé correspondant au type d'habilitation (exemple:mon_api
) ; - Dans le fichier de traduction
authorization_request_forms.fr.yml
, clédefault
- Attributs (dans
activerecord.fr.yml
)
Ce qui est exploité ici (liste non-exhaustive):
- Les labels
- Les 'hints' des formulaires
- Les titres
- Les blocs d'infos
A noter que l'on peut ajouter d'autres clés non-conventionnelles.
A noter que pour le point 4., les contacts sont définis de manière unitaire, si
vous voulez par exemple modifier ou ajouter des infos sur le contact
contact_technique
pour le modèle MonAPI
:
authorization_request_forms:
mon_api:
contact_technique:
info: |
Info sur mon contact technique
Il est possible, uniquement pour les infos des contacts, de modifier par formulaire. Par exemple pour le formulaire ayant l'id "mon-formulaire" pour le type d'habilitation "mon_api":
authorization_request_forms:
mon_formulaire:
contact_technique:
info: |
Info sur mon contact technique spécifie à mon_formulaire
Si il n'y a qu'un seul formulaire associé à la définition, alors on redirige directement vers le new
du formulaire, c'est à dire /formulaires/:form_uid/demande/nouveau
.
Si il y a plusieurs formulaires il y a par défaut la liste de formulaires générique de authorization_requests/new/default.html.erb
. Il est possible de personnaliser cette page afin par exemple d'effectuer de l'aiguillage.
C'est le cas pour API Entreprise, dont le fichier est présent ici
Si vous avez besoin de faire la même chose pour un autre type d'habilitation, il
suffit de créer une vue dans le dossier
[app/views/authorization_requests/new/
] avec le nom en underscore du type d'habilitation.
Pour API Entreprise => api_entreprise.html.erb
Il faut s'assurer que pour chaque étape défini dans le fichier en 1. une vue
existe dans le dossier app/views/authorization_request_forms/build/
.
Si ce n'est pas le cas il faut ajouter, pour une étape ayant pour nom
mon_etape
, le fichier mon_etape.html.erb
. Inspirez-vous des fichiers
existants1. Vous pouvez utiliser les méthodes de formulaire en dsfr_
pour
simplifier la génération des formulaires.
Il faut créer le fichier mon_api.html.erb
dans le dossier
app/views/authorization_request_forms/
avec le markup minimal:
<%= authorization_request_form(@authorization_request) do |f| %>
<% # Les autres champs ici %>
<%= render partial: 'authorization_request_forms/shared/tos_checkboxes', locals: { f: } %>
<%= render partial: 'authorization_request_forms/shared/submit_buttons', locals: { f: } %>
<% end %>
A noter qu'il est possible de changer le nom de mon_api
si vous précisez une
valeur pour single_page_view
Créer le fichier mon_api.feature
dans features/habilitations
et
remplissez en fonction de la spécification.
A noter qu'il peut déjà exister des fichiers si le type d'habilitation existait déjà avant.
Si il s'agit d'un nouveau formulaire sans donnée, il n'y a rien à faire. Sinon, vous pouvez vous référer au README associé.
Footnotes
-
il est désormais possible de surcharger le rendu d'un block (de formulaire comme de résumé) en créant un partial sous un dossier nommé avec l'identifiant de la définition (par exemple: le block de "contacts" est surchargé pour les demandes "api_impot_particulier"). Quand cela n'est pas nécessaire le partial sous
default
est alors rendu. cf les méthodesrender_custom_form_or_default
etrender_custom_block_or_default
. ↩