From b37037cda9175eb5168aeaf17f6dcee6ba05db83 Mon Sep 17 00:00:00 2001
From: Bastien Le Querrec <blq@laquadrature.net>
Date: Mon, 6 Jan 2025 19:41:35 +0100
Subject: [PATCH] prefdpt: ajoute une option pour ne pas suivre les liens avec
 une date non-reconnue

---
 Attrap_prefdpt.py | 80 ++++++++++++++++++++++++++---------------------
 1 file changed, 45 insertions(+), 35 deletions(-)

diff --git a/Attrap_prefdpt.py b/Attrap_prefdpt.py
index fa233e8..95bbe83 100644
--- a/Attrap_prefdpt.py
+++ b/Attrap_prefdpt.py
@@ -19,7 +19,8 @@ class Attrap_prefdpt(Attrap):
         'css_path': {
             'title': 'div.fr-card.fr-card--sm.fr-card--grey.fr-enlarge-link div.fr-card__body div.fr-card__content h2.fr-card__title a'
         },
-        'link_to_raa': False
+        'link_to_raa': False,
+        'follow_link_on_unrecognised_date': True
     }
     white_card = {
         'regex': {
@@ -31,7 +32,8 @@ class Attrap_prefdpt(Attrap):
             'details': 'div.fr-card.fr-card--horizontal.fr-card--sm.fr-enlarge-link div.fr-card__body div.fr-card__content div.fr-card__end p.fr-card__detail',  # Chemin CSS du détail des cartes blanches
             'pager': 'ul.fr-pagination__list li a.fr-pagination__link.fr-pagination__link--next.fr-pagination__link--lg-label'  # Chemin CSS du pager des cartes blanches
         },
-        'link_to_raa': False
+        'link_to_raa': False,
+        'follow_link_on_unrecognised_date': True
     }
 
     # Liste des widgets à analyser (sera remplie au moment de l'initialisation, mais peut être surchargée par la classe de préfecture de département)
@@ -50,11 +52,12 @@ class Attrap_prefdpt(Attrap):
     class DptWidget:
         """Une classe représentant un widget sur le site d'une préfecture de département."""
 
-        def __init__(self, name, regex=None, css_path=None, link_to_raa=False):
+        def __init__(self, name, regex=None, css_path=None, link_to_raa=False, follow_link_on_unrecognised_date=True):
             self.name = name
             self.regex = regex
             self.css_path = css_path
             self.link_to_raa = link_to_raa
+            self.follow_link_on_unrecognised_date = follow_link_on_unrecognised_date
 
         def has_css_path(self, key):
             return self.css_path and self.css_path.get(key, None) is not None
@@ -92,7 +95,8 @@ class Attrap_prefdpt(Attrap):
                     'grey_card',
                     regex=self.grey_card['regex'],
                     css_path=self.grey_card['css_path'],
-                    link_to_raa=self.grey_card['link_to_raa']
+                    link_to_raa=self.grey_card['link_to_raa'],
+                    follow_link_on_unrecognised_date=self.grey_card['follow_link_on_unrecognised_date']
                 )
             )
 
@@ -102,7 +106,8 @@ class Attrap_prefdpt(Attrap):
                     'white_card',
                     regex=self.white_card['regex'],
                     css_path=self.white_card['css_path'],
-                    link_to_raa=self.white_card['link_to_raa']
+                    link_to_raa=self.white_card['link_to_raa'],
+                    follow_link_on_unrecognised_date=self.white_card['follow_link_on_unrecognised_date']
                 )
             )
 
@@ -139,38 +144,43 @@ class Attrap_prefdpt(Attrap):
                     False
                 )
             for card in cards:
