Repository: zestedesavoir/zds-site

Issue:
Nombre délirant de requêtes sur les pages forum
Petite analyse sur les requêtes SQL :

Même [avec mon fix](https://github.com/zestedesavoir/zds-site/pull/2093), en mode connecté, je compte :
- 665 requêtes sur la home des forums (en première approche surtout la requête 1) (je me suis reconnecté pour vérifier ce chiffre tellement il me paraît débile, mais il est authentique).
- Plus de  300 requêtes sur les pages catégorie (en fonction de la page). Là je sais pas trop, c'est le foutoir et il faudrait creuser.
- 200 à plus de 300 requêtes sur les pages des forums (en fonction de la page). Là je sais pas trop, c'est le foutoir et il faudrait creuser.

À noter que je ne peux pas tester les pages avec des topics, il faudrait que je re-bascule sur l'autre BDD ou que j'importe les topics de prod.

En mode déconnecté, c'est déjà mieux, ce qui me fait dire qu'on peut énormément soigner le header en mode connecté. Néanmoins :
- 4 requêtes pour le menu principal qu'on pourrait facilement mettre en cache sans problème de cohérence, je pense
- 79 requêtes pour la home des forums. Ce qui me fait dire qu'on a un énorme problème avec le mode connecté, qui fait infiniment plus de requêtes que ce qu'il devrait. A voir avec un compte non-staff si on a le même problème.
- Environ 180 requêtes pour les catégories. Là c'est beaucoup plus proche du mode connecté.
- 70 à 80 requêtes sur les pages des forums.

Vraiment, l'immense différence entre le mode connecté et le mode non connecté m'inquiète, et cette différence ne s'explique pas que par le header.

Requête 1 :

```
SELECT 
    `utils_comment`.`id`,
    `utils_comment`.`author_id`,
    `utils_comment`.`editor_id`,
    `utils_comment`.`ip_address`,
    `utils_comment`.`position`,
    `utils_comment`.`text`,
    `utils_comment`.`text_html`,
    `utils_comment`.`like`,
    `utils_comment`.`dislike`,
    `utils_comment`.`pubdate`,
    `utils_comment`.`update`,
    `utils_comment`.`is_visible`,
    `utils_comment`.`text_hidden`,
    `forum_post`.`comment_ptr_id`,
    `forum_post`.`topic_id`,
    `forum_post`.`is_useful`
FROM
    `forum_post`
        INNER JOIN
    `utils_comment` ON (`forum_post`.`comment_ptr_id` = `utils_comment`.`id`)
WHERE
    `forum_post`.`comment_ptr_id` = <id commentaire>
```

Source : templates/forum/includes/forums.part.html ligne 9 : `<div class="topic-description {% if user.is_authenticated and not forum.is_read %}unread{% endif %}">`



Discussion:
Voici le coupable : https://github.com/zestedesavoir/zds-site/blob/dev/zds/forum/models.py#L125

Je crois que cet exemple est l'illustration parfaite du danger des ORM :)

Tout ça pour... afficher une classe qui n'est pas utilisée ! On indique dans le code quels forums contiennent des messages non lus, mais on affiche _jamais_ cette information à l'utilisateur ! (PS : sur les pages forums et catégorie en tous cas...)

Quand je demande à PyCharm les occurrences de la méthode `is_read`, il m'indique 0. Ce code ne semble jamais exécuté.

Je n'en trouve qu'une seule, ici : https://github.com/zestedesavoir/zds-site/blob/dev/templates/forum/includes/forums.part.html#L9

Et comme le fait d'avoir cette classe ne change en rien le design, je ne vais pas me prendre la tête et vais tout simplement dégager le tout.

Autant pour moi, j'ignorais qu'il était possible de faire des choses aussi dégueulasse.


Resolving patch:
diff --git a/zds/forum/models.py b/zds/forum/models.py
--- a/zds/forum/models.py
+++ b/zds/forum/models.py
@@ -120,13 +120,6 @@ def can_read(self, user):
             else:
                 return False
 
-    def is_read(self):
-        """Checks if there are topics never read in the forum."""
-        for current_topic in Topic.objects.filter(forum=self).all():
-            if never_read(current_topic):
-                return False
-        return True
-
 
 class Topic(models.Model):
 


Test patch: