From 8ea40c1aafa4df43ce9ad3cc1792c9d1b8b91509 Mon Sep 17 00:00:00 2001 From: Rowin Date: Tue, 2 Mar 2021 01:12:20 +0100 Subject: [PATCH 01/25] =?UTF-8?q?Fix=20#5980=20get=5Flast=5Fpost=20et=20ge?= =?UTF-8?q?t=5Flast=5Fmessage=20tiennent=20compte=20des=20postes=20masqu?= =?UTF-8?q?=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zds/forum/models.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/zds/forum/models.py b/zds/forum/models.py index be6599ec00..3bee9cc2d0 100644 --- a/zds/forum/models.py +++ b/zds/forum/models.py @@ -130,7 +130,7 @@ def get_last_message(self): :return: the last message on the forum, if there are any. """ try: - return Post.objects.filter(topic__forum=self).order_by("-pubdate").all()[0] + return Post.objects.filter(topic__forum=self, is_visible=True).order_by("-pubdate").all()[0] except IndexError: return None @@ -257,7 +257,10 @@ def get_last_post(self): """ :return: the last post in the thread. """ - return self.last_message + try: + return self.post_set.filter(is_visible=True).latest("pubdate") + except Post.DoesNotExist: + return None def get_last_answer(self): """ From 3a8256ec0b972f1a4c61eedc82a5b15243c67c42 Mon Sep 17 00:00:00 2001 From: Rowin Date: Tue, 2 Mar 2021 01:12:28 +0100 Subject: [PATCH 02/25] Ajout des tests --- zds/forum/tests/tests_views.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/zds/forum/tests/tests_views.py b/zds/forum/tests/tests_views.py index e03b61b507..6dca7d5ce6 100644 --- a/zds/forum/tests/tests_views.py +++ b/zds/forum/tests/tests_views.py @@ -1355,6 +1355,22 @@ def test_success_edit_post_hide_message_by_staff(self): self.assertEqual(staff.user, post.editor) self.assertEqual(text_hidden_expected, post.text_hidden) + def test_last_post_update_after_hiding(self): + profile = ProfileFactory() + _, forum = create_category_and_forum() + topic = create_topic_in_forum(forum, profile) + expected_last_post = topic.last_message + post_to_hide = PostFactory(topic=topic, author=profile.user, position=2) + + staff = StaffProfileFactory() + self.assertTrue(self.client.login(username=staff.user.username, password="hostel77")) + text_hidden_expected = "Bad guy!" + data = {"delete_message": "", "text_hidden": text_hidden_expected} + response = self.client.post(reverse("post-edit") + "?message={}".format(post_to_hide.pk), data, follow=False) + + last_post = Post.objects.get(pk=topic.get_last_post().pk) + self.assertEqual(last_post.pk, expected_last_post.pk) + def test_hide_helpful_message(self): profile = ProfileFactory() _, forum = create_category_and_forum() From 55d96626082143e6fc28af2a54259c36a9c89378 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 26 Feb 2021 08:52:08 +0000 Subject: [PATCH 03/25] Ajout d'un filtre par tag sur les flux RSS/Atom des contenus --- zds/tutorialv2/feeds.py | 10 ++- zds/tutorialv2/tests/tests_feeds.py | 129 +++++++++++++++++++++++++++- 2 files changed, 136 insertions(+), 3 deletions(-) diff --git a/zds/tutorialv2/feeds.py b/zds/tutorialv2/feeds.py index b432682821..00011b0e9a 100644 --- a/zds/tutorialv2/feeds.py +++ b/zds/tutorialv2/feeds.py @@ -4,7 +4,8 @@ from django.utils.feedgenerator import Atom1Feed from django.utils.translation import gettext_lazy as _ -from zds.utils.models import Category, SubCategory +from zds.utils.models import Category, SubCategory, Tag +from zds.utils.uuslug_wrapper import slugify from zds.tutorialv2.models.database import PublishedContent @@ -34,10 +35,15 @@ def items(self): if "subcategory" in self.query_params: subcategories = [get_object_or_404(SubCategory, slug=self.query_params.get("subcategory"))] + if "tag" in self.query_params: + tags = [get_object_or_404(Tag, slug=slugify(self.query_params.get("tag")))] + else: + tags = None + feed_length = settings.ZDS_APP["content"]["feed_length"] contents = PublishedContent.objects.last_contents( - content_type=[self.content_type], subcategories=subcategories + content_type=[self.content_type], subcategories=subcategories, tags=tags )[:feed_length] return contents diff --git a/zds/tutorialv2/tests/tests_feeds.py b/zds/tutorialv2/tests/tests_feeds.py index 7652bdd53f..14713280d9 100644 --- a/zds/tutorialv2/tests/tests_feeds.py +++ b/zds/tutorialv2/tests/tests_feeds.py @@ -1,11 +1,12 @@ from django.conf import settings +from django.http import Http404 from django.test import TestCase from django.test.utils import override_settings from django.contrib.auth.models import Group from zds.gallery.factories import UserGalleryFactory from zds.member.factories import ProfileFactory, StaffProfileFactory, UserFactory -from zds.forum.factories import ForumFactory, ForumCategoryFactory +from zds.forum.factories import ForumFactory, ForumCategoryFactory, TagFactory from zds.tutorialv2.models.database import PublishedContent from zds.tutorialv2.feeds import LastTutorialsFeedRSS, LastTutorialsFeedATOM, LastArticlesFeedRSS, LastArticlesFeedATOM from zds.tutorialv2.factories import ( @@ -50,6 +51,7 @@ def setUp(self): self.licence = LicenceFactory() self.subcategory = SubCategoryFactory() + self.tag = TagFactory() self.user_author = ProfileFactory().user self.user_staff = StaffProfileFactory().user @@ -61,6 +63,7 @@ def setUp(self): UserGalleryFactory(gallery=self.tuto.gallery, user=self.user_author, mode="W") self.tuto.licence = self.licence self.tuto.subcategory.add(self.subcategory) + self.tuto.tags.add(self.tag) self.tuto.save() # fill it with one part, containing one chapter, containing one extract @@ -138,6 +141,67 @@ def test_get_item_link(self): ret = self.tutofeed.item_link(item=tuto) self.assertEqual(ret, ref) + def test_filters(self): + """ Test filtering by category & tag """ + subcategory2 = SubCategoryFactory() + subcategory3 = SubCategoryFactory() + tag2 = TagFactory() + tag3 = TagFactory() + + # Add a new tuto & publish it + + tuto2 = PublishableContentFactory(type="TUTORIAL") + tuto2.authors.add(self.user_author) + tuto2.licence = self.licence + tuto2.subcategory.add(subcategory2) + tuto2.tags.add(self.tag) + tuto2.tags.add(tag2) + tuto2.save() + + tuto2_draft = tuto2.load_version() + tuto2.sha_public = tuto2.sha_draft = tuto2_draft.current_version + tuto2.public_version = publish_content(tuto2, tuto2_draft, is_major_update=True) + tuto2.save() + + # Default view + + ret = [item.content for item in self.tutofeed.items()] + self.assertEqual(ret, [tuto2, self.tuto]) + + # Filter by subcategory + + self.tutofeed.query_params = {"subcategory": self.subcategory.slug} + ret = [item.content for item in self.tutofeed.items()] + self.assertEqual(ret, [self.tuto]) + + self.tutofeed.query_params = {"subcategory": subcategory2.slug} + ret = [item.content for item in self.tutofeed.items()] + self.assertEqual(ret, [tuto2]) + + self.tutofeed.query_params = {"subcategory": subcategory3.slug} + ret = [item.content for item in self.tutofeed.items()] + self.assertEqual(ret, []) + + self.tutofeed.query_params = {"subcategory": "invalid"} + self.assertRaises(Http404, self.tutofeed.items) + + # Filter by tag + + self.tutofeed.query_params = {"tag": self.tag.slug} + ret = [item.content for item in self.tutofeed.items()] + self.assertEqual(ret, [tuto2, self.tuto]) + + self.tutofeed.query_params = {"tag": tag2.slug} + ret = [item.content for item in self.tutofeed.items()] + self.assertEqual(ret, [tuto2]) + + self.tutofeed.query_params = {"tag": tag3.slug} + ret = [item.content for item in self.tutofeed.items()] + self.assertEqual(ret, []) + + self.tutofeed.query_params = {"tag": "invalid"} + self.assertRaises(Http404, self.tutofeed.items) + @override_settings(ZDS_APP=overridden_zds_app) class LastArticlesFeedRSSTest(TutorialTestMixin, TestCase): @@ -164,6 +228,7 @@ def setUp(self): self.licence = LicenceFactory() self.subcategory = SubCategoryFactory() + self.tag = TagFactory() self.user_author = ProfileFactory().user self.user_staff = StaffProfileFactory().user @@ -175,6 +240,7 @@ def setUp(self): UserGalleryFactory(gallery=self.article.gallery, user=self.user_author, mode="W") self.article.licence = self.licence self.article.subcategory.add(self.subcategory) + self.article.tags.add(self.tag) self.article.save() # fill it with one extract @@ -249,3 +315,64 @@ def test_get_item_link(self): article = list(self.articlefeed.items())[0] ret = self.articlefeed.item_link(item=article) self.assertEqual(ret, ref) + + def test_filters(self): + """ Test filtering by category & tag """ + subcategory2 = SubCategoryFactory() + subcategory3 = SubCategoryFactory() + tag2 = TagFactory() + tag3 = TagFactory() + + # Add a new tuto & publish it + + article2 = PublishableContentFactory(type="ARTICLE") + article2.authors.add(self.user_author) + article2.licence = self.licence + article2.subcategory.add(subcategory2) + article2.tags.add(self.tag) + article2.tags.add(tag2) + article2.save() + + article2_draft = article2.load_version() + article2.sha_public = article2.sha_draft = article2_draft.current_version + article2.public_version = publish_content(article2, article2_draft, is_major_update=True) + article2.save() + + # Default view + + ret = [item.content for item in self.articlefeed.items()] + self.assertEqual(ret, [article2, self.article]) + + # Filter by subcategory + + self.articlefeed.query_params = {"subcategory": self.subcategory.slug} + ret = [item.content for item in self.articlefeed.items()] + self.assertEqual(ret, [self.article]) + + self.articlefeed.query_params = {"subcategory": subcategory2.slug} + ret = [item.content for item in self.articlefeed.items()] + self.assertEqual(ret, [article2]) + + self.articlefeed.query_params = {"subcategory": subcategory3.slug} + ret = [item.content for item in self.articlefeed.items()] + self.assertEqual(ret, []) + + self.articlefeed.query_params = {"subcategory": "invalid"} + self.assertRaises(Http404, self.articlefeed.items) + + # Filter by tag + + self.articlefeed.query_params = {"tag": self.tag.slug} + ret = [item.content for item in self.articlefeed.items()] + self.assertEqual(ret, [article2, self.article]) + + self.articlefeed.query_params = {"tag": tag2.slug} + ret = [item.content for item in self.articlefeed.items()] + self.assertEqual(ret, [article2]) + + self.articlefeed.query_params = {"tag": tag3.slug} + ret = [item.content for item in self.articlefeed.items()] + self.assertEqual(ret, []) + + self.articlefeed.query_params = {"tag": "invalid"} + self.assertRaises(Http404, self.articlefeed.items) From 39cdb479591dd3083662cefa91505a3abed92b3d Mon Sep 17 00:00:00 2001 From: root Date: Fri, 26 Feb 2021 09:38:52 +0000 Subject: [PATCH 04/25] fixup! Ajout d'un filtre par tag sur les flux RSS/Atom des contenus --- zds/tutorialv2/feeds.py | 3 ++- zds/tutorialv2/tests/tests_feeds.py | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/zds/tutorialv2/feeds.py b/zds/tutorialv2/feeds.py index 00011b0e9a..783d5609e9 100644 --- a/zds/tutorialv2/feeds.py +++ b/zds/tutorialv2/feeds.py @@ -35,7 +35,8 @@ def items(self): if "subcategory" in self.query_params: subcategories = [get_object_or_404(SubCategory, slug=self.query_params.get("subcategory"))] - if "tag" in self.query_params: + tag = self.query_params.get("tag", "").strip() + if tag: tags = [get_object_or_404(Tag, slug=slugify(self.query_params.get("tag")))] else: tags = None diff --git a/zds/tutorialv2/tests/tests_feeds.py b/zds/tutorialv2/tests/tests_feeds.py index 14713280d9..e5f07ea9e9 100644 --- a/zds/tutorialv2/tests/tests_feeds.py +++ b/zds/tutorialv2/tests/tests_feeds.py @@ -195,6 +195,10 @@ def test_filters(self): ret = [item.content for item in self.tutofeed.items()] self.assertEqual(ret, [tuto2]) + self.tutofeed.query_params = {"tag": f" {tag2.slug} "} + ret = [item.content for item in self.tutofeed.items()] + self.assertEqual(ret, [tuto2]) + self.tutofeed.query_params = {"tag": tag3.slug} ret = [item.content for item in self.tutofeed.items()] self.assertEqual(ret, []) @@ -370,6 +374,10 @@ def test_filters(self): ret = [item.content for item in self.articlefeed.items()] self.assertEqual(ret, [article2]) + self.articlefeed.query_params = {"tag": f" {tag2.slug} "} + ret = [item.content for item in self.articlefeed.items()] + self.assertEqual(ret, [article2]) + self.articlefeed.query_params = {"tag": tag3.slug} ret = [item.content for item in self.articlefeed.items()] self.assertEqual(ret, []) From 2f2b880bf0a0dbbe2b78b6469e20ea3d1862ca7f Mon Sep 17 00:00:00 2001 From: root Date: Fri, 26 Feb 2021 11:37:47 +0000 Subject: [PATCH 05/25] fixup! Ajout d'un filtre par tag sur les flux RSS/Atom des contenus --- zds/tutorialv2/feeds.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/zds/tutorialv2/feeds.py b/zds/tutorialv2/feeds.py index 783d5609e9..8e49d958c1 100644 --- a/zds/tutorialv2/feeds.py +++ b/zds/tutorialv2/feeds.py @@ -35,11 +35,10 @@ def items(self): if "subcategory" in self.query_params: subcategories = [get_object_or_404(SubCategory, slug=self.query_params.get("subcategory"))] + tags = None tag = self.query_params.get("tag", "").strip() if tag: tags = [get_object_or_404(Tag, slug=slugify(self.query_params.get("tag")))] - else: - tags = None feed_length = settings.ZDS_APP["content"]["feed_length"] From ea8302e4594d044424d5f80f51e25cd0f7544c62 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 26 Feb 2021 11:38:52 +0000 Subject: [PATCH 06/25] Strip des valeurs des filtres category/subcategory sur les flux RSS/Atom --- zds/tutorialv2/feeds.py | 10 ++++++---- zds/tutorialv2/tests/tests_feeds.py | 8 ++++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/zds/tutorialv2/feeds.py b/zds/tutorialv2/feeds.py index 8e49d958c1..0302a8d50d 100644 --- a/zds/tutorialv2/feeds.py +++ b/zds/tutorialv2/feeds.py @@ -29,11 +29,13 @@ def items(self): :return: The last (typically 5) contents (sorted by publication date). """ subcategories = None - if "category" in self.query_params: - category = get_object_or_404(Category, slug=self.query_params.get("category")) + category = self.query_params.get("category", "").strip() + if category: + category = get_object_or_404(Category, slug=category) subcategories = category.get_subcategories() - if "subcategory" in self.query_params: - subcategories = [get_object_or_404(SubCategory, slug=self.query_params.get("subcategory"))] + subcategory = self.query_params.get("subcategory", "").strip() + if subcategory: + subcategories = [get_object_or_404(SubCategory, slug=subcategory)] tags = None tag = self.query_params.get("tag", "").strip() diff --git a/zds/tutorialv2/tests/tests_feeds.py b/zds/tutorialv2/tests/tests_feeds.py index e5f07ea9e9..bcf158bdc7 100644 --- a/zds/tutorialv2/tests/tests_feeds.py +++ b/zds/tutorialv2/tests/tests_feeds.py @@ -174,6 +174,10 @@ def test_filters(self): ret = [item.content for item in self.tutofeed.items()] self.assertEqual(ret, [self.tuto]) + self.tutofeed.query_params = {"subcategory": f" {self.subcategory.slug} "} + ret = [item.content for item in self.tutofeed.items()] + self.assertEqual(ret, [self.tuto]) + self.tutofeed.query_params = {"subcategory": subcategory2.slug} ret = [item.content for item in self.tutofeed.items()] self.assertEqual(ret, [tuto2]) @@ -353,6 +357,10 @@ def test_filters(self): ret = [item.content for item in self.articlefeed.items()] self.assertEqual(ret, [self.article]) + self.articlefeed.query_params = {"subcategory": f" {self.subcategory.slug} "} + ret = [item.content for item in self.articlefeed.items()] + self.assertEqual(ret, [self.article]) + self.articlefeed.query_params = {"subcategory": subcategory2.slug} ret = [item.content for item in self.articlefeed.items()] self.assertEqual(ret, [article2]) From 469ad1ac7fed78be91065e4cd281b7f83fd9970f Mon Sep 17 00:00:00 2001 From: root Date: Fri, 26 Feb 2021 13:39:23 +0000 Subject: [PATCH 07/25] Relaie les paramTres GET de la page courante aux flux RSS --- templates/base.html | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/templates/base.html b/templates/base.html index e07401a647..ab7c52bc0a 100644 --- a/templates/base.html +++ b/templates/base.html @@ -126,13 +126,15 @@ {% endwith %} {# RSS links #} - - - - - - - + {% with request.GET|yesno:'?,'|add:request.GET.urlencode as rss_params %} + + + + + + + + {% endwith %} {# OpenSearch plugin autodiscovery #} From bc023846017767e1f7bc1bee47951da24865fe2f Mon Sep 17 00:00:00 2001 From: Situphen Date: Tue, 2 Mar 2021 19:51:22 +0100 Subject: [PATCH 08/25] Correction de l'affichage des membres sur les pages des casquettes --- templates/member/hat.html | 6 +++--- templates/member/hats.html | 13 +++++++------ 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/templates/member/hat.html b/templates/member/hat.html index b1e4e42fc8..d48d59e4da 100644 --- a/templates/member/hat.html +++ b/templates/member/hat.html @@ -45,10 +45,10 @@
  • {% include "misc/member_item.part.html" with avatar=True %}
  • {% endfor %} -

    - {% trans "Remarque : cette liste correspond aux membres possédant actuellement la casquette. Si vous voyez un message avec cette casquette mais que son auteur n'apparaît pas ici, cela signifie qu'il l'avait en postant. Des messages privés automatiques peuvent également être envoyés avec une casquette." %} -

    +

    + {% trans "Remarque : cette liste correspond aux membres possédant actuellement la casquette. Si vous voyez un message avec cette casquette mais que son auteur n'apparaît pas ici, cela signifie qu'il l'avait en postant. Des messages privés automatiques peuvent également être envoyés avec une casquette." %} +

    {% else %}

    {% trans "Aucun membre ne possède cette casquette." %}

    {% endif %} diff --git a/templates/member/hats.html b/templates/member/hats.html index eef4fdc16e..e2c7435809 100644 --- a/templates/member/hats.html +++ b/templates/member/hats.html @@ -45,13 +45,14 @@ {% if hat.get_users %} - {% for user in hat.get_users_preview %} - {% include 'misc/member_item.part.html' with member=user avatar=True %} - {% endfor %} - +
    +
      + {% for user in hat.get_users_preview %} +
    • {% include "misc/member_item.part.html" with member=user avatar=True %}
    • + {% endfor %} +
    +
    {% if hat.get_users_count > app.member.users_in_hats_list %} - – - {% blocktrans with users_count=hat.get_users_count %} Voir les {{ users_count }} membres From 7e7a914655dd431154b642000661464f97061d72 Mon Sep 17 00:00:00 2001 From: Situphen Date: Tue, 2 Mar 2021 20:22:22 +0100 Subject: [PATCH 09/25] Survoler le sous-titre d'une cartouche de sujet du forum ne souligne plus le titre --- assets/scss/components/_content-item.scss | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/assets/scss/components/_content-item.scss b/assets/scss/components/_content-item.scss index e49b7056c5..1de7f2f5ef 100644 --- a/assets/scss/components/_content-item.scss +++ b/assets/scss/components/_content-item.scss @@ -79,10 +79,6 @@ $content-item-padding-vertical: $length-14; header { flex: 2; - &:hover .content-title { - text-decoration: underline; - } - .content-title { margin: 0; padding: 0; @@ -102,6 +98,10 @@ $content-item-padding-vertical: $length-14; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; + + &:hover { + text-decoration: underline; + } } } @@ -112,10 +112,6 @@ $content-item-padding-vertical: $length-14; &, a { font-size: $font-size-9; color: $grey-600; - - &:hover { - text-decoration: none; - } } &.is-long { @@ -298,6 +294,10 @@ $content-item-padding-vertical: $length-14; } } } + + &:not(.topic-item) .content-info header:hover .content-title { + text-decoration: underline; + } } .content-item-list { From 1fd1fd55a620de02d33bd1ab50ca252f932bab1a Mon Sep 17 00:00:00 2001 From: Situphen Date: Thu, 4 Mar 2021 01:22:14 +0100 Subject: [PATCH 10/25] Rend moins visible un paragraphe --- assets/scss/layout/_content.scss | 4 ++++ templates/member/hat.html | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/assets/scss/layout/_content.scss b/assets/scss/layout/_content.scss index 7462bcbca8..f98d3b9db2 100644 --- a/assets/scss/layout/_content.scss +++ b/assets/scss/layout/_content.scss @@ -131,6 +131,10 @@ font-size: $font-size-6; font-weight: normal; } + + p.is-dimmed { + color: $grey-500; + } } @include wide { diff --git a/templates/member/hat.html b/templates/member/hat.html index d48d59e4da..e44e9b7cd6 100644 --- a/templates/member/hat.html +++ b/templates/member/hat.html @@ -46,7 +46,7 @@ {% endfor %} -

    +

    {% trans "Remarque : cette liste correspond aux membres possédant actuellement la casquette. Si vous voyez un message avec cette casquette mais que son auteur n'apparaît pas ici, cela signifie qu'il l'avait en postant. Des messages privés automatiques peuvent également être envoyés avec une casquette." %}

    {% else %} From 3cebb75ba41bd86d34005fcec50a2f85996a1134 Mon Sep 17 00:00:00 2001 From: Situphen Date: Tue, 2 Mar 2021 20:44:16 +0100 Subject: [PATCH 11/25] =?UTF-8?q?On=20cache=20le=20bouton=20Modifier=20dan?= =?UTF-8?q?s=20les=20MPs=20si=20quelqu'un=20a=20r=C3=A9pondu=20apr=C3=A8s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- templates/misc/message.part.html | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/templates/misc/message.part.html b/templates/misc/message.part.html index c196465117..6c1e47df76 100644 --- a/templates/misc/message.part.html +++ b/templates/misc/message.part.html @@ -114,11 +114,13 @@ {% if message.author == user %} {% if edit_link %} -
  • - - {% trans "Modifier" %} - -
  • + {% if message.pk in user_can_modify %} {# User cannot edit a MP post if someone answered after. #} +
  • + + {% trans "Modifier" %} + +
  • + {% endif %} {% endif %} {% if not message_is_hidden and can_hide != False %} From 41e56d0b39f418ce156d20fd1cf0ee089dfbec31 Mon Sep 17 00:00:00 2001 From: Situphen Date: Tue, 2 Mar 2021 20:50:48 +0100 Subject: [PATCH 12/25] =?UTF-8?q?Un=20membre=20ne=20peut=20pas=20modifier?= =?UTF-8?q?=20son=20message=20s'il=20est=20masqu=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- templates/misc/message.part.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/misc/message.part.html b/templates/misc/message.part.html index 6c1e47df76..dc2dead2fc 100644 --- a/templates/misc/message.part.html +++ b/templates/misc/message.part.html @@ -112,7 +112,7 @@