Repository: zestedesavoir/zds-site

Issue:
Améliorer le <meta description> des forum/des contenus
Mon fix de l'issue #5187 peut être amélioré, ce n'était pas le but premier de cette PR j'ai donc fait quelques choses de simple. En y repensant et suite au message de [Leeroy](https://zestedesavoir.com/forums/sujet/12099/seo-et-spam/?page=1#p199005) sur le forum : 

> revoyez la balise meta description qui la même sur toutes les pages (`<meta name="description" content="Zeste de Savoir est un site de partage de connaissances sur lequel vous trouverez des tutoriels de tous niveaux, des articles et des forums d’entraide animés par et pour la communauté.">`) ou est vide pour les tutos, alors que vous pourriez reprendre les x premiers caractères du premier post.

https://github.com/zestedesavoir/zds-site/blob/e7ff7912d2424523607308a566866012fb2e621e/templates/tutorialv2/view/content_online.html#L42

La description est bien mais on peut faire mieux, surtout pour les Tweets et le SEO. :) 


Discussion:

Resolving patch:
diff --git a/zds/forum/models.py b/zds/forum/models.py
--- a/zds/forum/models.py
+++ b/zds/forum/models.py
@@ -220,6 +220,26 @@ def __str__(self):
     def is_solved(self):
         return self.solved_by is not None
 
+    @property
+    def meta_description(self):
+        first_post = self.first_post()
+        if len(first_post.text) < 120:
+            return first_post.text
+        return Topic.__remove_greetings(first_post)[:settings.ZDS_APP['forum']['description_size']]
+
+    @staticmethod
+    def __remove_greetings(post):
+        greetings = settings.ZDS_APP['forum']['greetings']
+        max_size = settings.ZDS_APP['forum']['description_size'] + 1
+        text = post.text
+        for greeting in greetings:
+            if text.strip().lower().startswith(greeting):
+                index_of_dot = max(text.index('\n') if '\n' in text else -1, -1)
+                index_of_dot = min(index_of_dot, text.index('.') if '.' in text else max_size)
+                index_of_dot = min(index_of_dot, text.index('!') if '!' in text else max_size)
+                return text[index_of_dot + 1:].strip()
+        return text
+
     def get_absolute_url(self):
         return reverse('topic-posts-list', args=[self.pk, self.slug()])
 
diff --git a/zds/settings/abstract_base/zds.py b/zds/settings/abstract_base/zds.py
--- a/zds/settings/abstract_base/zds.py
+++ b/zds/settings/abstract_base/zds.py
@@ -205,7 +205,9 @@
         'old_post_limit_days': 90,
         # Exclude tags from top tags list. Tags listed here should not be relevant for most of users.
         # Be warned exclude too much tags can restrict performance
-        'top_tag_exclu': ['bug', 'suggestion', 'tutoriel', 'beta', 'article']
+        'top_tag_exclu': ['bug', 'suggestion', 'tutoriel', 'beta', 'article'],
+        'greetings': ['salut', 'bonjour', 'yo ', 'hello', 'bon matin', 'tout le monde se secoue'],
+        'description_size': 120,
     },
     'topic': {
         'home_number': 5,
diff --git a/zds/tutorialv2/models/database.py b/zds/tutorialv2/models/database.py
--- a/zds/tutorialv2/models/database.py
+++ b/zds/tutorialv2/models/database.py
@@ -627,6 +627,7 @@ class Meta:
 
     # sizes contain a python dict (as a string in database) with all information about file sizes
     sizes = models.CharField('Tailles des fichiers téléchargeables', max_length=512, default='{}')
+    _description = None
 
     @staticmethod
     def get_slug_from_file_path(file_path):
@@ -642,10 +643,14 @@ def title(self):
             return self.load_public_version().title
 
     def description(self):
-        if self.versioned_model:
-            return self.versioned_model.description
-        else:
-            return self.load_public_version().description
+        if self._description:
+            return self._description
+        if not self.versioned_model:
+            self.load_public_version()
+        self._description = self.versioned_model.description or self.versioned_model.get_introduction()
+        if self._description:
+            self._description = self._description[:settings.ZDS_APP['forum']['description_size']]
+        return self._description
 
     def get_prod_path(self, relative=False):
         if not relative:


Test patch: