From a771eae3a8805cd62763891e191c10cb5a341b12 Mon Sep 17 00:00:00 2001 From: jacquesfize Date: Wed, 17 Jul 2024 16:09:48 +0200 Subject: [PATCH 1/2] wip --- src/mtd_sync/mtd_utils.py | 47 ++++++++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 16 deletions(-) diff --git a/src/mtd_sync/mtd_utils.py b/src/mtd_sync/mtd_utils.py index 4630a7b..0dbefcf 100644 --- a/src/mtd_sync/mtd_utils.py +++ b/src/mtd_sync/mtd_utils.py @@ -4,9 +4,10 @@ from flask import current_app from sqlalchemy import select, exists -from sqlalchemy.exc import SQLAlchemyError +from sqlalchemy.exc import SQLAlchemyError, IntegrityError from sqlalchemy.sql import func, update + from sqlalchemy.dialects.postgresql import insert as pg_insert from geonature.utils.env import DB, db @@ -228,18 +229,27 @@ def associate_actors(actors, CorActor, pk_name, pk_value): ) if not id_organism: values["id_role"] = DB.session.scalar( - select(User.id_role).filter_by(email=actor["email"]) + select(User.id_role) + .filter_by(email=actor["email"]) + .where(User.groupe.is_(False)) ) else: values["id_organism"] = id_organism - statement = ( - pg_insert(CorActor) - .values(**values) - .on_conflict_do_nothing( - index_elements=[pk_name, "id_organism", "id_nomenclature_actor_role"], + try: + statement = ( + pg_insert(CorActor) + .values(**values) + .on_conflict_do_nothing( + index_elements=[ + pk_name, + "id_organism" if id_organism else "id_role", + "id_nomenclature_actor_role", + ], + ) ) - ) - DB.session.execute(statement) + DB.session.execute(statement) + except IntegrityError as I: + print("ERROR ASSOCIATE ACTORS") def associate_dataset_modules(dataset): @@ -264,12 +274,17 @@ class CasAuthentificationError(GeonatureApiError): def insert_user_and_org(info_user, update_user_organism: bool = True): + id_provider_inpn = current_app.config["MTD_SYNC"]["ID_PROVIDER_INPN"] - if not id_provider_inpn in auth_manager: - raise GeonatureApiError( - f"Identity provider named {id_provider_inpn} is not registered ! " - ) - inpn_identity_provider = auth_manager.get_provider(id_provider_inpn) + idprov = AuthenficationCASINPN() + idprov.id_provider = id_provider_inpn + auth_manager.add_provider(id_provider_inpn, idprov) + + # if not id_provider_inpn in auth_manager: + # raise GeonatureApiError( + # f"Identity provider named {id_provider_inpn} is not registered ! " + # ) + inpn_identity_provider = idprov organism_id = info_user["codeOrganisme"] organism_name = info_user.get("libelleLongOrganisme", "Autre") @@ -306,9 +321,9 @@ def insert_user_and_org(info_user, update_user_organism: bool = True): user_info["id_organisme"] = existing_user.id_organisme # Insert or update user - user_ = User(**user_info) - user_info = inpn_identity_provider.insert_or_update_role(user_, "email") + with current_app.app_context(): + user_info = inpn_identity_provider.insert_or_update_role(user_info, "email") # Associate user to a default group if the user is not associated to any group user = existing_user or db.session.get(User, user_id) From 00933df2371760fa74fc93f4a1a2c607f69b80bd Mon Sep 17 00:00:00 2001 From: jacquesfize Date: Wed, 17 Jul 2024 16:21:30 +0200 Subject: [PATCH 2/2] wip --- src/mtd_sync/mtd_utils.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mtd_sync/mtd_utils.py b/src/mtd_sync/mtd_utils.py index 0dbefcf..60cac5a 100644 --- a/src/mtd_sync/mtd_utils.py +++ b/src/mtd_sync/mtd_utils.py @@ -249,6 +249,7 @@ def associate_actors(actors, CorActor, pk_name, pk_value): ) DB.session.execute(statement) except IntegrityError as I: + db.session.rollback() print("ERROR ASSOCIATE ACTORS")