Repository: zestedesavoir/zds-site

Issue:
Nombre de messages postés par Clem incoherent
Sur [cette page](https://zestedesavoir.com/membres/voir/Clem/), on voit que Clem a posté 3 messages. Quand on clique [sur le lien](https://zestedesavoir.com/forums/messages/1/), il n'y en a plus.

Piste à confirmer : pourquoi [cette ligne](https://github.com/zestedesavoir/zds-site/blob/c73fa0704ed78f2676697c17c77ce24572f0ab03/zds/forum/managers.py#L115) n'apparait pas dans la condition au dessus ? J'imagine que Clem a la permission `forum.change_post` et la requete n'est donc pas filtrée comme il faut.



Discussion:
En fait, les sujets concernés sont dans le forum Staff. Forum dont tu n'as pas les accès.

Arf, je me doutais qu'on me cachais des choses comme ça ^^

J'imagine que le temps de dev et l'impact sur les perf rend la correction trop complexe pour être rentable.

C'est pas tellement ça. C'est plutôt : Est-ce que nous devons fausser le nombre de messages d'un membre sur cette page pour enlever les messags non visibles par le visiteur ou est-ce qu'il faut coller à la réaliter mais ne pas afficher les messages non visibles parce que le visiteur n'a pas les droits.

Personnellement, je préfère la seconde solution.

Hum. Mais dans ce cas, il vaut mieux peu être mettre un message "X messages non affichés".

Autant une différence de trois messages sur 100 ou 1000 messages ne se remarque pas, autant pour Clem ça surprend.

C'est tout à fait envisageable, même plus pertinent. :)


Resolving patch:
diff --git a/zds/forum/managers.py b/zds/forum/managers.py
--- a/zds/forum/managers.py
+++ b/zds/forum/managers.py
@@ -125,12 +125,22 @@ def get_messages_of_a_topic(self, topic_pk):
                    .order_by('position').all()
 
     def get_all_messages_of_a_user(self, current, target):
-        queryset = self.filter(author=target)\
-                       .prefetch_related('author')
+        queryset = self.filter(author=target).distinct()
+
+        # if user can't change posts, exclude hidden messages from queryset
         if not current.has_perm('forum.change_post'):
             queryset = queryset.filter(is_visible=True)
-        queryset = queryset.filter(self.visibility_check_query(current)).distinct()
-        return queryset.order_by('-pubdate').all()
+
+        full_queryset_len = queryset.count()
+        queryset = queryset.filter(self.visibility_check_query(current))
+        hidden_messages_count = full_queryset_len - queryset.count()
+
+        queryset = queryset.prefetch_related('author').order_by('-pubdate').all()
+
+        return {
+            'posts': queryset,
+            'hidden_messages_count': hidden_messages_count,
+        }
 
 
 class TopicReadManager(models.Manager):
diff --git a/zds/forum/views.py b/zds/forum/views.py
--- a/zds/forum/views.py
+++ b/zds/forum/views.py
@@ -376,7 +376,8 @@ def get(self, request, *args, **kwargs):
     def get_context_data(self, **kwargs):
         context = super(FindTopic, self).get_context_data(**kwargs)
         context.update({
-            'usr': self.object
+            'usr': self.object,
+            'hidden_topics_count': Topic.objects.filter(author=self.object).count() - context['paginator'].count,
         })
         return context
 
@@ -620,8 +621,10 @@ class FindPost(FindTopic):
     template_name = 'forum/find/post.html'
     paginate_by = settings.ZDS_APP['forum']['posts_per_page']
 
-    def get_queryset(self):
-        return Post.objects.get_all_messages_of_a_user(self.request.user, self.object)
+    def get_context_data(self, **kwargs):
+        context = super(FindPost, self).get_context_data(**kwargs)
+        context.update(Post.objects.get_all_messages_of_a_user(self.request.user, self.object))
+        return context
 
 
 @can_write_and_read_now


Test patch: