Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Teste et corrige l'affichage de quelques éléments de la sidebar des contenus #6599

Merged
merged 4 commits into from
Jul 20, 2024

Conversation

philippemilink
Copy link
Member

Fix #6596

Cette PR fait plusieurs choses :

  • ajout de tests pour vérifier que les éléments à afficher dans la barre latérale des contenus sont bien affichés uniquement sur les bonnes pages
  • correction de l'affichage La version X est identique à cette version
  • affichage de Exports du contenu sur la page publique des contenus
  • amélioration du code dans display/config.py

Contrôle qualité

Faire manuellement ce que fait le test ajouté.

Jouer avec les différents états possibles d'un contenu, afficher les différentes pages et s'assurer qu'il n'y a pas d'éléments incohérents dans la barre latérale (je ne dis pas que cette PR règle tous ces problèmes, ne pas hésiter à rapporter les éventuelles incohérences observées).

@philippemilink philippemilink added the Bloquant Ticket qui doit être traité avant la prochaine mise à jour label Mar 31, 2024
@philippemilink philippemilink changed the title Teste et corrige l'affiche de quelques éléments de la sidebar des contenus Teste et corrige l'affichage de quelques éléments de la sidebar des contenus Mar 31, 2024
@coveralls
Copy link

coveralls commented Mar 31, 2024

Coverage Status

coverage: 88.854% (+0.01%) from 88.842%
when pulling e7df5af on philippemilink:fix-sidebar-actions
into 3505295 on zestedesavoir:dev.

Copy link
Contributor

@Arnaud-D Arnaud-D left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ça marche, mais je préfèrerais qu'on change quelques trucs niveau positionnement des éléments.

Et des suggestions sur le code aussi. ^^

Comment on lines +26 to +37
{% if public_actions.show_identical_draft_version_message %}
<li class="inactive">
<span class="ico-after pin disabled">
{{ public_actions.messages|get_item:"draft_is_same" }}
</span>
</li>
{% endif %}

{% if public_actions.show_more_recent_draft_version_link %}
<li>
<a href="{{ public_content_object.get_absolute_url_online }}" class="ico-after online blue">
{% trans "Voir la page publique" %}
<a href="{{ object.get_absolute_url }}" class="ico-after online blue">
{{ public_actions.messages|get_item:"draft_is_more_recent" }}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je pense que cette mention devrait être tout en haut, avec "Voir la version brouillon". Comme ça pointe vers la même page, il faudrait peut-être transformer ça juste en note d'information (grisée).

C'est peut être aussi le signe qu'il faudrait une section "Version brouillon", comme on a "Version publique".

Je pense qu'être un peu ordonné à ce niveau-là peut améliorer la navigation et la compréhension de l'éditeur.

Faudra ranger la logique d'affichage en Python du bon côté aussi.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

J'ai un peu regardé comment faire ça, et j'ai l'impression que ça va demander plus de travail que tout ce qui est déjà fait dans cette PR. Je suis d'accord sur le principe avec toi, mais je pense que ça peut être fait une autre PR.

Comment on lines 33 to 154
result = self.client.post(
reverse("content:edit", args=[article.pk, article.slug]),
{
"title": article.title,
"description": article.description,
"introduction": "Modified introduction",
"conclusion": "Modified conclusion",
"type": article.type,
"subcategory": article.subcategory.first().pk,
"last_hash": versioned.compute_hash(),
},
follow=False,
)
self.assertEqual(result.status_code, 302)
article.refresh_from_db() # the previous request changes sha_draft
# Public page:
public_page = self.client.get(article.get_absolute_url_online())
self.assertNotContains(public_page, "Modified introduction")
self.assertNotContains(public_page, PublicActionsState.messages["draft_is_same"])
self.assertNotContains(public_page, PublicActionsState.messages["public_is_same"])
self.assertContains(public_page, PublicActionsState.messages["draft_is_more_recent"])
self.assertContains(public_page, PublicActionsState.messages["export_content"])
self.assertNotContains(public_page, ValidationActions.messages["validation_is_same"])
# Draft page:
draft_page = self.client.get(reverse("content:view", args=[article.pk, article.slug]), follow=False)
self.assertContains(draft_page, "Modified introduction")
self.assertNotContains(draft_page, PublicActionsState.messages["draft_is_same"])
self.assertNotContains(draft_page, PublicActionsState.messages["public_is_same"])
self.assertNotContains(draft_page, PublicActionsState.messages["draft_is_more_recent"])
self.assertNotContains(draft_page, PublicActionsState.messages["export_content"])
self.assertNotContains(draft_page, ValidationActions.messages["validation_is_same"])

# Ask validation:
request_validation(article)
# Public page:
public_page = self.client.get(article.get_absolute_url_online())
self.assertNotContains(public_page, PublicActionsState.messages["draft_is_same"])
self.assertNotContains(public_page, PublicActionsState.messages["public_is_same"])
self.assertContains(public_page, PublicActionsState.messages["draft_is_more_recent"])
self.assertContains(public_page, PublicActionsState.messages["export_content"])
self.assertNotContains(public_page, ValidationActions.messages["validation_is_same"])
# Draft page:
draft_page = self.client.get(reverse("content:view", args=[article.pk, article.slug]), follow=False)
self.assertNotContains(draft_page, PublicActionsState.messages["draft_is_same"])
self.assertNotContains(draft_page, PublicActionsState.messages["public_is_same"])
self.assertNotContains(draft_page, PublicActionsState.messages["draft_is_more_recent"])
self.assertNotContains(draft_page, PublicActionsState.messages["export_content"])
self.assertContains(draft_page, ValidationActions.messages["validation_is_same"])
# Validation page:
validation_page = self.client.get(
reverse("content:validation-view", args=[article.pk, article.slug]), follow=False
)
self.assertNotContains(validation_page, PublicActionsState.messages["draft_is_same"])
self.assertNotContains(validation_page, PublicActionsState.messages["public_is_same"])
self.assertNotContains(validation_page, PublicActionsState.messages["draft_is_more_recent"])
self.assertNotContains(validation_page, PublicActionsState.messages["export_content"])
self.assertNotContains(validation_page, ValidationActions.messages["validation_is_same"])

# Now a new draft version, to have different version from validation:
versioned = article.load_version()
result = self.client.post(
reverse("content:edit", args=[article.pk, article.slug]),
{
"title": article.title,
"description": article.description,
"introduction": "Modified introduction again",
"conclusion": "Modified conclusion",
"type": article.type,
"subcategory": article.subcategory.first().pk,
"last_hash": versioned.compute_hash(),
},
follow=False,
)
self.assertEqual(result.status_code, 302)
article.refresh_from_db() # the previous request changes sha_draft
# Public page:
public_page = self.client.get(article.get_absolute_url_online())
self.assertNotContains(public_page, "Modified introduction")
self.assertNotContains(public_page, PublicActionsState.messages["draft_is_same"])
self.assertNotContains(public_page, PublicActionsState.messages["public_is_same"])
self.assertContains(public_page, PublicActionsState.messages["draft_is_more_recent"])
self.assertContains(public_page, PublicActionsState.messages["export_content"])
self.assertNotContains(public_page, ValidationActions.messages["validation_is_same"])
# Draft page:
draft_page = self.client.get(reverse("content:view", args=[article.pk, article.slug]), follow=False)
self.assertContains(draft_page, "Modified introduction")
self.assertNotContains(draft_page, PublicActionsState.messages["draft_is_same"])
self.assertNotContains(draft_page, PublicActionsState.messages["public_is_same"])
self.assertNotContains(draft_page, PublicActionsState.messages["draft_is_more_recent"])
self.assertNotContains(draft_page, PublicActionsState.messages["export_content"])
self.assertNotContains(draft_page, ValidationActions.messages["validation_is_same"])
# Validation page:
validation_page = self.client.get(
reverse("content:validation-view", args=[article.pk, article.slug]), follow=False
)
self.assertNotContains(validation_page, PublicActionsState.messages["draft_is_same"])
self.assertNotContains(validation_page, PublicActionsState.messages["public_is_same"])
self.assertNotContains(validation_page, PublicActionsState.messages["draft_is_more_recent"])
self.assertNotContains(validation_page, PublicActionsState.messages["export_content"])
self.assertNotContains(validation_page, ValidationActions.messages["validation_is_same"])
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pas fan de ce test. J'ai été confronté à d'autres tests avec une séquence longue de ce type (il y en a plein dans le module tutorialv2). Je les ai trouvé dur à faire évoluer.

Je préfère qu'on teste chaque route/vue indépendamment, quitte à faire des fonctions auxilaires pour atteindre les états cibles (par exemple avoir un tuto en validation, avoir un tuto publié avec une version brouillon plus récente, etc.), tester si nécessaire des préconditions pour vérifier qu'on est bien dans l'état souhaité avant le test, puis tester ensuite ce qu'on veut effectivement tester unitairement.

Ici, ça voudrait dire tester séparément la page brouillon, la page publique, etc, éventuellement avec différents sous cas. Il y a un embryon dans ce fichier : tests_contentvalidationview.py. Le contenu d'une page n'est qu'un test particulier parmi d'autres pour la vue de validation.

Malheureusement, le reste des tests du module ne semble pas structuré dans ce sens, mais on devrait tendre vers ça à mon avis.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

J'ai restructuré les tests et, en effet, ça les rend bien plus lisibles.

Comment on lines +4 to +8
def request_validation(content):
"""Emulate a proper validation request."""
ValidationFactory(content=content, status="PENDING")
content.sha_validation = content.sha_draft
content.save()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pour info, je n'avais pas osé mettre cette fonction utilitaire en dehors du fichier de test spécifique où elle a été écrite, parce que je ne suis pas sûr que la manière d'émuler une validation soit suffisante dans d'autres tests que ceux que j'avais considéré à l'époque.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On verra comment ça évolue avec le temps, si on a besoin que cette fonction en fasse plus ou pas.

@Arnaud-D Arnaud-D enabled auto-merge (squash) July 20, 2024 13:34
@Arnaud-D Arnaud-D merged commit ab676f6 into zestedesavoir:dev Jul 20, 2024
8 checks passed
@philippemilink philippemilink deleted the fix-sidebar-actions branch July 20, 2024 15:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Bloquant Ticket qui doit être traité avant la prochaine mise à jour
Projects
Archived in project
Development

Successfully merging this pull request may close these issues.

Faire apparaître la section Administration dans la version publique des contenus
3 participants