From 3adc7b48c7f7e99b4c1a618e40857945895a38fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Lech=C3=A9mia?= Date: Fri, 9 Aug 2024 13:11:10 +0200 Subject: [PATCH] =?UTF-8?q?Int=C3=A9gration=20de=20taxhub=20v2=20=C3=A0=20?= =?UTF-8?q?GeoNature=20(#3150)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * TaxHub integration: - load of blueprint - add Babel for traductions - Infer TAXHUB API URL from GN API - remove taxhub from installation : systemd + apache * Taxhub integration (medias + suppression de l'installation standalone de TaxHub * doc on taxhub * compat 2.14 * fix multiple heads of migration ebbe0f7ed866 * add endpoint for taxhub media * Centralisation des parametères relatif à taxhub sous section TAXHUB + API_PREFIX for taxhub api url - retrocompatibily occtax-mobile GeoNature-atlas * Ajout paramètre taxref_region * update requirements * Correction test_synthese::test_get_observations_for_web * doc changelog --------- Co-authored-by: TheoLechemia Co-authored-by: jacquesfize Co-authored-by: amandine-sahl --- .github/workflows/cypress.yml | 9 +- .github/workflows/eval.yml | 1 + .github/workflows/eval_perf.yml | 21 +-- .github/workflows/pytest.yml | 1 + backend/dependencies/TaxHub | 2 +- backend/dependencies/UsersHub | 2 +- .../UsersHub-authentification-module | 2 +- backend/geonature/app.py | 42 +++++ backend/geonature/core/admin/admin.py | 3 + backend/geonature/core/command/main.py | 1 - .../geonature/core/gn_permissions/admin.py | 1 + backend/geonature/core/taxonomie/admin.py | 92 +++++++++++ .../ebbe0f7ed866_declare_taxhub_admin.py | 145 ++++++++++++++++++ backend/geonature/tests/test_synthese.py | 12 +- backend/geonature/utils/config_schema.py | 24 ++- backend/requirements-common.in | 1 + backend/requirements-dependencies.in | 2 +- backend/requirements-dev.txt | 82 +++++----- config/default_config.toml.example | 9 +- config/geonature_config.toml.sample | 1 - config/settings.ini.sample | 5 +- config/test_config.toml | 1 - docs/CHANGELOG.md | 23 +++ docs/admin-manual.rst | 28 ++++ docs/https.rst | 1 - install/03b_populate_db.sh | 2 +- install/assets/vhost_apache.conf | 1 - install/install_all/install_all.ini | 14 +- install/install_all/install_all.sh | 59 +------ install/migration/migration.sh | 51 +++++- 30 files changed, 487 insertions(+), 151 deletions(-) create mode 100644 backend/geonature/core/taxonomie/admin.py create mode 100644 backend/geonature/migrations/versions/ebbe0f7ed866_declare_taxhub_admin.py diff --git a/.github/workflows/cypress.yml b/.github/workflows/cypress.yml index f6c6c0c745..2d88ad76fb 100644 --- a/.github/workflows/cypress.yml +++ b/.github/workflows/cypress.yml @@ -78,6 +78,7 @@ jobs: GEONATURE_CONFIG_FILE: config/test_config.toml srid_local: 2154 install_bdc_statuts: true + taxref_region: fr add_sample_data: true install_sig_layers: true install_grid_layer_5: true @@ -100,7 +101,7 @@ jobs: cp ./config/settings.ini.sample ./config/settings.ini ./install/05_install_frontend.sh --ci env: - GEONATURE_CONFIG_FILE: "${{ github.workspace }}/config/test_config.toml" + GEONATURE_CONFIG_FILE: '${{ github.workspace }}/config/test_config.toml' - name: Install core modules run: | geonature install-gn-module contrib/occtax OCCTAX --build=false @@ -115,12 +116,6 @@ jobs: run: geonature dev_back & env: GEONATURE_CONFIG_FILE: config/test_config.toml - - name: Run TaxHub backend - run: flask run --host=0.0.0.0 & - working-directory: ./backend/dependencies/TaxHub/ - env: - TAXHUB_SETTINGS: test_config.py - TAXHUB_SQLALCHEMY_DATABASE_URI: "postgresql://geonatadmin:geonatpasswd@127.0.0.1:5432/geonature2db" - name: Cypress run uses: cypress-io/github-action@v5 with: diff --git a/.github/workflows/eval.yml b/.github/workflows/eval.yml index 060cf8546b..048f90f321 100644 --- a/.github/workflows/eval.yml +++ b/.github/workflows/eval.yml @@ -94,6 +94,7 @@ jobs: GEONATURE_CONFIG_FILE: config/test_config.toml srid_local: 2154 install_bdc_statuts: true + taxref_region: fr add_sample_data: true install_sig_layers: true install_grid_layer_5: true diff --git a/.github/workflows/eval_perf.yml b/.github/workflows/eval_perf.yml index c6fbe44030..a1a764446f 100644 --- a/.github/workflows/eval_perf.yml +++ b/.github/workflows/eval_perf.yml @@ -9,16 +9,16 @@ jobs: strategy: fail-fast: false matrix: - debian-version: ["11", "12"] + debian-version: ['11', '12'] include: - - debian-version: "11" - python-version: "3.9" - postgres-version: "13" - postgis-version: "3.2" - - debian-version: "12" - python-version: "3.11" - postgres-version: "15" - postgis-version: "3.3" + - debian-version: '11' + python-version: '3.9' + postgres-version: '13' + postgis-version: '3.2' + - debian-version: '12' + python-version: '3.11' + postgres-version: '15' + postgis-version: '3.3' name: Debian ${{ matrix.debian-version }} @@ -50,7 +50,7 @@ jobs: uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - cache: "pip" + cache: 'pip' - name: Install GDAL run: | sudo apt update @@ -94,6 +94,7 @@ jobs: GEONATURE_CONFIG_FILE: config/test_config.toml srid_local: 2154 install_bdc_statuts: true + taxref_region: fr add_sample_data: true install_sig_layers: true install_grid_layer_5: true diff --git a/.github/workflows/pytest.yml b/.github/workflows/pytest.yml index 32c6b218c4..e67e031abe 100644 --- a/.github/workflows/pytest.yml +++ b/.github/workflows/pytest.yml @@ -95,6 +95,7 @@ jobs: GEONATURE_CONFIG_FILE: config/test_config.toml srid_local: 2154 install_bdc_statuts: true + taxref_region: fr add_sample_data: true install_sig_layers: true install_grid_layer_5: true diff --git a/backend/dependencies/TaxHub b/backend/dependencies/TaxHub index 14614a75ad..0ef55f96dc 160000 --- a/backend/dependencies/TaxHub +++ b/backend/dependencies/TaxHub @@ -1 +1 @@ -Subproject commit 14614a75ad80a09f6a0fcfddda54252340abf728 +Subproject commit 0ef55f96dc566358e5f3ed43863dc836fdac362f diff --git a/backend/dependencies/UsersHub b/backend/dependencies/UsersHub index 1b5b79f19f..c1c2f55c0c 160000 --- a/backend/dependencies/UsersHub +++ b/backend/dependencies/UsersHub @@ -1 +1 @@ -Subproject commit 1b5b79f19fadb4688860b4219fbf58df4554547e +Subproject commit c1c2f55c0cea615bd0e9550cf0c0e606b7a94417 diff --git a/backend/dependencies/UsersHub-authentification-module b/backend/dependencies/UsersHub-authentification-module index 18c70fa84d..e27573a9d1 160000 --- a/backend/dependencies/UsersHub-authentification-module +++ b/backend/dependencies/UsersHub-authentification-module @@ -1 +1 @@ -Subproject commit 18c70fa84d5553e765d4c509948d1fc5e8554e29 +Subproject commit e27573a9d12e116ef91b1211d6cf9451ccd1aae7 diff --git a/backend/geonature/app.py b/backend/geonature/app.py index 669b93c4ab..ee5b8ae5c4 100755 --- a/backend/geonature/app.py +++ b/backend/geonature/app.py @@ -14,6 +14,7 @@ from flask import Flask, g, request, current_app, send_from_directory from flask.json.provider import DefaultJSONProvider from flask_mail import Message +from flask_babel import Babel from flask_cors import CORS from flask_login import current_user from flask_sqlalchemy.track_modifications import before_models_committed @@ -82,6 +83,17 @@ def default(o): return DefaultJSONProvider.default(o) +def get_locale(): + # if a user is logged in, use the locale from the user settings + user = getattr(g, "user", None) + if user is not None: + return user.locale + # otherwise try to guess the language from the user accept + # header the browser transmits. We support de/fr/en in this + # example. The best match wins. + return request.accept_languages.best_match(["de", "fr", "en"]) + + def create_app(with_external_mods=True): app = Flask( __name__.split(".")[0], @@ -175,12 +187,22 @@ def set_sentry_context(): admin.init_app(app) + # babel + babel = Babel(app, locale_selector=get_locale) + # Enable serving of media files app.add_url_rule( f"{config['MEDIA_URL']}/", view_func=lambda filename: send_from_directory(config["MEDIA_FOLDER"], filename), endpoint="media", ) + app.add_url_rule( + f"{config['MEDIA_URL']}/taxhub/", + view_func=lambda filename: send_from_directory( + config["MEDIA_FOLDER"] + "/taxhub", filename + ), + endpoint="media_taxhub", + ) for blueprint_path, url_prefix in [ ("pypn_habref_api.routes:routes", "/habref"), @@ -202,6 +224,26 @@ def set_sentry_context(): app.register_blueprint(blueprint, url_prefix=url_prefix) with app.app_context(): + # taxhub api + from apptax import taxhub_api_routes + + base_api_prefix = app.config["TAXHUB"].get("API_PREFIX") + + for blueprint_path, url_prefix in taxhub_api_routes: + module_name, blueprint_name = blueprint_path.split(":") + blueprint = getattr(import_module(module_name), blueprint_name) + app.register_blueprint(blueprint, url_prefix="/taxhub" + base_api_prefix + url_prefix) + + # taxhub admin + from apptax.admin.admin import adresses + + app.register_blueprint(adresses, url_prefix="/taxhub") + + # register taxhub admin view which need app context + from geonature.core.taxonomie.admin import load_admin_views + + load_admin_views(app, admin) + # register errors handlers import geonature.core.errors diff --git a/backend/geonature/core/admin/admin.py b/backend/geonature/core/admin/admin.py index bb171b2c1b..573a9096fd 100644 --- a/backend/geonature/core/admin/admin.py +++ b/backend/geonature/core/admin/admin.py @@ -1,3 +1,5 @@ +import os + from flask import g from werkzeug.exceptions import Unauthorized from flask_admin import Admin, AdminIndexView, expose @@ -152,4 +154,5 @@ class ProtectedTNomenclaturesAdmin( ) ) + flask_admin = admin # for retro-compatibility, usefull for export module for instance diff --git a/backend/geonature/core/command/main.py b/backend/geonature/core/command/main.py index 4b63ba18dc..a5db10d0e4 100644 --- a/backend/geonature/core/command/main.py +++ b/backend/geonature/core/command/main.py @@ -115,7 +115,6 @@ def default_config(): required_fields = ( "URL_APPLICATION", "API_ENDPOINT", - "API_TAXHUB", "SECRET_KEY", "SQLALCHEMY_DATABASE_URI", ) diff --git a/backend/geonature/core/gn_permissions/admin.py b/backend/geonature/core/gn_permissions/admin.py index fa548f330d..885d2d7836 100644 --- a/backend/geonature/core/gn_permissions/admin.py +++ b/backend/geonature/core/gn_permissions/admin.py @@ -9,6 +9,7 @@ from markupsafe import Markup from sqlalchemy.orm import contains_eager, joinedload from sqlalchemy import select +from markupsafe import Markup from geonature.utils.env import db from geonature.utils.config import config diff --git a/backend/geonature/core/taxonomie/admin.py b/backend/geonature/core/taxonomie/admin.py new file mode 100644 index 0000000000..288881aaa5 --- /dev/null +++ b/backend/geonature/core/taxonomie/admin.py @@ -0,0 +1,92 @@ +import os +from apptax.admin.admin_view import ( + BibListesView, + TaxrefView, + TMediasView, + BibAttributsView, + BibThemesView, +) +from geonature.utils.env import db + +from apptax.admin.admin import adresses +from apptax.taxonomie.models import Taxref, BibListes, TMedias, BibAttributs, BibThemes +from geonature.core.admin.utils import CruvedProtectedMixin + + +class CruvedProtectedBibListesView(CruvedProtectedMixin, BibListesView): + module_code = "TAXHUB" + object_code = "LISTE" + extra_actions_perm = {".import_cd_nom_view": "C"} + + +class CruvedProtectedTaxrefView(CruvedProtectedMixin, TaxrefView): + module_code = "TAXHUB" + object_code = "TAXON" + + +class CruvedProtectedTMediasView(CruvedProtectedMixin, TMediasView): + module_code = "TAXHUB" + object_code = "TAXON" + + +class CruvedProtectedBibAttributsView(CruvedProtectedMixin, BibAttributsView): + module_code = "TAXHUB" + object_code = "ATTRIBUT" + + +class CruvedProtectedBibThemes(CruvedProtectedMixin, BibThemesView): + module_code = "TAXHUB" + object_code = "THEME" + + +def load_admin_views(app, admin): + static_folder = os.path.join(adresses.root_path, "static") + + admin.add_view( + CruvedProtectedTaxrefView( + Taxref, + db.session, + name="Taxref", + endpoint="taxons", + category="TaxHub", + static_folder=static_folder, + ) + ) + admin.add_view( + CruvedProtectedBibListesView( + BibListes, + db.session, + name="Listes", + category="TaxHub", + static_folder=static_folder, + ) + ) + + admin.add_view( + CruvedProtectedBibAttributsView( + BibAttributs, + db.session, + name="Attributs", + category="TaxHub", + static_folder=static_folder, + ) + ) + admin.add_view( + CruvedProtectedBibThemes( + BibThemes, + db.session, + name="Thèmes", + category="TaxHub", + static_folder=static_folder, + ) + ) + + admin.add_view( + CruvedProtectedTMediasView( + TMedias, + db.session, + name="Médias", + category="TaxHub", + static_folder=static_folder, + ) + ) diff --git a/backend/geonature/migrations/versions/ebbe0f7ed866_declare_taxhub_admin.py b/backend/geonature/migrations/versions/ebbe0f7ed866_declare_taxhub_admin.py new file mode 100644 index 0000000000..52d5f4b24b --- /dev/null +++ b/backend/geonature/migrations/versions/ebbe0f7ed866_declare_taxhub_admin.py @@ -0,0 +1,145 @@ +"""declare module TAXHUB + +Revision ID: ebbe0f7ed866 +Revises: f1dd984bff97 +Create Date: 2023-08-02 13:15:38.542530 + +""" + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = "ebbe0f7ed866" +down_revision = "9f4db1786c22" +branch_labels = None +depends_on = None + +from geonature.utils.config import config + + +def upgrade(): + op.get_bind().execute( + sa.text( + """ + INSERT INTO gn_commons.t_modules + (module_code, module_label, module_picto, module_desc, module_target, module_external_url, active_frontend, active_backend) + VALUES('TAXHUB', 'Taxhub', 'fa-leaf', 'Module TaxHub', '_blank', :module_url, false, false); + + INSERT INTO gn_permissions.t_objects + (code_object, description_object) + VALUES + ('TAXON', 'Gestion des taxons dans TaxHub'), + ('THEME', 'Gestion des thêmes d''attribut dans TaxHub'), + ('LISTE', 'Gestion des listes dans TaxHub'), + ('ATTRIBUT', 'Gestion des types d''attributs dans TaxHub') + ; + + INSERT INTO gn_permissions.cor_object_module + (id_object, id_module) + SELECT _to.id_object, (SELECT id_module FROM gn_commons.t_modules WHERE module_code = 'TAXHUB') + FROM ( + VALUES + ('TAXON'), + ('THEME'), + ('LISTE'), + ('ATTRIBUT') + ) AS o (object_code) + JOIN gn_permissions.t_objects _to ON _to.code_object = o.object_code; + + + + INSERT INTO + gn_permissions.t_permissions_available ( + id_module, + id_object, + id_action, + scope_filter, + label + ) + SELECT + m.id_module, + o.id_object, + a.id_action, + v.scope_filter, + v.label + FROM ( + VALUES + ('TAXHUB', 'TAXON', 'R', False, 'Voir les taxons') + ,('TAXHUB', 'TAXON', 'U', False, 'Modifier les taxons (médias - liste - attributs)') + ,('TAXHUB', 'THEME', 'C', False, 'Créer des thêmes') + ,('TAXHUB', 'THEME', 'R', False, 'Voir les thêmes') + ,('TAXHUB', 'THEME', 'U', False, 'Modifier les thêmes') + ,('TAXHUB', 'THEME', 'D', False, 'Supprimer des thêmes') + ,('TAXHUB', 'LISTE', 'C', False, 'Creer des listes') + ,('TAXHUB', 'LISTE', 'R', False, 'Voir les listes') + ,('TAXHUB', 'LISTE', 'U', False, 'Modifier les listes') + ,('TAXHUB', 'LISTE', 'D', False, 'Supprimer des listes') + ,('TAXHUB', 'ATTRIBUT', 'C', False, 'Créer des types d''attribut') + ,('TAXHUB', 'ATTRIBUT', 'R', False, 'Voir les types d''attribut') + ,('TAXHUB', 'ATTRIBUT', 'U', False, 'Modfier les types d''attribut') + ,('TAXHUB', 'ATTRIBUT', 'D', False, 'Supprimer les types d''attribut') + ) AS v (module_code, object_code, action_code, scope_filter, label) + JOIN + gn_commons.t_modules m ON m.module_code = v.module_code + JOIN + gn_permissions.t_objects o ON o.code_object = v.object_code + JOIN + gn_permissions.bib_actions a ON a.code_action = v.action_code + WHERE m.module_code = 'TAXHUB' + """ + ), + module_url=f"{config['API_ENDPOINT']}/admin/taxons", + ) + # rappatriement des permissions de l'application TaxHub + + op.execute( + """ + INSERT INTO gn_permissions.t_permissions + (id_role, id_action, id_module, id_object) + SELECT crap.id_role, t.id_action, t.id_module, t.id_object + FROM + ( values ('TH', 'TAXHUB')) as v (code_appli, code_module) + JOIN gn_commons.t_modules m ON m.module_code = v.code_module + JOIN gn_permissions.t_permissions_available t on t.id_module = m.id_module + JOIN utilisateurs.t_applications app on app.code_application = v.code_appli + JOIN utilisateurs.cor_role_app_profil crap on crap.id_application = app.id_application + WHERE m.module_code = 'TAXHUB' and app.code_application = 'TH' and crap.id_profil = 6; + + INSERT INTO gn_permissions.t_permissions + (id_role, id_action, id_module, id_object) + SELECT crap.id_role, t.id_action, t.id_module, t.id_object + FROM + ( values ('TH', 'TAXHUB')) as v (code_appli, code_module) + JOIN gn_commons.t_modules m ON m.module_code = v.code_module + JOIN gn_permissions.t_permissions_available t on t.id_module = m.id_module + JOIN gn_permissions.t_objects obj on t.id_object = obj.id_object + JOIN utilisateurs.t_applications app on app.code_application = v.code_appli + JOIN utilisateurs.cor_role_app_profil crap on crap.id_application = app.id_application + WHERE + m.module_code = 'TAXHUB' + AND app.code_application = 'TH' + AND crap.id_profil in (1,2,3,4,5) + AND obj.code_object = 'TAXON'; + """ + ) + + op.execute( + """ + DELETE FROM utilisateurs.cor_role_app_profil where id_application = (select id_application from utilisateurs.t_applications t where t.code_application = 'TH' ); + DELETE FROM utilisateurs.cor_profil_for_app where id_application = (select id_application from utilisateurs.t_applications t where t.code_application = 'TH' ); + DELETE FROM utilisateurs.t_applications where code_application = 'TH'; + """ + ) + + +def downgrade(): + op.execute( + """ + DELETE FROM gn_permissions.t_permissions WHERE id_module = (SELECT id_module FROM gn_commons.t_modules WHERE module_code = 'TAXHUB'); + DELETE FROM gn_permissions.t_permissions_available WHERE id_module = (SELECT id_module FROM gn_commons.t_modules WHERE module_code = 'TAXHUB'); + DELETE FROM gn_commons.t_modules where module_code = 'TAXHUB'; + DELETE FROM gn_permissions.t_objects where code_object in ('TAXON', 'ATTRIBUT', 'THEME', 'LISTE'); + """ + ) diff --git a/backend/geonature/tests/test_synthese.py b/backend/geonature/tests/test_synthese.py index 8f2f219c3f..f39df755a4 100644 --- a/backend/geonature/tests/test_synthese.py +++ b/backend/geonature/tests/test_synthese.py @@ -36,7 +36,7 @@ from apptax.taxonomie.models import Taxref from ref_geo.models import BibAreasTypes, LAreas -from apptax.tests.fixtures import noms_example, attribut_example +from apptax.tests.fixtures import noms_example, attribut_example, liste from pypnusershub.tests.utils import logged_user_headers, set_logged_user from utils_flask_sqla_geo.schema import GeoModelConverter, GeoAlchemyAutoSchema @@ -76,14 +76,14 @@ def taxon_attribut(noms_example, attribut_example, synthese_data): """ Require "taxonomie_taxons_example" and "taxonomie_attributes_example" alembic branches. """ - from apptax.taxonomie.models import BibAttributs, BibNoms, CorTaxonAttribut + from apptax.taxonomie.models import Taxref, BibAttributs, CorTaxonAttribut - nom = db.session.scalars(select(BibNoms).filter_by(cd_ref=209902)).one() + nom = db.session.scalars(select(Taxref).filter_by(cd_nom=209902)).one() attribut = db.session.scalars( select(BibAttributs).filter_by(nom_attribut=attribut_example.nom_attribut) ).one() with db.session.begin_nested(): - c = CorTaxonAttribut(bib_nom=nom, bib_attribut=attribut, valeur_attribut="eau") + c = CorTaxonAttribut(taxon=nom, bib_attribut=attribut, valeur_attribut="eau") db.session.add(c) return c @@ -241,7 +241,7 @@ def test_get_observations_for_web(self, app, users, synthese_data, taxon_attribu # schema["properties"]["observations"]["items"]["required"] = # test on synonymy and taxref attrs filters = { - "cd_ref": [taxon_attribut.bib_nom.cd_ref], + "cd_ref": [taxon_attribut.taxon.cd_ref], "taxhub_attribut_{}".format(taxon_attribut.bib_attribut.id_attribut): [ taxon_attribut.valeur_attribut ], @@ -250,7 +250,7 @@ def test_get_observations_for_web(self, app, users, synthese_data, taxon_attribu assert r.status_code == 200 assert len(r.json["features"]) > 0 for feature in r.json["features"]: - assert feature["properties"]["cd_nom"] == taxon_attribut.bib_nom.cd_nom + assert feature["properties"]["cd_nom"] == 713776 # test intersection filters filters = { diff --git a/backend/geonature/utils/config_schema.py b/backend/geonature/utils/config_schema.py index 54b9d9548b..977d8f7464 100644 --- a/backend/geonature/utils/config_schema.py +++ b/backend/geonature/utils/config_schema.py @@ -3,6 +3,7 @@ """ import os +import warnings from warnings import warn @@ -25,6 +26,7 @@ from geonature.utils.module import iter_modules_dist, get_module_config from geonature.utils.utilsmails import clean_recipients from pypnusershub.auth.authentication import ProviderConfigurationSchema +from apptax.utils.config.config_schema import TaxhubAppConf class EmailStrOrListOfEmailStrField(fields.Field): @@ -528,10 +530,6 @@ class MapConfig(Schema): REF_LAYERS_LEGEND = fields.Boolean(load_default=False) -class TaxHub(Schema): - ID_TYPE_MAIN_PHOTO = fields.Integer(load_default=1) - - # class a utiliser pour les paramètres que l'on veut passer au frontend class GnGeneralSchemaConf(Schema): appName = fields.String(load_default="GeoNature2") @@ -541,7 +539,7 @@ class GnGeneralSchemaConf(Schema): DEBUG = fields.Boolean(load_default=False) URL_APPLICATION = fields.Url(required=True) API_ENDPOINT = fields.Url(required=True) - API_TAXHUB = fields.Url(required=True) + API_TAXHUB = fields.Url() CODE_APPLICATION = fields.String(load_default="GN") DISABLED_MODULES = fields.List(fields.String(), load_default=[]) RIGHTS = fields.Nested(RightsSchemaConf, load_default=RightsSchemaConf().load({})) @@ -559,7 +557,8 @@ class GnGeneralSchemaConf(Schema): NB_MAX_DATA_SENSITIVITY_REPORT = fields.Integer(load_default=1000000) ADDITIONAL_FIELDS = fields.Nested(AdditionalFields, load_default=AdditionalFields().load({})) PUBLIC_ACCESS_USERNAME = fields.String(load_default="") - TAXHUB = fields.Nested(TaxHub, load_default=TaxHub().load({})) + TAXHUB = fields.Nested(TaxhubAppConf, load_default=TaxhubAppConf().load({"API_PREFIX": "/api"})) + HOME = fields.Nested(HomeConfig, load_default=HomeConfig().load({})) NOTIFICATIONS_ENABLED = fields.Boolean(load_default=True) PROFILES_REFRESH_CRONTAB = fields.String(load_default="0 3 * * *") @@ -580,8 +579,21 @@ def validate_account_autovalidation(self, data, **kwargs): "AUTO_ACCOUNT_CREATION, VALIDATOR_EMAIL", ) + @pre_load + def _pre_load(self, data, **kwargs): + if "API_TAXHUB" in data: + warnings.warn( + "Le paramètre API_TAXHUB est déprécié, il sera automatiquement déduit API_ENDPOINT et supprimé dans la version 2.14", + Warning, + ) + return data + @post_load def insert_module_config(self, data, **kwargs): + # URL de l'api taxub + data["API_TAXHUB"] = f"{data['API_ENDPOINT']}/taxhub{data['TAXHUB']['API_PREFIX']}" + + # Configuration des modules actifs for dist in iter_modules_dist(): module_code = dist.entry_points["code"].load() if module_code in data["DISABLED_MODULES"]: diff --git a/backend/requirements-common.in b/backend/requirements-common.in index 74d53793dd..05919e73da 100644 --- a/backend/requirements-common.in +++ b/backend/requirements-common.in @@ -3,6 +3,7 @@ click>=7.0 fiona>=1.9.6 flask>=3.0 flask-admin +flask-babel flask-cors flask-mail flask-marshmallow diff --git a/backend/requirements-dependencies.in b/backend/requirements-dependencies.in index 91fd661b61..eccc6681d5 100644 --- a/backend/requirements-dependencies.in +++ b/backend/requirements-dependencies.in @@ -1,4 +1,4 @@ -pypnusershub>=2.1.5,<3 +pypnusershub>=3.0.0,<4 pypnnomenclature>=1.6.3,<2 pypn_habref_api>=0.4.1,<1 utils-flask-sqlalchemy-geo>=0.3.2,<1 diff --git a/backend/requirements-dev.txt b/backend/requirements-dev.txt index 2790608f10..75af6a482d 100644 --- a/backend/requirements-dev.txt +++ b/backend/requirements-dev.txt @@ -37,7 +37,7 @@ # via # -r requirements-submodules.in # pypn-ref-geo -alembic==1.13.1 +alembic==1.13.2 # via # flask-migrate # pypn-ref-geo @@ -46,11 +46,13 @@ amqp==5.2.0 # via kombu async-timeout==4.0.3 # via redis -attrs==23.2.0 +attrs==24.2.0 # via fiona -authlib==1.3.0 +authlib==1.3.1 # via pypnusershub -bcrypt==4.1.3 +babel==2.15.0 + # via flask-babel +bcrypt==4.2.0 # via pypnusershub billiard==4.2.0 # via celery @@ -58,13 +60,7 @@ blinker==1.8.2 # via # flask # flask-mail -boto3==1.34.112 - # via taxhub -botocore==1.34.112 - # via - # boto3 - # s3transfer -cairocffi==1.7.0 +cairocffi==1.7.1 # via # cairosvg # weasyprint @@ -72,11 +68,11 @@ cairosvg==2.7.1 # via weasyprint celery[redis]==5.4.0 # via -r requirements-common.in -certifi==2024.2.2 +certifi==2024.7.4 # via # fiona # requests -cffi==1.16.0 +cffi==1.17.0 # via # cairocffi # cryptography @@ -104,7 +100,7 @@ click-repl==0.3.0 # via celery cligj==0.7.2 # via fiona -cryptography==42.0.7 +cryptography==43.0.0 # via authlib cssselect2==0.7.0 # via @@ -114,7 +110,7 @@ defusedxml==0.7.1 # via cairosvg dnspython==2.6.1 # via email-validator -email-validator==2.1.1 +email-validator==2.2.0 # via wtforms-components fiona==1.9.6 # via @@ -124,6 +120,7 @@ flask==3.0.3 # via # -r requirements-common.in # flask-admin + # flask-babel # flask-cors # flask-login # flask-mail @@ -143,6 +140,9 @@ flask-admin==1.6.1 # via # -r requirements-common.in # pypnnomenclature + # taxhub +flask-babel==4.0.0 + # via -r requirements-common.in flask-cors==4.0.1 # via # -r requirements-common.in @@ -183,7 +183,7 @@ flask-wtf==1.2.1 # via # -r requirements-common.in # usershub -geoalchemy2==0.15.1 +geoalchemy2==0.15.2 # via utils-flask-sqlalchemy-geo geojson==3.1.0 # via @@ -216,12 +216,10 @@ itsdangerous==2.2.0 # flask # flask-wtf jinja2==3.1.4 - # via flask -jmespath==1.0.1 # via - # boto3 - # botocore -kombu==5.3.7 + # flask + # flask-babel +kombu==5.4.0 # via celery lxml==5.2.2 # via -r requirements-common.in @@ -234,7 +232,7 @@ markupsafe==2.1.5 # werkzeug # wtforms # wtforms-components -marshmallow==3.21.2 +marshmallow==3.21.3 # via # -r requirements-common.in # flask-marshmallow @@ -253,21 +251,21 @@ marshmallow-sqlalchemy==1.0.0 # taxhub # usershub # utils-flask-sqlalchemy-geo -numpy==1.26.4 +numpy==2.0.1 # via shapely -packaging==24.0 +packaging==24.1 # via # -r requirements-common.in # geoalchemy2 # gunicorn # marshmallow -pillow==10.3.0 +pillow==10.4.0 # via # -r requirements-common.in # cairosvg # taxhub # weasyprint -prompt-toolkit==3.0.43 +prompt-toolkit==3.0.47 # via click-repl psycopg2==2.9.9 # via @@ -280,12 +278,11 @@ psycopg2==2.9.9 # usershub pycparser==2.22 # via cffi -pyphen==0.15.0 +pyphen==0.16.0 # via weasyprint python-dateutil==2.9.0.post0 # via # -r requirements-common.in - # botocore # celery # usershub # utils-flask-sqlalchemy @@ -296,15 +293,15 @@ python-dotenv==1.0.1 # pypnnomenclature # taxhub # usershub -redis==5.0.4 +pytz==2024.1 + # via flask-babel +redis==5.0.8 # via celery -requests==2.32.2 +requests==2.32.3 # via # pypn-habref-api # pypnusershub -s3transfer==0.10.1 - # via boto3 -shapely==2.0.4 +shapely==2.0.5 # via # -r requirements-common.in # utils-flask-sqlalchemy-geo @@ -314,7 +311,7 @@ six==1.16.0 # html5lib # python-dateutil # wtforms-components -sqlalchemy==1.4.52 +sqlalchemy==1.4.53 # via # -r requirements-common.in # alembic @@ -335,19 +332,20 @@ tinycss2==1.3.0 # cssselect2 # weasyprint toml==0.10.2 - # via -r requirements-common.in -typing-extensions==4.12.0 + # via + # -r requirements-common.in + # taxhub +typing-extensions==4.12.2 # via # alembic # kombu tzdata==2024.1 # via celery -urllib3==1.26.18 +urllib3==2.2.2 # via - # botocore # requests # taxhub -validators==0.28.2 +validators==0.33.0 # via wtforms-components vine==5.1.0 # via @@ -382,8 +380,10 @@ wtforms-components==0.10.5 wtforms-sqlalchemy==0.4.1 # via -r requirements-common.in xmltodict==0.13.0 - # via -r requirements-common.in -zipp==3.18.2 + # via + # -r requirements-common.in + # pypnusershub +zipp==3.19.2 # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: diff --git a/config/default_config.toml.example b/config/default_config.toml.example index d5a75b5bd8..937a97416a 100644 --- a/config/default_config.toml.example +++ b/config/default_config.toml.example @@ -41,8 +41,6 @@ URL_APPLICATION = "http://url.com/geonature" # URL de l'API de GeoNature. Remplacer "url.com" par votre domaine ou IP API_ENDPOINT = "http://url.com/geonature/api" -# URL de l'API de Taxhub -API_TAXHUB = "http://127.0.0.1:5000/api/" # Type de session SESSION_TYPE = "filesystem" @@ -112,6 +110,13 @@ MEDIA_CLEAN_CRONTAB = "0 1 * * *" MY_ORGANISM_DATA = 2 ALL_DATA = 3 +# Configuration de taxhub +[TAXHUB] + # Préfixe des routes de l'api de taxhub + API_PREFIX="/api" + # Identifiant du type de médias "Photo principale" + ID_TYPE_MAIN_PHOTO=1 + # Configuration générale de l'interface de GeoNature [FRONTEND] # En mode production (=true) moins de message dans la Console navigateur diff --git a/config/geonature_config.toml.sample b/config/geonature_config.toml.sample index 16ca60b648..6625c7a8df 100644 --- a/config/geonature_config.toml.sample +++ b/config/geonature_config.toml.sample @@ -6,7 +6,6 @@ SQLALCHEMY_DATABASE_URI = "postgresql://monuser:monpassachanger@localhost:5432/mabase" URL_APPLICATION = 'http://url.com/geonature' API_ENDPOINT = 'http://url.com/geonature/api' -API_TAXHUB = 'http://url.com/taxhub/api' # Remplacer par une clé alétoire complexe SECRET_KEY = 'super secret key' diff --git a/config/settings.ini.sample b/config/settings.ini.sample index 6d4fd78f23..021693b894 100755 --- a/config/settings.ini.sample +++ b/config/settings.ini.sample @@ -47,7 +47,10 @@ srid_local=2154 default_language=fr # Installation de la base de connaissance des statuts -install_bdc_statuts=true +install_bdc_statuts=false + +# Nom de la colonne région à importer dans la colonne id_statut de taxref +taxref_region=fr # Permet l'installation des couches SIG des communes et départements # Seules les couches de métropole en 2154 sont fournies (false conseillé hors métropole) diff --git a/config/test_config.toml b/config/test_config.toml index 03432288eb..fe5ca581c6 100644 --- a/config/test_config.toml +++ b/config/test_config.toml @@ -1,7 +1,6 @@ SQLALCHEMY_DATABASE_URI = "postgresql://geonatadmin:geonatpasswd@127.0.0.1:5432/geonature2db" URL_APPLICATION = 'http://127.0.0.1:4200' API_ENDPOINT = 'http://127.0.0.1:8000' -API_TAXHUB = 'http://127.0.0.1:5000/api' SECRET_KEY = '5fdc2c8fb46f44033144d07396ba082a95b8b3cc827b611a7aaaefbef414f13b' DEFAULT_LANGUAGE='fr' [MAPCONFIG] diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 6f7b037a73..d28abaf69e 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -6,6 +6,7 @@ CHANGELOG **🚀 Nouveautés** +- Intégration de TaxHub à GeoNature (voir la note de version de TaxHub 2.0.0 - LIEN) - Intégration du module Import dans le coeur de GeoNature et refonte de celui-ci pour qu'il puisse importer dans d'autres modules que Synthèse (https://github.com/PnX-SI/gn_module_import/issues/303) - Ajout de la possibilité d'importer des données depuis des fichiers vers le module Occhab - Autres évolutions du module Import à mentionner ici... (évolution des controles ? Import GeoJSON ? Graphiques génériques ? Meilleure gestion des formats de date ? Amélioration export PDF ? Import multi-JDD ?) @@ -23,6 +24,16 @@ CHANGELOG Si vous mettez à jour GeoNature : +- L'application TaxHub a été integrée dans le backoffice de GeoNature (voir documentation TH) et accessible depuis la barre de menu : + - Les permissions basées sur les profils 1-6 ont été rappatriées et adaptées dans le modèle de permissions de GeoNature. + TaxHub est désormais un "module" GeoNature et dispose des objets de permissions `TAXON`, `THEME`, `LISTE` et `ATTRIBUT` (voir doc GeoNature pour la description des objets). Les personnes ayant anciennement des droits 6 dans TaxHub on tous les droits sur les objets précédents. Les personnes ayant des droits inférieurs à 6 et ayant un compte sur TaxHub ont maintenant des droits sur l'objet `TAXON` (voir et éditer des taxons = ajouter des médias et des attributs) + - L'API de Taxhub est désormais disponible à l'URL `/api/taxhub/api>` (le dernier /api est une rétrocompatibilité et sera enlevé de manière transparante dans les prochaines versions) + - Le paramètre `API_TAXHUB` est désormais obsolète (déduit de `API_ENDPOINT`) et peut être retiré du fichier de configuration + - Si vous utilisez Occtax-mobile, veillez à modifier le paramètre `taxhub_url` du fichier `/geonature/backend/media/mobile/occtax/settings.json`, pour mettre la valeur `/api/taxhub>` + - Une redirection Apache automatique de l'URL de TaxHub et des médias est disponible à l'adresse suivante : XXXX + - ATLAS a tester -> modification URL des médias + - suppression de la branche alembic taxhub : `geonature db downgrade taxhub@base` + - Le module Import a été intégré dans le coeur de GeoNature - si vous aviez installé le module externe Import, XXXXX - si vous n'aviez pas installé le module externe Import, il sera disponible après la mise à jour vers cette nouvelle version de GeoNature. Vous pouvez configurer les permissions de vos utilisateurs si vous souhaitez qu'ils y accédent @@ -36,6 +47,8 @@ Si vous mettez à jour GeoNature : - Remplissez la configuration dans un fichier `mtd_sync.toml` 2.14.2 (2024-05-28) + +2.14.0 (unreleased) ------------------- **🚀 Nouveautés** @@ -181,6 +194,16 @@ Si vous mettez à jour GeoNature : - [Synthèse] Correction de la recherche par attribut TaxHub de type "multiselect" (#2767, par @mvergez) - [Occtax] Tri alphabétique de la liste des "Mes lieux" (#2805, par @DonovanMaillard) - [Documentation] Corrections et compléments de la documentation d'administrateur (#2812, par @marie-laure-cen) +- Intégration de TaxHub dans GeoNature. L'interface est dispobible dans le "backoffice" + +**💻 Développement** + +- L'API de TaxHub est désormais disponible à l'URL `/api/taxhub`. + +Note de version: + +- L'intégration de TaxHub dans GeoNature entraine la suppression du service systemd et la conf apache spécifique à TaxHub. Les logs sont également centralisés dans le fichier de log de GeoNature +- Les permissions de TaxHub comme "module" de GeoNature ont été modifié. Voir la section "module TaxHub" de la doc administrateur de GeoNature. Les anciennes permissions de l'application TaxHub on été rappatriées dans ce nouveau modèle. Les utilisateurs avec un profil "6" ont tous les droits sur le modules, les personnes ayant des profils 1,3,4 ou 5 ont des droits sur les objets uniquement sur l'objet 'TAXON'. 2.13.3 (2023-10-17) ------------------- diff --git a/docs/admin-manual.rst b/docs/admin-manual.rst index f5334642e3..2d325051bc 100644 --- a/docs/admin-manual.rst +++ b/docs/admin-manual.rst @@ -2005,6 +2005,12 @@ Le champs "Attribut additionnels" permet d'ajouter des éléments de configurati - Ajouter un sous-titre descriptif : `{"help" : "mon sous titre"}` - Ajouter des valeurs min/max pour un input `number` : `{"min": 1, "max": 10}` +TaxHub +"""""" + +Backoffice de gestion des taxons (basé sur TaxHub) permettant de faire des liste de taxons ainsi que d'ajouter des attributs etdes médias aux taxons. +Voir la documentation de TaxHub : https://taxhub.readthedocs.io/fr/latest/ + Module OCCHAB ------------- @@ -2388,6 +2394,7 @@ Liste des propriétés disponibles : - tous les champs de la synthèse (acquisition_framework, altitude_max, altitude_min, bio_status, blurring, cd_hab, cd_nom, comment_context, comment_description, date_min, depth_max, depth_min, determiner, diffusion_level, digital_proof, entity_source_pk_value, exist_proof, grp_method, grp_typ, last_action, life_stage, meta_create_date, meta_update_date, meta_v_taxref, meta_validation_date, nat_obj_geo, naturalness, nom_cite, non_digital_proof, obj_count, obs_technique, observation_status, observers, occ_behaviour, occ_stat_biogeo, place_name, precision, sample_number_proof, sensitivity, sex, source, type_count, unique_id_sinp, unique_id_sinp_grp, valid_status, validation_comment) - tous les champs du taxon (cd_nom, cd_ref, cd_sup, cd_taxsup, regne, ordre, classe, famille, group1_inpn, group2_inpn, id_rang, nom_complet, nom_habitat, nom_rang, nom_statut, nom_valide, nom_vern) +<<<<<<< HEAD Validation automatique """""""""""""""""""""" Depuis la version 2.14, il est possible d'activer la validation automatique d'observations. @@ -2426,3 +2433,24 @@ Ce paramètre est composé de cinq valeurs, chacune séparée par un espace: min Modification de la fonction de validation automatique ````````````````````````````````````````````````````` Dans GeoNature, la validation automatique est effectuée par une fonction en ``PL/pgSQL`` déclarée dans le schéma ``gn_profiles``. Si toutefois, le fonctionnement de celle-ci ne correspond à vos besoins, indiquer le nom de la nouvelle fonction dans la variable ``AUTO_VALIDATION_SQL_FUNCTION``. Attention, cette fonction doit aussi être stockée dans le schema ``gn_profiles``. Pour vous aidez, n'hésitez pas à regarder la définition de la fonction par défaut nommée ``fct_auto_validation``. +======= + + +Module TaxHub +------------- + +Depuis la version 2.14 de GeoNature, TaxHub est integré comme un module de GeoNature. Il est disponible depuis le backoffice de GeoNature. + +L'emplacement de stockage des médias est contrôlé par le paramètre `MEDIA_FOLDER`. Les médias de TaxHub seront à l'emplacement `/taxhub`. Par défaut tous les médias de GeoNature sont stocké dans le répertoire de GeoNature : `/backend/media`. Via ce paramètre, il est possible de mettre un chemin absolu pour stocker les médias n'importe ou sur votre serveur. + +Gestion des permissions +``````````````````````` + +La gestion des permissions du module TaxHub est entierement gérée par le module de gestion de permission de GeoNature. Dans le cas d'une installation standalone de TaxHub, se réferer à la documentation de TaxHub pour la gestion des permissions. + +Les permissions du module TaxHub peuvent être reglé aux trois niveaux (objets) suivants : +- TAXON : permet voir et modifier des taxons (ajout de médias, d'attributs et association de taxon à des listes) +- THEME : permet de voir / modifier / supprimer des thêmes. Les thêmes sont des groupes d'attributs +- LISTE : permet de voir / modifier / supprimer des listes de taxons +- ATTRIBUT : permet de voir / modifier / supprimer des attributs de taxons +>>>>>>> 9a28b7442 (doc on taxhub) diff --git a/docs/https.rst b/docs/https.rst index 7d577558b0..ae283229cc 100644 --- a/docs/https.rst +++ b/docs/https.rst @@ -60,7 +60,6 @@ Modifier les éléments suivants : URL_APPLICATION = 'https://mondomaine.fr/geonature' API_ENDPOINT = 'https://mondomaine.fr/geonature/api' - API_TAXHUB = 'https://mondomaine.fr/taxhub/api' Pour que ces modifications soient prises en compte, exécuter les :ref:`actions à effecture après modification de la configuration `. diff --git a/install/03b_populate_db.sh b/install/03b_populate_db.sh index fc3dab1dd9..c0495f6168 100755 --- a/install/03b_populate_db.sh +++ b/install/03b_populate_db.sh @@ -6,7 +6,7 @@ geonature db exec "DO 'BEGIN ASSERT EXISTS (SELECT 1 FROM taxonomie.taxref); END || if [ "$install_bdc_statuts" = true ]; then geonature db upgrade ref_geo_fr_departments@head - geonature taxref import-v17 + geonature taxref import-v17 --taxref-region=${taxref_region:-fr} else geonature taxref import-v17 --skip-bdc-statuts fi diff --git a/install/assets/vhost_apache.conf b/install/assets/vhost_apache.conf index 2feca979f9..c9bc826535 100644 --- a/install/assets/vhost_apache.conf +++ b/install/assets/vhost_apache.conf @@ -2,7 +2,6 @@ ServerName ${DOMAIN_NAME} IncludeOptional /etc/apache2/conf-available/geonature.conf - IncludeOptional /etc/apache2/conf-available/taxhub.conf IncludeOptional /etc/apache2/conf-available/usershub.conf ErrorLog "/var/log/apache2/geonature_error.log" diff --git a/install/install_all/install_all.ini b/install/install_all/install_all.ini index 19dd7c509d..03eafbe904 100644 --- a/install/install_all/install_all.ini +++ b/install/install_all/install_all.ini @@ -17,9 +17,9 @@ my_url=http://mon.domaine.com/ pg_host=localhost # Port sur lequel PostgreSQL ecoute pg_port=5432 -# Nom de l'utilisateur propriétaire des bases UsersHub, GeoNature, TaxHub +# Nom de l'utilisateur propriétaire des bases UsersHub, GeoNature user_pg=geonatadmin -# Mot de passe de l'utilisateur propriétaire des bases UsersHub, GeoNature, TaxHub +# Mot de passe de l'utilisateur propriétaire des bases UsersHub, GeoNature user_pg_pass=monpassachanger ### CONFIGURATION USERSHUB ### @@ -41,6 +41,8 @@ geonaturedb_name=geonature2db srid_local=2154 # Installation de la base de connaissance des statuts install_bdc_statuts=true +# Nom de la colonne région à importer dans la colonne id_statut de taxref +taxref_region=fr # Intègre des couches SIG (communes de métropole) # Seules des couches de métropole sont fournies (false conseillé hors métropole) install_sig_layers=true @@ -66,11 +68,3 @@ install_module_occhab=true # Laisser vide si vous n'avez pas de proxy proxy_http= proxy_https= - -### CONFIGURATION TAXHUB ### - -# Version de TaxHub -taxhub_release=1.14.1 -# Pour des questions de performances de GeoNature, il n'y a pas de base de données spécifique pour TaxHub -# Le schéma "taxonomie" de TaxHub est intégré dans la BDD de GeoNature pour que les requêtes ne soient pas trop pénalisées -# par un accès à une BDD distante. diff --git a/install/install_all/install_all.sh b/install/install_all/install_all.sh index c3d3ddd021..c1f17cf17d 100755 --- a/install/install_all/install_all.sh +++ b/install/install_all/install_all.sh @@ -9,7 +9,6 @@ OS_VERSION=$VERSION_ID OS_BITS="$(getconf LONG_BIT)" BASE_DIR=$(readlink -e "${0%/*}") export GEONATURE_DIR="${HOME}/geonature" -export TAXHUB_DIR="${HOME}/taxhub" export USERSHUB_DIR="${HOME}/usershub" @@ -107,6 +106,7 @@ sed -i "s/db_host=.*$/db_host=$pg_host/g" config/settings.ini sed -i "s/user_pg_pass=.*$/user_pg_pass=$user_pg_pass/g" config/settings.ini sed -i "s/srid_local=.*$/srid_local=$srid_local/g" config/settings.ini sed -i "s/install_bdc_statuts=.*$/install_bdc_statuts=$install_bdc_statuts/g" config/settings.ini +sed -i "s/taxref_region=.*$/taxref_region=$taxref_region/g" config/settings.ini sed -i "s/install_sig_layers=.*$/install_sig_layers=$install_sig_layers/g" config/settings.ini sed -i "s/install_grid_layer=.*$/install_grid_layer=$install_grid_layer/g" config/settings.ini sed -i "s/install_default_dem=.*$/install_default_dem=$install_default_dem/g" config/settings.ini @@ -114,8 +114,6 @@ sed -i "s/vectorise_dem=.*$/vectorise_dem=$vectorise_dem/g" config/settings.ini sed -i "s/install_ref_sensitivity=.*$/install_ref_sensitivity=$install_ref_sensitivity/g" config/settings.ini sed -i "s/add_sample_data=.*$/add_sample_data=$add_sample_data/g" config/settings.ini sed -i "s/usershub_release=.*$/usershub_release=$usershub_release/g" config/settings.ini -sed -i "s/taxhub_release=.*$/taxhub_release=$taxhub_release/g" config/settings.ini -sed -i "s/taxhub_release=.*$/taxhub_release=$taxhub_release/g" config/settings.ini sed -i "s/install_module_validation=.*$/install_module_validation=$install_module_validation/g" config/settings.ini sed -i "s/install_module_occhab=.*$/install_module_occhab=$install_module_occhab/g" config/settings.ini sed -i "s/proxy_http=.*$/proxy_http=$proxy_http/g" config/settings.ini @@ -146,59 +144,6 @@ if [ "${mode}" != dev ]; then fi -# Installing TaxHub with current user -if [ ! -d "${TAXHUB_DIR}" ]; then - echo "Téléchargement et installation de TaxHub ..." - cd "${HOME}" - if [ "${mode}" = "dev" ]; then - git clone https://github.com/PnX-SI/TaxHub "${TAXHUB_DIR}" || exit 1 - cd "${TAXHUB_DIR}" - git checkout "$taxhub_release" || exit 1 - git submodule init || exit 1 - git submodule update || exit 1 - else - escaped_taxhub_release=${taxhub_release//\//-} - wget https://github.com/PnX-SI/TaxHub/archive/$taxhub_release.zip -O TaxHub-$escaped_taxhub_release.zip || exit 1 - unzip TaxHub-$escaped_taxhub_release.zip || exit 1 - mv TaxHub-$escaped_taxhub_release "${TAXHUB_DIR}" - fi -fi - -cd "${TAXHUB_DIR}" - -# Setting configuration of TaxHub -echo "Configuration de l'application TaxHub ..." -cp settings.ini.sample settings.ini -sed -i "s/mode=.*$/mode=$mode/g" settings.ini -sed -i "s/drop_apps_db=.*$/drop_apps_db=false/g" settings.ini -sed -i "s/db_host=.*$/db_host=$pg_host/g" settings.ini -sed -i "s/db_port=.*$/db_port=$pg_port/g" settings.ini -sed -i "s/db_name=.*$/db_name=$geonaturedb_name/g" settings.ini -sed -i "s/user_pg=.*$/user_pg=$user_pg/g" settings.ini -sed -i "s/user_pg_pass=.*$/user_pg_pass=$user_pg_pass/g" settings.ini -sed -i "s/user_schema=.*$/user_schema=local/g" settings.ini -sed -i "s/usershub_host=.*$/usershub_host=$pg_host/g" settings.ini -sed -i "s/usershub_port=.*$/usershub_port=$pg_port/g" settings.ini -sed -i "s/usershub_db=.*$/usershub_db=$usershubdb_name/g" settings.ini -sed -i "s/usershub_user=.*$/usershub_user=$user_pg/g" settings.ini -sed -i "s/usershub_pass=.*$/usershub_pass=$user_pg_pass/g" settings.ini -sed -i "s/enable_https=.*$/enable_https=$enable_https/g" settings.ini -sed -i "s/https_cert_path=.*$/https_cert_path=$enable_https/g" settings.ini -sed -i "s/https_key_path=.*$/https_key_path=$enable_https/g" settings.ini - -# Installation of TaxHub -# lance install_app en le sourcant pour que la commande NVM soit disponible -./install_app.sh || exit 1 - -source "${GEONATURE_DIR}/backend/venv/bin/activate" -geonature db upgrade taxhub-admin@head -deactivate - -sudo systemctl start taxhub || exit 1 -if [ "${mode}" != "dev" ]; then - sudo systemctl enable taxhub || exit 1 -fi - # Installation and configuration of UsersHub application (if activated) if [ "$install_usershub_app" = true ]; then if [ ! -d "${USERSHUB_DIR}" ]; then @@ -245,7 +190,7 @@ if [ "$install_usershub_app" = true ]; then fi fi -# Upgrade depending branches like taxhub and usershub +# Upgrade depending branches and usershub source "${GEONATURE_DIR}/backend/venv/bin/activate" geonature db autoupgrade deactivate diff --git a/install/migration/migration.sh b/install/migration/migration.sh index 20c1ca7afd..26e0dc674e 100755 --- a/install/migration/migration.sh +++ b/install/migration/migration.sh @@ -1,6 +1,8 @@ #!/usr/bin/env bash -SERVICES=("geonature" "geonature-worker" "taxhub" "usershub") + + +SERVICES=("geonature" "geonature-worker" "usershub") newdir="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../.." &> /dev/null && pwd )" if (($# > 0)); then @@ -23,6 +25,19 @@ if [ ! -d "${olddir}/backend" ] || [ ! -d "${olddir}/frontend" ] || [ ! -f "${ol exit 1 fi +# before 2.13 - Rappatriement des médias TaxHub necessite de connaitre l'emplacement de taxhub +if [ ! -d "${newdir}/backend/media/taxhub" ];then + TAXHUB_DIR="${HOME}/taxhub" + if (($# > 1)); then + TAXHUB_DIR="$(realpath "$2")" + fi + if [ ! -d "${TAXHUB_DIR}/apptax" ];then + echo $2 + echo "Le dossier ${TAXHUB_DIR} ne semble pas contenir une installation de TaxHub. Veuillez spécifier le chemin vers TaxHub et celui de GeoNature : ./install/migration/migration.sh [OLD_GeoNature_dir] [OLD_TaxHub_dir]" + fi +fi + + echo "Nouveau dossier GeoNature : ${newdir} ($(cat "${newdir}/VERSION"))" echo "Ancien dossier GeoNature : ${olddir} ($(cat "${olddir}/VERSION"))" @@ -94,6 +109,7 @@ if [ ! -f "${newdir}/custom/css/metadata_pdf_custom.css" ] && [ -f "${olddir}/ba fi + echo "Mise à jour de node si nécessaire …" cd "${newdir}"/install ./00_install_nvm.sh @@ -243,4 +259,37 @@ done deactivate + +# before 2.13 +if [ -f "/etc/systemd/system/taxhub.service" ]; then + sudo systemctl stop taxhub + sudo systemctl disable taxhub + sudo rm /etc/systemd/system/taxhub + sudo systemctl daemon-reload + sudo systemctl reset-failed +fi + +if [ -f "/etc/apache2/sites-available/taxhub.conf" ]; then + rm /etc/apache2/sites-available/taxhub.conf +fi + +if [ -f "/etc/apache2/sites-available/taxhub-le-ssl.conf" ]; then + rm /etc/apache2/sites-available/taxhub-le-ssl.conf + rm -r /var/log/taxhub/ +fi + +if [ ! -d "${newdir}/backend/medias/taxhub" ]; then + mkdir -p "${newdir}"/backend/medias/taxhub/ + cp +fi + +# before 2.13 - Rappatriement des médias TaxHub + +if [ ! -d "${newdir}/backend/media/taxhub" ];then + mkdir "${newdir}/backend/media/taxhub" + cp -r "${TAXHUB_DIR}"/static/medias/* "${newdir}"/backend/media/taxhub/ +fi + + +sudo apachectl restart echo "Migration terminée"