Repository: zestedesavoir/zds-site

Issue:
[beta][v20] S'inscrire/se connecter/chercher avec un emoji provoque une 500
Serveur : Beta
Version : v20-RC3/d3fd8af
Système : Mac OS X
Navigateur : 52.0.2743.116 (64-bit)

---
1. Rendez-vous à la page d'inscription et renseigner un pseudo du type : 👚 test
2. Remplissez les autres champs.
3. Soumettez le formulaire.
4. Constatez une erreur 500.

Note : Vous pouvez reproduire la même erreur en tentant de vous connecter avec le même pseudo ou en faisant une recherche sur le pseudo d'un membre.



Discussion:
On aurait pu ré-ouvrir celle-ci #3831 . Mais oui je confirme que le bug n'est pas corrigé.

Bien vu, j'avais zappé ton issue. Sorry.

Ça me surprend. @gustavi t'as une idée du pourquoi ?

J'ai jeté un oeil et le champ username de RegisterForm doit passer par validate_zds_username qui doit refuser les emojis...

Pour information, la recherche d'un membre provoque aussi une 500.

Scénario :
1. Rendez-vous sur un MP.
2. Cliquez pour ajouter un membre.
3. Recherchez avec un emoji (🐙 par exemple)
4. Soumettez et constatez la 500.

Erreurs :

``` console
OperationalError: (1267, "Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation '='")
(19 additional frame(s) were not displayed)
...
  File "zds/mp/views.py", line 172, in dispatch
    return super(PrivateTopicAddParticipant, self).dispatch(request, *args, **kwargs)
  File "zds/mp/views.py", line 184, in post
    participant = get_object_or_404(Profile, user__username=request.POST.get('username'))
```

``` console
OperationalError: (1267, "Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation 'like'")
(23 additional frame(s) were not displayed)
...
  File "rest_framework_extensions/cache/decorators.py", line 62, in process_cache_response
    response = view_method(view_instance, request, *args, **kwargs)
  File "zds/member/api/views.py", line 101, in get
    return self.list(request, *args, **kwargs)
  File "rest_framework/mixins.py", line 42, in list
    page = self.paginate_queryset(queryset)
  File "rest_framework/generics.py", line 172, in paginate_queryset
    return self.paginator.paginate_queryset(queryset, self.request, view=self)
  File "rest_framework/pagination.py", line 206, in paginate_queryset
    self.page = paginator.page(page_number)
```

Premier message de l'issue édité.

Ce qui m'embête le plus c'est qu'on a un test pour ça : https://github.com/zestedesavoir/zds-site/pull/3809/commits/478ee609b38480efc20b87414322043546163d97 et il passe.

Je pense qu'on a besoin d'yeux supplémentaires ici. On a un test, il est bon, il passe, mais sur la beta ça passe pas. Et je sais pas pourquoi.

Je vais mettre le tag bloquant, parce que faire une RC avec ce bug n'a pas de sens.

Tu sais donner un pointeur vers le test ?

Ici : https://github.com/zestedesavoir/zds-site/issues/3836#issuecomment-246980773


Resolving patch:
diff --git a/zds/utils/misc.py b/zds/utils/misc.py
--- a/zds/utils/misc.py
+++ b/zds/utils/misc.py
@@ -53,4 +53,5 @@ def contains_utf8mb4(s):
     """
     if not isinstance(s, unicode):
         s = unicode(s, 'utf-8')
-    return not all(len(c.encode('utf-8')) <= 3 for c in s)
+    re_pattern = re.compile(u'[^\u0000-\uD7FF\uE000-\uFFFF]', re.UNICODE)
+    return s != re_pattern.sub(u'\uFFFD', s)


Test patch:
diff --git a/zds/utils/tests/misc.py b/zds/utils/tests/test_misc.py
similarity index 100%
rename from zds/utils/tests/misc.py
rename to zds/utils/tests/test_misc.py