diff --git a/VERSION b/VERSION index 347f5833..9df886c4 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.4.1 +1.4.2 diff --git a/atlas/atlasAPI.py b/atlas/atlasAPI.py index 58a036ac..28f2c01e 100644 --- a/atlas/atlasAPI.py +++ b/atlas/atlasAPI.py @@ -33,23 +33,23 @@ def searchCommuneAPI(): results = vmCommunesRepository.getCommunesSearch(session, search, limit) return jsonify(results) - -@api.route("/observationsMailleAndPoint/", methods=["GET"]) -def getObservationsMailleAndPointAPI(cd_ref): - """ - Retourne les observations d'un taxon en point et en maille - - :returns: dict ({'point:', 'maille': 'GeoJson}) - """ - session = utils.loadSession() - observations = { - "point": vmObservationsRepository.searchObservationsChilds(session, cd_ref), - "maille": vmObservationsMaillesRepository.getObservationsMaillesChilds( - session, cd_ref - ), - } - session.close() - return jsonify(observations) +if not current_app.config['AFFICHAGE_MAILLE']: + @api.route("/observationsMailleAndPoint/", methods=["GET"]) + def getObservationsMailleAndPointAPI(cd_ref): + """ + Retourne les observations d'un taxon en point et en maille + + :returns: dict ({'point:', 'maille': 'GeoJson}) + """ + session = utils.loadSession() + observations = { + "point": vmObservationsRepository.searchObservationsChilds(session, cd_ref), + "maille": vmObservationsMaillesRepository.getObservationsMaillesChilds( + session, cd_ref + ), + } + session.close() + return jsonify(observations) @api.route("/observationsMaille/", methods=["GET"]) @@ -70,22 +70,23 @@ def getObservationsMailleAPI(cd_ref, year_min=None, year_max=None): return jsonify(observations) -@api.route("/observationsPoint/", methods=["GET"]) -def getObservationsPointAPI(cd_ref): - connection = utils.engine.connect() - observations = vmObservationsRepository.searchObservationsChilds(connection, cd_ref) - connection.close() - return jsonify(observations) - - -@api.route("/observations//", methods=["GET"]) -def getObservationsCommuneTaxonAPI(insee, cd_ref): - connection = utils.engine.connect() - observations = vmObservationsRepository.getObservationTaxonCommune( - connection, insee, cd_ref - ) - connection.close() - return jsonify(observations) +if not current_app.config['AFFICHAGE_MAILLE']: + @api.route("/observationsPoint/", methods=["GET"]) + def getObservationsPointAPI(cd_ref): + session = utils.loadSession() + observations = vmObservationsRepository.searchObservationsChilds(session, cd_ref) + session.close() + return jsonify(observations) + +if not current_app.config['AFFICHAGE_MAILLE']: + @api.route("/observations//", methods=["GET"]) + def getObservationsCommuneTaxonAPI(insee, cd_ref): + connection = utils.engine.connect() + observations = vmObservationsRepository.getObservationTaxonCommune( + connection, insee, cd_ref + ) + connection.close() + return jsonify(observations) @api.route("/observationsMaille//", methods=["GET"]) diff --git a/atlas/configuration/config.py.example b/atlas/configuration/config.py.example index 5fb9bcbc..6069c5a2 100644 --- a/atlas/configuration/config.py.example +++ b/atlas/configuration/config.py.example @@ -107,7 +107,7 @@ AFFICHAGE_EN_CE_MOMENT = True AFFICHAGE_RANG_STAT = True COLONNES_RANG_STAT = 3 -RANG_STAT = [{'phylum': ["Arthropoda", "Mollusca"]}, {'phylum': ["Chordata"]}, {'regne': ["Plantae"]}] +RANG_STAT = [{'phylum': ["Arthropoda", "Mollusca", "Annelida", "Cnidaria", "Platyhelminthes"]]}, {'phylum': ["Chordata"]}, {'regne': ["Plantae"]}] RANG_STAT_FR = ['Faune invertébrée', 'Faune vertébrée', 'Flore'] diff --git a/atlas/configuration/settings.ini.sample b/atlas/configuration/settings.ini.sample index 125a24f7..56e4b845 100644 --- a/atlas/configuration/settings.ini.sample +++ b/atlas/configuration/settings.ini.sample @@ -1,7 +1,7 @@ - +# ................................ # GeoNature-atlas # PostgreSQL database settings -#................................. +# ................................ # Effacer la base de données existante lors de l'installation drop_apps_db=false @@ -15,15 +15,15 @@ db_port=5432 # Nom de la base de données de l'application db_name=geonatureatlas -# Nom de l'utilisateur BDD, utilisé par l'application, lecteur des vues matérialisées uniquement +# Nom de l'utilisateur BDD, utilisé par l'application atlas, lecteur des vues matérialisées uniquement user_pg=geonatatlas -# Nom du propriétaire de la BDD, utilisé pour créer et mettre à jour la BDD -owner_atlas=geonatuser - -# Password de l'utilisateur de l'application +# Password de l'utilisateur BDD, utilisé par l'application, lecteur des vues matérialisées uniquement user_pg_pass=monpassachanger +# Nom du propriétaire de la BDD atlas, utilisé pour créer et mettre à jour la BDD +owner_atlas=geonatadmin + # Password du propriétaire de la BDD owner_atlas_pass=monpassachanger @@ -52,7 +52,7 @@ db_source_port=5432 db_source_name=geonature2db # Nom de l'utilisateur atlas dans la BDD GeoNature source (lecture seule) -atlas_source_user=geonatuser +atlas_source_user=geonatatlas # Pass de l'utilisateur atlas dans la BDD GeoNature source (lecture seule) atlas_source_pass=monpassachanger diff --git a/atlas/modeles/repositories/vmTaxrefRepository.py b/atlas/modeles/repositories/vmTaxrefRepository.py index e0665aeb..be2982c7 100644 --- a/atlas/modeles/repositories/vmTaxrefRepository.py +++ b/atlas/modeles/repositories/vmTaxrefRepository.py @@ -106,7 +106,7 @@ def getSynonymy(connection, cd_ref): def getTaxon(session, cd_nom): - taxon = ( + return ( session.query( VmTaxref.lb_nom, VmTaxref.id_rang, @@ -119,7 +119,6 @@ def getTaxon(session, cd_nom): .filter(VmTaxref.cd_nom == cd_nom) .one_or_none() ) - return None def getCd_sup(session, cd_ref): diff --git a/data/gn2/atlas_ref_geo.sql b/data/gn2/atlas_ref_geo.sql index 98bc204b..a997915f 100644 --- a/data/gn2/atlas_ref_geo.sql +++ b/data/gn2/atlas_ref_geo.sql @@ -1,9 +1,7 @@ - --################################ ---###COMMUNES +--###Communes --################################ - -- Suppression si temporaire des communes la table existe DO $$ BEGIN @@ -23,15 +21,11 @@ CREATE MATERIALIZED VIEW atlas.l_communes AS WHERE enable=true WITH DATA; - CREATE INDEX index_gist_l_communes_the_geom ON atlas.l_communes USING gist (the_geom); --- Index: atlas.l_communes_insee_idx - --- DROP INDEX atlas.l_communes_insee_idx; CREATE UNIQUE INDEX l_communes_insee_idx ON atlas.l_communes @@ -52,7 +46,6 @@ EXCEPTION WHEN others THEN RAISE NOTICE 'view atlas.t_mailles_territoire does not exist'; END$$; - CREATE MATERIALIZED VIEW atlas.t_mailles_territoire AS SELECT st_transform(c.geom, 3857)::geometry('MultiPolygon',3857) as the_geom, st_asgeojson(st_transform(c.geom, 4326)) AS geojson_maille, @@ -62,6 +55,9 @@ JOIN ref_geo.bib_areas_types t ON t.id_type = c.id_type WHERE t.type_code = :type_maille; +CREATE UNIQUE INDEX t_mailles_territoire_id_maille_idx + ON atlas.t_mailles_territoire + USING btree (id_maille); --################################ @@ -74,7 +70,7 @@ DO $$ BEGIN DROP TABLE atlas.t_layer_territoire; EXCEPTION WHEN others THEN - RAISE NOTICE 'view atlas.t_mailles_territoire does not exist'; + RAISE NOTICE 'view atlas.t_layer_territoire does not exist'; END$$; @@ -99,8 +95,10 @@ CREATE INDEX index_gist_t_layer_territoire_the_geom ON atlas.t_layer_territoire USING gist (the_geom); - - + +CREATE UNIQUE INDEX t_layer_territoire_gid_idx + ON atlas.t_layer_territoire + USING btree (gid); -- Rafraichissement des vues contenant les données de l'atlas diff --git a/data/update_1.4.1to1.4.2.sql b/data/update_1.4.1to1.4.2.sql new file mode 100644 index 00000000..4a8d3b2e --- /dev/null +++ b/data/update_1.4.1to1.4.2.sql @@ -0,0 +1,8 @@ +--index uniques manquants sur 2 vues matérialisées +CREATE UNIQUE INDEX t_layer_territoire_gid_idx + ON atlas.t_layer_territoire + USING btree (gid); + +CREATE UNIQUE INDEX t_mailles_territoire_id_maille_idx + ON atlas.t_mailles_territoire + USING btree (id_maille); \ No newline at end of file diff --git a/docs/changelog.rst b/docs/changelog.rst index db8ec602..bedb21a5 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -2,6 +2,26 @@ CHANGELOG ========= +1.4.2 (2020-11-25) +------------------ + +**🐛 Corrections** + +* Désactivation de la route des observations ponctuelles quand l'atlas est paramétre en mode mailles (#237 par @lpofredc) +* Correction de l'affichage des rangs taxonomiques sur les fiches espèces +* Ajout d'index sur les vues matérialisées ``atlas.t_layer_territoire`` et ``atlas.t_mailles_territoire`` pour pouvoir les rafraichir en parallèle (#254 et #260) +* Correction des observations dupliquées dans les fiches communes (#225 par @jpm-cbna) +* Correction des liens vers les fiches espèce depuis la carte de la page d'accueil en mode mailles (#221 par @jpm-cbna et @lpofredc) +* Correction du spinner pour la recherche par commune (#227 par @jpm-cbna) +* Corrections CSS supprimant un scroll horizontal global (par @jpm-cbna) et un problème de positionnement sur la page de présentation +* Mise à jour de la dépendance Python ``SQLAlchemy`` en version 1.3.19 +* Clarification de la documentation et du fichier d'exemple de ``settings.ini`` + +**⚠️ Notes de version** + +* Si vous mettez à jour l'application, exécutez le script SQL de mise à jour de la BDD : https://github.com/PnX-SI/GeoNature-atlas/blob/master/data/update_1.4.1to1.4.2.sql +* Suivez la procédure classique de mise à jour : https://github.com/PnX-SI/GeoNature-atlas/blob/master/docs/installation.rst#mise-%C3%A0-jour-de-lapplication + 1.4.1 (2019-10-09) ------------------ diff --git a/docs/installation.rst b/docs/installation.rst index 084e802d..6a554657 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -73,8 +73,8 @@ Vous pouvez renommer le dossier qui contient l'application (dans un dossier ``/h Le script ``install_env.sh`` va automatiquement installer les outils nécessaires à l'application si ils ne sont pas déjà sur le serveur : -- PostgreSQL 9.6+ -- PostGIS 2.3+ +- PostgreSQL +- PostGIS - Apache 2 - Python 3 et GDAL - Supervisor @@ -96,52 +96,40 @@ Faites une copie du modèle de fichier de configuration de la BDD et de son inst cp settings.ini.sample settings.ini nano settings.ini -:note: - - Suivez bien les indications en commentaire dans ce fichier. - -:note: +NOTES : - Attention à ne pas mettre de 'quote' dans les valeurs, même pour les chaines de caractères. +* Suivez bien les indications en commentaire dans ce fichier. -:note: - - Dans le cas où vous vous souhaitez connecter l'atlas à une BDD distante de GeoNature v2, il faut au préalable créer un utilisateur spécifique pour l'atlas dans cette dernière (lecture seule). - -:note: +* Attention à ne pas mettre de 'quote' dans les valeurs, même pour les chaines de caractères. - Se connecter en SSH au serveur hébergeant la BDD mère de GeoNature v2 et lancez les commandes suivantes en les adaptant. Faire ensuite correspondre avec les paramètres concernés dans le fichier ``settings.ini`` (``atlas_source_user`` et ``atlas_source_pass``) : +* Dans le cas où vous souhaitez connecter l'atlas à une BDD distante de GeoNature v2, il faut au préalable créer un utilisateur spécifique pour l'atlas dans cette dernière (lecture seule). Pour cela se connecter en SSH au serveur hébergeant la BDD mère de GeoNature v2 et lancez les commandes suivantes en les adaptant. Faire ensuite correspondre avec les paramètres concernés dans le fichier ``settings.ini`` (``atlas_source_user`` et ``atlas_source_pass``) : - :: - - sudo su - postgres - psql - CREATE USER geonatatlas WITH ENCRYPTED PASSWORD 'monpassachanger'; - GRANT USAGE ON SCHEMA gn_synthese, ref_geo, ref_nomenclatures, taxonomie TO geonatatlas; - GRANT SELECT ON ALL TABLES IN SCHEMA gn_synthese, ref_geo, ref_nomenclatures, taxonomie TO geonatatlas; - \q - exit +:: -:note: + sudo su - postgres + psql + CREATE USER geonatatlas WITH ENCRYPTED PASSWORD 'monpassachanger'; + \c geonature2db + GRANT USAGE ON SCHEMA gn_synthese, ref_geo, ref_nomenclatures, taxonomie TO geonatatlas; + GRANT SELECT ON ALL TABLES IN SCHEMA gn_synthese, ref_geo, ref_nomenclatures, taxonomie TO geonatatlas; + \q + exit - GeoNature-atlas fonctionne avec des données géographiques qui doivent être fournies en amont (mailles, limite de territoire, limite de communes). Vous avez la possibilité de récupérer ces données directement depuis le référentiel géographique de GeoNature si les données y sont présentes (``use_ref_geo_gn2=true``); ou de fournir des fichiers shapefiles (à mettre dans le répertoire ``data/ref``) +* GeoNature-atlas fonctionne avec des données géographiques qui doivent être fournies en amont (mailles, limite de territoire, limite de communes). Vous avez la possibilité de récupérer ces données directement depuis le référentiel géographique de GeoNature si les données y sont présentes (``use_ref_geo_gn2=true``); ou de fournir des fichiers shapefiles (à mettre dans le répertoire ``data/ref``) -:note: - - **Attention** si ``use_ref_geo_gn2=true``. Par défaut le ``ref_geo`` contient l'ensemble des communes de France, ce qui ralentit fortement l'installation lorsqu'on construit la vue matérialisée ``vm_communes`` (qui intersecte les communes avec les limites du territoire). +**Attention** si ``use_ref_geo_gn2=true``. Par défaut le ``ref_geo`` contient l'ensemble des communes de France, ce qui ralentit fortement l'installation lorsqu'on construit la vue matérialisée ``vm_communes`` (qui intersecte les communes avec les limites du territoire). - Pour accelérer l'installation, vous pouvez "désactiver" certaines communes du ``ref_geo``, dont vous ne vous servez pas. Voir l'exemple de requête ci-dessous : +Pour accelérer l'installation, vous pouvez "désactiver" certaines communes du ``ref_geo``, dont vous ne vous servez pas. Voir l'exemple de requête ci-dessous : - :: +:: - UPDATE ref_geo.l_areas set enable = false where id_type = 25 AND id_area NOT in ( - select a.id_area from ref_geo.l_areas a - join ref_geo.li_municipalities m ON a.id_area = m.id_area - where insee_dep in ('MON_CODE_DEPARTEMENT', 'MON_CODE_DEPARTEMENT_BIS') - ) + UPDATE ref_geo.l_areas set enable = false where id_type = 25 AND id_area NOT in ( + select a.id_area from ref_geo.l_areas a + join ref_geo.li_municipalities m ON a.id_area = m.id_area + where insee_dep in ('MON_CODE_DEPARTEMENT', 'MON_CODE_DEPARTEMENT_BIS') + ) - - Si votre territoire est celui de toute la France, préférez une installation en fournissant une couche SHP des communes (sans connection au ``ref_geo``) +Si votre territoire est celui de toute la France, préférez une installation en fournissant une couche SHP des communes (sans connection au ``ref_geo``) :note: @@ -170,7 +158,7 @@ Lancez le fichier fichier d'installation de la base de données : :: cd /home/`whoami`/atlas - sudo ./install_db.sh + ./install_db.sh :notes: @@ -186,7 +174,7 @@ Si vous souhaitez uniquement recréer la vue ``atlas.vm_observations`` et les 6 :notes: - Un mécanisme de dégradation des données est fournit par défaut dans GeoNature-atlas, voir la documentation à ce sujet: ``_ + Un mécanisme de dégradation des données est fourni par défaut dans GeoNature-atlas, voir la documentation à ce sujet : ``_ **5. Installation de l'application** diff --git a/requirements.txt b/requirements.txt index f4b31916..2f620c72 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,18 +1,18 @@ Click==7.0 dominate==2.3.5 -Flask==1.1.1 Flask-Compress==1.4.0 Flask-Script==2.0.6 Flask-SQLAlchemy==2.4.0 +Flask==1.1.1 GeoAlchemy2==0.6.3 +geojson==2.4.1 gunicorn==19.9.0 itsdangerous==1.1.0 Jinja2==2.10.1 MarkupSafe==1.1.1 -psycopg2==2.7.5 -SQLAlchemy==1.3.5 +marshmallow==2.19.5 +psycopg2==2.8.5 +SQLAlchemy==1.3.19 visitor==0.1.3 Werkzeug==0.15.4 -marshmallow==2.19.5 -geojson==2.4.1 diff --git a/static/css/atlas.css b/static/css/atlas.css index 30414545..eb3656de 100644 --- a/static/css/atlas.css +++ b/static/css/atlas.css @@ -20,6 +20,12 @@ body { background-color: white !important; } +/* PRESENTATION affix navbar */ + +.affix { + top: 60px; +} + /* TITLE WITH border bar */ .title-bar::before { @@ -55,8 +61,7 @@ body { } #page { - padding-left: 70px; - padding-right: 10px; + padding-left: 75px; margin-top: 25px; } diff --git a/static/css/index.css b/static/css/index.css index e4bb9a31..30ef6122 100644 --- a/static/css/index.css +++ b/static/css/index.css @@ -127,7 +127,7 @@ h3.title-spaced { margin: 0px; } -#searchTaxonsStat { +#searchTaxonsStat, #searchCommunesStat { background-position: right center; background-repeat: no-repeat; background-size: 25px 25px; diff --git a/static/mapGenerator.js b/static/mapGenerator.js index 6ac5429e..40ecbee3 100644 --- a/static/mapGenerator.js +++ b/static/mapGenerator.js @@ -418,11 +418,6 @@ function generateGeojsonPointLastObs(observationsPoint) { properties: properties, geometry: obs.geojson_point }); - myGeoJson.features.push({ - type: "Feature", - properties: properties, - geometry: obs.geojson_point - }); }); return myGeoJson; } @@ -493,7 +488,9 @@ function printEspece(tabEspece, tabCdRef) { i = 0; while (i < tabEspece.length) { stringEspece += - "
  • " + tabEspece[i] + "
  • "; + "
  • " + tabEspece[i] + "
  • "; i = i + 1; }