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.