Mise en production : le tableau de bord répond de nouveau (#267) #273

Merged
marvin merged 2 commits from develop into main 2026-09-10 20:25:19 +00:00
Member

Correctif chaud. L'écran /graphiques est hors service en production depuis le déploiement de main du 10/09 (#271) : les quatre fenêtres rendent 500 et l'écran affiche « Aucune source n'a répondu » sur les sept sites.

Un seul changement depuis #271 : la #272, relue et approuvée par Marvin, fusionnée dans develop.

Cause float * Decimal dans _seau_imputeSEUIL_SEAU_IMPUTE est un float, sum(releves_pris_en_compte) rend un Decimal
Portée les 4 fenêtres (3 h, 24 h, 7 j, 30 j), tous les sites, /parc/mesures compris
Correctif conversion des deux comptes avant comparaison
Chaîne verte sur la #272 (6 jobs)
Relecture approuvée par Marvin, qui a rejoué pytest tests/unit/api — 248 passed

À vérifier après déploiement : https://app.g2.enervision/graphiques trace les sept sites sur les quatre fenêtres.

Motif de l'urgence : soutenance EC02 demain 11/09 à 10h45.

Correctif chaud. **L'écran `/graphiques` est hors service en production** depuis le déploiement de `main` du 10/09 (#271) : les quatre fenêtres rendent 500 et l'écran affiche « Aucune source n'a répondu » sur les sept sites. Un seul changement depuis #271 : la #272, relue et approuvée par Marvin, fusionnée dans `develop`. | | | |---|---| | Cause | `float * Decimal` dans `_seau_impute` — `SEUIL_SEAU_IMPUTE` est un `float`, `sum(releves_pris_en_compte)` rend un `Decimal` | | Portée | les 4 fenêtres (3 h, 24 h, 7 j, 30 j), tous les sites, `/parc/mesures` compris | | Correctif | conversion des deux comptes avant comparaison | | Chaîne | verte sur la #272 (6 jobs) | | Relecture | approuvée par Marvin, qui a rejoué `pytest tests/unit/api` — 248 passed | À vérifier après déploiement : `https://app.g2.enervision/graphiques` trace les sept sites sur les quatre fenêtres. Motif de l'urgence : soutenance EC02 demain 11/09 à 10h45.
api : le seuil du seau reconstitué se calcule sur le type que la base rend (#267)
All checks were successful
Intégration / Contrôles statiques du dépôt (pull_request) Successful in 10s
Intégration / Terraform — format, validité et lint (pull_request) Successful in 16s
Intégration / Checkov — audit de la configuration (pull_request) Successful in 17s
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Successful in 49s
Intégration / Workflows — lint et audit de sécurité (pull_request) Successful in 18s
Intégration / Python — qualité, tests et dépendances (pull_request) Successful in 6m15s
938dd656c8
Les quatre fenêtres du tableau de bord rendaient 500 en production depuis le
déploiement de main du 10/09 : l'écran affichait « Aucune source n'a répondu »
sur les sept sites, les sept appels de courbe échouant ensemble.

    File "enervision_api/dashboard/repository.py", line 732, in _seau_impute
        return minutes_imputees >= SEUIL_SEAU_IMPUTE * minutes_retenues
    TypeError: unsupported operand type(s) for *: 'float' and 'decimal.Decimal'

Les deux comptes n'ont pas le même type. « minutes_imputees » vient d'un
count(*) filter, donc un bigint, donc un int. « minutes_retenues » vient d'un
sum(releves_pris_en_compte) : PostgreSQL élargit la somme d'un bigint en
numeric, et psycopg rend un Decimal. Or Decimal refuse d'être multiplié par un
float, et SEUIL_SEAU_IMPUTE en est un.

La garde « if not minutes_retenues or not minutes_imputees » masquait la faute
sur les seaux sans imputation. Elle n'en masquait aucun ce jour-là : les
vingt-cinq seaux de la fenêtre 24 h comme les huit de la fenêtre 7 j portaient
tous au moins une minute reconstituée.

Pourquoi la suite unitaire était verte : la fausse connexion rendait
« minutes_retenues » et « minutes_ecartees » en int nu là où la base rend un
Decimal — elle prenait pourtant soin de modéliser le numeric de « moyenne_kw ».
Le jeu d'essai est corrigé, et il suffit à faire tomber les deux cas
préexistants du #267 sur la ligne fautive. Un troisième cas nomme les deux
types explicitement, pour que la couverture ne se perde pas si quelqu'un
simplifie la fixture un jour.

Le cas d'intégration qui aurait attrapé ceci existe
(tests/integration/test_lectures_tableau_de_bord.py, la part imputée autour du
seuil) mais ne tourne pas : il est marqué skipif sans base, et la chaîne ne
lance que « pytest tests/unit ». Ce trou-là dépasse ce correctif et n'est pas
refermé ici.
Merge pull request 'api : le seuil du seau reconstitué se calcule sur le type que la base rend (#267)' (#272) from gabriel/267-seau-impute-decimal into develop
All checks were successful
Intégration / Contrôles statiques du dépôt (push) Successful in 9s
Intégration / Terraform — format, validité et lint (push) Successful in 30s
Intégration / Tableau de bord — dépendances, tests et construction (push) Successful in 46s
Intégration / Workflows — lint et audit de sécurité (push) Successful in 19s
Intégration / Checkov — audit de la configuration (push) Successful in 45s
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Successful in 46s
Intégration / Contrôles statiques du dépôt (pull_request) Successful in 9s
Intégration / Terraform — format, validité et lint (pull_request) Successful in 13s
Intégration / Checkov — audit de la configuration (pull_request) Successful in 17s
Intégration / Workflows — lint et audit de sécurité (pull_request) Successful in 17s
Intégration / Python — qualité, tests et dépendances (push) Successful in 6m31s
Intégration / Python — qualité, tests et dépendances (pull_request) Successful in 7m0s
a701582c55
Reviewed-on: https://10.105.200.41/g2/enervision/pulls/272
Reviewed-by: marvin <marvin@noreply.10.105.200.41>
gabriel requested review from marvin 2026-09-10 20:24:43 +00:00
marvin approved these changes 2026-09-10 20:25:06 +00:00
marvin merged commit e91bef4409 into main 2026-09-10 20:25:19 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
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
g2/enervision!273
No description provided.