Skip to content

Commit

Permalink
Merge pull request #242 from PnX-SI/develop
Browse files Browse the repository at this point in the history
Develop > Master / Prepa 1.7.3
  • Loading branch information
camillemonchicourt authored Sep 29, 2020
2 parents 8d2b48b + a2c8f98 commit 2b0616d
Show file tree
Hide file tree
Showing 11 changed files with 279 additions and 70 deletions.
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.7.2
1.7.3
12 changes: 4 additions & 8 deletions apptax/taxonomie/routesbibnoms.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,6 @@ def getOne_bibtaxonsInfo(cd_nom):
- id_attribut(integer): id_attribut
(Possibilité de passer plusiers id_attribut)
"""
params = dict(request.args)

# Récupération du cd_ref à partir du cd_nom
cd_ref = db.session.query(Taxref.cd_ref).filter_by(cd_nom=cd_nom).first()
obj = {}
Expand All @@ -125,17 +123,17 @@ def getOne_bibtaxonsInfo(cd_nom):
obj["attributs"] = []
q = db.session.query(CorTaxonAttribut).filter_by(cd_ref=cd_ref)
join_on_bib_attr = False
if "id_theme" in params:
if "id_theme" in request.args.keys() :
q = q.join(
BibAttributs, BibAttributs.id_attribut == CorTaxonAttribut.id_attribut
).filter(BibAttributs.id_theme.in_(params["id_theme"]))
).filter(BibAttributs.id_theme.in_( request.args.getlist("id_theme") ))
join_on_bib_attr = True
if "id_attribut" in params:
if "id_attribut" in request.args.keys() :
if not join_on_bib_attr:
q = q.join(
BibAttributs, BibAttributs.id_attribut == CorTaxonAttribut.id_attribut
)
q = q.filter(BibAttributs.id_attribut.in_(params["id_attribut"]))
q = q.filter(BibAttributs.id_attribut.in_( request.args.getlist("id_attribut") ))
bibAttr = q.all()
for attr in bibAttr:
o = dict(attr.as_dict().items())
Expand All @@ -144,7 +142,6 @@ def getOne_bibtaxonsInfo(cd_nom):
theme = db.session.query(BibThemes).filter_by(id_theme=id).first()
o["nom_theme"] = theme.as_dict()["nom_theme"]
obj["attributs"].append(o)

# Ajout des medias
medias = db.session.query(TMedias).filter_by(cd_ref=cd_ref).all()
obj["medias"] = []
Expand All @@ -154,7 +151,6 @@ def getOne_bibtaxonsInfo(cd_nom):
obj["medias"].append(o)
return obj


@adresses.route("/simple/<int:id_nom>", methods=["GET"])
@json_resp
def getOneSimple_bibtaxons(id_nom):
Expand Down
60 changes: 52 additions & 8 deletions data/scripts/import_inpn_media/README.rst
Original file line number Diff line number Diff line change
@@ -1,38 +1,82 @@

Exemple d'utilisation de la fonctionnalité importer médias depuis INPN
Script d'import des médias de l'INPN
====================================

| Exemple d'utilisation de la fonctionnalité importer des médias depuis l'INPN.
| Ressources : `Connecter TaxHub à wikidata (ou l'INPN) pour en récupérer les médias <https://github.com/PnX-SI/TaxHub/issues/150>`_

Configuration
=============
-------------

Modifier le fichier ``config.py``, en le créant à partir du fichier ``config.py.sample``
Modifier le fichier ``config.py``, en le créant à partir du fichier ``config.py.sample`` : ``cp config.py.sample config.py``

``SQLALCHEMY_DATABASE_URI`` = Chaine de connexion à la base de données

``QUERY_SELECT_CDREF`` = Requete SQL permettant de sélectionner les cd_ref


Usage
=====
Installation
------------

* Créer environnement Python :
* Dans un terminal, se placer dans le dossier du script puis créer l'environnement virtuel Python 3 :

::
virtualenv -p /usr/bin/python3 venv
# Alternative : python3 -m venv venv
source venv/bin/activate
pip install psycopg2
pip install requests
deactivate

* Lancer le script :

Usage
-----

Lancer le script :

::
source venv/bin/activate
python import_inpn_media.py
deactivate

Librairies requises (à installer via pip dans un virtualenv de préférence) :
Le script ajoute toutes les photos en tant que "Photo secondaire" (*id_type = 2*).

L'API de l'INPN ne permet pas encore (2020-09-01) d'obtenir les votes
effectués sur les images sur le site de l'INPN. Cette information pourrait
servir à sélectionner un photo principale (*id_type = 1*).

Si vous souhaitez malgré tout ajouter une photo principale vous pouvez en sélectionner
une aléatoirement (ici le plus petit ``id_media`` pour chaque ``cd_ref``) :

.. code-block:: sql
WITH first_media AS (
SELECT MIN(id_media) AS first_id_media_founded, cd_ref
FROM taxonomie.t_medias
GROUP BY cd_ref
)
UPDATE taxonomie.t_medias AS tm
SET id_type = 1
FROM first_media AS fm
WHERE tm.id_media = fm.first_id_media_founded
AND tm.cd_ref = fm.cd_ref ;
Une fois l'import des médias effectué, et à fin de **rendre visible les photos sur GeoNature-atlas**,
il est nécessaire de rafraichir les données de ses vues matérialisées *atlas.vm_medias* et *atlas.vm_taxons_plus_observes* :

::

REFRESH MATERIALIZED VIEW atlas.vm_medias WITH DATA ;
REFRESH MATERIALIZED VIEW atlas.vm_taxons_plus_observes WITH DATA ;


Dépendances
-----------

Ce script nécessite Python 3 et les bibliothèques suivantes (à installer via pip dans un virtualenv de préférence) :

- psycopg2
- requests
40 changes: 20 additions & 20 deletions data/scripts/import_inpn_media/import_inpn_media.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
# coding: utf8


'''
Script permettant l'import de médias récupérés via l'API inpn
'''
Expand All @@ -10,7 +8,7 @@

import config

# ################

# CONSTANTES
API_URL = "https://taxref.mnhn.fr/api/taxa/{}/media"

Expand Down Expand Up @@ -42,24 +40,24 @@ class Media():

def __init__(
self,
cd_ref, titre, auteur, desc_media, licence,
cd_ref, titre, nom, auteur, desc_media, licence,
url
):
self.cd_ref = cd_ref
self.titre = titre
self.nom = nom
self.auteur = auteur
self.desc_media = desc_media
self.licence = licence
self.url = url

def __repr__(self):
return "cd_ref: {}, titre: {}, url:{}".format(
self.cd_ref, self.titre, self.url
return "Nom: {}, Media: {}".format(
self.nom, self.url
)

# ################
# FONCTIONS

# FONCTIONS
def runquery(cursor, sql, params, trap=False):
'''
Fonction permettant d'executer une requete
Expand All @@ -80,18 +78,17 @@ def runquery(cursor, sql, params, trap=False):

def process_media(cur, cd_ref, media):
'''
Fonction qui gère l'enregistrement du media
dans la base
Fonction qui gère l'enregistrement du media dans la base
'''
m_obj = Media(
cd_ref,
titre = media['taxon']['referenceNameHtml'],
nom = media['taxon']['scientificName'],
auteur = media['copyright'],
desc_media = media['title'],
licence = media['licence'],
url = media['_links']['file']['href']
)
print(m_obj)

# Test si média existe déjà en base
runquery(
Expand All @@ -103,8 +100,8 @@ def process_media(cur, cd_ref, media):

if nb_r[0][0] > 0:
# Mise à jour au cas ou les données
# licence/légende/copyright aient changées
print('update')
# licence/légende/copyright aient changées
print(f'\t{m_obj}, Action : UPDATE')
runquery(
cur,
QUERY_UPDATE_TMEDIA,
Expand All @@ -120,8 +117,8 @@ def process_media(cur, cd_ref, media):
True
)
else:
# Si le média n'éxiste pas insertion en base
print('insert')
# Si le média n'existe pas insertion en base
print(f'\t{m_obj}, Action : INSERT')
runquery(
cur,
QUERY_INSERT_TMEDIA,
Expand All @@ -136,20 +133,19 @@ def process_media(cur, cd_ref, media):
DB_CONNEXION.commit()


# ################
# SCRIPT
try:
DB_CONNEXION = psycopg2.connect(config.SQLALCHEMY_DATABASE_URI)
except Exception as exp:
print("Connexion à la base impossible")
print("ERREUR : connexion à la base impossible !")
quit()

try:
cursor = DB_CONNEXION.cursor()
rows = runquery(cursor, config.QUERY_SELECT_CDREF, None, False)
rows = cursor.fetchall()
except Exception as exp:
print("Problème lors de la récupération de la liste des cd_ref")
print("ERREUR : problème lors de la récupération de la liste des cd_ref !")
quit()


Expand All @@ -158,15 +154,19 @@ def process_media(cur, cd_ref, media):
url = API_URL.format(cd_ref[0])
r = requests.get(url)

if r.status_code != 200:
print(f"\tERREUR : l'URL {url} retourne le code HTTP {r.status_code} !")
continue

if '_embedded' in r.json():
medias = r.json()['_embedded']['media']
if not medias:
print(' no media')
print('\tERREUR : aucun media !')

for media in medias:
if media['taxon']['referenceId'] == cd_ref[0]:
process_media(cursor, cd_ref[0], media)
else:
print (" media non pris en compte car pas sur le bon taxon ", media['taxon']['id'])
print(f"\tERREUR : media non pris en compte car pas sur le bon taxon {media['taxon']['id']} !")

DB_CONNEXION.close()
Loading

0 comments on commit 2b0616d

Please sign in to comment.