From 92e7176367eff26f1cec052f6a31f3939c4aa2ff Mon Sep 17 00:00:00 2001 From: Arnaud-D <35631001+Arnaud-D@users.noreply.github.com> Date: Thu, 24 Mar 2022 19:03:17 +0100 Subject: [PATCH 1/2] Retire la gestion des anciens smileys --- templates/pages/cookies.html | 5 -- zds/member/forms.py | 6 -- .../0021_remove_profile_use_old_smileys.py | 17 +++++ zds/member/models.py | 28 -------- zds/member/tests/views/tests_profile.py | 66 ------------------- zds/member/views/login.py | 5 +- zds/member/views/profile.py | 4 -- zds/settings/abstract_base/zds.py | 2 - 8 files changed, 18 insertions(+), 115 deletions(-) create mode 100644 zds/member/migrations/0021_remove_profile_use_old_smileys.py diff --git a/templates/pages/cookies.html b/templates/pages/cookies.html index 6d732cd1d1..7f2c4ca107 100644 --- a/templates/pages/cookies.html +++ b/templates/pages/cookies.html @@ -54,11 +54,6 @@

{% trans "Cookies techniques" %}

{% blocktrans %}Ce cookie est un identifiant unique qui permet de faire le lien entre votre session de navigation et les différentes pages que vous visitez. Il permet en particulier de vous connecter à {{ site_name }}. Il ne contient qu’une chaîne de caractères aléatoires.{% endblocktrans %}
csrftoken
{% blocktrans %}Ce cookie contient une chaîne de caractères aléatoires qui permet de se prémunir des attaques CSRF. Composant indispensable de la sécurité du site, vous ne pourrez rien poster sans ce cookie.{% endblocktrans %}
- {% if app.member.old_smileys_allowed %} -
{{ app.member.old_smileys_cookie_key }}
- {% url 'update-member' as update_member %} -
{% blocktrans with url=update_member %}Ce cookie est utilisé pour afficher les "vieux" smileys en lieu et place des smileys Clem (auquel cas il prend la valeur True), si vous activez cette option dans votre profil.{% endblocktrans %}
- {% endif %} diff --git a/zds/member/forms.py b/zds/member/forms.py index 916046247f..106f2334d1 100644 --- a/zds/member/forms.py +++ b/zds/member/forms.py @@ -250,9 +250,6 @@ def __init__(self, *args, **kwargs): self.helper.form_class = "content-wrapper" self.helper.form_method = "post" - if settings.ZDS_APP["member"]["old_smileys_allowed"]: - self.fields["options"].choices.insert(3, ("use_old_smileys", _("Utiliser les anciens smileys"))) - # to get initial value form checkbox show email initial = kwargs.get("initial", {}) self.fields["options"].initial = "" @@ -266,9 +263,6 @@ def __init__(self, *args, **kwargs): if "allow_temp_visual_changes" in initial and initial["allow_temp_visual_changes"]: self.fields["options"].initial += "allow_temp_visual_changes" - if "use_old_smileys" in initial and initial["use_old_smileys"]: - self.fields["options"].initial += "use_old_smileys" - if "show_markdown_help" in initial and initial["show_markdown_help"]: self.fields["options"].initial += "show_markdown_help" diff --git a/zds/member/migrations/0021_remove_profile_use_old_smileys.py b/zds/member/migrations/0021_remove_profile_use_old_smileys.py new file mode 100644 index 0000000000..218faffdb2 --- /dev/null +++ b/zds/member/migrations/0021_remove_profile_use_old_smileys.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.12 on 2022-03-24 18:57 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("member", "0020_auto_20201018_0841"), + ] + + operations = [ + migrations.RemoveField( + model_name="profile", + name="use_old_smileys", + ), + ] diff --git a/zds/member/models.py b/zds/member/models.py index 371f24eede..394bb9a5c4 100644 --- a/zds/member/models.py +++ b/zds/member/models.py @@ -65,7 +65,6 @@ class Meta: can_write = models.BooleanField("Possibilité d'écrire", default=True) end_ban_write = models.DateTimeField("Fin d'interdiction d'écrire", null=True, blank=True) last_visit = models.DateTimeField("Date de dernière visite", null=True, blank=True) - use_old_smileys = models.BooleanField("Utilise les anciens smileys ?", default=False) _permissions = {} _groups = None _cached_city = None @@ -490,33 +489,6 @@ def remove_hats_linked_to_group(sender, instance, **kwargs): instance.hats.remove(hat) -def remove_old_smileys_cookie(response): - """Remove the Clem smileys cookie by immediate expiration - - :param response: the HTTP response - :type: django.http.response.HttpResponse - """ - - response.set_cookie(settings.ZDS_APP["member"]["old_smileys_cookie_key"], "", expires=0) - - -def set_old_smileys_cookie(response, profile): - """Set the Clem smileys cookie according to profile (and if allowed) - - :param response: the HTTP response - :type: django.http.response.HttpResponse - :param profile: the profile - :type profile: Profile - """ - - if settings.ZDS_APP["member"]["old_smileys_allowed"]: - if profile.use_old_smileys: - # TODO: set max_age, expires and so all (see https://stackoverflow.com/a/1623910) - response.set_cookie(settings.ZDS_APP["member"]["old_smileys_cookie_key"], profile.use_old_smileys) - else: - remove_old_smileys_cookie(response) - - class TokenForgotPassword(models.Model): """ When a user forgot its password, the website sends it an email with a token (embedded in a URL). diff --git a/zds/member/tests/views/tests_profile.py b/zds/member/tests/views/tests_profile.py index a8f115bdac..8a10b7f741 100644 --- a/zds/member/tests/views/tests_profile.py +++ b/zds/member/tests/views/tests_profile.py @@ -254,69 +254,3 @@ def test_markdown_help_settings(self): user.profile.save() result = self.client.get(reverse("pages-index"), follow=False) self.assertContains(result, 'data-show-markdown-help="false"') - - def test_old_smileys(self): - """Test the cookie""" - - # NOTE: we have to use the "real" login and logout pages here - cookie_key = settings.ZDS_APP["member"]["old_smileys_cookie_key"] - - profile_without_clem = ProfileFactory() - profile_without_clem = Profile.objects.get(pk=profile_without_clem.pk) - self.assertFalse(profile_without_clem.use_old_smileys) - - user_without_clem = profile_without_clem.user - profile_with_clem = ProfileFactory() - profile_with_clem.use_old_smileys = True - profile_with_clem.save() - user_with_clem = profile_with_clem.user - - settings.ZDS_APP["member"]["old_smileys_allowed"] = True - - # test that the cookie is set when connection - result = self.client.post( - reverse("member-login"), - {"username": user_with_clem.username, "password": "hostel77", "remember": "remember"}, - follow=False, - ) - self.assertEqual(result.status_code, 302) - self.client.get(reverse("homepage")) - - self.assertIn(cookie_key, self.client.cookies) - self.assertNotEqual(self.client.cookies[cookie_key]["expires"], 0) - - # test that logout set the cookies expiration to 0 (= no more cookie) - self.client.post(reverse("member-logout"), follow=True) - self.client.get(reverse("homepage")) - self.assertEqual(self.client.cookies[cookie_key]["expires"], 0) - - # test that user without the setting have the cookie with expiration 0 (= no cookie) - result = self.client.post( - reverse("member-login"), - {"username": user_without_clem.username, "password": "hostel77", "remember": "remember"}, - follow=False, - ) - - self.assertEqual(result.status_code, 302) - self.assertEqual(self.client.cookies[cookie_key]["expires"], 0) - - # setting use_smileys sets the cookie - self.client.post( - reverse("update-member"), - {"biography": "", "site": "", "avatar_url": "", "sign": "", "options": ["use_old_smileys"]}, - ) - self.client.get(reverse("homepage")) - - profile_without_clem = Profile.objects.get(pk=profile_without_clem.pk) - self.assertTrue(profile_without_clem.use_old_smileys) - self.assertNotEqual(self.client.cookies[cookie_key]["expires"], 0) - - # ... and that not setting it removes the cookie - self.client.post( - reverse("update-member"), {"biography": "", "site": "", "avatar_url": "", "sign": "", "options": []} - ) - self.client.get(reverse("homepage")) - - profile_without_clem = Profile.objects.get(pk=profile_without_clem.pk) - self.assertFalse(profile_without_clem.use_old_smileys) - self.assertEqual(self.client.cookies[cookie_key]["expires"], 0) diff --git a/zds/member/views/login.py b/zds/member/views/login.py index 712b10e68b..0bc95cba54 100644 --- a/zds/member/views/login.py +++ b/zds/member/views/login.py @@ -9,7 +9,7 @@ from django.views.decorators.http import require_POST from zds.member.forms import LoginForm -from zds.member.models import Profile, set_old_smileys_cookie, remove_old_smileys_cookie +from zds.member.models import Profile from zds.member.views import get_client_ip from zds.utils.tokens import generate_token @@ -94,7 +94,6 @@ def login_view(request): response = redirect(next_page) except Resolver404: response = redirect(reverse("homepage")) - set_old_smileys_cookie(response, profile) return response if next_page is not None: @@ -112,6 +111,4 @@ def logout_view(request): logout(request) request.session.clear() response = redirect(reverse("homepage")) - # disable Clem smileys: - remove_old_smileys_cookie(response) return response diff --git a/zds/member/views/profile.py b/zds/member/views/profile.py index 4a69027e32..7205de3955 100644 --- a/zds/member/views/profile.py +++ b/zds/member/views/profile.py @@ -30,7 +30,6 @@ KarmaNote, Ban, NewEmailProvider, - set_old_smileys_cookie, ) from zds.notification.models import TopicAnswerSubscription, NewPublicationSubscription from zds.tutorialv2.models import CONTENT_TYPES @@ -215,7 +214,6 @@ def get_form(self, form_class=ProfileForm): "avatar_url": profile.avatar_url, "show_sign": profile.show_sign, "is_hover_enabled": profile.is_hover_enabled, - "use_old_smileys": profile.use_old_smileys, "allow_temp_visual_changes": profile.allow_temp_visual_changes, "show_markdown_help": profile.show_markdown_help, "email_for_answer": profile.email_for_answer, @@ -245,7 +243,6 @@ def form_valid(self, form): self.save_profile(profile) response = redirect(self.get_success_url()) - set_old_smileys_cookie(response, profile) return response def update_profile(self, profile, form): @@ -254,7 +251,6 @@ def update_profile(self, profile, form): profile.site = form.data["site"] profile.show_sign = "show_sign" in cleaned_data_options profile.is_hover_enabled = "is_hover_enabled" in cleaned_data_options - profile.use_old_smileys = "use_old_smileys" in cleaned_data_options profile.allow_temp_visual_changes = "allow_temp_visual_changes" in cleaned_data_options profile.show_markdown_help = "show_markdown_help" in cleaned_data_options profile.email_for_answer = "email_for_answer" in cleaned_data_options diff --git a/zds/settings/abstract_base/zds.py b/zds/settings/abstract_base/zds.py index 067208c777..0c6bc107d6 100644 --- a/zds/settings/abstract_base/zds.py +++ b/zds/settings/abstract_base/zds.py @@ -137,8 +137,6 @@ "users_in_hats_list": 5, "requested_hats_per_page": 100, "update_last_visit_interval": 600, # seconds - "old_smileys_allowed": False, - "old_smileys_cookie_key": "use_old_smileys", }, "hats": { "moderation": "Staff", From 88958692b96b2e5dd9ebba414894fdefb48cb0b9 Mon Sep 17 00:00:00 2001 From: Arnaud-D <35631001+Arnaud-D@users.noreply.github.com> Date: Sat, 26 Mar 2022 07:48:21 +0100 Subject: [PATCH 2/2] Supprime les anciens smileys des assets --- assets/smileys/old/ange.png | Bin 888 -> 0 bytes assets/smileys/old/angry.gif | Bin 4155 -> 0 bytes assets/smileys/old/blink.gif | Bin 719 -> 0 bytes assets/smileys/old/clin.png | Bin 698 -> 0 bytes assets/smileys/old/cthulhu.png | Bin 411 -> 0 bytes assets/smileys/old/diable.png | Bin 752 -> 0 bytes assets/smileys/old/heureux.png | Bin 669 -> 0 bytes assets/smileys/old/hihi.png | Bin 682 -> 0 bytes assets/smileys/old/huh.png | Bin 687 -> 0 bytes assets/smileys/old/langue.png | Bin 705 -> 0 bytes assets/smileys/old/magicien.png | Bin 964 -> 0 bytes assets/smileys/old/mechant.png | Bin 683 -> 0 bytes assets/smileys/old/ninja.png | Bin 628 -> 0 bytes assets/smileys/old/pinch.png | Bin 681 -> 0 bytes assets/smileys/old/pirate.png | Bin 775 -> 0 bytes assets/smileys/old/pleure.png | Bin 706 -> 0 bytes assets/smileys/old/rire.gif | Bin 339 -> 0 bytes assets/smileys/old/rouge.png | Bin 828 -> 0 bytes assets/smileys/old/siffle.png | Bin 709 -> 0 bytes assets/smileys/old/smile.png | Bin 690 -> 0 bytes assets/smileys/old/soleil.png | Bin 663 -> 0 bytes assets/smileys/old/triste.png | Bin 685 -> 0 bytes assets/smileys/old/unsure.gif | Bin 513 -> 0 bytes assets/smileys/old/waw.png | Bin 851 -> 0 bytes assets/smileys/old/zorro.png | Bin 777 -> 0 bytes 25 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 assets/smileys/old/ange.png delete mode 100644 assets/smileys/old/angry.gif delete mode 100644 assets/smileys/old/blink.gif delete mode 100644 assets/smileys/old/clin.png delete mode 100644 assets/smileys/old/cthulhu.png delete mode 100644 assets/smileys/old/diable.png delete mode 100644 assets/smileys/old/heureux.png delete mode 100644 assets/smileys/old/hihi.png delete mode 100644 assets/smileys/old/huh.png delete mode 100644 assets/smileys/old/langue.png delete mode 100644 assets/smileys/old/magicien.png delete mode 100644 assets/smileys/old/mechant.png delete mode 100644 assets/smileys/old/ninja.png delete mode 100644 assets/smileys/old/pinch.png delete mode 100644 assets/smileys/old/pirate.png delete mode 100644 assets/smileys/old/pleure.png delete mode 100644 assets/smileys/old/rire.gif delete mode 100644 assets/smileys/old/rouge.png delete mode 100644 assets/smileys/old/siffle.png delete mode 100644 assets/smileys/old/smile.png delete mode 100644 assets/smileys/old/soleil.png delete mode 100644 assets/smileys/old/triste.png delete mode 100644 assets/smileys/old/unsure.gif delete mode 100644 assets/smileys/old/waw.png delete mode 100644 assets/smileys/old/zorro.png diff --git a/assets/smileys/old/ange.png b/assets/smileys/old/ange.png deleted file mode 100644 index 20ae0c10f66f801184d43e68f253036396c3a1b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 888 zcmaJ~+245RR1VoL?lm*RuNRc||p77GuEz_3tmFi*?ZO|rW zdsM{IU;-5p5SIpBQV2mbMu}sIjv8A?uqK;C6B9M9Rl=4H%`)Q5_4*HZll$X4Ip=)m zobR?v_MN%fPqhGmTw8Tz9lF<`ZKMeRu$-ZDmk}Tv#aa=7D~T;s_!YvO-|F<&AM*N- zxsND7^c-qXc-ujDqf)21J%OgAQjVOwQjKhlHGeUC{!0kQ;GO;O-eGv-J9zyY_^1{B z@grOuf^)s_!3j9N5B_x#-g3iq7mOc-zbf$GpW)jP_@o`q9D6Y+!8e!Sd_R1422T6C zySw4LQFzTcJ39*@L_FxMU))Zjm&IRauSf9X3*@FIn*hKM*eXT&_~QmimL-{_`6bo> z<)Bo6cLf&!76(QQ*{CKeU{ygwXXBCxz(}Lp1vCW7oE#h|ztYh?GB9BgfVmwfnNH2a z%Q2b}_|aeqQ;ZCWjRoB9Xfw)pE$%tq$7NUy4~h1@qFU<^_vZ8J?KzV;2XK01dFLs++VDKnn1;1MbLFaH{Dw(`H zLw{!SZ5KexJb7zJn@w!lp<*Q@BMA4w#X|Gs>J1yFEK8e91t7NmSJv11sBe$C0?i@s zxi_0Ndd@1u;#YaRYBHoV>9mRL4S2+v^F$aU86x$I_K3Da!1Akj!lXqpI$!5W6URnt z5PN`rq2Xxttqw=UTiL?H=ATaGY$gH8RI;gUQOO~@o<7fHBA%=ZyiS`3!{HB#)RTHQ z8|mtDFg*@e*6Wo!Pt!pI3L+vFjh!oSg%XMBqt#dcPFU8VhFgoMO{L~&Q9*(I2b~e~ ze!izFwpF48uu1qcXGs4ntJfPNuExAHL9vk{B(hqFFJuhP@v?E&*}JG>Iyt^9e4;FL z6QCi^Z`+8stzWgO_yS(ouTWf`e&It`8ef?!I^BZzV=-=fz4{K9IbE#-vh)&SMUG; diff --git a/assets/smileys/old/angry.gif b/assets/smileys/old/angry.gif deleted file mode 100644 index 61e726b7588a26a04e591e5315911b111a967d12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4155 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 Rd?xa1byz7(ob}FL{{Y(vSt|el diff --git a/assets/smileys/old/blink.gif b/assets/smileys/old/blink.gif deleted file mode 100644 index d945c390451203f561988f4066249cbc65fa14c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 719 zcmZ?wbhEHb6lM@+xXQrre@oQ=;|2eJuKa(u^Z%jiXsc!R?%Lox>(vG`Py} z9Cbg=QS72{?cyc=JDD9@B%)8nhRD2`7L@7!(!~+%0iZV+bXXWz7`PeOfgaETdcZ?M zqHT7HMzW#bw38X112|KxZsc5(@(o(S&okwwL5Sdq0Lumsj%I}a5!#i3+HYtI_0H|z oBPkuYq?NeO%H3W0rY|MegFUf diff --git a/assets/smileys/old/clin.png b/assets/smileys/old/clin.png deleted file mode 100644 index 37025dca1264f78f90f26d420a65b8f1ab2fd961..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 698 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S%)r2C)cGv~$YDu$^mSxlSbxHtwd*C2FInOm zQ4*Y=R#Ki=l*-_klAn~S;F+74o*I;zm{M7IGSvpCC?~)t#P$Ed%>P@W{@-l*|7ynn zpDX|0?fieS=Ks67|M#Z;-x2@+NbY|i__p-_uEhVp*ZhAn@&DEO|L4m8znS&_%i?E? z0{%bj{r`E_RW&(*b zf`p$r~AJb8L_N2J}cG$=?Ksb z*ecY)0<_D3`v{Oy@NS$t)6+3h5~ObF(o?vWWf@JBTDLu zOI7rb>#b8!R^~Nf1X%^7(7l=$xr#U}R&Ep0298MDsx| QFn$?4UHx3vIVCg!0Eg`)oB#j- diff --git a/assets/smileys/old/cthulhu.png b/assets/smileys/old/cthulhu.png deleted file mode 100644 index 71bd36369cf72a31e90392d475a89399819ebdc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 411 zcmV;M0c8G(P)P000#T1^@s6vnxdy00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qRNAp5A0003BNklk?qX;kTusS0AE`Q<>xYQzDxJojg;J7c!qE ze|dK3oO8mYD(jvhJD?1O3dEiyMcDym2uPC5PfI!xyc38rbUG2`rzMoD1eq86JnuSX zDE#Xw&3W$l+$lq$g5T$J7U;~m@VU;MLm7&$xTD`6%L~AuD3HMPwRQji002ovPDHLk FV1g+Sr*!}T diff --git a/assets/smileys/old/diable.png b/assets/smileys/old/diable.png deleted file mode 100644 index 4b80375bd07d640625714f3974e620a86b1a176f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 752 zcmeAS@N?(olHy`uVBq!ia0vp^!ayv>!OXzGnBExQ`2T9g z|824V4`%-Vx$^(Jx&QBW{@?*$7#yzvWt+S9?Ag@Rv}w;CporlL4I>T>?awDQR)M58Y0O?U zX_8WR6Hqs!>(r?Y4v~SZ3Jng=G*6#oECrbzAbq2t66C0W#E`I%fRMBhpfeS^+o!iX zPXZ~Gm{Q3yMRJO2UU0^I^}api-D1)XxgGVN*9D07?`Z*3%UR;o}jAFv?V~2WkC*5tkclw zl=0@x#;3VHpY--%I0_7cCDUCwBv^R%oH zc~^tmh}%#@OH;dff|B<3ra2&g9<^|pIkmF&N9#zopr0GLWLPyhe` diff --git a/assets/smileys/old/heureux.png b/assets/smileys/old/heureux.png deleted file mode 100644 index bce7432d47a2e369f6cdf9870f6d9473751a9eeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 669 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S%)r2C)cGv~$YDu$^mSxlSbxHtwd*C2FInOm zQ4*Y=R#Ki=l*-_klAn~S;F+74o*I;zm{M7IGSvpCC?UWn#P$Ed%>O@E{(m*&|F+ow zcRT+dFZlm%?*E%D|F=Z_zgqwQV$J_26aSwp|Nmw2|KDr=AIbgyX4e0`ssFz%{l6>m z|Bm?o4}1TgF8Tj|!~ehQu21*=zbRrxnbosJ0ssI12igE6B^L)70$B(t59%q#-Ub6A9%Z5$X34LXaBPcX6wFt1*-rUxj%Xj*XMBv66Jv`*hC!Yf!5 z8YG^usw`1eT^hOc2_sX7V_&N$8^@9*PZ)sgI6sMuo}LABK>DsSg`RHo09whg*}(^B z(WWIgXWUr&^eITsyhx`x{jJ_Xav;+ro*q$+c;W&!z|A9O&cw;{orQoBDLYaRxOp)F z-6k_#hr{C}&{55MmKby>YVr#>C<{9 diff --git a/assets/smileys/old/hihi.png b/assets/smileys/old/hihi.png deleted file mode 100644 index d1f178a7dc4fe6216d02ce1cd802b14d7ce2b6dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 682 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S%)r2C)cGv~$YDu$^mSxlSbxHtwd*C2FInOm zQ4*Y=R#Ki=l*-_klAn~S;F+74o*I;zm{M7IGSvpCC?UWn#P$Epmj8D<|NmV1|J98D zTcZB&P5pnh{{O|A|4%0Ve>eC4?=}B-CH_B>`~Tb0|L4m8?}-2ZX4bPs0sp@&{{OJ| z|K~;jPnY~ZnE8KO?Em8h*Qa~`|GV!0{|zh3tp0C`0NU{X|Nk{}vRi>Hg_0n@U?3MC zV2Fv4ehc)|5>FS$kcwML6Q)mQ=TKm?%#3Vc0CJ{+IF*$k_9O<7xEYA~d}`7JW{`xL zVWeRL0~6P&lc$+k1e)iFY@T7`z+hTv9vIMdsqDLO2S4#K3q&;kb&fx~lpqeRiNk)1FJ0d~$4b zCV?bQ96Wvcz$txgPM}25n>PxJQ=c*bt&E!_ov~%j5}@lEeI`y7WuC<(;J`5%Xk(7- z1l}nVrZz@s1MNtNEL2p}Q&UWHW3%&|paJwstcJ3RDlbcrQcq5e%_E~Cu;uE?2UJv* zb#;|h4eC4k=*|`TmHY9_5aDl|6dmWKUe;2QNaJ-Yo<(@^8aD) z|I;P^KQH>fCF=jS*#8GJ{~s^-|99R0{~NAP_g+zE^?y^u|NsAi_5jH$jpYJBmQqQO zUoeo1A29GF!NdX}NEF21KtgMy|3`q=^7#NQ%SivFSz!NkH#5}+S zWOls?;^G4FPG~8rGYU93II_CBHZU-0B~AeAWy@scWCiM;@I-uiFvu`hOG8$Wf|EuC zT$`DuGO!3VEA>y=vd3oik~vBa42Bv8#vGqKHk~}F36#1JV^(NrX(`soPJ$$ugoRIJSc04uFeQ;$N>_a`&}Rz4PefE2mI37tr2yR+&7N|aDfEQX znoyw2H>|OcU);nb&unbIpT|Q)p`k%<%G1e{*qAf})52Kw3L`;|ObVFrG?Ar?Q`3V} z^Mkin7qc$|C;%Db{M;spTRwfNs&b_9n-1PntKBmbsu z@1|B}6^1XC7i@s`-_~Y+!t5N?=PZgTe~DWM4fF9r{A diff --git a/assets/smileys/old/langue.png b/assets/smileys/old/langue.png deleted file mode 100644 index 1bd7892e233445371f739fe9bec102563568ebad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 705 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S%)r2C)cGv~$YDu$^mSxlSbxHtwd*C2FInOm zQ4*Y=R#Ki=l*-_klAn~S;F+74o*I;zm{M7IGSvpCC?~)t#P$Ed%>O@E{@)h+|J~gG zcRT;zZ2A9t&Hq<3o-GRaei_?)yFT6f|E7rl|2Mo}-n^pB3TWH^|Nnp2 z^Y#H*DkVXF!9Xq{z!0Is%M0}5YEKu(kcwML0bxOG913izm6i<*Ku!RNlbQ--PngIA z5>EsPKbsgD1mdN-vZ}H*FfegxX=*dG2sBTcq|=z4AvwdHDT$AGv`*VSi>XWz;nvS$ScR|&Zbigj7Jt6S)rkSc#+0R z7NCTT&8JU2Omk{B0VNI`R6Tn5l)kn)H&DXs&Lu7{E{Dw^J0rsa9itor!z2|N9F}Ql zX)yURawtqV>Ez|)Af(W6;2L9Y;FQUegIgk21MNzvp2;G4Q-bwoWQ1#q<01w|mXd{w z7W7P7v}aO}Q1>Ds^~sASfqkm^$%v^|SzrI~87(E%qbw$jAP-sWn9l<$`Wu6#o@6Ran)aA|7CXqo)SnGZT@Hqt8}@?cAhQ4f diff --git a/assets/smileys/old/magicien.png b/assets/smileys/old/magicien.png deleted file mode 100644 index eaf112927334e7cd7f5065e563cd78b609de988a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 964 zcma))@lO+H7{}lCuH^`d2opuOLGaxNE=g`b6((MY0wX~#)bZyfL*Vr&wH(au0 zSEvaBDr#2+=W-66bYeBy8m4Y(2^(D?#A-$D*bf@mlsJD<6E~N4PqTkum)yPgym_DJ z`8?n6yWdd%fh=2*jS!OQ*%~9P3V4@O1VWhQ!z7+=Iw2*)}6 z+y0;%;m8jBPZ(cm#{CHY;KEn!c-+%5@&|qq!neP`(I%Yy96uh!bBFOg|L@-z@aTv5 z`5Eh%N&Ms_p7i2{mn?bgK8!I?z&E(S*x|3# zYpid8@c%w&V&;`Tgv1B+HCof&wByFi%uOk!l6pKc50Aw8?lcmO3+I12E1?-CxRyaa zHG?#*=RzWq?h1BS!N%P*BUbTp`QC{6?Nmf0rV;^L-du~AQuVJJsv64V%txcJU&C=6 zLDJnu^Q}yaWm1n!3QZhnPb!7P6szal?P8K9u3e!nU(Hkw3}4P9n3fwP-H1}jx0*L8 zSU3?lTO!1TGv{SAWBWSzT_H8h0gnI8MA3y%$y*^n%}qZZOXoX`#s}ArENn(1GC46m z5ekQ=PeYEn(wF9o85IAMAb3=r@UcAV{532s0>)kIyAYeN;%ysbGI~*FEKA&)x`9?p zfVgp4qmZXy&>Bj`$J*%@cPN9`wKmIgOsYna%&do93aKXuG0xNOUU;e6kya*lCjAmJrCp zV8dv^s&ey^*c(Ky()N`bh-aBHvkED*{0gC;0GrfVmY!_`y%M=|=ip#<_RHD69bh|o z^roZWRk9Xbb91ZJl^>t0bc4*qnsl^y+{w4^?5TKgY4`5gnDZ1U9y3jsmySqMC1d5` zqMyshrgE~apVYr!2LAGrZwpr_H*Qp}Tj{H~&RhfbC%HoLV)k8{t*G>wfT)(?I8B8{ fqp9voN+~t^ajLEGz0~AOxY0 diff --git a/assets/smileys/old/mechant.png b/assets/smileys/old/mechant.png deleted file mode 100644 index 1113c1908452617b0c584b30b6d604871305ece8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 683 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S%)r2C)cGv~$YDu$^mSxlSbxHtwd*C2FInOm zQ4*Y=R#Ki=l*-_klAn~S;F+74o*I;zm{M7IGSvpCC^^6<#P$ES*#BFi{=b^>|L4m8 zSL^>@toeVp^Z&P{|BvMUzuEGCSK|M@ssG>2{eQ0f|L--=76tr&GV%YH#s7E2|9>;< z|HIxXQ>OesUGo3$y8j0=|Nr0c|9HXm>E0{Ktp0C``2YVu&=Medg>AJCkfm4>#=M3;A1m>fvz$<8N|sZV!41xj(O5L*!?=fcDy zz&wLB2}n&)J$(3x=Hdkm0uDS}JdZxrd|Gpfi-GZo!g(D{b$xX;6@H+^pEr{}6@8NF zxdfCrpnu@pxs$po+PpxCPixjFEKYsO2(;31R=41Z31LA0P0-x5Nys4>Xj!6>14H9l z=1q-4n~VgqLDuV>Ryc9yxXy_q$4+YV3bAr1EZ|OMIjX9f`sC=-)QAd8iIgWGWiMhA z(-zEFv1iT-oApyfm@lvZLutZu@dt@)l@s0l{G6H?GuGPx!{O@2O@&2 zq@fIStiop%3k#Jejtm+{cun{f8V-E(Y8GK=oFH-|u7ROxw|`WW)HAyV24)7CrAqUr T@;$l*j9CUxS3j3^P6!OXzGcq)^3K9Iwb?&#~tz_9*=IcwKTAYZb? zHKHUqKdq!Zu_%?nF(p4KRlzeiF+DXXH8G{K@MNkDP*FmFPl)UP{~P{qiunI`-T&hS z|GzE$|7OjrWZN`m}?fn0om zAtpxpEznPSo-U3d6}OTmOrOfmp}-ay>DIsi4h(NNdt7jSTh-E(Qp8K<62n~FfP41ugc>gqso1@5P*2d$nwWn}7LJkwUhz{GKa zaWzvhkj`K}krZjbuh1Zoa3Jne4Hf-?dWKeBr zV+KlHky^m~G=-6g;}!RULI+<4#+D=#2Zn_aTmlXW&lz?K)CM>TFmNbr(6VG{@CG{B zV#*AOh6c}o8Qyc8#nQwa7z|H*+PI0ixglDtWyVZP$)70)Z!s`+I8Jl-5m8}g%E_72 z)AMIj0yEHtHwlp}4HmK*%mNNP8ez_B*s~cq6n3muSatANvo4T1=N|)y0fUgc{`=sb Sc_)Ce#Ng@b=d#Wzp$P!k#{N$L diff --git a/assets/smileys/old/pinch.png b/assets/smileys/old/pinch.png deleted file mode 100644 index 7c2d57ad082ce888c99b9df9fe4bf155a1cc49d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 681 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S%)r2C)cGv~$YDu$^mSxlSbxHtwd*C2FInOm zQ4*Y=R#Ki=l*-_klAn~S;F+74o*I;zm{M7IGSvpCC?UWn#P$D{sQ-66|NmV1|7Oeo zS2O-!toi?L?*HFw{$H*Czbotp0C`0NU{X|Nk#5`l5g=g_0n@U?3MC zV2Fv4ehc)|Vow*xkcwML6Q)mQ=TKm?w2W+E0CJ{+IF*$k_B3XYI3I}ld} zY1qKP#C7WAX=WCI<~b(aGi)3f3^$xO*?E!?D8RCP#~Ppjqp87(lRyO?(^`F}Ft1=y zXpnfqy7Z|^>r<7Kr;JP;j(rnbV*{Fk!@~GLQco?8Ha`0d))Al^uvMmm1!%JY_Yoka z;N8~S8tE1%2U2%*sp?J1$fZxfCU^z~%?fPs1{v_9;^~taPo79DVPNWL?4Lh<`pkCk zFfNdeh)74b)2Bc#+asdhJZH_CDL~gX`b?ZE$~=onz=2~jBNIoC>;&E^6Q(vsX!8p= zBt#Y}s+FlJin*obX-?1pdL>pvSw)wV<3VtQ&&YGO)d;mK4RprVQZpAgp#M*J(vtp4Ba{C~XQ z`gHIA|2JH{dez?6_W!}m|68N~|6TWgOVt0pssFz%{l6{t|IL>FPbNNF6!8Du-2WGA z{=b^>|48ottM&hPCI0`p^8cGz{~z{FnKI@7>5~6D;{ShM^#AvoBc^<-R;{{s@817S z5hq<0{{R0Ev>8Y${WU5FvNTG9{DOg8VgSRwReBOYKR@(zaSW-rl@t&j&d#C0R%&Y6 zz>pM>{+JQSQIJ+>khpSX3IkI|W3#WILPJ9iD_f~5NP&1zaA+74hk`=?#K5_n3Jnfi zSFT=RWa3y6=jiLp3)B{J#eo4xvFvQIxN?O7C^50u*H;#3M3GL`oL3BtEMc5%SzbWK zkp+v^9b2$y5!00=OV|V)cwY4gWxdI|bf(6E&w+u_(kIC0OwFoOV9wVSh1%NM#;aEv zu4HBrn8XOw-IB0+6(fs4$J%8F7OVdea$qoA!RfJK)yLJJ7;l0sS39#_?abn3$JVam5O8pq?HU>ydh?2e=vAPTGt|0g zZ8Ey>&?gJ%T(kMDuD-Fo!9c$Wd{dHH%(X>Qq2a-!gx?Dud1ZmT!H~uryPT;=l(~aj zBs_!}7<{Gy9*uKWF->Od20F%NPPZt>jwd0ZsWVci9()8ek;mClFitP5tjyGu(bP1M zFK>axg`@@srcPtdjt{3kdwnwg+`&ATCy-yjVL?N(m>Bae-Z%B3rm1|U3pQ9eFgX5E z;u8*koY-g~q0pf4EO1*ZhCj`+ryBlqpkGf?obVUGjfh?Ek;({{P=_eY*FGGOPcaBL4sX53~?S z`fSp=0c5F`1o;I6xdZ`&{dp&Upg&i5x;TbZ+)4@v3}fU_U`tJPZD0U$LO>i*Q6PIl zC=*CL3?%$8I4q0}BoXH3>ej%(#HF=*1p|vfK&R1SE(Zp~4ceYYTFfj0%)?cb$eALc3``x4GiT2A?(+5u43q>(O;Js0c=lNf zq$5B#V5?CF3(zV9?jt}-!Mm|NHp0=B6{IdDW$Mu>H=jUEaP{+>7CFlqWB|*LCn{5? zSV}%&1RC8i+uy^p!#Pk6C^6;cjTtH;jcGuqHFxbXYTmSH(;lGn8hrvoQdnj&2{>>} zW@O^Xk)6OhB_O0BVl_}CAyU#&%uvj+EG@CFa)JiXFR?2WG*;`dZwZ<*GjwLKn`0!% zEmK5YA{zDu22BbLdX%0tiE$Q#fCJAdraLw|n_^C#@;Y_OsmG|R>(eO)MwXD{$8>bg zojr5xi1uNIEgg=IKqosqGb}37(k?d8V6t6zg4={&q2a){Q_Ug_jO@ZU;u;v5cKgT0 g$vv}cU|?nlXjfbD%5||eFp?QOUHx3vIVCg!0R3SlhX4Qo diff --git a/assets/smileys/old/rire.gif b/assets/smileys/old/rire.gif deleted file mode 100644 index 237d431ad44791be557c9a8efc1b3b3c0805351d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 339 zcmV-Z0j&NnY5%re|Hp9GmrMWsuK)kA zsCGL4vRD8B0RR90A^!_bMO0HmK~P09E-(WD0000X`2+00000695wc00p7o zCyt+Inq)efT<3DADtg>-+!a8;vUf=WMQ{<&WjrY#Lc?SZiU!MZRcmgp6KLYXD;VPo|d}sx?4%+nKE`|1TXwm>x0YALp(ZkRg=sNYWJs%pi zaGms5?}9tUaKG?vgAzQ)q1gZpWdH%7is4NyOkH$3osejT8TV(m3NGv6T|KQHWg>GxEI{@=uxf^ZFCV| zW$_dim$|CX<)#zSbVqy&S4h>Nkc)Gd#kcbk-z)nQiKz8JGKF#F+&=mA;A{2O+SYWw z-F_(&lS!k;qI8F1or21~!orVjNDpJjABhQtldosH5e z26b3bQJSvE+ueO=PY;D<2YR-qcW{>1*{}HsrgQIT$ zy*Avq5$vO=AVs|=C+9RHt}w&GZnW8K9*c!xv9#RR&Rd&t7^Q?mPs)a$jgGD}4X+vT z>vZAH$WSU*D4eyfc$IW*39tCswK=)nHI~HE2&2E*F_2A2Pq5D=QVG86w=;{!bGFYg ai4EveS*~~4K<*v<8<0#Q7yEV}IsX^pG@D8Q diff --git a/assets/smileys/old/siffle.png b/assets/smileys/old/siffle.png deleted file mode 100644 index ec7e85fd78679593a1aee389c27a01cd338f35b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 709 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz6!OXzGcp>zyAdth7?&#~tz_9*=IcwKTAYZb? zHKHUqKdq!Zu_%?nF(p4KRlzeiF+DXXH8G{K@MNkDP*Hw>Pl)UPgPH&DcK*NF^8a|j z|1DAff3Ez0q5A);8UK&u{(m?3|L-;bzb*a$Wa57y*p>KyZ|bu}0dJRw{@)S*|I6b4 zSL^@3nPqBfI%Ud~Ckq1ppDy|Tu=oGPn*ZBkSCm=(|GVz`bnm65Hvj)`_`fLvXd%#y z+*spEAWO9*$S)XVCLzFJf8NO-=+D)jE{-7;w~_(^!x%Xf*iv0p8yJ9`AT}UJR20ab zkPKp`vVw#kPD_SJ2(qaH1(>+BR7)HYRb=)h$&N8 zo{BOsajXzq5hdxu1T<>~YZ{Q6pm}=b85QmnAhWrvXO5EiVv_(Fpr$F2jcJBj+?pV3 zni;k)Qd-Ty-n|Fp7>*AG#l|1GH6c<)($XiGR1H%>-kA8D`PKrJ^$U0e92^ddOqrr0 z(%=Sk^(0XSMwV?7CnmCLO={&>3G!J)oZF14-jOrrPUKuAq|nf?ZmKBTFQ>r3n3+K2 z>?WoGG=k^UrbTNK9OL5D;^NXI7bt2mFdkW;bKo$i$kfM=QYNJ&Okj*!zlKS`;lP6A zt|&u~$kx(Ez%IY1YaE2M!)QpwA-6xGTaD7zziropxqrdHPgTL}W@RFdUxw ju~sf%I5U@lk&VHqTVr7aFKY!bo*6t{{an^LB{Ts5q3s_L diff --git a/assets/smileys/old/smile.png b/assets/smileys/old/smile.png deleted file mode 100644 index 4771bca4c07d6351c8a3cd0ac0b05942248383e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 690 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S%)r2C)cGv~$YDu$^mSxlSbxHtwd*C2FInOm zQ4*Y=R#Ki=l*-_klAn~S;F+74o*I;zm{M7IGSvpCC^^6<#P$D{sQ*7#{(m*&|IL>F zcRT;@P5pnh{{Oe7|98ayzgYAC-Q54@%K!gf^M6<3|0B8o-^}{|Wa9rXi=QnD`2VnX z%9JVpPnY~ZnE8KO?Em8h|Nn3J|99Q>>E0{Ktp0C``2YVu&=Mf|L@|3Mkfm4>{11Qs^~2`5ZXn#K;2 zFf)uaY+zvGI;E|_z#`DRM`ZF0CI<#X1J6^PCz*i)EZcXi0SYjh8l2DuD)5-r={zCpcKanu@zBrE=()} z%rjV%fYb!l!$*(kEMCAM;K0N6C}@(6&YVkJ42(w<&TD8Ysq3Foi=reJuDDx~P0SAuBj7%Ik zvJ-fxOqkjju^MPeLS&(%o1B}Ynpj$1<^&C(Ut%?sHB>b<)zwwij~_d$uBW^nTIgZGn}aSXv^Zm>*|YA=?61 z9-~hTj4Vd}J^lXkrZQ_N=xd+mGT~QfIPlG@S%iVHo#jSc14Gkp|EMUbXLbz?%nYpZ WO6d!BJW~cnFoUP7pUXO@geCx?m=xFm diff --git a/assets/smileys/old/soleil.png b/assets/smileys/old/soleil.png deleted file mode 100644 index ec9aeb59cd38f6078cc1b83c3c0f1e700050e3b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 663 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S%)r2C)cGv~$YDu$^mSxlSbxHtwd*C2FInOm zQ4*Y=R#Ki=l*-_klAn~S;F+74o*I;zm{M7IGSvpCC^^6<#I-P3@BhKf|F35J-xmA- zV$J`%o&W!?`~P$0|C=rUj~D#k67~Pv(*N(~{=ZuPe{bsl-)sKwN_@5`;QyD!|DR0! z|7O>%+tknn@F#}hz2 z*0@MZw+03#u2b3?3@if8Hqye2nH(4l4NiJ{pJrweU|zmv&KjTqqiMlOZJ+{=X`Stj z;wxAb8YD!XEOcN5(oZ61{&2NmO-Xse$i$(crJ${@ep-D!gMfp>R)?#f6oi0E4(JF7 zD>O9dM9QhLMS|TDkdP+uG(B}<7}%+mmIjkRu5rw(tSqan)XM}qQ9$I`vu6*4Cr@Mp zIa*9Ca=}ESPYjGl7AWW{u%~!{9CJcMQqpaKCIe%OfuusifoqI69XKT;JGOE$FtSWb z6-!D;5Kl@<6`0P}$;2XXp>>nfCyoO;+90R#eA=Y+CSjhA3r_~fwr`~POk|6Pgy_on_oSN{Lq-2dN}{{Ol1|Ch!8pGOesUGo3)qW=do{~s^-|99R0{~NAP_g+zE^?y^u|NsAi_5jJIhqq?{SxO~A ze!)O4e!#$c;cy|)Z}UA}978H@B?W{8uy81_v9ek=FeC*`2?lXoU4iTglfdF)AmJwy zg8~>p5@MW|oDB?2Tv{4hOe_KcoU2=u92g8YcxiiRFt7+TtB5zx0SYjh8fa+%W0LWFhclBZ82Ri274GIcmMc80nHOmg<~V+2WwT8KzI6|oQnN^z_ZTM@m4Q(aQu?!J@VwjiI*0Z9!ozQ7F1X#*2JXsH$|b@V@A=1JUh>Pr^9L7r&!Na zM&=e<%-Wr#bh4nEBZ*f=POha*oRLR1BZNP(T~uCfl1!IufIMGVWviQ}5P^SAE7e}xk7(jktXJBVwV_*XMf$PAjE8d37yQ3k|9?x= z|824V|E~LgxAXt28UKH-{Qqw5|GlaIFV_6O+46r!{Qq<1|DR0!|842BMFIc6EdKvy z*8g3JQ>IM$|FHM}=SBaI3Fl~lMzVSffL7-mV*Sk ziX0+AhH3@^ZI~cc=4Ys;Ags_JA<`PTbm`HV5>G`KnK};6>y3?@5g6xpPEMhr;gn0n zjHgd_yb)z&;#eWJf_;g%phAO#Po$(|qynpeLqMPcC(!=w&{?}noFNPU0O5e z)2E&u9S32ca}LH$m_OP1-o3ba!Y&&a?k4dAeN=iU$0q4d&Yhl^1r8IEr)^~i23Vz$ zkdRSKi~?iA0fw{8910uu@;KNTC_JfNU@|l`Z_W&tUqDS+Vv91mn?CO zC<)F_D=AMbN@Z|N$xljE@XSq2PYp^H(54~`*I2m3wWH>@^S_B;`H2Vb62o9FgU8tIJ4!;&5G8F z2+7ukLJW*7QwFYk6$l0e;Os0q)ed|yLv?79uC&!WD5Q`^}%^VXW z-1ESQfw5&mgCfYq2UREZGJ#|~4n_E#zvOWBKv1lkm*df6$K04y7zG>@I14K+OM`7K zDCtp_slq=74ut}R zTb>#kH$0n;yvs~`!%Mr<`RH3lCJwRV xWo3_qgoGZI85CAGFf_UEv$dI`z@Tt|Veg|P<5?3r#DG!D;OXk;vd$@?2>=&9QTzY^