Repository: zestedesavoir/zds-site

Issue:
Notification via les tags auxquels on est abonné pour les sujets inaccessibles
**Description du bug**

Un utilisateur abonné à un tag est notifié des nouveaux sujets avec ce tag, même s'il n'a pas accès au forum dans lequel le sujet a été créé.

Signalé [ici](https://zestedesavoir.com/forums/sujet/15948/notification-persistante-sur-le-forum/).

**Comment reproduire ?**

La liste des étapes qui permet de reproduire le bug :

1. Avec l'utilisateur `user1`, s'abonner à un tag (le plus simple est sans doute d'aller dans le menu _Forum_ en haut du site, cliquer sur un tag dans la colonne _Tags les plus utilisés_, puis sur _Suivre ce tag_ dans le menu à gauche. Tant qu'on est connecté avec `user1`, on peut en profiter pour marquer toutes ses notifications comme lues, on y verra plus clair.
2. Avec l'utilisateur `staff`, créer un sujet dans le forum _Staff only_ avec le tag auquel `user1` est abonné (ce forum restreint a été introduit dans [cette PR](https://github.com/zestedesavoir/zds-site/pull/6196)).
3. Se connecter avec `user1` et constater qu'une notification est présente pour le sujet créé, et que `user1` ne peut pas y accéder au sujet.

En plus de corriger le bug en créant la notification que si on a accès au sujet, on pourra sans doute s'inspirer de [cette PR](https://github.com/zestedesavoir/zds-site/pull/6196) pour ajouter les tests correspondants et créer la migration qui supprimera (ou juste marquera en lu ?) toutes les notifications qui sont concernées par ce problème.





Discussion:

Resolving patch:
diff --git a/zds/notification/receivers.py b/zds/notification/receivers.py
--- a/zds/notification/receivers.py
+++ b/zds/notification/receivers.py
@@ -266,7 +266,7 @@ def _handle_added_tags(tag_content_type, topic):
         for subscription in subscriptions:
             notification = Notification.objects.filter(object_id=topic.id, subscription=subscription)
             if not notification:
-                if subscription.user != topic.author:
+                if subscription.user != topic.author and topic.forum.can_read(subscription.user):
                     subscription.send_notification(content=topic, sender=topic.author)
 
 


Test patch:
diff --git a/zds/notification/tests/tests_basics.py b/zds/notification/tests/tests_basics.py
--- a/zds/notification/tests/tests_basics.py
+++ b/zds/notification/tests/tests_basics.py
@@ -8,7 +8,14 @@
 from django.db import IntegrityError
 
 from django.conf import settings
-from zds.forum.tests.factories import ForumCategoryFactory, ForumFactory, TopicFactory, PostFactory, TagFactory
+from zds.forum.tests.factories import (
+    ForumCategoryFactory,
+    ForumFactory,
+    TopicFactory,
+    PostFactory,
+    TagFactory,
+    create_category_and_forum,
+)
 from zds.forum.models import Topic
 from zds.gallery.tests.factories import UserGalleryFactory
 from zds.member.tests.factories import ProfileFactory, StaffProfileFactory, UserFactory
@@ -414,6 +421,28 @@ def test_notifications_on_a_tag_subscribed(self):
         notifications = Notification.objects.filter(object_id=topic2.pk, is_read=False).all()
         self.assertEqual(0, len(notifications))
 
+    def test_no_notification_on_a_tag_subscribed_in_hidden_forum(self):
+        """
+        When a user subscribes to a tag and a topic is created using that tag in a hidden forum, no notification is sent
+        """
+        # Subscribe.
+        user1 = ProfileFactory().user
+        user2 = ProfileFactory().user
+
+        group = Group.objects.create(name="Restricted")
+        user2.groups.add(group)
+        user2.save()
+        category, forum = create_category_and_forum(group)
+
+        tag1 = TagFactory(title="MyTagInHiddenForum")
+        NewTopicSubscription.objects.toggle_follow(tag1, user1)
+
+        topic1 = TopicFactory(forum=forum, author=user2)
+        topic1.add_tags([tag1.title])
+
+        notifications = Notification.objects.filter(object_id=topic1.pk, is_read=False).all()
+        self.assertEqual(0, len(notifications))
+
     def test_mark_read_a_topic_of_a_tag_subscribed(self):
         """
         When a user has a notification on a topic, the notification should be marked as read.