workflows: allow create formdata & related actions to set a subfield (#77522) #892
Loading…
Reference in New Issue
No description provided.
Delete Branch "wip/77522-create-formdata-set-block-subfield"
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?
81e24d4dd0
to4637c68b1d
4637c68b1d
toe8028866f8
@ -1134,6 +1136,121 @@ def test_edit_carddata_invalid_file_field(pub):
assert carddata.data == {'0': 'new value', '4': None}
def test_edit_carddata_partial_block_field(pub, admin_user):
Le code s'applique aux actions de création de demandes/fiches, et à la modification de fiche, je pars sur un test de modification de fiche parce que c'était le plus facile à mettre en place.
@ -1137,0 +1227,4 @@
assert carddata.data == {
'0': 'new value',
'1': {
'data': [{'123': 'new subfield value', '234': None}, {'123': 'new subfield value', '234': None}],
Contrairement à ce que j'écris dans le ticket, en cas de plusieurs lignes, j'applique la modification sur toutes les lignes, ça me semble au final plus logique.
@ -294,2 +294,4 @@
elif value and not (isinstance(value, dict) and 'data' in value and 'schema' in value):
raise SetValueError(_('invalid value for block (field id: %s)') % self.id)
elif value:
value = copy.deepcopy(value)
Dans une action de création de demande, avec d'abord une affectation de tout le bloc, puis d'un de ses champs, le dictionnaire avec les données du bloc était partagé et à l'enregistrement du formdata d'origine, sa valeur était modifiée.
(ce cas n'apparait pas sur le cas de test, oui clairement ça indique que je devrais écrire un test en plus)
J'ai maintenant ajouté test_create_carddata_partial_block_field pour vérifier ça.
@ -79,0 +78,4 @@
for field in formdef.get_widget_fields():
options.append((field.id, field.label, str(field.id)))
if field.key == 'block':
for subfield in field.block.get_widget_fields():
La structure avec la double boucle se répète plusieurs fois dans le fichier, dans différentes variantes selon ce qui veut être construit (ici une liste, ailleurs un dictionnaire pointant les champs, encore ailleurs un dictionnaire pointant une position), j'ai trouvé qu'au final ça restait plus lisible de répéter un peu.
@ -120,0 +128,4 @@
ranks = {}
i = 0
for field in self.to_formdef.get_widget_fields():
ranks[str(field.id)] = i
Voilà le cas où on crée un dictionnaire avec une position.
@ -542,0 +557,4 @@
self.cached_field_labels = {}
for field in self.formdef.get_widget_fields():
if field.id in mapped_field_ids:
self.cached_field_labels[field.id] = field.label
Et voilà le cas où on crée un dictionnaire de l'id au libellé, pour certains champs uniquement.
@ -784,0 +808,4 @@
for field in self.formdef.get_widget_fields():
if field.key == 'block':
for subfield in field.block.get_widget_fields():
to_id_fields[f'{field.id}${subfield.id}'] = subfield
Et ici un dictionnaire de l'id au champ, pour tous les champs.
@ -834,0 +868,4 @@
if not formdata.data.get(parent_block_field.id):
formdata.data[parent_block_field.id] = BlockRowValue().make_value(
block=parent_block_field.block, field=parent_block_field, data={}
)
BlockRowValue().make_value(...) va créer un dictionnaire {'data': [{}], 'schema': ...} dans lequel la nouvelle valeur pourra s'insérer.
@ -834,0 +871,4 @@
)
for sub_data in formdata.data[parent_block_field.id]['data']:
field.set_value(sub_data, value)
formdata.data[f'{parent_block_field.id}_display'] = parent_block_field.store_display_value(
Après avoir modifié la valeur c'est important d'enregistre le nouveau rendu "_display".
WIP: workflows: allow create formdata & related actions to set a subfield (#77522)to workflows: allow create formdata & related actions to set a subfield (#77522)e8028866f8
to44135e73d2