Skip to content
Extraits de code Groupes Projets
Valider b37037cd rédigé par Bastien Le Querrec's avatar Bastien Le Querrec
Parcourir les fichiers

prefdpt: ajoute une option pour ne pas suivre les liens avec une date non-reconnue

parent 73450c57
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -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
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter