Projet

Général

Profil

Bug #15537

demandes multiples d'un usager: trop d'appel webservice lors de l'affichafge de l'une d'elle

Ajouté par Thomas Noël il y a environ 7 ans. Mis à jour il y a plus de 5 ans.

Statut:
Fermé
Priorité:
Haut
Assigné à:
Version cible:
-
Début:
21 mars 2017
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

Situation:
  • une statut avec une action "afficher un formulaire"
  • dans ce formulaire, un champ liste avec un datasource qui appelle un webservice

Une demande est dans ce statut. Quand on l'affiche, le datasource est calculé deux fois = deux appels webservices.
Deux demande dans ce statut, liées au même utilisateur : quand on affiche l'une d'entre elle, trois appels au webservices.

En fait, pour chaque demande du même usager qui s'affiche dans la colonne de droite, si son statut est "avec un datasource" alors il est appelé.


Fichiers

Révisions associées

Révision 966015f8 (diff)
Ajouté par Thomas Noël il y a environ 7 ans

backoffice: optimize locking of related user formdata (#15537)

Use actions_roles instead of get_workflow_form, because
get_workflow_form could contain a workflow form, which could use
data_sources, which could call webservices.

Historique

#1

Mis à jour par Thomas Noël il y a environ 7 ans

Les appels en trop disparaissent si on fait ça (c'est pas un patch, juste une piste à suivre) :

--- a/wcs/backoffice/management.py
+++ b/wcs/backoffice/management.py
@@ -1975,7 +1975,7 @@ class FormBackOfficeStatusPage(FormStatusPage):
                         ]
             from wcs import sql
             formdatas = sql.AnyFormData.select(criterias, order_by='receipt_time')
-            self.filled.related_user_forms = formdatas
+            self.filled.related_user_forms = [] # formdatas

#2

Mis à jour par Thomas Noël il y a environ 7 ans

Parce que ensuite, on fait ceci dans wcs/forms/common.py :

615                 related_user_forms = getattr(self.filled, 'related_user_forms', None) or []
616                 for user_formdata in related_user_forms:
617                     other_form = user_formdata.get_workflow_form(user)
618                     if other_form:
619                         user_formdata.mark_as_being_visited()

pour savoir si l'user a quelque chose à faire et locker la demande, cf #12895

#4

Mis à jour par Thomas Noël il y a environ 7 ans

Voilà, les tests passent très bien et ça ne me semble pas nécessaire d'en ajouter.

#5

Mis à jour par Thomas Noël il y a environ 7 ans

  • Statut changé de Nouveau à En cours
  • Assigné à mis à Thomas Noël
#6

Mis à jour par Frédéric Péters il y a environ 7 ans

Je suis gêné par la disparition du or [] qui ajoute un niveau d'indentatoin, + nouveau check sur get_request().user et .roles, a priori nécessairement là; cela ne marche pas 

--- a/wcs/forms/common.py
+++ b/wcs/forms/common.py
@@ -613,9 +613,9 @@ class FormStatusPage(Directory):
                 r += form.render()
                 self.filled.mark_as_being_visited()
                 related_user_forms = getattr(self.filled, 'related_user_forms', None) or []
+                user_roles = set(get_request().user.roles)
                 for user_formdata in related_user_forms:
-                    other_form = user_formdata.get_workflow_form(user)
-                    if other_form:
+                    if user_roles.intersection(user_formdata.actions_roles):
                         user_formdata.mark_as_being_visited()

         if not locked:

(en exécutant uniquement les tests backoffice ça sonne ok)

#7

Mis à jour par Thomas Noël il y a environ 7 ans

C'était exactement mon premier patch, j'aurai dû m'arrêter à ça :)

#8

Mis à jour par Thomas Noël il y a environ 7 ans

  • Priorité changé de Normal à Haut
#10

Mis à jour par Frédéric Péters il y a environ 7 ans

Ouaip c'est bien sûr ok pour moi vu que je proposais aussi ce patch :)

#11

Mis à jour par Thomas Noël il y a environ 7 ans

  • Statut changé de En cours à Résolu (à déployer)
commit 966015f83092a3338b9d92ba66a9012f14476c22
Author: Thomas NOEL <tnoel@entrouvert.com>
Date:   Tue Mar 21 19:50:29 2017 +0100

    backoffice: optimize locking of related user formdata (#15537)

    Use actions_roles instead of get_workflow_form, because
    get_workflow_form could contain a workflow form, which could use
    data_sources, which could call webservices.

#12

Mis à jour par Frédéric Péters il y a plus de 5 ans

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF