toulouse-maelis: prevent creating invoice in concurency (#82706) #378

Merged
nroche merged 1 commits from wip/82706-manage-concurency-on-create-invoice into main 2023-11-10 08:58:29 +01:00
Owner

Les objets "Invoice" du connecteur sont créés par la fonction get_invoices.
Cette fonction récupère la liste des factures connues de Maélis,
puis boucle sur cette liste pour ajouter les nouvelles factures en base.

Le patch place le code de recherche puis d'ajout des factures dans une transaction,
afin que 2 appels ne puissent pas ajouter la même facture en même temps.

Les objets "Invoice" du connecteur sont créés par la fonction get_invoices. Cette fonction récupère la liste des factures connues de Maélis, puis boucle sur cette liste pour ajouter les nouvelles factures en base. Le patch place le code de recherche puis d'ajout des factures dans une transaction, afin que 2 appels ne puissent pas ajouter la même facture en même temps.
nroche added 1 commit 2023-11-02 09:33:22 +01:00
Owner

Pourquoi ne pas juste faire un get_or_create ou un update_or_create, via l'index sur resource, regie_id, invoice_id il ne peut pas y avoir de problème de concurrence (la transaction ne protégera pas vraiment des soucis dans ce cas de toute façon).

Pourquoi ne pas juste faire un get_or_create ou un update_or_create, via l'index sur resource, regie_id, invoice_id il ne peut pas y avoir de problème de concurrence (la transaction ne protégera pas vraiment des soucis dans ce cas de toute façon).
bdauvergne requested changes 2023-11-06 10:33:34 +01:00
bdauvergne left a comment
Owner

Pas la bonne solution.

Pas la bonne solution.
Owner

Le code pourrait ressembler à ça:

                invoice, created = self.invoice_set.get_or_create(
                    regie_id=regie_id,
                    invoice_id=item['numInvoice'],
                    defaults=dict(
                    family_id=family_id,
                    maelis_data=item,
                    maelis_data_update_date=now()),
                )
                if created:
                      # return early
                # else eventual check to family_id and update or maelis_data
Le code pourrait ressembler à ça: invoice, created = self.invoice_set.get_or_create( regie_id=regie_id, invoice_id=item['numInvoice'], defaults=dict( family_id=family_id, maelis_data=item, maelis_data_update_date=now()), ) if created: # return early # else eventual check to family_id and update or maelis_data
nroche force-pushed wip/82706-manage-concurency-on-create-invoice from 59d0209cfb to 4865168e4e 2023-11-06 16:49:01 +01:00 Compare
Author
Owner

Pourquoi ne pas juste faire un get_or_create ou un update_or_create, via l'index sur resource, regie_id, invoice_id il ne peut pas y avoir de problème de concurrence (la transaction ne protégera pas vraiment des soucis dans ce cas de toute façon).

Oui, je fais ça, merci d'avoir détricoté mon code.

> Pourquoi ne pas juste faire un get_or_create ou un update_or_create, via l'index sur resource, regie_id, invoice_id il ne peut pas y avoir de problème de concurrence (la transaction ne protégera pas vraiment des soucis dans ce cas de toute façon). Oui, je fais ça, merci d'avoir détricoté mon code.
nroche force-pushed wip/82706-manage-concurency-on-create-invoice from 4865168e4e to d1a2f8d26b 2023-11-06 17:04:12 +01:00 Compare
nroche requested review from bdauvergne 2023-11-09 18:55:44 +01:00
bdauvergne approved these changes 2023-11-09 19:40:52 +01:00
@ -4075,0 +4062,4 @@
invoice.family_id,
)
continue
content_one = json.dumps(invoice.maelis_data, sort_keys=True, indent=2)
Owner

Ne suffirait-il pas de faire juste invoice.maelis_data != item ? Je ne comprends pas le passage par la sérialisation JSON, python sait déjà comparer deux dicos (je comprends ensuite pour le difflib, mais donc déplacer la sérialisation à cet endroit).

Ne suffirait-il pas de faire juste invoice.maelis_data != item ? Je ne comprends pas le passage par la sérialisation JSON, python sait déjà comparer deux dicos (je comprends ensuite pour le difflib, mais donc déplacer la sérialisation à cet endroit).
bdauvergne marked this conversation as resolved
nroche force-pushed wip/82706-manage-concurency-on-create-invoice from d1a2f8d26b to e59765eaf7 2023-11-10 08:43:20 +01:00 Compare
nroche merged commit e59765eaf7 into main 2023-11-10 08:58:29 +01:00
nroche deleted branch wip/82706-manage-concurency-on-create-invoice 2023-11-10 08:58:29 +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/passerelle#378
No description provided.