DP-1869 — Formulaire d’habilitation « Produits DINUM » (V1)#1677
DP-1869 — Formulaire d’habilitation « Produits DINUM » (V1)#1677Isalafont wants to merge 9 commits into
Conversation
|
(désolé je lâche un pavé je me suis lancé dans une réflexion couplé avec des explications en écrivant, le but est d'apporter mon point de vue architecte/concepteur logiciel vis-à-vis des défis que vous avez) J'ai plusieurs remarques/questions:
Si 1. on simplifie, on peut reprendre le bloc existant du legal et si on recycle les contacts métiers/techniques, à priori.. tout peut-être fait directement en db non ? (je ne sais pas si on peut customiser les wordings mais à priori c'est le seul truc qu'il faut faire) Là ce qui me dérange d'un point de vue technique c'est qu'à chaque fois qu'on introduit un nouveau formulaire en db on introduit des wordings/blocs customs (qui sont pas vraiment des vrais blocs customs, juste des moyens d'utiliser le système en db) sans avoir toute la chaîne, ce qui rend le code très compliqué (vu que y'a du bloc dans le code qui est dépendant de valeurs en db). Pour illustrer mon point: le bloc J'entends l'envie d'industrialiser du formulaire DataPass, mais ça a du sens sur des blocs straightforward (genre de l'automatisation avec data.gouv par exemple), comme c'est un poil ~ish custom c'est plus tricky et on se retrouve à faire des galipettes très étranges/qui font des noeuds au cerveau ici. Là à mon sens, sous condition qu'on drop le champ
L'option entre 2 chaises c'est complexifier le système à mon sens (car le système aura un pied de config dans le code et un autre pied de config en prod, qui faut sync et avoir l'image mental du système). Après c'est une question de stratégie : si il y a beaucoup d'itérations avec plein de champs customs and stuff, l'option 1. me semble la plus logique, si on sait d'avance que ça sera surtout du wording, le 2. est le mieux (limite ça se fait même en live 👍) C'est de la réflexion high level que j'ai eu à la lecture de cette PR qui me semble compliqué par rapport à l'option 1. en dur qui est assez straightforward 🤔 (et l'option 2. si on est ~ish sûr qu'il n'y a pas de champ custom c'est le plus banger car on peut laisser quelqu'un de la suite faire la config lui même en autonomie, ce qui est j'ai cru comprendre le but in-fine). Pour aller plus loin: si on sait qu'il va y avoir des champs customs en mode texte souvent, clairement l'option faire un bloc/vue custom à chaque formulaire c'est pas viable, de là y'a plusieurs approches : continuer à faire du code custom sur les cas complexes (i.e. proactivité), ou introduire un colonne qui défini des attributs customs (mais là on commence à s'orienter vers un form builder ala DN) |
|
@skelz0r en fait j'en viens à exactement la même conclusion que toi , je vais faire au plus simple et je vais tout reprendre dans ce sens. Du coup ce n'est pas tout à fait le même champs que pour le cadre legal "normal". (a terme dans une V2, ce champ devra s'auto complete comme pour proactivité en récupérant les info de l'orga) On doit juste push cette V1 pour cette semaine (ou semaine pro) afin de mettre en prod au max fin juillet et entre temps faire les aller retours de wording avec le juridique. Ps: je suis pas hyper fan de faire des blocs de code custom mais tant que l'on ne gère pas les wordings en mode form builder comme DN, du moins facilement, on n'a pas trop le choix pour ce bloc. |
Je m'en suis douté, mais doit y avoir un truc qui m'échappe car la nature d'une organisation on l'a déjà via les APIs, je suppose que la qualification des administrations pour l'alimentation du JDD doivent se faire après examen du cadre juridique global, et les juristes doivent du coup inférer que tel organisation est une administration pour X/Y/Z raison, et du coup après alimenter à la main 🤔 Surtout que c'est un champ libre (soit la porte ouverte à n'importe quoi). Perso je shipperai sans et je ferai directement 1. parce qu'en fait les personnes en face (i.e. la suite) ne savent pas forcément qu'on a déjà (potentiellement) l'info, et c'est aussi l'occasion de rendre le produit plus legaltech, et ça introduit surtout beaucoup moins de dette. Faire la v1 avec 1. c'est 1 prompt claude et 0 test à introduire (car c'est déjà testé automatiquement) vu que tout est détaillé dans les procédures, même ajouter un champ custom avec du code c'est trivial ici. A dispo pour en discuter. |
885a643 to
17d93fa
Compare
2da149b to
88cd947
Compare
Les contacts du formulaire Produits DINUM (référent outils numériques, DPD, responsable de l’administration) ne demandent que nom, prénom et email. Le téléphone et la fonction sont retirés de l’affichage et des validations. Introduit une option « except » sur la déclaration « contact », réutilisable par n’importe quel formulaire, qui lève les validations de présence et masque les champs correspondants. Comportement inchangé pour tous les formulaires qui ne l’utilisent pas.
88cd947 to
861c907
Compare
Un3x
left a comment
There was a problem hiding this comment.
Je m'abstiens de valider ou non, j'ai juste fait une review purement technique avec mon ignorance complète
| provider: "dinum" | ||
| kind: 'service' | ||
| cgu_link: "https://example.org/cgu-produits-dinum" | ||
| support_email: "support@yopmail.com" |
There was a problem hiding this comment.
J'avoue qu'ici j'ai du mal à comprendre dans quelle mesure ce fichier est un fichier de test ou non.
Je comprends d'après le contenu que c'est le cas mais d'après le code j'interprête ca comme un fichier qui va partir en prod.
Potentiellement ajoutable en tant que block, je trouve ca limite.
There was a problem hiding this comment.
C'est un fichier de config de type d'habilitation (comme tout ce qui est dans config/authorization_definitions), vu la potentielle complexité du sujet (i.e. c'est pas un formulaire straightforward) c'est plus simple de le faire en mode code que via le système existant (qui n'est pas assez complet).
Plus de détails sur mon commmentaire plus haut #1677 (comment)
| define_common_contact_attributes(kind, validation_condition:, except:) | ||
| define_contact_person_attributes(kind, validation_condition:, except:) |
There was a problem hiding this comment.
on est ok ici que ca va continuer d'afficher les anciens wording aussi et les anciesn attributs ? il y a une maj qui a été faite en ce sens dans le partial et le décorator de _contact mais j'ai l'impression que ce serait aussi pertinent.
There was a problem hiding this comment.
Oui (mais en fait je ne vois pas le rapport avec cette ligne 🤔)
There was a problem hiding this comment.
J'ai introduit le except: pour ne pas a avoir à afficher certains champs des contact pour le formulaire des produit DINUM et qu'ils ne soient pas bloquer en validation.
Le but étant de ne pas impacté le comportement des autres formulaires existant.
Je ne mergerai de toute façon rien sans avoir testé que nous n'introduisons aucune régression.
| <div data-controller="message-template-selector" | ||
| data-message-template-selector-templates-value="<%= @message_templates.map { |t| { id: t.id, content: t.content } }.to_json %>" | ||
| data-message-template-selector-authorization-request-data-value="<%= { demande_url: authorization_request_url(@authorization_request), demande_intitule: @authorization_request.intitule, demande_id: @authorization_request.id }.to_json %>"> | ||
| data-message-template-selector-authorization-request-data-value="<%= { demande_url: authorization_request_url(@authorization_request), demande_intitule: @authorization_request.try(:intitule), demande_id: @authorization_request.id }.to_json %>"> |
There was a problem hiding this comment.
On est d'accord que ici, on skip une potentielle erreur 500 en renvoyant null ?
Juste pour confirmer que c'était bien l'intention
There was a problem hiding this comment.
Oui, mais imo c'est pas la meilleure approche (car l'intitulé est un champ standard mais parfois absent comme sur HubEE), ici il faudrait utiliser AuthorizationRequest#name https://github.com/etalab/data_pass/blob/develop/app/models/authorization_request.rb#L188 imo
| data-message-template-selector-authorization-request-data-value="<%= { demande_url: authorization_request_url(@authorization_request), demande_intitule: @authorization_request.try(:intitule), demande_id: @authorization_request.id }.to_json %>"> | |
| data-message-template-selector-authorization-request-data-value="<%= { demande_url: authorization_request_url(@authorization_request), demande_intitule: @authorization_request.name, demande_id: @authorization_request.id }.to_json %>"> |
There was a problem hiding this comment.
Et c'est le changement que je vais faire, c'était un résidu du passage de formulaire dynamique à STI fait le soir... 👍🏻
…oc custom Suite à la revue de PR (skelz0r) : le formulaire Produits DINUM dupliquait le modèle du cadre juridique (concern, attributs, validation) alors que seule la présentation devait être spécifique au formulaire. - ProduitsDinum réutilise le concern CadreJuridique et les attributs standard (cadre_juridique_nature/url/document) plutôt qu’un concern dédié - La présentation retravaillée est portée par une vue propre au formulaire (blocks/produits_dinum/_legal.html.erb) : champ nature sur une ligne, titre justificatif en bleu, description avec marge - Suppression du concern CadreJuridiqueDinum et des vues/wordings _legal_dinum - Test de non-régression sur wording_for (renommage de contact par formulaire, sans impact sur les autres formulaires)
… le sélecteur de template Suite review : try(:intitule) renvoie nil quand l’intitulé est absent (HubEE, Produits DINUM…). #name fournit un repli lisible (nom du formulaire puis de la définition), cohérent avec le titre de la modale qui l’utilise déjà.
|
Pour information, j'ai appliqué les derniers changements suite à ton retour @skelz0r . Pour le cadre juridique, j'aimerais passer par le bloc de base sauf que cela demande une petite refacto pour qu'il ressemble bien à la dernière version et ça impacterait la tout de suite, tous les formulaires. Je pense qu'il serait préférable que l'on traite cela dans une PR moins "urgente" et surtout entièrement dédié à cela. La différence de design n'est pas grand chose mais la on commence à sortir du scope de cette PR. Il me manque encore des infos à récupérer auprès du Pole juridique concernant les envoie d'email. Du coup, si je passe la PR en Draft ici, est ce que ça aura une incidence sur le deploiement de cette branche sur Sandbox ? @Un3x (si vous avez la réponse à cette question je suis preneuse) |
|
Pour moi le design n'est en effet pas à traiter dans le cadre d'une simple configuration de formulaire car ce n'est pas le scope. |
Contexte
Nouveau formulaire d’habilitation « Produits DINUM » (accès groupé aux produits de la Suite numérique), issu du cadrage DP-1868 et de la réunion juridique du 08/07 (DP-1851).
Implémenté en dur dans le code (STI)
Ce que fait la PR
Formulaire à 2 étapes :
Pas d’étape « Nom du projet ». CGU en case à cocher standard. Pas de sélection de produits (liste dans l’introduction).
Décisions clés
AuthorizationRequest::ProduitsDinum+config/authorization_request_forms/produits_dinum.yml+authorization_definitions/produits_dinum.yml) plutôt qu’un type dynamique en base : le formulaire vit dans le code → aucune manip en base (ni local, ni staging, ni prod).form_uid(pas de contact_types dédiés) :responsable_traitement→ « Responsable de l’administration » (déjà notifié par email à la validation = besoin métier),contact_technique→ « Référent des outils numériques de l’administration ».shared/_contact.html.erb→f.wording_for, cascade form_uid → default, rétro-compatible). Ouvre la voie à de la config par formulaire sans dupliquer de types.AuthorizationExtensions::CadreJuridiqueDinum(bloclegal_dinum), stockage endata, zéro migration..intitule→try(:intitule)dans les vues d’instruction (ce type n’a pas de blocbasic_infosfournissant l’intitulé).Comment tester
Pas de reseed — le formulaire est dans le code :
/local-sign-in?email=user@yopmail.com/demandes/produits_dinum/nouveau/local-sign-in?email=datapass@yopmail.com) : ouvrir la demande, vérifier qu’approuver / refuser / demander des modifications ne plantent pas.Tests automatisés :
bundle exec rspec(2955 examples, 0 échec) ·bundle exec cucumber features/habilitations/produits_dinum.feature.Points en attente (hors périmètre technique)
https://example.org/cgu-produits-dinum, dansauthorization_definitions/produits_dinum.yml) → à remplacer par le document juridique.