workflows: allow create formdata & related actions to set a subfield (#77522) #892

Merged
fpeters merged 1 commits from wip/77522-create-formdata-set-block-subfield into main 2023-12-18 13:19:55 +01:00
Owner
No description provided.
fpeters force-pushed wip/77522-create-formdata-set-block-subfield from 81e24d4dd0 to 4637c68b1d 2023-12-05 16:11:23 +01:00 Compare
fpeters force-pushed wip/77522-create-formdata-set-block-subfield from 4637c68b1d to e8028866f8 2023-12-05 16:48:18 +01:00 Compare
fpeters reviewed 2023-12-05 18:23:03 +01:00
@ -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):
Author
Owner

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.

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}],
Author
Owner

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.

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)
Author
Owner

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)

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)
Author
Owner

J'ai maintenant ajouté test_create_carddata_partial_block_field pour vérifier ça.

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():
Author
Owner

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.

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
Author
Owner

Voilà le cas où on crée un dictionnaire avec une position.

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
Author
Owner

Et voilà le cas où on crée un dictionnaire de l'id au libellé, pour certains champs uniquement.

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
Author
Owner

Et ici un dictionnaire de l'id au champ, pour tous les champs.

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={}
)
Author
Owner

BlockRowValue().make_value(...) va créer un dictionnaire {'data': [{}], 'schema': ...} dans lequel la nouvelle valeur pourra s'insérer.

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(
Author
Owner

Après avoir modifié la valeur c'est important d'enregistre le nouveau rendu "_display".

Après avoir modifié la valeur c'est important d'enregistre le nouveau rendu "_display".
fpeters changed title from WIP: workflows: allow create formdata & related actions to set a subfield (#77522) to workflows: allow create formdata & related actions to set a subfield (#77522) 2023-12-05 18:23:10 +01:00
fpeters force-pushed wip/77522-create-formdata-set-block-subfield from e8028866f8 to 44135e73d2 2023-12-06 12:12:53 +01:00 Compare
lguerin approved these changes 2023-12-18 09:42:47 +01:00
fpeters merged commit 467b20b031 into main 2023-12-18 13:19:55 +01:00
fpeters deleted branch wip/77522-create-formdata-set-block-subfield 2023-12-18 13:19:55 +01:00
Sign in to join this conversation.
No reviewers
No Label
No Milestone
No Assignees
2 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#892
No description provided.