Problème de locale
#1
Bonjour à tous,

J'ai une installation qui tourne bien en prod, avec Apache et le mod WSGI.

J'ai créé ma première opportunité commerciale (Yes!), en Euro, et depuis j'ai une erreur 500 lorsque je veux accéder soit à la page de l'entreprise, soit à celle de l'opportunité commerciale.

J'ai l'erreur suivante :

Citation :[...]
raise ValueError("Currency formatting is not possible using the 'C' locale.")
ValueError: Currency formatting is not possible using the 'C' locale., referer



Effectivement, les locales n'étaient pas bien configurées sur le serveur, je suis depuis passé en fr_UTF8.
Cela n'a rien changé, j'ai toujours cette même erreur, même après restart Apache.

La langue est bien fr dans les settings :

Citation :LANGUAGE_CODE = 'fr'  # Also available : 'fr'
TIME_ZONE = 'Europe/Paris'  # See http://en.wikipedia.org/wiki/List_of_tz_zones_by_name


J'ai noté par contre que la variable LC_ALL était vide :

Citation :LANG=fr_FR.UTF-8
LANGUAGE=
LC_CTYPE="fr_FR.UTF-8"
LC_NUMERIC="fr_FR.UTF-8"
LC_TIME="fr_FR.UTF-8"
LC_COLLATE="fr_FR.UTF-8"
LC_MONETARY="fr_FR.UTF-8"
LC_MESSAGES="fr_FR.UTF-8"
LC_PAPER="fr_FR.UTF-8"
LC_NAME="fr_FR.UTF-8"
LC_ADDRESS="fr_FR.UTF-8"
LC_TELEPHONE="fr_FR.UTF-8"
LC_MEASUREMENT="fr_FR.UTF-8"
LC_IDENTIFICATION="fr_FR.UTF-8"
LC_ALL=


Merci d'avance pour toute suggestions

J'ai reproduit l'erreur sur mon environnement de test, qui lui était déjà paramétré avec les bonnes locales :
fr_FR.UTF-8

J'ai le même soucis, avec l'erreur sur la page de l'opportunité et sur la page de la société
  Répondre
#2
Bonjour,

vous faites bien de précisez votre environnement lorsque vous demandez de l'aide, mais vous devriez être plus complet en précisant la version de Creme (pour les futurs lecteurs par exemple), la version de Python et votre OS (dans le cas présent où il s'agit potentiellement d'un problème d'environnement c'est particulièrement vrai).

De la même manière, c'est dommage d'avoir tronqué la pile d'erreur qui est utile pour localiser le problème.

Je suppose que vous êtes avec Creme2.0 + Debian9 (vu vos précédant messages), et je suppose que l'erreur provient du fichier "creme/creme_core/utils/currency_format.py" ligne 106

Dans un shell Python chez moi :

Code :
>>> import locale
>>> locale.localeconv()
{ ... 'currency_symbol': '', ...  'int_frac_digits': 127, 'frac_digits': 127, ...}  # j'ai surtout laissé les 2 clés qui nous intéresse


On a des valeurs du nombres de digits problématiques (127) ; mais si on continue :

Code :
>>> locale.setlocale(locale.LC_MONETARY, ('fr_FR', 'utf8'))
'fr_FR.UTF-8'
>>> locale.localeconv()
{ ... 'currency_symbol': '€', ... 'int_frac_digits': 2, 'frac_digits': 2, ... }

Cette fois les valeurs pour le nombre de chiffres après la virgule sont corrects (2).

C'est ce que fait Creme : le code de formatage va essayer de trouver une locale en essayant successivement locale.setlocale(locale.LC_MONETARY, ('fr_FR', 'utf8')) puis locale.setlocale(locale.LC_MONETARY, 'fr_FR') puis locale.setlocale(locale.LC_MONETARY, '')).

Arrivez-vous à obtenir des valeurs correctes pour le nombre de digits dans un de ces cas ?
  Répondre
#3
Merci pour votre retour,

Je ne voulais pas "polluer" le quote, mais effectivement il s'agit bien du fichier currency_format

Je suis effectivement sur Debian 9, en version 2.0

J'ai bien le même comportement sur fr_FR.utf8 :

Citation :>>> locale.setlocale(locale.LC_MONETARY, ('fr_FR', 'utf8'))
'fr_FR.UTF-8'
>>> locale.localeconv()
{'p_cs_precedes': 0, 'positive_sign': '', 'thousands_sep': '', 'p_sep_by_space': 1, 'n_cs_precedes': 0, 'negative_sign': '-', 'n_sign_posn': 1, 'decimal_point': '.', 'mon_decimal_point': ',', 'frac_digits': 2, 'mon_thousands_sep': ' ', 'currency_symbol': '€', 'mon_grouping': [3, 0], 'grouping': [], 'int_curr_symbol': 'EUR ', 'int_frac_digits': 2, 'n_sep_by_space': 1, 'p_sign_posn': 1}

J'ai du coup l'impression que Django ne charge pas la bonne locale, avec les lignes suivantes dans le django.wsgi je n'ai plus le problème :
Code :
import locale
locale.setlocale(locale.LC_ALL,'fr_FR.UTF-8')

Comment sont chargées les locales normalement?
Vu que Debian déconseille fortement de renseigner LC_ALL au niveau global?
https://wiki.debian.org/Locale

Merci
  Répondre
#4
Je pencherai pour un bug dans 'currency_format.py' ; si vous remplacez les lignes (85 -> 87)

Code :
   conv = _get_locale_conv(category=locale.LC_MONETARY,
                           locale_code=standardized_locale_code(settings.LANGUAGE_CODE),
                          )

par :


Code :
   locale.setlocale(locale.LC_MONETARY, ('fr_FR', 'utf8'))
   conv = locale.localeconv()

Est-ce que ça fonctionne ?
  Répondre
#5
Effectivement le correctif est fonctionnel et permet de visualisé l'opportunité sans problème

Merci
  Répondre
#6
(18-09-2019, 17:33)jdiswt a écrit : Effectivement le correctif est fonctionnel et permet de visualisé l'opportunité sans problème

Merci

Ok c'est donc bien un souci avec le code que nous avons remplacé.

J'imagine que si vous mettez plutôt le code suivant (qui ressemble plus au code en cause)

Code :
locale.setlocale(locale.LC_MONETARY, ('fr', 'UTF8'))

cela ne marche pas ; si c'est bien le cas, pouvez-vous regarder si c'est 'fr' plutôt que 'fr_FR' le problème, ou bien 'UTF8' à la place de 'utf8' ?
  Répondre
#7
ça marche avec le 'fr' au lieu du 'fr_FR'

Sans le utf8 ça ne fonctionne pas par contre, que ce soit le 'fr' ou le 'fr_FR'

Code :
locale.setlocale(locale.LC_MONETARY, ('fr_FR', ''))
  Répondre
#8
(18-09-2019, 21:41)jdiswt a écrit : ça marche avec le 'fr' au lieu du 'fr_FR'

Sans le utf8 ça ne fonctionne pas par contre, que ce soit le 'fr' ou le 'fr_FR'

Code :
locale.setlocale(locale.LC_MONETARY, ('fr_FR', ''))

La fonction "_locale_args()" génère les arguments qu'on va essayer successivement avec setlocale() (en tant que 2ème argument, après locale.LC_MONETARY donc) ; sauf erreur de ma part, les arguments essayés devraient être:[/font][/color]


Code :
('fr', 'UTF8')
'fr'
''

(mais pas ('fr_FR', ''), donc ce cas ne peut pas être mis en cause dans le bug)

Avez-vous testé avec 'UTF8' comme je le suggérais (en majuscule donc, puisque settings.DEFAULT_ENCODING est en majuscule de base) ?
  Répondre
#9
Bonjour,

Désolé pour le délais de réponse, je n'ai pas eu le temps de me pencher sur le problème plus tôt.

Voici les tests que j'ai pu faire :

Code :
locale.setlocale(locale.LC_MONETARY, ('fr', 'UTF8'))

Fonctionne


Code :
locale.setlocale(locale.LC_MONETARY, ('fr', ''))
Ne fonctionne pas


Code :
locale.setlocale(locale.LC_MONETARY, ('fr', 'utf8'))
Fonctionne

N'hésitez pas à me demander si vous souhaitez que je fasse d'autres tests
  Répondre
#10
Bonjour,

Désolé pour ma réponse tardive, c'est compliqué de boucler tout ce qu'il faut pour que la prochaine release sorte dans les clous.

Pouvez vous insérer cette ligne de code (ligne 55)


Code :
   for locale_arg in _locale_args(locale_code):
       try:
           print('locale_arg', locale_arg) # <================== CELLE-CI
           locale.setlocale(category, locale_arg)
           return locale.localeconv()   # NB: Windows can raise UnicodeDecodeError here

et me dire ce que ça affiche dans le terminal (quand vous aller sur la page en erreur évidemment) ?
  Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 2 visiteur(s)