Skip to content

Erreur 500 (encoding) à la validation de facture

À 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.