Repository: zestedesavoir/zds-site

Issue:
erreur 500 lors d'une edition malencontreuse de commentaire saison 3
Version beta-RC3

Url incriminée : http://beta.zestedesavoir.com/contenus/reactions/ajouter/?cite=76865&pk=83

Pouf **erreur 500**

On ne devrait jamais avoir d'erreur 500 dans le meilleur des mondes



Discussion:
De l'information complémentaire ? Les pks sont valides ? Le message est masqué ? ...

J'ai pris une url au pif valide et j'ai changé la pk. Je ne sais pas si la pk existe quelque part.

non en fait l'erreur a changé par rapport à avant (le bug "initial" est corrigé, mais deux corrections de bugs (citer un commentaire masquer) se sont fait de l'ombre.

l'erreur 500 arrive sur une pk qui n'existe pas en bdd, on devrait avoir une erreur 400 et non une 500. Je regarde ça ce midi.

/!\ ce bug n'est pas propre à la béta, il est présent en prod.

Avec quelle url tu arrive à le reproduire en prod ?

Je n'arrive pas à reproduire en prod non plus.

https://zestedesavoir.com/articles/message/nouveau/?article=321&cite=7776555

Ok, `pk` était `article`. Je retag en conséquence.


Resolving patch:
diff --git a/zds/tutorialv2/views/views_published.py b/zds/tutorialv2/views/views_published.py
--- a/zds/tutorialv2/views/views_published.py
+++ b/zds/tutorialv2/views/views_published.py
@@ -364,10 +364,10 @@ def get(self, request, *args, **kwargs):
 
             reaction = ContentReaction.objects.filter(pk=cited_pk).first()
 
-            if not reaction.is_visible:
-                raise PermissionDenied
-
             if reaction:
+                if not reaction.is_visible:
+                    raise PermissionDenied
+
                 text = '\n'.join('> ' + line for line in reaction.text.split('\n'))
                 text += "\nSource: [{}]({})".format(reaction.author.username, reaction.get_absolute_url())
 
@@ -485,7 +485,7 @@ def form_valid(self, form):
                 if not self.request.user.has_perm('tutorialv2.change_contentreaction'):
                     raise PermissionDenied
         else:
-            messages.error(self.request, 'Oh non ! Une erreur est survenue dans la requête !')
+            messages.error(self.request, _(u'Oh non ! Une erreur est survenue dans la requête !'))
             return self.form_invalid(form)
 
         return super(UpdateNoteView, self).form_valid(form)


Test patch:
diff --git a/zds/tutorialv2/tests/tests_views.py b/zds/tutorialv2/tests/tests_views.py
--- a/zds/tutorialv2/tests/tests_views.py
+++ b/zds/tutorialv2/tests/tests_views.py
@@ -4891,6 +4891,53 @@ def test_cant_edit_not_owned_note(self):
             })
         self.assertEqual(403, resp.status_code)
 
+    def test_quote_note(self):
+        """ Ensure the behavior of the `&cite=xxx` parameter on "content:add-reaction"
+        """
+
+        tuto = PublishableContent.objects.get(pk=self.tuto.pk)
+        text = u'À force de temps, de patience et de crachats, ' \
+               u'on met un pépin de callebasse dans le derrière d\'un moustique (proverbe créole)'
+
+        # add note :
+        reaction = ContentReaction(related_content=tuto, position=1)
+        reaction.update_content(text)
+        reaction.author = self.user_guest
+        reaction.save()
+
+        self.assertEqual(
+            self.client.login(
+                username=self.user_author.username,
+                password='hostel77'),
+            True)
+
+        # cite note
+        result = self.client.get(
+            reverse("content:add-reaction") + u'?pk={}&cite={}'.format(tuto.pk, reaction.pk), follow=True)
+        self.assertEqual(200, result.status_code)
+
+        self.assertTrue(text in result.context['form'].initial['text'])  # ok, text quoted !
+
+        # cite with a abnormal parameter raises 404
+        result = self.client.get(
+            reverse("content:add-reaction") + u'?pk={}&cite={}'.format(tuto.pk, 'lililol'), follow=True)
+        self.assertEqual(404, result.status_code)
+
+        # cite not existing note just gives the form empty
+        result = self.client.get(
+            reverse("content:add-reaction") + u'?pk={}&cite={}'.format(tuto.pk, 99999999), follow=True)
+        self.assertEqual(200, result.status_code)
+
+        self.assertTrue('text' not in result.context['form'])  # nothing quoted, so no text cited
+
+        # it's not possible to cite an hidden note (get 403)
+        reaction.is_visible = False
+        reaction.save()
+
+        result = self.client.get(
+            reverse("content:add-reaction") + u'?pk={}&cite={}'.format(tuto.pk, reaction.pk), follow=True)
+        self.assertEqual(403, result.status_code)
+
     def test_cant_view_private_even_if_draft_is_equal_to_public(self):
         content = PublishedContentFactory(author_list=[self.user_author])
         self.assertEqual(