Projet

Général

Profil

Bug #73411

soap: activer api_error=True sur Parsifal

Ajouté par Nicolas Roche il y a plus d'un an. Mis à jour il y a environ un an.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
13 janvier 2023
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

Dans les traces (rien trouvé encore sur Jenkins)

From: FAMILLE & ACTIVITES DE LOISIRS <ne-pas-repondre+parsifal.test.entrouvert.org@entrouvert.com>
To: admin+recette@entrouvert.com
Subject: FAMILLE & ACTIVITES DE LOISIRS : [ERROR] [DATASOURCE] Error reading JSON data source output (err_desc
        Unknown fault occured, err_class passerelle.utils.jsonresponse.APIError, err
        Site-readSchoolForAdressAndLevel-None)

## FAMILLE & ACTIVITES DE LOISIRS ##

Stack trace (most recent call first):
  File "/usr/lib/python3/dist-packages/wcs/data_sources.py", line 298, in get_json_from_url
    get_publisher().record_error(
  File "/usr/lib/python3/dist-packages/wcs/data_sources.py", line 311, in request_json_items
    entries = get_json_from_url(url, data_source, cache_duration=cache_duration)
  File "/usr/lib/python3/dist-packages/wcs/data_sources.py", line 530, in _get_structured_items
    items = request_json_items(url, data_source, cache_duration=cache_duration)
  File "/usr/lib/python3/dist-packages/wcs/data_sources.py", line 371, in get_structured_items
    items = _get_structured_items(data_source, mode=mode, raise_on_error=raise_on_error)
  File "/usr/lib/python3/dist-packages/wcs/data_sources.py", line 224, in get_items
    structured_items = get_structured_items(data_source, mode=mode, include_disabled=include_disabled)
  File "/usr/lib/python3/dist-packages/wcs/fields.py", line 2274, in perform_more_widget_changes
    items = data_sources.get_items(self.data_source, include_disabled=self.display_disabled_items)
  File "/usr/lib/python3/dist-packages/wcs/fields.py", line 887, in add_to_form
    self.perform_more_widget_changes(form, kwargs)
  File "/usr/lib/python3/dist-packages/wcs/formdef.py", line 834, in add_fields_to_form
    widget = field.add_to_form(form, value)
  File "/usr/lib/python3/dist-packages/wcs/formdef.py", line 780, in create_form
    self.add_fields_to_form(
  File "/usr/lib/python3/dist-packages/wcs/forms/root.py", line 893, in create_form
    form = self.formdef.create_form(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/wcs/forms/root.py", line 563, in page
    form = self.create_form(page, displayed_fields, transient_formdata=transient_formdata)
  File "/usr/lib/python3/dist-packages/wcs/forms/root.py", line 1435, in previous_page
    return self.page(previous_page, page_change=True)
  File "/usr/lib/python3/dist-packages/wcs/forms/root.py", line 1165, in _q_index
    return self.previous_page(page_no, magictoken)
  File "/usr/lib/python3/dist-packages/quixote/directory.py", line 92, in _q_traverse
    return obj()
  File "/usr/lib/python3/dist-packages/quixote/directory.py", line 88, in _q_traverse
    return obj._q_traverse(path)
  File "/usr/lib/python3/dist-packages/quixote/directory.py", line 116, in _q_traverse
    return super(AccessControlled, self)._q_traverse(path)
  File "/usr/lib/python3/dist-packages/quixote/directory.py", line 88, in _q_traverse
    return obj._q_traverse(path)
  File "/usr/lib/python3/dist-packages/wcs/root.py", line 307, in _q_traverse
    return Directory._q_traverse(self, path)
  File "/usr/lib/python3/dist-packages/quixote/publish.py", line 241, in try_publish
    output = self.root_directory._q_traverse(components)
  File "/usr/lib/python3/dist-packages/wcs/compat.py", line 214, in process_request
    output = self.try_publish(request)
  File "/usr/lib/python3/dist-packages/wcs/compat.py", line 262, in quixote
    return pub.process_request(pub.get_request())
  File "/usr/lib/python3/dist-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/usr/lib/python3/dist-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/usr/lib/python3/dist-packages/django/utils/deprecation.py", line 94, in __call__
    response = response or self.get_response(request)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/middleware.py", line 92, in
+sentry_wrapped_method
    return old_method(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/middleware.py", line 131, in __call__
    return f(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/usr/lib/python3/dist-packages/django/utils/deprecation.py", line 94, in __call__
    response = response or self.get_response(request)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/middleware.py", line 92, in
+sentry_wrapped_method
    return old_method(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/middleware.py", line 131, in __call__
    return f(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/usr/lib/python3/dist-packages/wcs/middleware.py", line 155, in process_request
    return self.get_response(request)
  File "/usr/lib/python3/dist-packages/django/utils/deprecation.py", line 93, in __call__
    response = self.process_request(request)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/middleware.py", line 92, in
+sentry_wrapped_method
    return old_method(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/middleware.py", line 131, in __call__
    return f(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/usr/lib/python3/dist-packages/django/utils/deprecation.py", line 94, in __call__
    response = response or self.get_response(request)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/middleware.py", line 92, in
+sentry_wrapped_method
    return old_method(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/middleware.py", line 131, in __call__
    return f(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/usr/lib/python3/dist-packages/django/utils/deprecation.py", line 94, in __call__
    response = response or self.get_response(request)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/middleware.py", line 92, in
+sentry_wrapped_method
    return old_method(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/middleware.py", line 131, in __call__
    return f(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/usr/lib/python3/dist-packages/django/utils/deprecation.py", line 94, in __call__
    response = response or self.get_response(request)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/middleware.py", line 92, in
+sentry_wrapped_method
    return old_method(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/middleware.py", line 131, in __call__
    return f(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/usr/lib/python3/dist-packages/django/utils/deprecation.py", line 94, in __call__
    response = response or self.get_response(request)
  File "/usr/lib/python3/dist-packages/hobo/middleware/common.py", line 10, in __call__
    return super().__call__(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/middleware.py", line 92, in
+sentry_wrapped_method
    return old_method(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/middleware.py", line 131, in __call__
    return f(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/usr/lib/python3/dist-packages/hobo/middleware/maintenance.py", line 55, in __call__
    return self.get_response(request)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/middleware.py", line 92, in
+sentry_wrapped_method
    return old_method(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/middleware.py", line 131, in __call__
    return f(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/django/core/handlers/exception.py", line 34, in inner
   response = get_response(request)
  File "/usr/lib/python3/dist-packages/django/utils/deprecation.py", line 94, in __call__
    response = response or self.get_response(request)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/middleware.py", line 92, in
+sentry_wrapped_method
    return old_method(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/middleware.py", line 131, in __call__
    return f(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/usr/lib/python3/dist-packages/django/utils/deprecation.py", line 94, in __call__
    response = response or self.get_response(request)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/middleware.py", line 92, in
+sentry_wrapped_method
    return old_method(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/middleware.py", line 131, in __call__
    return f(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/usr/lib/python3/dist-packages/django/utils/deprecation.py", line 94, in __call__
    response = response or self.get_response(request)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/middleware.py", line 92, in
+sentry_wrapped_method
    return old_method(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/middleware.py", line 131, in __call__
    return f(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/usr/lib/python3/dist-packages/django/utils/deprecation.py", line 94, in __call__
    response = response or self.get_response(request)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/middleware.py", line 92, in
+sentry_wrapped_method
    return old_method(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/middleware.py", line 131, in __call__
    return f(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/usr/lib/python3/dist-packages/django/utils/deprecation.py", line 94, in __call__
    response = response or self.get_response(request)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/middleware.py", line 92, in
+sentry_wrapped_method
    return old_method(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/middleware.py", line 131, in __call__
    return f(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/usr/lib/python3/dist-packages/django/utils/deprecation.py", line 94, in __call__
    response = response or self.get_response(request)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/middleware.py", line 92, in
+sentry_wrapped_method
    return old_method(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/middleware.py", line 131, in __call__
    return f(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/usr/lib/python3/dist-packages/django/utils/deprecation.py", line 94, in __call__
    response = response or self.get_response(request)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/middleware.py", line 92, in
+sentry_wrapped_method
    return old_method(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/middleware.py", line 131, in __call__
    return f(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/usr/lib/python3/dist-packages/django/utils/deprecation.py", line 94, in __call__
    response = response or self.get_response(request)
 File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/middleware.py", line 92, in
+sentry_wrapped_method
    return old_method(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/middleware.py", line 131, in __call__
    return f(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/usr/lib/python3/dist-packages/django/core/handlers/base.py", line 75, in get_response
    response = self._middleware_chain(request)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/__init__.py", line 140, in
+sentry_patched_get_response
    return old_get_response(self, request)
  File "/usr/lib/python3/dist-packages/django/core/handlers/wsgi.py", line 141, in __call__
    response = self.get_response(request)
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/wsgi.py", line 113, in __call__
    rv = self.app(
  File "/usr/lib/python3/dist-packages/sentry_sdk/integrations/django/__init__.py", line 108, in
+sentry_patched_wsgi_handler
    return SentryWsgiMiddleware(bound_old_app)(environ, start_response)

Form:
_ajax_form_token 'XIzFYTlZcDp-M3OSLnkfBw'
f00             ''
f501$element0$fbf38b483e0-39ae-4657-a858-e74120dd2f2a$file ''
f501$element0$fbf38b483e0-39ae-4657-a858-e74120dd2f2a$token ''
f502$element0$fbf38b483e0-39ae-4657-a858-e74120dd2f2a$file ''
f502$element0$fbf38b483e0-39ae-4657-a858-e74120dd2f2a$token ''
f546            ''
f548            '07DERO-1'
f551$element0$fbfb2a4f64b-2d5a-4b5d-a039-848a2519ab20 '2435'
f551$element1$fbfb2a4f64b-2d5a-4b5d-a039-848a2519ab20 '2435'
magictoken      'zdZ_1qH6RE0'
page            '5'
page_id         '416'
previous        'Précédent'
step            '0'

Cookies:
a2-opened-session-59150e '98d570f7cbd54afbab6e48a2d7e77956'
sessionid-wcs-bad34e 'XakyQljGdz_vEhPOHyIHog'

Environment:
CONTENT_LENGTH  '2224'
CONTENT_TYPE    'multipart/form-data; boundary=---------------------------182828711325786232522680271468'
HTTP_ACCEPT     'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8'
HTTP_ACCEPT_ENCODING 'gzip, deflate, br'
HTTP_ACCEPT_LANGUAGE 'fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3'
HTTP_CONNECTION 'close'
HTTP_COOKIE     'a2-opened-session-59150e=98d570f7cbd54afbab6e48a2d7e77956;
+sessionid-wcs-bad34e=XakyQljGdz_vEhPOHyIHog'
HTTP_DNT        '1'
HTTP_HOST       'demarches-parsifal.test.entrouvert.org'
HTTP_ORIGIN     'https://demarches-parsifal.test.entrouvert.org'
HTTP_REFERER    'https://demarches-parsifal.test.entrouvert.org/parsifal-en-cours/inscription-scolaire/'
HTTP_SEC_FETCH_DEST 'document'
HTTP_SEC_FETCH_MODE 'navigate'
HTTP_SEC_FETCH_SITE 'same-origin'
HTTP_SEC_FETCH_USER '?1'
HTTP_UPGRADE_INSECURE_REQUESTS '1'
HTTP_USER_AGENT 'Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0'
HTTP_X_FORWARDED_FOR '78.193.132.195, 78.193.132.195'
HTTP_X_FORWARDED_PROTO 'https'
HTTP_X_FORWARDED_PROTOCOL 'ssl'
HTTP_X_FORWARDED_SSL 'on'
HTTP_X_PUBLIK_CLUSTER_BACKEND 'wcs-balancer'
HTTP_X_REAL_IP  '78.193.132.195'
PATH_INFO       '/parsifal-en-cours/inscription-scolaire/'
QUERY_STRING    ''
REMOTE_ADDR     '78.193.132.195'
REMOTE_USER     '159'
REQUEST_METHOD  'POST'
REQUEST_URI     '/parsifal-en-cours/inscription-scolaire/'
SCRIPT_NAME     ''
SERVER_NAME     'wcs'
SERVER_PORT     '9920'
SERVER_PROTOCOL 'HTTP/1.0'
uwsgi.node      b'wcs'
uwsgi.version   b'2.0.19.1-debian'
wsgi.errors     <_io.TextIOWrapper name=2 mode='w' encoding='UTF-8'>
wsgi.file_wrapper <built-in function uwsgi_sendfile>
wsgi.input      <uwsgi._Input object at 0x7f66cdc32cb0>
wsgi.multiprocess True
wsgi.multithread False
wsgi.run_once   False
wsgi.url_scheme 'https'
wsgi.version    (1, 0)

Reproductible en cliquant sur la définition de la source de donnée :
https://passerelle-parsifal.test.entrouvert.org/toulouse-maelis/test/read-schools-for-address-and-level?year=&id_street=&num=

{
   "data" : null,
   "err" : "Site-readSchoolForAdressAndLevel-soap:Server",
   "err_class" : "passerelle.utils.jsonresponse.APIError",
   "err_desc" : "E19 : La voie est obligatoire" 
}


Fichiers


Demandes liées

Lié à Passerelle - Development #65763: soap: activer api_error=True sur tous les utilisateurs de soap_client()Nouveau30 mai 2022

Actions
Lié à Passerelle - Bug #73567: toulouse-maelis: mise à jour des tests fonctionnelsFermé18 janvier 2023

Actions

Révisions associées

Révision d1a4921e (diff)
Ajouté par Nicolas Roche il y a plus d'un an

toulouse-maelis: reproduce wcs trace on SoapError (#73411)

Révision 47e0b644 (diff)
Ajouté par Nicolas Roche il y a plus d'un an

toulouse-maelis: add wrapping of zeep errors inside APIError (#73411)

Révision 93290763 (diff)
Ajouté par Nicolas Roche il y a plus d'un an

toulouse-maelis: manage XML soap fault detail content (#73411)

Révision 250100fb (diff)
Ajouté par Nicolas Roche il y a plus d'un an

Revert "toulouse-maelis: manage XML soap fault detail content (#73411)"

This reverts commit 932907630bf8d57cc2b6edfdeaf0c9ee19fac6ce.

Révision 9cd40592 (diff)
Ajouté par Nicolas Roche il y a plus d'un an

Revert "toulouse-maelis: add wrapping of zeep errors inside APIError (#73411)"

This reverts commit 47e0b644a55fb458178e92a0b3333917b7bfd8d6.

Révision 6bb7231a (diff)
Ajouté par Nicolas Roche il y a plus d'un an

Revert "toulouse-maelis: reproduce wcs trace on SoapError (#73411)"

This reverts commit d1a4921ea7f1a09d2ccfe7d4c99be721dc92ce00.

Révision e012e85a (diff)
Ajouté par Nicolas Roche il y a environ un an

toulouse-maelis: add wrapping of zeep errors inside APIError (#73411)

Révision 1d86c0ac (diff)
Ajouté par Nicolas Roche il y a environ un an

toulouse-maelis: update soap error in functests (#73411)

Historique

#1

Mis à jour par Nicolas Roche il y a plus d'un an

En local, je déduis que c'est la SOAPError qui n'est pas interceptée

POST https://demo-toulouse.sigec.fr/maelisws-toulouse-recette/services/SiteService (=> 500)

#2

Mis à jour par Nicolas Roche il y a plus d'un an

  • Lié à Development #65763: soap: activer api_error=True sur tous les utilisateurs de soap_client() ajouté
#3

Mis à jour par Nicolas Roche il y a plus d'un an

0001: J'ai isolé l'erreur.

La correction est donnée dans https://dev.entrouvert.org/issues/65763
Je ne l'ai d'abord pas compris, ce qui a donné suite à beaucoup de tickets pour valider les paramètres issus des référentiels, dont on aurait pu se passer, mais qui a quand même permis de clarifier certains messages d'erreurs).
En l'activant (0002), on fait crasher l'encodeur json sur du contenu XML qui apparaît dans un champ "detail" de l'exception.

Ce que répare 0003, en prenant en compte le nouveau champ "detail".

#4

Mis à jour par Robot Gitea il y a plus d'un an

  • Statut changé de Solution proposée à En cours

Nicolas Roche (nroche) a lié une pull request sur Gitea concernant cette demande :

#5

Mis à jour par Benjamin Dauvergne il y a plus d'un an

  • Statut changé de En cours à Solution proposée
#6

Mis à jour par Robot Gitea il y a plus d'un an

Nicolas Roche (nroche) a ouvert une pull request sur Gitea concernant cette demande :

#7

Mis à jour par Nicolas Roche il y a plus d'un an

  • Lié à Bug #73567: toulouse-maelis: mise à jour des tests fonctionnels ajouté
#8

Mis à jour par Nicolas Roche il y a plus d'un an

Je ne comprends pas pourquoi la PR 45 est arrivée ici (en plus que dans #73567).
Peut-être parce que j'ai fait référence à ce ticket dans le message de la PR ?

#9

Mis à jour par Benjamin Dauvergne il y a plus d'un an

La PR 45 est référencée parce que tu références ce ticket dans un commentaire. Je préférerais que tu revert et qu'on corrige cette histoire de dict modifié.

#10

Mis à jour par Robot Gitea il y a plus d'un an

  • Statut changé de Solution proposée à Solution validée

Benjamin Dauvergne (bdauvergne) a approuvé une pull request sur Gitea concernant cette demande :

#11

Mis à jour par Benjamin Dauvergne il y a plus d'un an

  • Statut changé de Solution validée à Solution proposée
#12

Mis à jour par Nicolas Roche il y a plus d'un an

  • Statut changé de Solution proposée à En cours

3 premier patchs poussés par erreur et revertés :

commit 6bb7231a7f363ef16c5c0923982dea5a3484f073 (HEAD -> main)
Author: Nicolas ROCHE <nroche@entrouvert.com>
Date:   Wed Jan 18 17:45:29 2023 +0100

    Revert "toulouse-maelis: reproduce wcs trace on SoapError (#73411)" 

    This reverts commit d1a4921ea7f1a09d2ccfe7d4c99be721dc92ce00.

commit 9cd4059284f15f40728c562cda4093f55295b752
Author: Nicolas ROCHE <nroche@entrouvert.com>
Date:   Wed Jan 18 17:45:19 2023 +0100

    Revert "toulouse-maelis: add wrapping of zeep errors inside APIError (#73411)" 

    This reverts commit 47e0b644a55fb458178e92a0b3333917b7bfd8d6.

commit 250100fb83fae42eb47769a0758de39582eb909e
Author: Nicolas ROCHE <nroche@entrouvert.com>
Date:   Wed Jan 18 17:44:52 2023 +0100

    Revert "toulouse-maelis: manage XML soap fault detail content (#73411)" 

    This reverts commit 932907630bf8d57cc2b6edfdeaf0c9ee19fac6ce.
#13

Mis à jour par Nicolas Roche il y a environ un an

  • Statut changé de En cours à Solution proposée
#14

Mis à jour par Benjamin Dauvergne il y a environ un an

Il faudrait refaire une PR (en rebasant la branche) là elle n'est plus lisible.

#15

Mis à jour par Robot Gitea il y a environ un an

Nicolas Roche (nroche) a ouvert une pull request sur Gitea concernant cette demande :

#16

Mis à jour par Robot Gitea il y a environ un an

  • Statut changé de Solution proposée à Solution validée

Serghei Mihai (smihai) a approuvé une pull request sur Gitea concernant cette demande :

#17

Mis à jour par Robot Gitea il y a environ un an

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

Nicolas Roche (nroche) a mergé une pull request sur Gitea concernant cette demande :

#18

Mis à jour par Transition automatique il y a environ un an

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

Mis à jour par Transition automatique il y a environ un an

Automatic expiration

Formats disponibles : Atom PDF