Development #22390
Ajouter un unique_together = (('user', 'external_id'),) sur le modèle Notification
0%
Description
Il me semble que c'est ce qu'on souhaite en fait en lisant le code Notification.notify() et ça simplifierait la lecture du code à base de .first()
qu'on pourrait remplacer par un .get_or_create() classique, actuellement il reste une race condition possible.
(À noter que ça n'aura pas d'impact si external_id = NULL, deux valeurs nulles n'étant jamais égales dans Postgres).
Files
Related issues
Associated revisions
tox.ini: always set usedevelop=True (#22390)
It currently does not work without it.
tests: set a TEST database name so that pytest --reuse-db works (#22390)
notifications: improve internal API (#22390)
- (user, external_id) is now unique, no need to user .first() / .last()
- new filter .find(user, id), .visible(user), new queryset actions .ack() and .forget()
- new property notification.visible to know if a notification is shown
- when notify() is called on an existing notification, it's unacked
- notify's parameters url, body and origin now default to '', serializer
has been updated
History
Updated by Benjamin Dauvergne about 4 years ago
- File 0003-tests-set-a-TEST-database-name-so-that-pytest-reuse-.patch 0003-tests-set-a-TEST-database-name-so-that-pytest-reuse-.patch added
- File 0002-tox.ini-always-set-usedevelop-True-22390.patch 0002-tox.ini-always-set-usedevelop-True-22390.patch added
- File 0001-tox.ini-remove-pytest-capturelog-22390.patch 0001-tox.ini-remove-pytest-capturelog-22390.patch added
- File 0004-notifications-improve-internal-API-22390.patch 0004-notifications-improve-internal-API-22390.patch added
Au passage je fais un peu de nettoyage dans tox et je permet d'utiliser
--reuse-db (sinon ça recrée la db à chaque fois).
Updated by Benjamin Dauvergne about 4 years ago
Je n'ai pas touché du tout aux APIs externe (à part le serializer pour changer les valeurs par défaut, None -> ''). Mais il y aurait certainement des choses à faire, typiquement Ack devrait prendre une liste d'id parce que typiquement en cliquant sur le badge on devrait acker toutes les notifications visibles et ne pas faire n appels.
À voir si le acked=False sur un renotify est vraiment le comportement souhaité, il me semble que si.
Updated by Frédéric Péters about 4 years ago
(ceci n'est pas une relecture)
cliquant sur le badge
En l'espèce on n'a pas de clic sur le badge, les clics se font sur les notifications, individuelles.
Updated by Frédéric Péters about 4 years ago
- (user, external_id) is now unique, no need to user .first() / .last()
J'ai l'impression qu'on doit aussi inclure l'origin dans le tuple d'unicité, ou on convient de donner comme consigne aux appelants de namespacer l'external_id.
Updated by Benjamin Dauvergne about 4 years ago
Frédéric Péters a écrit :
(ceci n'est pas une relecture)
cliquant sur le badge
En l'espèce on n'a pas de clic sur le badge, les clics se font sur les notifications, individuelles.
En discutant avec Thomas il sous-entendait que c'était en cliquant sur le badge qu'un encart contenant les notifications s'ouvrait et que certainement à ce moment les notifications étaient ackés mais je ne pense pas qu'il ait déjà vu une vrai intégration lui non plus.
Est-ce que tu peux me pointer vers une intégration existante appelant les WS ack et forget dans combo je ne vois rien ?
Updated by Benjamin Dauvergne about 4 years ago
- Assignee set to Benjamin Dauvergne
Frédéric Péters a écrit :
- (user, external_id) is now unique, no need to user .first() / .last()
J'ai l'impression qu'on doit aussi inclure l'origin dans le tuple d'unicité, ou on convient de donner comme consigne aux appelants de namespacer l'external_id.
1. origin n'étant jamais nul ça me va, mais est-ce qu'on impose au niveau du WS (voir au niveau de l'API interne aussi) d'avoir forcément un origin si on a un id fourni ? Ça me paraîtrait bien mais je ne voudrai pas casser une utilisation existante.
2. est-ce qu'on imposerait d'avoir au moins un caractère non alpha-numérique dans un id fourni via le web-service ? pour éviter les collisions si jamais un client voulait envoyer un entier et que par hasard ça matchait une autre notification existante.
Updated by Frédéric Péters about 4 years ago
Est-ce que tu peux me pointer vers une intégration existante appelant les WS ack et forget dans combo je ne vois rien ?
var ack_url = $(this).data('combo-notification-ack-url'); $.ajax({ url: ack_url, success: function(html) { $(cell).removeClass('new').addClass('acked'); ...
dans le js.
Updated by Frédéric Péters about 4 years ago
1. origin n'étant jamais nul ça me va, mais est-ce qu'on impose au niveau du WS (voir au niveau de l'API interne aussi) d'avoir forcément un origin si on a un id fourni ? Ça me paraîtrait bien mais je ne voudrai pas casser une utilisation existante.
Je ne pense pas que ça casse (à gnm ça serait utilisé pour avoir la commune traitant dans le champ origine mais ça n'est pas encore présent).
2. est-ce qu'on imposerait d'avoir au moins un caractère non alpha-numérique dans un id fourni via le web-service ? pour éviter les collisions si jamais un client voulait envoyer un entier et que par hasard ça matchait une autre notification existante.
Je pense qu'on pourrait imposer la forme namespace:whatever, [\w-]+:[\w]+ (voire même imposer plusieurs caractères pour le namespace ?). (et si on fait ça je pense on peut laisser origin hors des critères d'unicité, juste une info utile pour l'affichage).
Updated by Benjamin Dauvergne about 4 years ago
Frédéric Péters a écrit :
1. origin n'étant jamais nul ça me va, mais est-ce qu'on impose au niveau du WS (voir au niveau de l'API interne aussi) d'avoir forcément un origin si on a un id fourni ? Ça me paraîtrait bien mais je ne voudrai pas casser une utilisation existante.
Je ne pense pas que ça casse (à gnm ça serait utilisé pour avoir la commune traitant dans le champ origine mais ça n'est pas encore présent).
Après réflexion si on rend origin+external_id unique alors il faut demander l'origine sur les appels à ack et forget.
2. est-ce qu'on imposerait d'avoir au moins un caractère non alpha-numérique dans un id fourni via le web-service ? pour éviter les collisions si jamais un client voulait envoyer un entier et que par hasard ça matchait une autre notification existante.
Je pense qu'on pourrait imposer la forme namespace:whatever, [\w-]+:[\w]+ (voire même imposer plusieurs caractères pour le namespace ?). (et si on fait ça je pense on peut laisser origin hors des critères d'unicité, juste une info utile pour l'affichage).
Ok.
Updated by Serghei Mihai about 4 years ago
- Related to Development #13122: lingo: systeme de notification en cas de facture à payer added
Updated by Benjamin Dauvergne about 4 years ago
- File 0003-tests-set-a-TEST-database-name-so-that-pytest-reuse-.patch 0003-tests-set-a-TEST-database-name-so-that-pytest-reuse-.patch added
- File 0005-notifications-add-origin-to-unique-index-to-be-rebas.patch 0005-notifications-add-origin-to-unique-index-to-be-rebas.patch added
- File 0002-tox.ini-always-set-usedevelop-True-22390.patch 0002-tox.ini-always-set-usedevelop-True-22390.patch added
- File 0001-tox.ini-remove-pytest-capturelog-22390.patch 0001-tox.ini-remove-pytest-capturelog-22390.patch added
- File 0007-notifications-enforce-namespacing-on-external-ids-an.patch 0007-notifications-enforce-namespacing-on-external-ids-an.patch added
- File 0006-notifications-remove-unused-import-to-be-rebased.patch 0006-notifications-remove-unused-import-to-be-rebased.patch added
- File 0004-notifications-improve-internal-API-22390.patch 0004-notifications-improve-internal-API-22390.patch added
Si l'id est un entier est qu'une notification existe, on laisse passer.
Si l'id n'est pas un entier alors on exige la présence d'une origine et l'id
doit match une regexp qui impose un namespace.
Tout ceci est indépendant du fait qu'on demande l'unicité ou pas par rapport à
origin (enfin dans ce cas il faudrait quand même modifier find et les
update_or_create/get_or_create pour considérer l'origine, je laisse le
changement d'index dans la liste des patchs en attendant reconfirmation qu'on
s'en fout).
Updated by Benjamin Dauvergne about 4 years ago
Dernière suggestion: je me demande si le retour created
par notify() a vraiment un intérêt, ici il ne sert qu'une fois, pour la réponse au WS add, je ne sais pas trop ce que ça apporte.
Updated by Benjamin Dauvergne about 4 years ago
Dans les derniers patchs seulement 5, 6 et 7 ont bougé.
Updated by Frédéric Péters about 4 years ago
Dernière suggestion: je me demande si le retour created par notify() a vraiment un intérêt, ici il ne sert qu'une fois, pour la réponse au WS add, je ne sais pas trop ce que ça apporte.
Il est arrivé dans https://dev.entrouvert.org/issues/21189
Vraiment l'origine on s'en fout pour l'unicité, pour tout le reste aussi, juste une information d'affichage; et donc je n'ai pas du être clair, dans 0007, la validation, ça devrait pour moi juste être en cas d'id une vérif sur le format "<namespace>:<whatever>" (la partie regex manque du patch ?). (et si cette validation peut se monter pour se faire aussi dans l'API interne, c'est super).
(ça fait trop de patchs tu pousserais ça dans une branche ?)
Updated by Benjamin Dauvergne about 4 years ago
Frédéric Péters a écrit :
Dernière suggestion: je me demande si le retour created par notify() a vraiment un intérêt, ici il ne sert qu'une fois, pour la réponse au WS add, je ne sais pas trop ce que ça apporte.
Il est arrivé dans https://dev.entrouvert.org/issues/21189
Clairement ça ne sert à rien je vais le virer, les notifications sont nouvelles si acked == False
rien à voir avec la présence ou pas en base.
Vraiment l'origine on s'en fout pour l'unicité, pour tout le reste aussi, juste une information d'affichage; et donc je n'ai pas du être clair, dans 0007, la validation, ça devrait pour moi juste être en cas d'id une vérif sur le format "<namespace>:<whatever>" (la partie regex manque du patch ?). (et si cette validation peut se monter pour se faire aussi dans l'API interne, c'est super).
D'ac je virer l'index et la contrainte pour avoir origin, je vais voir pour l'API interne.
(ça fait trop de patchs tu pousserais ça dans une branche ?)
Oui.
Updated by Serghei Mihai about 4 years ago
Dans le patch: http://git.entrouvert.org/combo.git/commit/?h=wip/22390-Ajouter-un-unique-together-user-external-id-sur-le-modele-Notification&id=3749fd7dfb2535d20d6d0812f143f81bb978bb18 je mettrais:
id = unicode(id)
dans un try... except pour intercepter les erreurs d'unicode.
Dans http://git.entrouvert.org/combo.git/commit/?h=wip/22390-Ajouter-un-unique-together-user-external-id-sur-le-modele-Notification&id=3749fd7dfb2535d20d6d0812f143f81bb978bb18 l'origin
ne semble pas être éxigé lors de l'appel à l'api, contrairement à ce que dit le message du commit.
Updated by Benjamin Dauvergne about 4 years ago
- File 0003-tests-set-a-TEST-database-name-so-that-pytest-reuse-.patch 0003-tests-set-a-TEST-database-name-so-that-pytest-reuse-.patch added
- File 0002-tox.ini-always-set-usedevelop-True-22390.patch 0002-tox.ini-always-set-usedevelop-True-22390.patch added
- File 0001-tox.ini-remove-pytest-capturelog-22390.patch 0001-tox.ini-remove-pytest-capturelog-22390.patch added
- File 0005-notifications-remove-unused-import-to-be-rebased.patch 0005-notifications-remove-unused-import-to-be-rebased.patch added
- File 0007-notifications-do-not-return-created-from-.notify-to-.patch 0007-notifications-do-not-return-created-from-.notify-to-.patch added
- File 0008-notifications-add-a-listing-API.patch 0008-notifications-add-a-listing-API.patch added
- File 0006-notifications-enforce-namespacing-on-external-ids-to.patch 0006-notifications-enforce-namespacing-on-external-ids-to.patch added
- File 0004-notifications-improve-internal-API-22390.patch 0004-notifications-improve-internal-API-22390.patch added
Remarques prises en compte.
Updated by Frédéric Péters about 4 years ago
(vraiment utiliser la branche plutôt que poser un tas de patchs).
0008 est à discuter ailleurs il me semble.
Et pousse déjà 0001→0003, qui n'ont pas de rapport.
Updated by Serghei Mihai about 4 years ago
Ack pour ma part pour les patchs 0001-0007.
Le 0008, comme dit Frédéric, peut-être traité dans un autre ticket.
Updated by Benjamin Dauvergne about 4 years ago
- Status changed from Nouveau to Résolu (à déployer)
commit f2719b3a68b4e7e4b5ba54870305ee8c60c058ab (HEAD -> master, origin/master, origin/HEAD) Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Fri Mar 16 12:35:28 2018 +0100 notifications: improve internal API (#22390) * (user, external_id) is now unique, no need to user .first() / .last() * new filter .find(user, id), .visible(user), new queryset actions .ack() and .forget() * new property notification.visible to know if a notification is shown * when notify() is called on an existing notification, it's unacked * notify's parameters url, body and origin now default to '', serializer has been updated
Je déplace le nouveau dans un nouveau ticket.
Updated by Frédéric Péters over 3 years ago
- Status changed from Résolu (à déployer) to Solution déployée
tox.ini: remove pytest-capturelog (#22390)