#142 Erreur 500 (encoding) à la validation de facture

Closed
opened 7 years ago by jocelyn · 2 comments
jocelyn commented 7 years ago

À la validation d'une facture brouillon, erreur 500, qui se traduit dans les logs par :


Updating invoice 2018-04-XXXXXX (Member: Liliane Béta ncourt, Total amount: 42000.00, Am
Updating invoice 2018-04-XXXXXX (Member: Liliane Bétancourt, Total amount: 42000.00, Am
Draft invoice DRAFT-XXX validated as invoice 2018-04-XXXXXX. (Total amount : 42000.000000 ;
Internal Server Error: /admin/billing/invoice/validate/XXX
Traceback (most recent call last):
File "/home/coin/venv/local/lib/python2.7/site-packages/django/core/handlers/base.py", l
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/coin/venv/local/lib/python2.7/site-packages/django/utils/decorators.py", lin
response = view_func(request, *args, **kwargs)
File "/home/coin/venv/local/lib/python2.7/site-packages/django/views/decorators/cache.py
response = view_func(request, *args, **kwargs)
File "/home/coin/venv/local/lib/python2.7/site-packages/django/contrib/admin/sites.py", 
return view(request, *args, **kwargs)
File "/home/coin/coin/coin/billing/admin.py", line 180, in validate_view
invoice.validate()
File "/home/coin/venv/local/lib/python2.7/site-packages/django/utils/decorators.py", lin
return func(*args, **kwargs)
File "/home/coin/coin/coin/billing/models.py", line 232, in validate
update_accounting_for_member(self.member)
File "/home/coin/coin/coin/billing/models.py", line 488, in update_accounting_for_member
% str(member))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 10: ordinal not in r
Updating draft invoice DRAFT-XXX (Member: Liliane Bétancourt).

L'erreur vient des accents dans le nom et de la mauvaise gestion des encodages dans une partie du code de #125 (en même temps, c'est tellement le dawa en Python2 la gestion de l'encodage…)

Voici le patch rapide que j'ai fait en prod pour que ça tombe en marche.

diff --git a/coin/billing/models.py b/coin/billing/models.py
index 47df12e..600c937 100644
--- a/coin/billing/models.py
+++ b/coin/billing/models.py
@@ -277,7 +277,7 @@ class Invoice(models.Model):
             return False
 
         accounting_log.info("Sending reminder email to %s to pay invoice %s"
-                           % (str(self.member), str(self.number)))
+                           % (self.member, str(self.number)))
 
         isp_info = ISPInfo.objects.first()
         kwargs = {}
@@ -485,9 +485,9 @@ def update_accounting_for_member(member):
     """
 
     accounting_log.info("Updating accounting for member %s ..."
-                        % str(member))
+                        % member)
     accounting_log.info("Member %s current balance is %f ..."
-                        % (str(member), float(member.balance)))
+                        % (member, float(member.balance)))
 
     reconcile_invoices_and_payments(member)
 
@@ -499,7 +499,7 @@ def update_accounting_for_member(member):
     member.save()
 
     accounting_log.info("Member %s new balance is %f"
-                        % (str(member),  float(member.balance)))
+                        % (member,  float(member.balance)))
 
 
 def reconcile_invoices_and_payments(member):
@@ -513,16 +513,16 @@ def reconcile_invoices_and_payments(member):
     if active_payments == []:
         accounting_log.info("(No active payment for %s. No invoice/payment "
                             "reconciliation needed.)."
-                            % str(member))
+                            % member)
         return
     elif active_invoices == []:
         accounting_log.info("(No active invoice for %s. No invoice/payment "
                             "reconciliation needed.)."
-                            % str(member))
+                            % member)
         return
 
     accounting_log.info("Initiating reconciliation between "
-                        "invoice and payments for %s" % str(member))
+                        "invoice and payments for %s" % member)
 
     while active_payments != [] and active_invoices != []:

Il conviendrait de 1) le commiter 2) faire un exament attentif pour vérifier qu'il n'y a pas d'autres erreurs du même type dans cette partie du code.

À la validation d'une facture brouillon, erreur 500, qui se traduit dans les logs par : ``` Updating invoice 2018-04-XXXXXX (Member: Liliane Béta ncourt, Total amount: 42000.00, Am Updating invoice 2018-04-XXXXXX (Member: Liliane Bétancourt, Total amount: 42000.00, Am Draft invoice DRAFT-XXX validated as invoice 2018-04-XXXXXX. (Total amount : 42000.000000 ; Internal Server Error: /admin/billing/invoice/validate/XXX Traceback (most recent call last): File "/home/coin/venv/local/lib/python2.7/site-packages/django/core/handlers/base.py", l response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/home/coin/venv/local/lib/python2.7/site-packages/django/utils/decorators.py", lin response = view_func(request, *args, **kwargs) File "/home/coin/venv/local/lib/python2.7/site-packages/django/views/decorators/cache.py response = view_func(request, *args, **kwargs) File "/home/coin/venv/local/lib/python2.7/site-packages/django/contrib/admin/sites.py", return view(request, *args, **kwargs) File "/home/coin/coin/coin/billing/admin.py", line 180, in validate_view invoice.validate() File "/home/coin/venv/local/lib/python2.7/site-packages/django/utils/decorators.py", lin return func(*args, **kwargs) File "/home/coin/coin/coin/billing/models.py", line 232, in validate update_accounting_for_member(self.member) File "/home/coin/coin/coin/billing/models.py", line 488, in update_accounting_for_member % str(member)) UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 10: ordinal not in r Updating draft invoice DRAFT-XXX (Member: Liliane Bétancourt). ``` L'erreur vient des accents dans le nom et de la mauvaise gestion des encodages dans une partie du code de #125 (en même temps, c'est tellement le dawa en Python2 la gestion de l'encodage…) Voici le patch rapide que j'ai fait en prod pour que ça tombe en marche. ``` diff --git a/coin/billing/models.py b/coin/billing/models.py index 47df12e..600c937 100644 --- a/coin/billing/models.py +++ b/coin/billing/models.py @@ -277,7 +277,7 @@ class Invoice(models.Model): return False accounting_log.info("Sending reminder email to %s to pay invoice %s" - % (str(self.member), str(self.number))) + % (self.member, str(self.number))) isp_info = ISPInfo.objects.first() kwargs = {} @@ -485,9 +485,9 @@ def update_accounting_for_member(member): """ accounting_log.info("Updating accounting for member %s ..." - % str(member)) + % member) accounting_log.info("Member %s current balance is %f ..." - % (str(member), float(member.balance))) + % (member, float(member.balance))) reconcile_invoices_and_payments(member) @@ -499,7 +499,7 @@ def update_accounting_for_member(member): member.save() accounting_log.info("Member %s new balance is %f" - % (str(member), float(member.balance))) + % (member, float(member.balance))) def reconcile_invoices_and_payments(member): @@ -513,16 +513,16 @@ def reconcile_invoices_and_payments(member): if active_payments == []: accounting_log.info("(No active payment for %s. No invoice/payment " "reconciliation needed.)." - % str(member)) + % member) return elif active_invoices == []: accounting_log.info("(No active invoice for %s. No invoice/payment " "reconciliation needed.)." - % str(member)) + % member) return accounting_log.info("Initiating reconciliation between " - "invoice and payments for %s" % str(member)) + "invoice and payments for %s" % member) while active_payments != [] and active_invoices != []: ``` Il conviendrait de 1) le commiter 2) faire un exament attentif pour vérifier qu'il n'y a pas d'autres erreurs du même type dans cette partie du code.
alexAubin commented 7 years ago
Collaborator

#mybad, déso je pige pas grand chose à l'encodage :s

De ce que je me souviens, j'avais essayé pleins de combinaisons de truc et j'avais toujours un cas qui passait pas bien ... Du coup je sais pas trop quelle est la bonne façon de faire ni même quels peuvent être les autres endroits affectés :.

(Espérons qu'un jour on puisse passer le code en python 3 (pendant le prochain devcamp ? ;P))

#mybad, déso je pige pas grand chose à l'encodage :s De ce que je me souviens, j'avais essayé pleins de combinaisons de truc et j'avais toujours un cas qui passait pas bien ... Du coup je sais pas trop quelle est la bonne façon de faire ni même quels peuvent être les autres endroits affectés :\. (Espérons qu'un jour on puisse passer le code en python 3 (pendant le prochain devcamp ? ;P))
daimrod commented 6 years ago
Collaborator

Fixed by #50aeb43d13

Fixed by #50aeb43d132c085177514ebb2f0be66c8d735b74
Sign in to join this conversation.
No Milestone
No assignee
3 Participants
Loading...
Cancel
Save
There is no content yet.