-                date = None
-
-                # Si un regex d'année est spécifié, on parse le titre avec
-                if widget.has_regex('year'):
-                    date = Attrap.guess_date(card['name'].strip(), widget.get_regex('year')).replace(day=1, month=1)
-                    if date >= self.not_before.replace(day=1, month=1) and card['url'] not in self.page_urls_to_parse:
-                        # Si aucune date n'a été détectée, l'année est à 9999. Mais on n'inclut l'URL que s'il n'y a pas de regex de mois à tester après.
-                        if not widget.has_regex('month') or (widget.has_regex('month') and date.year < 9999):
-                            if not widget.link_to_raa:
-                                self.page_urls_to_parse.append(card['url'])
-
-                # Si aucun regex d'année n'est pas configuré ou s'il n'a pas permis de trouver une date, on teste avec le regex de mois
-                if widget.has_regex('month') and (not date or date.year == 9999):
-                    date = Attrap.guess_date(card['name'].strip(), widget.get_regex('month')).replace(day=1)
-                    if date >= self.not_before.replace(day=1) and card['url'] not in self.page_urls_to_parse:
-                        if not widget.link_to_raa:
+                if card['url'] not in self.page_urls_to_parse:
+                    date = None
+                    date_is_correct = False
+
+                    # Si un regex d'année est spécifié, on parse le titre avec
+                    if widget.has_regex('year'):
+                        date = Attrap.guess_date(card['name'].strip(), widget.get_regex('year')).replace(day=1, month=1)
+                        # Si une date a été trouvée (l'année n'est pas 9999) et qu'elle est avant la valeur not_before, on la marque comme correcte
+                        if date >= self.not_before.replace(day=1, month=1) and date.year < 9999:
+                            date_is_correct = True
+
+                    # Si un regex de mois est spécifié et qu'aucune date correcte n'a été trouvée, on teste avec le regex de mois sur le titre
+                    if widget.has_regex('month') and not date_is_correct:
+                        date = Attrap.guess_date(card['name'].strip(), widget.get_regex('month')).replace(day=1)
+                        if date >= self.not_before.replace(day=1) and date.year < 9999:
+                            date_is_correct = True
+
+                    # Si un chemin CSS vers les détails du widget est spécifié et qu'aucune date correcte n'a été trouvée, on tente de parser la date présente dans les détails
+                    if widget.has_css_path('details') and not date_is_correct:
+                        try:
+                            date = datetime.datetime.strptime(card['details'].replace('Publié le ', '').strip(), '%d/%m/%Y')
+                            if date >= self.not_before:
+                                date_is_correct = True
+                        except Exception as e:
+                            date = datetime.datetime(9999, 1, 1)
+
+                    # Si la configuration indique que les liens renvoient vers un RAA, on ajoute le lien à la liste des éléments
+                    if widget.link_to_raa:
+                        if date.year == 9999:
+                            date = None
+                        raa = Attrap.RAA(card['url'], date, card['name'].strip(), timezone=self.timezone)
+                        self.elements.append(raa)
+                    else:
+                        # Si une date a été trouvée, on regarde s'il faut ajouter l'URL à la liste des pages à parser
+                        if date_is_correct or (date.year == 9999 and widget.follow_link_on_unrecognised_date):
                             self.page_urls_to_parse.append(card['url'])
 
-                # On regarde aussi la date dans les détails de la carte
-                if widget.has_css_path('details') and (not date or date.year == 9999):
-                    date = datetime.datetime.strptime(card['details'].replace('Publié le ', '').strip(), '%d/%m/%Y')
-                    if date >= self.not_before and card['url'] not in self.page_urls_to_parse:
-                        if not widget.link_to_raa:
-                            self.page_urls_to_parse.append(card['url'])
-
-                # Si la configuration indique que les cartes blanches renvoient vers un RAA, on ajoute le lien à la liste des éléments
-                if widget.link_to_raa:
-                    if date.year == 9999:
-                        date = None
-                    raa = Attrap.RAA(card['url'], date, card['name'].strip(), timezone=self.timezone)
-                    self.elements.append(raa)
-
     def get_raa_elements(self, page_content):
         elements = []
         # On charge le parser
-- 
GitLab