workflows : add an identifier to automatic and on submit jumps (#74723) #161
Open
ecazenave
wants to merge 2 commits from
wip/74723-last-jump
into main
pull from: wip/74723-last-jump
merge into: entrouvert:main
entrouvert:main
entrouvert:wip/88845-submission-breadcrumb
entrouvert:wip/88844-pending-submission
entrouvert:wip/88755-testdef-avoir-un-historique-des
entrouvert:wip/69291-warn-on-time-related-conditions
entrouvert:wip/86527-better-fts
entrouvert:wip/88753-testdef-lancer-les-tests-apres-u
entrouvert:wip/88754-testdef-ajouter-un-resume-aux-ac
entrouvert:wip/66916-wscall-apply-unflatten-payload
entrouvert:wip/88744-testdef-ajouter-une-action-dupli
entrouvert:wip/88404-testdef-support-du-declencheur-a
entrouvert:wip/88412-testdef-ameliorer-la-gestion-de
entrouvert:wip/88687-update-relations-once-per-model
entrouvert:wip/86062-invalid-queryset-translation-fr
entrouvert:wip/76958-a11y-live-validation
entrouvert:wip/88612-a11y-file-widget
entrouvert:wip/88473-workflow-tests-mauvais-bouton-se
entrouvert:wip/44804-form-details-detailed-blocks
entrouvert:wip/84136-passage-a-nox
entrouvert:wip/71778-block-post-condition
entrouvert:wip/75955-backoffice-field-table
entrouvert:wip/46617-map-field-jsonb
entrouvert:wip/88208-tests-hobo-provision-clean
entrouvert:wip/4794-mark-vhost-name
entrouvert:wip/87800-update-wcs-wcs-all-forms-category
entrouvert:wip/87739-clamav
entrouvert:wip/87690-backoffice-builtin-select-filters
entrouvert:hotfix/v10.81
entrouvert:wip/87525-marqueur-position-initiale
entrouvert:wip/72793-french-mobile-number-templatetag
entrouvert:wip/36626-html-form-details
entrouvert:wip/87435-submission-index-query
entrouvert:wip/87434-Ameliorer-les-requetes-dans-Subm
entrouvert:wip/81010-improve-list-as-images-rendering
entrouvert:wip/xxxxx-lazy-publication-attributes
entrouvert:wip/86992-Condition-de-sortie-de-page-ne-p
entrouvert:wip/28236-age-in-partial-days
entrouvert:wip/83593-testdef-socle-de-base-pour-les-w
entrouvert:wip/86587-testdef-inclure-les-tests-dans-l
entrouvert:hotfix/v10.71
entrouvert:wip/xxx-failing-tests-1
entrouvert:wip/xxx-failing-tests-2
entrouvert:wip/86587-testdef-inclure-les-tests-dans-l-old
entrouvert:wip/86490-opacify-short-url
entrouvert:83593-old-2
entrouvert:hotfix/v10.63
entrouvert:wip/86224-no-godo-for-loops
entrouvert:wip/27992-history-comment-rich
entrouvert:wip/75777-Doublon-d-utilisateur-au-provisi
entrouvert:wip/83593-testdef-socle-de-base-pour-les-w-old
entrouvert:wip/84500-fausse-exception-None-dans-les-t
entrouvert:wip/41460-workflow-zoom-with-ctrl
entrouvert:wip/tests-jenkins
entrouvert:wip/85108-gin-indexes
entrouvert:hotfix/v10.48
entrouvert:wip/50829-sql-schema
entrouvert:wip/84579-jenkinsfile-double-numprocesses
entrouvert:wip/test-ci
entrouvert:wip/78777-template-data-source
entrouvert:wip/60412-dynamic-prefill-select2-card
entrouvert:wip/81734-rewrite-stats-in-sql
entrouvert:wip/66067-admin-permissions-check-all
entrouvert:wip/79738-role-usage
entrouvert:wip/81105-tests-unitaires-js
entrouvert:wip/81496-application-diff-version
entrouvert:wip/77911-decimal-queries
entrouvert:wip/80843-unicite-identifiant
entrouvert:wip/73401-longueur-champ-text
entrouvert:wip/81020-clamp
entrouvert:hotfix/v9.94
entrouvert:wip/80613-visited-objects
entrouvert:wip/80462-stats-enlever-le-choix-Tous-les-
entrouvert:wip/80360-form-details-titles
entrouvert:wip/59221-import-none-role
entrouvert:wip/79858-has-role-filter-uuid
entrouvert:wip/79859-liste-image-live-update-champ-ignore
entrouvert:wip/79775-tox-v4-compat
entrouvert:tmp-paul/godo-dependency-riddance
entrouvert:hotfix/v9.68
entrouvert:hotfix/v9.58
entrouvert:wip/72091-remove-python-option
entrouvert:hotfix/v9.36
entrouvert:hotfix/v9.21
entrouvert:wip/75724-live-validation-js
entrouvert:wip/75724-error-template-markup
entrouvert:wip/75724-JS-live-validation
entrouvert:wip/75170-testdef-revoir-la-creation
entrouvert:wip/75795-sql-application_name
entrouvert:wip/75647-cron-ne-pas-bloquer-sur-une-erre
entrouvert:hotfix/v8.98
entrouvert:wip/75178-Retirer-l-application-d-ExifRest
entrouvert:hotfix/v8.90
entrouvert:wip/74840-tox-30
entrouvert:wip/74840-tox-31
entrouvert:wip/73674-sql-cleanup
entrouvert:wip/74435-show-max-file-size-in-error
entrouvert:wip/check-pylint-broad-exception-raised
entrouvert:wip/xxxxx-native-form-pages
entrouvert:wip/73860-enforce-phone-fr-validation
entrouvert:wip/73513-audit-reduce-default-retention-delay
entrouvert:hotfix/v8.68
entrouvert:wip/72989-testdef-gerer-les-pages-conditio
entrouvert:wip/69561-page-title
entrouvert:wip/72704-testdef-verifier-la-validation-d
entrouvert:wip/72802-wf-actions-tracing-table
entrouvert:wip/72860-geojson-missing-id_property
entrouvert:wip/72862-i18n-none-template
entrouvert:wip/70508-missing-edited-data
entrouvert:wip/71789-empty-supported-languages
entrouvert:wip/72859-recreate-formdef-indexes
entrouvert:wip/72857-call-command-close-conn
entrouvert:wip/72682-grep-backoffice-fields
entrouvert:wip/72851-anonymised-tz
entrouvert:wip/38269-adapt-some-category-slugs
entrouvert:wip/72819-myspace-redirect
entrouvert:wip/72815-steps-title
entrouvert:wip/71590-translate-card-digests
entrouvert:wip/61416-cards-fields-directory
entrouvert:wip/72809-stub-data-source
entrouvert:wip/71020-anonymisation-as-trigger-date
entrouvert:wip/72083-add-deprecated-to-python-labels
entrouvert:wip/72803-snapshot-no-changes
entrouvert:wip/72801-jsonvalue-migration-exceptions
entrouvert:wip/71455-move-form-tokens-to-database
entrouvert:wip/72096-datasource-jsondef
entrouvert:wip/72765-phone-number-prefill
entrouvert:wip/31201-redirect-as-endpoint
entrouvert:wip/67090-saml-lier-la-session-en-cours-a-
entrouvert:wip/xxx-track-possible-regression
entrouvert:wip/72623-native-home-anyformdata
entrouvert:wip/71937-add-json-output-in-inspect-tool
entrouvert:hotfix/v8.54
entrouvert:wip/39178-history-message-template
entrouvert:wip/XXX-optimize-condition
entrouvert:wip/71471-fullname-vs-hobo
entrouvert:wip/XXXXX-test-jumps
entrouvert:wip/71330-api-include-workflow-data-param
entrouvert:wip/71333-lazy-evolution-and-old-pickles
entrouvert:wip/71327-redirect-query-string-trailing-slash
entrouvert:wip/71316-redirect-to-correct-category
entrouvert:wip/71303-api-fix-include-evolution
entrouvert:wip/69108-api-formdata-split-full
entrouvert:wip/71252-wscall-deps-conditions
entrouvert:wip/71152-api-export-import-category
entrouvert:wip/71184-preview-redirection
entrouvert:wip/71183-preview-redirection
entrouvert:wip/71183-edit-backoffice-redirection
entrouvert:wip/71176-summary-display-labels-as-p
entrouvert:wip/71102-timetable-a11y-focus-on-week-change
entrouvert:wip/71103-timetable-a11y-keyboard-nav
entrouvert:wip/71101-timetable-a11y-week-nav-buttons
entrouvert:wip/71091-evolution-metadata-p-tag
entrouvert:wip/71118-post-same-slug
entrouvert:wip/71087-filename-p-tag
entrouvert:wip/71051-edit-with-category
entrouvert:wip/70259-import-submission-channel
entrouvert:wip/71038-backoffice-data-admin-url
entrouvert:wip/71034-fullname-template
entrouvert:wip/70952-get-cron-status-no-lock
entrouvert:wip/4281-use-filewidget-in-export-to-model-action
entrouvert:wip/70045-ignore-anonymised-formdata-in-jumps
entrouvert:wip/70639-order-filter-options
entrouvert:wip/70990-restricted-api-user-substvars
entrouvert:wip/70458-create-doc-section
entrouvert:wip/70576-add-action-types-to-deprecation-page
entrouvert:wip/70978-not-set
entrouvert:wip/70979-fix-distance-filter-templatetags
entrouvert:wip/68883-go-to-mail-template
entrouvert:wip/70773-tempfile-link-on-edit-card
entrouvert:wip/70931-api-geojson-no-result
entrouvert:wip/70949-a-in-rich-text
entrouvert:wip/70858-mail-template-category-in-create
entrouvert:wip/70772-fix-json-import-bad-user-format
entrouvert:wip/70644-fix-get-int-or-404
entrouvert:wip/70914-tracing-members
entrouvert:wip/70904-pgpassword
entrouvert:wip/70908-cron-setproctitle
entrouvert:wip/70907-cron-legacy-needed
entrouvert:wip/70906-meta-unique-index
entrouvert:wip/70000-wf-edit-carddata-evolution-bis
entrouvert:wip/70898-missing-card-custom-view-redirect
entrouvert:wip/70702-api-export-import-set-categories
entrouvert:wip/69375-api-export-import-cards-forms-objects-dependencies
entrouvert:wip/69441-api-export-import-wscall-dependencies
entrouvert:wip/62800-formdata-snapshot-bis
entrouvert:wip/70853-remove-static-pages-support
entrouvert:wip/70606-api-export-import-redirect-url
entrouvert:wip/70685-parallel-cron
entrouvert:wip/70587-dedup-sms
entrouvert:wip/70575-add-field-types-to-deprecation-page
entrouvert:wip/69546-redirect-form-to-url-with-category-bis
entrouvert:wip/69546-redirect-form-to-url-with-category
entrouvert:wip/test-formdata-snapshot-show-diffs
entrouvert:wip/67283-L-affectation-d-un-id-inconnu-a-
entrouvert:hotfix/v8.17
entrouvert:wip/xxxxx-responses-as-mock-library
entrouvert:wip/68413-sql-simplify-fields-used-items
entrouvert:wip/68324-custom_view-2
entrouvert:wip/27991-rich-hints
entrouvert:hotfix/v8.4
entrouvert:wip/64499-computed-field-only-cards
entrouvert:wip/67843-itemsfield-with-none-prefill
entrouvert:wip/clean-more-pickle-code
entrouvert:wip/59052-prefill-items
entrouvert:wip/xxxxx-flex-backoffice
entrouvert:wip/xxxxx-api-perfs
entrouvert:hotfix/v7.93
entrouvert:wip/65104-texte-riche-pour-le-message-d-er
entrouvert:wip/xxxxx-transient-data-table
entrouvert:hotfix/v7.87
entrouvert:wip/api-prefetch-users-and-roles
entrouvert:wip/sql-get-listing-item-ids
entrouvert:wip/check-test-admin-pages-sql-mode
entrouvert:wip/64768-fix-dynamic-internal-id-filter
entrouvert:wip/64260-disable-table-fields
entrouvert:misc/id-matching
entrouvert:wip/62760-block-remove-label
entrouvert:wip/62919-block-remove-row
entrouvert:wip/56640-add-informative-pages-into-summary
entrouvert:wip/63038-extend-error-messages-with-examples
entrouvert:wip/62750-a11y-all
entrouvert:hotfix/v7.46
entrouvert:wip/62344-clean-snapshot-models-check-usage
entrouvert:hotfix/v7.42
entrouvert:wip/61728-computed-and-field-position
entrouvert:wip60469-index-gin-for-arrays
entrouvert:wip/60611-fix-computed-field-with-lazylist
entrouvert:wip/58884-agendas-datasource
entrouvert:wip/58208-formulaire-un-autosave-peut-se-t
entrouvert:wip/60025-wscall-allow-empty-parameter-values
entrouvert:wip/59914-do-not-trace-skipped-jumps
entrouvert:wip/xxxxx-do-no-reload-empty-evolution
entrouvert:wip/59683-fix-test
entrouvert:wip/try-to-fix-test
entrouvert:hotfix/v7.17
entrouvert:wip/58632-allow-empty-values-on-create-formdata
entrouvert:wip/43614-move-post-formdata-to-advanced-wscall-options
entrouvert:wip/56802-remove-display-exception-settings
entrouvert:wip/57066-filter-by-on-list-of-dicts
entrouvert:wip/pin-pylint
entrouvert:wip/56205-La-recherche-sur-un-champ-date-e
entrouvert:wip/55494-card-summary-status
entrouvert:wip/pylint-too-many-xxx
entrouvert:hotfix/v6.66
entrouvert:wip/users-in-functions
entrouvert:hotfix/v6.62
entrouvert:hotfix/v6.54
entrouvert:wip/get-roles-translation-refactor-to-list
entrouvert:wip/tests-close-files
entrouvert:hotfix/v6.33
entrouvert:wip/pylint-no-init-hook
entrouvert:wip/pylint-more
entrouvert:hotfix/v6.27
entrouvert:hotfix/v6.18
entrouvert:hotfix/v6.7
entrouvert:wip/jenkins-check-black
entrouvert:hotfix/v5.96
entrouvert:wip/49538-wscall-record-errors-more-more
entrouvert:hotfix/v5.84
entrouvert:hotfix/v5.75
entrouvert:wip/48678-add-items-options-for-radio
entrouvert:hotfix/v5.70
entrouvert:hotfix/v5.51
entrouvert:wip/46617-map-data-as-dictionary
entrouvert:wip/setuptools
entrouvert:wip/admin-tests-split
entrouvert:hotfix/v5.24
entrouvert:hotfix/v5.18
entrouvert:wip/widget-list
entrouvert:wip/transfer-form-value
entrouvert:wip/readonly-validation
entrouvert:hotfix/v5.6
entrouvert:wip/43384-jump-compute-timeout-errors
entrouvert:wip/django-22
entrouvert:hotfix/v4.56
entrouvert:wip/latest-pylint
entrouvert:hotfix/v4.46
entrouvert:wip/alternate-file-storage
entrouvert:hotfix/v4.40
entrouvert:wip/38852-Evaluation-live-des-formulaires-
entrouvert:wip/python3-part2
entrouvert:hotfix/v4.22
entrouvert:wip/36752-fc-attr-verification-bypassed
entrouvert:wip/36037-datasource-notype
entrouvert:hotfix/v4.2
entrouvert:wip/31942-wipe-exclude
entrouvert:wip/checkboxes-tpl
entrouvert:wip/django
entrouvert:wip/future
entrouvert:wip/misc-fred
entrouvert:wip/json-with-files-content
entrouvert:wip/alfortville
entrouvert:debian-squeeze
entrouvert:debian-wheezy
entrouvert:qommon-for-authentic1
entrouvert:v2012.3
No reviewers
Labels
Clear labels
No items
No Label
Milestone
Clear milestone
No items
No Milestone
Assignees
Clear assignees
No Assignees
3 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.
No due date set.
Dependencies
No dependencies set.
Reference: entrouvert/wcs#161
Reference in New Issue
No description provided.
Delete Branch "wip/74723-last-jump"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
c1dad3fac7
to69cc3c3949
69cc3c3949
tod3559cfe71
d3559cfe71
toeb67c4ab20
WIP: workflows : add an identifier to automatic and on submit jumps (#74723)to workflows : add an identifier to automatic and on submit jumps (#74723)Hésitation sur le fait qu'il faille rendre ces infos disponibles via les noms 'form_jumps' et 'form_last_jump' plutôt que 'form_workflow_data_...'.
Dans le doute j'en reste à 'form_workflow_data_...'.
Avant de continuer ici il va falloir décider de la possibilité, ou pas, d'identifiants identiques, et si on les accepte du comportement à adopter. (#74132)
@ -3049,0 +3064,4 @@
jumps = formdata.workflow_data.get('jumps', [])
if self.identifier:
jumps.append(self.identifier)
formdata.update_workflow_data({'jumps': jumps, 'last_jump': self.identifier})
Ça ne conserve pas le statut dans lequel est le saut, ça ne permet ainsi pas de distinguer deux sauts qui auraient le même identifiant et seraient dans des statuts différents. C'est volontaire ?
Il me semble que ça rendrait la chose plus difficile à l'usage voir inutilisable en condition Django. Ici jumps est une bête liste de chaîne donc on peut faire comme indiqué dans le ticket
si ça devient une liste de tuple
je ne vois pas trop comment l'utiliser simplement dans une condition et si on form_workflow_jumps ne reflète que le deuxième élément du tuple, alors autant ne pas le garder c'est une information de toute façon visible dans l'historique de la demande.
@ -3049,0 +3065,4 @@
if self.identifier:
jumps.append(self.identifier)
formdata.update_workflow_data({'jumps': jumps, 'last_jump': self.identifier})
Aussi, si le dernier n'a pas d'identifiant, ne devrait-on pas remettre last_jump à None tout de même ? Pour que ça reste vraiment l'identifiant du dernier saut, et pas l'identifiant du dernier saut nommé.
Tenu compte, j'ai mis 'undefined'.
Remarque plus générale: il me semblait qu'on essayait de déprécier l'usage de formdata.workflow_data (j'exagère peut-être ce mouvement), autant pour un autre ticket sur les marqueurs qui l'utilisent de toute façon déjà ce n'est pas gênant, mais là vu que c'est un nouvel usage est-ce qu'on ne devrait pas passer par une EvolutionPart (c'est tout de suite plus chiant que de taper 2 trucs dans un dico, je sais).
eb67c4ab20
to301d1f18b0
301d1f18b0
toe37714196a
e37714196a
to3fa6f36ec0
En supposant l'unicité des identifiants, via #74132.
Pour la dépréciation de workflow_data, je veux bien une confirmation et surtout qu'on me pointe un exemple de la méthode alternative.
Oui, tu peux voir la méthode actuelle via LazyFormDataEmailsBase/EmailEvolutionPart pour les mails envoyés, ou LazyFormDataWorkflowForms/WorkflowFormEvolutionPart pour les formulaires de workflow.
3fa6f36ec0
tof906d97b94
f906d97b94
toc9b1abad55
c9b1abad55
to6acaf757cd
6acaf757cd
to291bbebc3b
291bbebc3b
to438f813140
438f813140
to081dfb344c
081dfb344c
to1474049e08
1474049e08
to6f16eaba83
Voilà avec la gestion via des Part, pas de tout repos.
@ -167,12 +167,14 @@ def test_trigger_jumps(pub):
formdata.id = 1
formdata.data = {'0': 'Alice', '1': 'alice@example.net'}
formdata.status = 'wf-%s' % st1.id
formdata.just_created()
Sinon le tests crash sur add_jump_part qui ne trouve pas d'évolution.
L'absence d'evolution me parait être une situation artificielle du test, d'où l'ajout du just_created.
@ -807,3 +807,3 @@
and self.evolution[-1].status == status
and not self.evolution[-1].comment
and not [x for x in self.evolution[-1].parts or [] if not isinstance(x, ContentSnapshotPart)]
and not [
Pour préserver le non ajout d'une nouvelle evolution lors d'un saut sur le même statut (test_form_worklow_multiple_identical_status).
@ -116,6 +114,7 @@ class ChoiceWorkflowStatusItem(WorkflowStatusJumpItem):
formdata.record_workflow_event('button', action_item_id=self.id)
evo.status = 'wf-%s' % wf_status[0].id
self.handle_markers_stack(formdata)
self.add_jump_part(formdata, evo)
On passe l'evolution qui vient d'être créée sinon pas de persistance de la JumpEvolutionPart (voir plus bas).
@ -253,2 +254,4 @@
self.handle_markers_stack(formdata)
self.add_jump_part(formdata)
formdata.status = 'wf-%s' % wf_status[0].id
formdata.store()
Sans le formdata.store, pas de persistance de JumpEvolutionPart.
Ça se joue dans formdata.store, dont le fonctionnement me semble suspect sur les evolution :
1/ si une evolution n'a pas d'attribut _sql_id, elle (et éventuellement les suivantes) sont sotckées dans la DB), pas de mise jour en DB pour les evolution qui ont déjà _sql_id
2/ si toutes les evolutions ont un _sql_id elles sont toutes mise à jour
Je raconte n'importe quoi dans 2/, si toutes les evolution on un _sql_id, ça met juste à jour la dernière.
@ -3153,0 +3169,4 @@
def add_jump_part(self, formdata, evo=None):
if evo is None:
evo = formdata.evolution[-1]
evo.add_part(JumpEvolutionPart(self.identifier or 'undefined'))
Désolé cette PR était un peu oubliée; ici s'il n'y a pas d'identifiant, je serais pour ne pas ajouter la Part.
Ça casserait le fonctionnement de latest_jump, dont la description dans le ticket est "donne l'identifiant d'un saut uniquement si la demande est dans un statut qui vient d'être atteint par ce saut".
Si je n'enregistre rien lors des sauts qui n'ont pas d'identifiants, je ne sais comment sortir l'information comme quoi tel ou tel est saut est le dernier saut à avoir été effectué.
C'est un peu dommage de charger l'historique de toutes les demandes pour quelque chose qui ne sera pas tant utilisé :/
Alors au moins enregistrer l'identifiant comme étant None, plutôt qu'une chaine particulière ?
Fait ainsi.
6f16eaba83
tofad22d4195
fad22d4195
toa64592c57d
(cf commentaire)
a64592c57d
todce0a5ebc6
dce0a5ebc6
tobc078bb906