Commit a59924df authored by Nicolas Joyard's avatar Nicolas Joyard

Ajout import suivi depuis la poste

parent d00910c3
......@@ -8,6 +8,7 @@ from flask_migrate import Migrate, MigrateCommand
from flask_script import Manager
from .importers.adresses import AdressesImporter
from .importers.laposte import LaPosteImporter
from .importers.nosdeputes import NosDeputesImporter
from .irfm import app
......@@ -102,6 +103,13 @@ def import_adresses():
AdressesImporter(app).run()
@manager.command
def import_laposte():
"""Importe l'état des courriers suivi depuis La Poste"""
app.config.update(SQLALCHEMY_ECHO=False)
LaPosteImporter(app).run()
@manager.command
def password():
"""Chiffre un mot de passe admin"""
......
# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
import requests
from .base import BaseImporter
from ..models import Action, Parlementaire, db
from ..models.constants import ETAPE_ENVOYE
class LaPosteImporter(BaseImporter):
URL = 'http://www.part.csuivi.courrier.laposte.fr/suivi/index?id={}'
cache = {}
def _next_el_sibling(self, soup):
cur = soup
while cur and cur.next_sibling and cur.next_sibling.name is None:
cur = cur.next_sibling
return cur.next_sibling
def _import_suivi(self, suivi):
url = self.URL.format(suivi)
try:
soup = BeautifulSoup(requests.get(url).content, 'html5lib')
except Exception as e:
self.error('Erreur sur %s: %s' % (url, e))
ident = soup.select('td.identifiant_num')
if not len(ident):
return None
ident = ident[0]
if ident.text.startswith('Aucun produit'):
return None
produit = self._next_el_sibling(ident)
date = self._next_el_sibling(produit)
localisation = self._next_el_sibling(date)
statut = self._next_el_sibling(localisation)
if date and statut:
return '%s (%s)' % (statut.text, date.text)
else:
return None
def import_suivi(self, suivi):
if suivi not in self.cache:
statut = self._import_suivi(suivi)
self.info('SUIVI %s => %s' % (suivi, statut))
self.cache[suivi] = statut
return self.cache[suivi]
def run(self):
self.info('Début import suivi depuis La Poste')
acts = Action.query.join(Action.parlementaire) \
.filter(Parlementaire.etape == ETAPE_ENVOYE) \
.filter(Action.etape == ETAPE_ENVOYE) \
.order_by(Action.suivi) \
.all()
for act in acts:
if not act.suivi:
self.error('Pas de suivi: action %s' % act.id)
continue
suivi = act.suivi.split(':', 1)[0]
status = self.import_suivi(suivi)
if status:
act.suivi = '%s:%s' % (suivi, status)
db.session.commit()
self.info('Import suivi terminé')
......@@ -87,6 +87,25 @@ def setup(app):
return ('<span data-toggle="tooltip"><i class="fa fa-%(icone)s"></i> '
'%(label)s</span>') % etape
@app.template_filter('suivi_laposte')
def suivi_laposte(suivi):
if not suivi:
return ''
parts = suivi.split(':', 1)
link = 'http://www.part.csuivi.courrier.laposte.fr/suivi/index?id=%s' \
% parts[0]
html = 'Suivi&nbsp: <a href="%s" target="_blank">%s</a>' \
% (link, parts[0])
if len(parts) > 1:
html += ' <span class="anon">&ndash; %s</span>' % parts[1]
warning = 'Le suivi peut ne pas fonctionner avant 24 heures.'
html += '<br><small>%s</small>' % warning
return html
_paragraph_re = re.compile(r'(?:\r\n|\r|\n){2,}')
@app.template_filter('nl2br')
......
......@@ -42,7 +42,7 @@
</td>
<td>
{% if action.suivi and action.etape == ordres.ETAPE_ENVOYE %}
<a href="http://www.part.csuivi.courrier.laposte.fr/suivi/index?id={{ action.suivi }}" target="_blank">{{ action.suivi }}</a>
{{ action.suivi|suivi_laposte }}
{% elif action.suivi %}
{{ action.suivi|e }}
{% endif %}
......
......@@ -152,8 +152,7 @@
<td>{{ act.date.strftime("%c") }}</td>
<td>
{% if act.suivi and act.etape == ordres.ETAPE_ENVOYE %}
Suivi&nbsp;: <a href="http://www.part.csuivi.courrier.laposte.fr/suivi/index?id={{ act.suivi }}" target="_blank">{{ act.suivi }}</a><br>
<small>Attention, le suivi peut ne pas fonctionner avant 24 heures.</small>
{{ act.suivi|suivi_laposte }}
{% elif act.suivi %}
{{ act.suivi|e }}
{% endif %}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment