Repository: zestedesavoir/zds-site

Issue:
[v16] On a perdu la date de réservation d'un contenu
Environnement : prod

Depuis la v16, dans la [zone de validation](https://zestedesavoir.com/validations/) (comme le montre la capture ci-dessous) on ne sait plus à quelle date à été réservée un contenu.

![validationnes](https://cloud.githubusercontent.com/assets/6066015/13671528/af332fd6-e6d0-11e5-934e-1aed9502fe62.PNG)



Discussion:
Sur une installation toute propre le problème ne se produit pas (ou en tout cas je n'ai réussi a le reproduire)

@artragis @SpaceFox @firm1 @Fumble vous pouvez vérifier sur des contenus récents ?

J'ai les 2 cas.

2016-03-30 11:33 GMT+02:00 Laville Augustin notifications@github.com:

> @artragis https://github.com/artragis @SpaceFox
> https://github.com/SpaceFox @firm1 https://github.com/firm1 @Fumble
> https://github.com/Fumble vous pouvez vérifier sur des contenus récents
> ?
> 
> —
> You are receiving this because you were mentioned.
> Reply to this email directly or view it on GitHub
> https://github.com/zestedesavoir/zds-site/issues/3432#issuecomment-203345490

Je confirme j'ai aussi les 2 cas. Je n'arrive pas a savoir dans quel cas on a la date et dans quel cas on ne l'a pas.

Première demande de validation / demande de mise à jour ?

Si sur un contenu sans date de resa, vous operez une annulation de resa puis a nouveau une resa ? Quel est le résultat ?
Je teste demain pour essayer de déterminer un critère pour reproduire le bug. ;)

@firm1 @SpaceFox Est-il possible d'avoir du feedback sur ce bug ? Est-il toujours présent en prod ? Si oui avez vous reperé un schéma ou ça se reproduit ?

Pour ciblage : 

- Quel type de contenus sont concernées (tuto, article, mixte?)
- Cela se produit sur une première validation / re-validation d'un contenu déja en ligne ?
- Si vous annulez la réservation et que vous re-réservez sur un contenu buggé, le bug se produit-il à nouveau ? 
- Le bug se produit quelque soit le validateur ? Il y a t il des validateurs pour qui ça ne marche jamais / toujours ?

Merci ;)


Resolving patch:
diff --git a/zds/tutorialv2/views/views_validations.py b/zds/tutorialv2/views/views_validations.py
--- a/zds/tutorialv2/views/views_validations.py
+++ b/zds/tutorialv2/views/views_validations.py
@@ -158,6 +158,7 @@ def form_valid(self, form):
         validation.version = form.cleaned_data['version']
         if old_validator:
             validation.validator = old_validator
+            validation.date_reserve = old_validation.date_reserve
             validation.status = 'PENDING_V'
         validation.save()
 


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
@@ -5731,6 +5731,62 @@ def test_validation_history_for_new_content(self):
         result = self.client.get(reverse('validation:list') + '?type=tuto')
         self.assertNotIn('class="update_content"', result.content)
 
+    def test_ask_validation_update(self):
+        """
+        Test AskValidationView.
+        """
+        text_validation = u'La validation on vous aime !'
+        content = PublishableContentFactory(author_list=[self.user_author], type='ARTICLE')
+        content.save()
+        content_draft = content.load_version()
+
+        self.assertEqual(Validation.objects.count(), 0)
+
+        # login with user and ask validation
+        self.assertEqual(self.client.login(username=self.user_author.username, password='hostel77'), True)
+        result = self.client.post(
+            reverse('validation:ask', kwargs={'pk': content_draft.pk, 'slug': content_draft.slug}),
+            {'text': text_validation, 'source': '', 'version': content_draft.current_version},
+            follow=False)
+        self.assertEqual(result.status_code, 302)
+        self.assertEqual(Validation.objects.count(), 1)
+
+        # login with staff and reserve the content
+        self.assertEqual(self.client.login(username=self.user_staff.username, password='hostel77'), True)
+        validation = Validation.objects.filter(content=content).last()
+        result = self.client.post(
+            reverse('validation:reserve', kwargs={'pk': validation.pk}),
+            {'version': validation.version},
+            follow=False)
+        self.assertEqual(result.status_code, 302)
+
+        # login with user, edit content and ask validation for update
+        self.assertEqual(self.client.login(username=self.user_author.username, password='hostel77'), True)
+        result = self.client.post(
+            reverse('content:edit', args=[content_draft.pk, content_draft.slug]),
+            {
+                'title': content_draft.title + u'2',
+                'description': content_draft.description,
+                'introduction': content_draft.introduction,
+                'conclusion': content_draft.conclusion,
+                'type': content_draft.type,
+                'licence': self.licence.pk,
+                'subcategory': self.subcategory.pk,
+                'last_hash': content_draft.compute_hash(),
+                'image': content_draft.image
+            },
+            follow=False)
+        self.assertEqual(result.status_code, 302)
+        result = self.client.post(
+            reverse('validation:ask', kwargs={'pk': content_draft.pk, 'slug': content_draft.slug}),
+            {'text': text_validation, 'source': '', 'version': content_draft.current_version},
+            follow=False)
+        self.assertEqual(result.status_code, 302)
+
+        # ensure the validation is effective
+        self.assertEqual(Validation.objects.count(), 2)
+        self.assertIsNotNone(Validation.objects.last().date_reserve)  # issue #3432
+
     def test_beta_article_closed_when_published(self):
         """Test that the beta of an article is locked when the content is published"""