h1. généralisation d'un code de suivi h2. L'idée. Chaque formdata possède un attribut tracking_code. Ce code est disponible sous la variable [form_tracking_code] h3. Création du tracking_code Le code de suivi est créé par une action de workflow, typiquement lors de la toute première étape. Cette action de workflow a des paramètres : - chaine de caractère "format du code de suivi" = une chaine avec n pour un nombre, l pour une lettre, et on autorise "-" et "." . si rien, on utilise nnnnnnn (7 chiffres). Les chiffres sont 2-9 (jamais de 1 et 0 pouvant être confondus avec I et O). Les lettres sont majuscules, en éliminant O,I et autres lettres qui ressemblent à des nombres. - case à cocher "effacer l'ancien code si présent" (=False par défaut) - case à cocher "autoriser l'accès frontoffice même si le formulaire appartient à un autre utilisateur" (=False par défaut) ou "accès aux formulaires anonymes seulement" (=True par défaut) h3. Utilisation en frontoffice Un formulaire est présent pour taper un code, on tape le code de suivi et on accède au formulaire comme si on était l'expéditeur. Si on est loggué, on dispose d'un lien permettant de devenir vraiment l'expéditeur du formulaire (il n'est alors plus anonmye) (="rattacher de formulaire à mon compte") h3. Utilisation en backoffice ... h2. Réalisation Une classe TrackingCode similaire à Token, avec _name = 'trackingcode' et les restrictions sur le format (LLNNLLNNLL). Dans le __init__, on passe la référence vers le formulaire (formdef.id et formdata.id) qui sont placés dans le contenu de l'objet, ainsi que les paramétrages selon l'action de workflow (accès anonyme seulement). Pour éviter un risque de réutilisation, le code de suivi reste en place même si le formdata est archivé/effacé. Il est cependant marqué "obsolète", et on peut prévoir une date d'expiration via un cron (6 mois ?). Une URL /trackingcode/?code=xxxxx permet d'obtenir l'accès via le code de suivi. Cette URL est protégée contre une attaque brute-force (throttle). Bien sûr, l'accès n'est validé que si le formdata cible a bien le trackingcode attendu et que le formdata est anonyme (sauf si "accès anonyme seulement" est faux). ...