partiduo-form
= partiduo-form — formulaires publics par jeton :toc: left :toc-title: Table des matières :icons: font
Partiduo est le portage en Crystal de https://noalyss.eu[NOALYSS], logiciel libre de comptabilité créé et maintenu par Dany De Bontridder. Partiduo n'est pas un projet officiel NOALYSS.
Ce dépôt est l'extension FORM de Partiduo (ADR-003), successeur de l'extension noalyss-form (FVAL, FDEF ; la source legacy) : on en porte les fonctions, pas le code. Un formulaire se publie par un lien à jeton (/p/form/<jeton>, l'ancienne adresse /f/<jeton> y redirige), seule surface de Partiduo ouverte sans authentification ; les réponses arrivent dans une boîte de réception, et un utilisateur authentifié décide : créer la fiche (par le contrat du cœur, avec ses droits), classer, rejeter. Rien n'entre d'office dans les fiches ni en comptabilité.
Spécification : ../partiduo-docs/adr/ADR-003-contrat-extensions.adoc (sort des extensions amont), avec ADR-001, ADR-002, ADR-005 et ADR-011. Décisions (D-FRM-*), inventaire porté / adapté / refusé et amendements proposés : link:DECISIONS.adoc[]. Référence du contrat : link:doc/api/form.adoc[].
== Fonctions
[cols="1,3",options="header"] |=== |Fonction |Dans FORM
|Formulaires |Titre, présentation, finalité, responsable du traitement, durée de conservation, catégorie de fiches visée, pièces jointes admises ; jusqu'à 30 champs typés (texte, texte long, courriel, téléphone, nombre décimal, date, case, liste de choix), cible facultative dans la fiche.
|Liens publics |Jeton de 256 bits montré une seule fois, conservé en empreinte ; expiration, révocation, usage unique ou nombre d'envois borné.
|Page publique |Montée par l'interface sous /p/form/ (route publique d'extension) ; limitation de débit par adresse et par lien, limite durable en base, taille bornée, protection CSRF, en-têtes stricts sans script, champ piège, rappel de la finalité, du responsable, de la conservation et des droits. Liens remis avant la version 0.1.4 (/f/<jeton>) : redirection 308.
|Boîte de réception |À traiter / toutes, compteur au menu et au tableau de bord ; fiche proposée, vérifiée puis créée par Partiduo::Api::Cards ; pièces contrôlées à la réception par la règle du socle, versées au dossier par store_attachment et rattachées à la fiche ; classer, rejeter, effacer.
|Conservation |Purge des réponses échues à la lecture, à la demande et par manage form_purge. |===
== Organisation
[source]
src/ ├── partiduo-form.cr # point d'entrée du shard ├── partiduo-form/cli.cr # migrations et commandes : require "partiduo-form/cli" └── forms/ # métier (application Marten « form ») ├── app.cr, manifest.cr # code FORM, permissions, menus ├── models/ # tables form_* ├── migrations/ # 0001 : tables et contraintes ├── services/ # jetons, contrôles, envois, traitement, purge (interne) ├── api/ # contrat public Forms::Api ├── commands/ # manage form_purge, form_attach_files └── locales/ # fr, en, nl, de, es, it, pt ui/ └── bulma/ # interface pour partiduo-ui-bulma (application « form_ui ») ├── bulma.cr # routes sous /ext/FORM/, page publique /p/form/, redirection /f/ ├── throttle.cr # limitation de débit propre à la page publique ├── ext/ # masquage du jeton dans le journal du serveur ├── handlers/, templates/forms/, assets/forms/, locales/
== Composer une distribution
[source,crystal]
require "partiduo-ui-bulma/partiduo_ui" require "partiduo-form" require "partiduo-form/ui/bulma"
installed_apps += Forms::INSTALLED_APPS + Forms::Ui::INSTALLED_APPS
ligne de commande : require "partiduo-form/cli"
L'extension ne dépend d'aucun module (fiches et pièces jointes sont du socle) ; elle s'active par dossier (Partiduo::Api::Modules.activate, écran « Modules »), y compris dans un dossier foyer.
À l'exploitation : planifier partiduo-manage form_purge chaque jour ; la reprise des pièces des réponses déjà acceptées (rattachées à leur fiche) est une migration de données, jouée d'elle-même par partiduo-manage migrate au démarrage de l'instance (D-FRM-021) ; partiduo-manage form_attach_files reste pour un passage manuel ; ne pas journaliser en clair les chemins /f/ et /p/form/ au mandataire (le jeton est dans l'adresse), y écraser X-Real-IP par l'adresse du client (DECISIONS A-FRM-4, D-FRM-017).
== Développement local
shard.yml et shard.lock référencent les shards maison sur GitHub (aloli-crystal/* et aloli-partiduo/*), suivis par branche. Le verrou versionné ne contient aucune dépendance path: : les ports FreeBSD et la CI l'exigent.
Pour travailler sur les copies de travail voisines (../../prod-crystal/<nom> et ../partiduo-<dépôt>), lancer :
[source,sh]
scripts/override-local.sh
Le script génère un shard.override.yml local et non versionné (ignoré par git), installe les shards, puis remet shard.lock à son état versionné. Une copie de travail absente reste prise sur GitHub.
Pour régénérer le verrou versionné, supprimer d'abord l'override local :
[source,sh]
rm -f shard.override.yml SKIP_MARTEN_CLI_PRECOMPILATION=1 shards update scripts/override-local.sh # retour au mode local
== Commandes
[source,sh]
SKIP_MARTEN_CLI_PRECOMPILATION=1 shards install createdb -h /tmp partiduo_test_ DATABASE_URL='postgres:///partiduo_test_?host=/tmp' crystal spec --order random crystal tool format src spec ui config scripts manage.cr && bin/ameba
== Version et licence
Numéro dans shard.yml seulement (constante Forms::VERSION lue à la compilation) ; chaque commit en incrémente le dernier chiffre. Licence AGPL-3.0-or-later (fichier LICENSE).
partiduo-form
- 0
- 0
- 0
- 1
- 4
- 8 days ago
- October 12, 2026
GNU Affero General Public License v3.0
Mon, 26 Oct 2026 12:23:59 GMT