Repository: zestedesavoir/zds-site

Issue:
[v18] Date incorrecte dans les notifications
J'ai reçu une notification pour un topic que je suivais avant la v18.

Selon la notification elle datait d'il y'a 7h, sauf qu'en cliquant dessus, je suis tombé sur un message qui date d'il y'a 7 minutes. On peut le voir sur les screens ci-dessous.

**Notification avant le clic** : 

![capture d ecran de 2016-05-28 09-03-31](https://cloud.githubusercontent.com/assets/6066015/15625756/7d2d85ba-24b3-11e6-8537-0055b9ebc892.png)

**Notification après le clic** : 

![capture d ecran de 2016-05-28 09-03-48](https://cloud.githubusercontent.com/assets/6066015/15625757/81da4634-24b3-11e6-9cfd-22e48d7535e2.png)

Il faudrait retomber sur ce cas pour identifier facilement le bug. Si jamais j'ai une meilleur idée du truc j'édite le titre qui n'est pas très parlant.



Discussion:
ping @GerardPaligot 

Après visite du sujet, et après le post de quelqu'un d'autre, j'ai a nouveau la notification avec la mauvaise heure.

**La preuve en image** : 

![capture d ecran de 2016-05-28 09-09-58](https://cloud.githubusercontent.com/assets/6066015/15625767/0eccf000-24b4-11e6-8295-b2e2b0236328.png)

Pour information les **7h** correspondent à la date de la notification que j'avais **AVANT** la MEP de la v18. On dirait que les dates des notifications existantes n'ont pas été migrés par la MEP.

Ca risque d'être compliqué dans la mesure où il n'existait pas de date à une notification puisque pas d'objet. C'était une info calculé à chaque fois.

J'essayerais de voir ce que je peux faire mais je n'ai pas beaucoup de temps en ce moment et cela, jusqu'au 9 juin. Autrement dit, si quelqu'un d'autres veut être sur cette regression, qu'il ne s'en prive pas.

Juste une précision : Ca concerne que les notifications actives avant la MEP de la v18 + les nouvelles notifications sur ces sujets qui avaient des notifications actives ? Ou la portée est plus large ?

Si j'en crois ce que je vois. ça concerne **tous les topics que je suivais avant la MEP**.

Le problème est le même pour les notifications des contenus.

Et tu sais à quoi correspond ce 7h ? Et si c'est toujours 7h ?

Je ne comprends pas parce que à vue de nez, le code semble cohérent :
- Récupère le dernier message non lu du sujet suivi : https://github.com/zestedesavoir/zds-site/blob/dev/zds/notification/management/commands/migrate_subscriptions.py#L28
- Ou le dernier message : https://github.com/zestedesavoir/zds-site/blob/dev/zds/notification/management/commands/migrate_subscriptions.py#L30
- Affectation de la date du message à la date de la notification : https://github.com/zestedesavoir/zds-site/blob/dev/zds/notification/management/commands/migrate_subscriptions.py#L41

> Le problème est le même pour les notifications des contenus.
- Même chose pour les contenus : https://github.com/zestedesavoir/zds-site/blob/dev/zds/notification/management/commands/migrate_subscriptions.py#L113

Ah bah je viens d'inspecter et le public est plus restreint. le 07h correspond aux notifications que je n'ai pas lus **JUSTE AVANT** qui étaient activent avant la MEP.

Les anciens topics que je suivaient sont OK.

J'ai eu le même problème aujourd'hui. J'ai lu toutes mes notifications ce matin et en début d'après midi je vois ceci : 
![notifications](https://cloud.githubusercontent.com/assets/10438692/15673510/7342a388-2737-11e6-823a-de34f9ccba65.png)
Et en cliquant dessus je vois bien le soucis de concordance des dates. (Si je marque non lu, la notification revenu a toujours la mauvaise date)
![notification1](https://cloud.githubusercontent.com/assets/10438692/15673523/92ec5bde-2737-11e6-82d3-b17ca1c49fa0.png)
et
![notification2](https://cloud.githubusercontent.com/assets/10438692/15673525/983ea15a-2737-11e6-803f-5dcb706512ae.png)

En cliquant sur toutes les notifications j'ai bien les bonnes dates.

Pour précision ce sont des sujets suivis depuis un moment (donc avant la MEP de ce week-end). Si vous avez besoin de plus d'informations n'hésitez pas.

/blague Je suis célèbre, je tiens à remercier tout d'abord ma mére sans qui … o/

Même souci qu’au dessus un sujet souscrit avant la MEP. Joseph poste dedans y'a 45 minutes, la date de la notification. J'ai l’impression que c'est la date de l'avant dernière notification pour le sujet.

![notification](https://cloud.githubusercontent.com/assets/6099338/15723819/6fd5b56a-2844-11e6-98f2-7ca187d72767.png)

> J'ai l’impression que c'est la date de l'avant dernière notification pour le sujet.

Dans mon cas ce n'est pas ça. Moi il me renvoit toujours a une notification trop vieille (difficile de l'identifier)

Ce matin j'ai eu la meme chose qu'Hugo : Une notif mais la date était celle de l'avant dernier message (juste avant celui concerné par la notif)

Je confirme que dans certains cas, la date de la notif est foireus.

2016-06-02 9:48 GMT+02:00 Christophe Gabard notifications@github.com:

> Ce matin j'ai eu la meme chose qu'Hugo : Une notif mais la date était
> celle de l'avant dernier message (juste avant celui concerné par la notif)
> 
> —
> You are receiving this because you are subscribed to this thread.
> Reply to this email directly, view it on GitHub
> https://github.com/zestedesavoir/zds-site/issues/3628#issuecomment-223219970,
> or mute the thread
> https://github.com/notifications/unsubscribe/AFhKnJhHOy1JYGk8jU2b4JF1RTP4wpNyks5qHorZgaJpZM4IpA9Z
> .

Ok, je pense avoir compris le bug de cette issue :

La valeur `pubdate` d'une notification est enregistrée automatiquement à la sauvegarde d'une nouvelle instance du modèle ([comme en témoigne la déclaration du champ dans le modèle](https://github.com/zestedesavoir/zds-site/blob/dev/zds/notification/models.py#L290)) mais comme nous réutilisons la notification existante si elle existe, nous ne mettons pas à jour sa valeur à l'[envoi de la notification](https://github.com/zestedesavoir/zds-site/blob/dev/zds/notification/models.py#L132-L141).

Ceci est théorique parce que non testé (toujours pas le temps en ce moment) mais fait sens.

Pour corriger le bug, il faut simplement mettre à jour la valeur de `pubdate` avec la valeur de `content.pubdate` et pour tester, il suffit de générer 2 notifications pour un même contenu notifiable (pensé à renseigner une valeur manuellement à la première notification pour éviter d'avoir la même date si Django est un rapide dans l'exécution du test).


Resolving patch:
diff --git a/zds/notification/models.py b/zds/notification/models.py
--- a/zds/notification/models.py
+++ b/zds/notification/models.py
@@ -137,6 +137,7 @@ def send_notification(self, content=None, send_email=True, sender=None):
             notification.sender = sender
             notification.url = self.get_notification_url(content)
             notification.title = self.get_notification_title(content)
+            notification.pubdate = content.pubdate
             notification.is_read = False
             notification.save()
             self.set_last_notification(notification)


Test patch:
diff --git a/zds/notification/tests.py b/zds/notification/tests.py
--- a/zds/notification/tests.py
+++ b/zds/notification/tests.py
@@ -1,4 +1,6 @@
 # -*- coding: utf-8 -*-
+
+from datetime import datetime, timedelta
 from django.contrib.auth.models import Group
 from django.contrib.contenttypes.models import ContentType
 from django.core import mail
@@ -235,6 +237,38 @@ def test_topics_followed_by_a_user(self):
         topics_followed = TopicAnswerSubscription.objects.get_objects_followed_by(user)
         self.assertEqual(3, len(topics_followed))
 
+    def test_pubdate_on_notification_updated(self):
+        """
+        When we update a notification, we should update its pubdate too.
+        """
+        topic = TopicFactory(forum=self.forum11, author=self.user1)
+        PostFactory(topic=topic, author=self.user1, position=1)
+
+        topics_followed = TopicAnswerSubscription.objects.get_objects_followed_by(self.user1)
+        self.assertEqual(1, len(topics_followed))
+
+        post = PostFactory(topic=topic, author=self.user2, position=2)
+
+        old_notification = Notification.objects.get(subscription__user=self.user1, object_id=post.pk, is_read=False)
+        old_notification.pubdate = datetime.now() - timedelta(days=1)
+        old_notification.save()
+        self.assertEqual(old_notification.object_id, post.pk)
+        self.assertEqual(old_notification.subscription.object_id, topic.pk)
+
+        # read it.
+        old_notification.is_read = True
+        old_notification.save()
+
+        user3 = UserFactory()
+        post2 = PostFactory(topic=topic, author=user3, position=3)
+
+        new_notification = Notification.objects.get(subscription__user=self.user1, object_id=post2.pk, is_read=False)
+        self.assertEqual(new_notification.object_id, post2.pk)
+        self.assertEqual(new_notification.subscription.object_id, topic.pk)
+
+        # Check that the pubdate is well updated.
+        self.assertTrue(old_notification.pubdate < new_notification.pubdate)
+
 
 class NotificationPublishableContentTest(TestCase):
     def setUp(self):