Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Synchronisation des taxons terminée avec des erreurs #280

Open
aferchal opened this issue Jan 26, 2025 · 14 comments
Open

Synchronisation des taxons terminée avec des erreurs #280

aferchal opened this issue Jan 26, 2025 · 14 comments
Labels
bug Something isn't working

Comments

@aferchal
Copy link

Version de l'application

Version d'Occtax-mobile affectée par le bug : 2.7.0 et 2.7.1
Version de GeoNature utilisée : 2.14.2
Version de TH : 1.14.2 (?) Instance du BRGM

Terminal et Version Android

Marque et modèle du terminal : Xcover 4
Version d'Android : 10

Description du bug et comportement attendu

La synchronisation n'aboutit pas sur les taxons (cf log). J'ai reduit le chiffre du page_size mais pas mieux

Logs

log.txt

settings_occtax.json

settings_occtax.json

@aferchal aferchal added the bug Something isn't working label Jan 26, 2025
@camillemonchicourt
Copy link
Member

Oui c'est bizarre.
On voit qu'il accède bien au contenu de la première page de la route de l'API, qui fonctionne bien : https://gngua.brgm-rec.fr/taxhub/api/taxref/?orderby=cd_nom&limit=15000&page=1
Et dans la foulée, il dit qu'il est en erreur.
Je vois rien de spécial, peut-être un soucis avec le contenu d'un taxon ?
Peut-être qu'il bloque sur un taxon maison ajouté dans Taxref mais avec des infos incomplètes ?

@sgrimault
Copy link
Collaborator

C'est très certainement lié à un souci sur au moins un taxon lors de la synchronisation et comme on a supprimé tous les contrôles pour gagner en efficacité et en temps car on part du principe que les données sont (et doivent être) cohérentes coté GeoNature et donc coté APIs, mais ce n'est pas du tout le cas :
Très récemment j'ai eu un problème similaire lors de la synchronisation qui tombait en échec car l'API me retournait des données additionnels aux taxons (l'appel à l'API GET -> /api/synthese/color_taxon) avec des identifiants de taxons qui ne correspondaient à rien (que je devrait retrouver lors de la synchronisation des taxons via les appels à l'API GET -> /api/taxref). Le problème a été corrigé sur la future 2.8 en rajoutant un contrôle afin de ne garder que les données cohérentes.

Un taxon valide, c'est un taxon qui doit suivre les règles suivantes :

  • Un identifiant valide (cd_nom unique et renseigné)
  • Son nom doit être renseigné (lb_nom), ainsi que son nom complet (nom_complet)
  • Si il est rattaché à un rang taxonomique (regne et group2_inpn renseignés), il doit correspondre à un rang taxonomique valide (selon ce que retourne l'appel à l'API GET -> /api/taxref/regnewithgroupe2)

Les données additionnels à un taxon doit être rattachées à un taxon valide :

  • Un identifiant valide (cd_nom renseigné), il doit correspondre à un identifiant de taxon valide (selon ce que retourne l'appel à l'API GET -> /api/taxref)
  • L'identifiant de la zone géographique doit être renseigné (id_area)
  • Sa "couleur" doit être renseigné (color)
  • Le nombre d'observateurs doit être renseigné (nb_obs)
  • La date de dernière mise à jour (ou date de dernière observation ?) doit être renseignée (last_date)

Pour que la synchronisation des taxons soit efficace et rapide, elle fonctionne par "paquets", c'est à dire qu'on fait appel en cascade à l'API GET -> /api/taxref (et ensuite à l'API GET -> /api/synthese/color_taxon), en jouant sur la taille de la "page" (paramètres limit et page) puis ensuite d'insérer en mode "bulk" les données valides dans la base de données locale. Si pour x raisons, l'insertion en base échoue (car au moins une donnée n'est pas valide), ce sont toutes les données de la "page" courante qui ne seront pas insérées (même si l'erreur ne concerne qu'une seule). Et comme toute la synchronisation fonctionne en mode transactionnel, ce sera donc toute la synchronisation qui sera en échec avec un "rollback" en sortie, ceci afin de garantir d'avoir toujours des données cohérentes en locale entre deux synchronisations complètes.

Ce n'est pas la première fois que des soucis de synchronisation soient remontées et je pense que c'est un vrai souci que les APIs de Geonature et TaxHub ne puissent pas garantir la cohérence des données entre tous les appels.
En attendant, je peux remettre plus de contrôle lors de la synchronisation comme avant.

@camillemonchicourt
Copy link
Member

OK OK, faudrait voir si il y a des données incomplètes qui ont été ajoutées dans le Taxref du PNG. @aferchal, tu as ajouté un taxon sans nom_complet ? Ou autre champs non renseigné ?

En effet, on utilise un Taxref de base, complet et de référence, mais il arrive que l'on doive ajouter quelques taxons manuellement dans ce référentiel, notamment dans les DOM, quand de nouvelles espèces sont découvertes, le temps qu'elles soient intégrées officiellement dans une nouvelle version de Taxref.
Là, charge aux administrateurs qui ajoutent quelques taxons de bien les renseigner complètement.

En effet, depuis la version 2.7 d'Occtax-mobile, on charge seulement une fois (puis à chaque nouvelle version de Taxref) tout Taxref. Et pour que cela soit assez rapide, on a supprimé tous les contrôles qui étaient trop longs : #247

Je pense qu'il ne faut surtout pas remettre ces contrôles pour ne pas que la synchro de Taxref soit plus longue.
L'idéal serait que si une donnée récupérée de l'API n'est pas complète, alors elle soit tout simplement ignorée, sans faire planter la synchro. Mais cela ne semble pas possible, ou pas si simple ?

De notre côté, on pourrait ajouter plus de contraintes sur l'API pour ne pas renvoyer des taxons incomplets. Mais pour nos outils, c'est pas forcément un problème qu'un taxon n'est pas de group_inpn, ou de règne, peut-être même de pas avoir de lb_nom ou de nom_complet.

Mais on peut regarder pour ajouter des contraintes en plus directement au niveau de la BDD dans la table taxonomie.taxref.

@aferchal
Copy link
Author

Ce qui est étonnant ce qu'il va chercher les données sur le taxhub de la recette de GN hébergé au BRGM et je n'y vais jamais. Je n'utilise pas non plus de données additionnelles. La seule intervention concerne la màj de TAXREF en v17, à voir ce qui a été fait

@camillemonchicourt
Copy link
Member

Ah OK, alors si c'est une instance de recette où vous n'avez rien touché de spécial et un Taxref v17 brut, non enrichi, alors je vois pas le soucis.

En effet, vous êtes bien en version 17 sur cette plateforme de recette : https://gngua.brgm-rec.fr/taxhub/api/taxref/version

Je viens de tester une installation d'Occtax-mobile 2.7.1 et la connecter sur le serveur DEMO qui est aussi en Taxref 17 (https://demo.geonature.fr/geonature/api/taxhub/api/taxref/version) et ça a synchronisé sans soucis.

Votre GeoNature est en 2.14.2, ce qui est compatible avec Occtax-mobile 2.7.
Par contre, je ne sais pas quelle est la version de votre TaxHub, il faut la version 1.14.2 minimum, je ne sais pas si c'est votre cas. Je pense que oui, mais faudrait vérifier.

Sinon, je ne vois pas d'où peut venir le soucis...
A voir si le message dans les logs pourrait être plus précis ou explicite ?

@aferchal
Copy link
Author

aferchal commented Jan 31, 2025

J'ai testé avec la demo de GN. La synchro aboutit avec un msg d'erreur failed to update taxa with areas (page: 1) mais surtout, une fois que je relance GN mobile j'ai un msg similaire à #281

11:34:36.609 ERROR: [fr.geonature.occtax.ui.input.InputPagerFragmentActivity] no default nomenclature values found for observation record with ID '286716876': fr.geonature.occtax.features.record.error.ObservationRecordException$NoDefaultNomenclatureValuesFoundException: no default nomenclature values found for observation record with ID '286716876

avec un écran qui reste ensuite blanc dans l'appli sur les observateurs et les jdd

Log de synchro :

11:31:28.451 WARN: [fr.geonature.datasync.sync.repository.SynchronizeTaxaRepositoryImpl] failed to update taxa with areas (page: 1): android.database.sqlite.SQLiteConstraintException: FOREIGN KEY constraint failed (code 787 SQLITE_CONSTRAINT_FOREIGNKEY)
    at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
    at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:879)
    at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:790)
    at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:88)
    at androidx.sqlite.db.framework.FrameworkSQLiteStatement.executeInsert(FrameworkSQLiteStatement.kt:42)
    at androidx.room.EntityInsertionAdapter.insert(EntityInsertionAdapter.kt:85)
    at fr.geonature.commons.data.dao.TaxonAreaDao_Impl.insertAll(TaxonAreaDao_Impl.java:108)
    at fr.geonature.datasync.sync.repository.SynchronizeTaxaRepositoryImpl$synchronizeTaxaAdditionalDataWithPagination$2.invokeSuspend(SynchronizeTaxaRepositoryImpl.kt:307)
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
    at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
    at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:284)
    at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:85)
    at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:59)
    at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source:1)
    at androidx.room.RoomDatabaseKt$startTransactionCoroutine$2$1.run(RoomDatabaseExt.kt:93)
    at androidx.room.TransactionExecutor.execute$lambda$1$lambda$0(TransactionExecutor.kt:36)
    at androidx.room.TransactionExecutor.$r8$lambda$AympDHYBb78s7_N_9gRsXF0sHiw(Unknown Source:0)
    at androidx.room.TransactionExecutor$$ExternalSyntheticLambda0.run(Unknown Source:4)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.lang.Thread.run(Thread.java:919)
11:31:28.457 INFO: [fr.geonature.datasync.sync.repository.SynchronizeTaxaRepositoryImpl] updating 1864 taxa with areas from page 1
11:31:28.460 INFO: [fr.geonature.datasync.sync.repository.SynchronizeAdditionalFieldsRepositoryImpl] synchronize additional fields...
11:31:28.464 INFO: [fr.geonature.datasync.api.ClientKt] --> GET https://demo.geonature.fr/geonature/api/gn_commons/additional_fields?module_code=OCCTAX
11:31:28.768 INFO: [fr.geonature.datasync.api.ClientKt] <-- 200 OK https://demo.geonature.fr/geonature/api/gn_commons/additional_fields?module_code=OCCTAX (303ms, 29501-byte body)
11:31:28.806 WARN: [fr.geonature.datasync.sync.io.AdditionalFieldJsonReader] unknown widget 'java.util.NoSuchElementException: Array contains no element matching the predicate.'
11:31:28.825 INFO: [fr.geonature.datasync.sync.repository.SynchronizeAdditionalFieldsRepositoryImpl] 24 additional field(s) found
11:31:28.871 INFO: [fr.geonature.datasync.sync.worker.DataSyncWorker] local data synchronization successfully finished in 11m 56.788s

Log de saisie :

11:34:30.469 INFO: [fr.geonature.occtax.MainApplication] starting fr.geonature.occtax2 (version 2.7.0)...
11:34:30.470 INFO: [fr.geonature.occtax.MainApplication] logs directory: '/storage/emulated/0/Android/data/fr.geonature.occtax2/logs'
11:34:30.471 INFO: [fr.geonature.occtax.MainApplication] internal storage: 'MountPoint(mountPath=/storage/emulated/0, storageType=INTERNAL)'
11:34:30.472 INFO: [fr.geonature.occtax.MainApplication] external storage: 'MountPoint(mountPath=/storage/152C-3841, storageType=EXTERNAL)'
11:34:30.656 INFO: [fr.geonature.commons.data.DatabaseModule] loading local database '/storage/emulated/0/Android/data/fr.geonature.occtax2/databases/data.db'...
11:34:30.663 INFO: [fr.geonature.datasync.features.settings.usecase.UpdateSettingsFromRemoteUseCase] loading app configuration...
11:34:30.664 INFO: [fr.geonature.datasync.settings.DataSyncSettingsFileDataSourceImpl] loading data sync settings from '/storage/emulated/0/Android/data/fr.geonature.occtax2/settings_occtax.json'...
11:34:30.691 INFO: [fr.geonature.datasync.api.GeoNatureAPIClientImpl] set server base URLs (GeoNature: 'https://demo.geonature.fr/geonature', TaxHub: 'https://demo.geonature.fr/geonature/api/taxhub')...
11:34:30.716 INFO: [fr.geonature.datasync.features.settings.usecase.UpdateSettingsFromRemoteUseCase] updating app configuration from 'https://demo.geonature.fr/geonature'...
11:34:30.914 INFO: [fr.geonature.datasync.api.ClientKt] --> GET https://demo.geonature.fr/geonature/api/gn_commons/t_mobile_apps
11:34:30.948 INFO: [fr.geonature.datasync.packageinfo.worker.CheckInputsToSynchronizeWorker] available inputs to synchronize: 0
11:34:31.522 INFO: [fr.geonature.datasync.api.ClientKt] <-- 200 OK https://demo.geonature.fr/geonature/api/gn_commons/t_mobile_apps (606ms, 2119-byte body)
11:34:31.532 INFO: [fr.geonature.datasync.packageinfo.PackageInfoRepositoryImpl] updating settings for 'fr.geonature.occtax2'...
11:34:31.552 INFO: [fr.geonature.datasync.packageinfo.io.AppSettingsJsonWriter] updating app settings '/storage/emulated/0/Android/data/fr.geonature.occtax2/settings_occtax.json'
11:34:31.554 INFO: [fr.geonature.datasync.settings.DataSyncSettingsFileDataSourceImpl] loading data sync settings from '/storage/emulated/0/Android/data/fr.geonature.occtax2/settings_occtax.json'...
11:34:31.557 INFO: [fr.geonature.datasync.api.GeoNatureAPIClientImpl] set server base URLs (GeoNature: 'https://demo.geonature.fr/geonature', TaxHub: 'https://demo.geonature.fr/geonature/api/taxhub')...
11:34:31.563 INFO: [fr.geonature.datasync.features.settings.usecase.UpdateSettingsFromRemoteUseCase] app configuration successfully updated from 'https://demo.geonature.fr/geonature'
11:34:31.564 INFO: [fr.geonature.occtax.ui.home.HomeActivity] reloading settings after update...
11:34:31.566 INFO: [fr.geonature.occtax.features.settings.data.AppSettingsFileLocalDataSourceImpl] loading settings from '/storage/emulated/0/Android/data/fr.geonature.occtax2/settings_occtax.json'...
11:34:31.576 INFO: [fr.geonature.occtax.features.settings.data.AppSettingsFileLocalDataSourceImpl] loading additional settings from '/storage/emulated/0/Android/data/fr.geonature.occtax2/settings_occtax.local.json'...
11:34:31.577 INFO: [fr.geonature.occtax.features.settings.repository.AppSettingsRepositoryImpl] no app settings found locally at '/storage/emulated/0/Android/data/fr.geonature.occtax2/settings_occtax.local.json'
11:34:31.578 INFO: [fr.geonature.occtax.features.settings.repository.AppSettingsRepositoryImpl] default app settings successfully loaded
11:34:31.656 INFO: [fr.geonature.maps.layer.presentation.LayerSettingsViewModel] preparing all layers:
    'OpenStreetMap': [https://a.tile.openstreetmap.org, https://b.tile.openstreetmap.org, https://c.tile.openstreetmap.org]' (active: true)
    'OpenTopoMap': [https://a.tile.opentopomap.org, https://b.tile.opentopomap.org, https://c.tile.opentopomap.org]' (active: true)
    'IGN plan v2': [https://data.geopf.fr/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2&STYLE=normal&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}]' (active: true)
    'IGN ortho': [https://data.geopf.fr/wmts?layer=ORTHOIMAGERY.ORTHOPHOTOS&style=normal&tilematrixset=PM&Service=WMTS&Request=GetTile&Version=1.0.0&Format=image%2Fjpeg&TileMatrix={$z}&TileCol={$x}&TileRow={$y}]' (active: true)
    'IGN cadastre': [https://wxs.ign.fr/parcellaire/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=CADASTRALPARCELS.PARCELS]' (active: true)
    'Demo offline': [demo_scan.mbtiles]' (active: true)
    'Mailles 10km': [mailles10.geojson]' (active: true),
  using online layers: true...
11:34:31.659 INFO: [fr.geonature.maps.layer.data.LayerLocalDataSourceImpl] base path: '/storage/152C-3841'
11:34:32.008 INFO: [fr.geonature.maps.util.CheckPermissionLifecycleObserver] permission 'android.permission.READ_EXTERNAL_STORAGE' already granted
11:34:32.180 DEBUG: [fr.geonature.datasync.sync.DataSyncViewModel] has local data: false
11:34:32.229 INFO: [fr.geonature.datasync.sync.DataSyncViewModel] configure data sync periodic worker (repeat interval: 15m, with additional data: true)...
11:34:33.864 WARN: [fr.geonature.maps.layer.data.LayerLocalDataSourceImpl] no layer 'Demo offline' found from root path: '/storage/152C-3841', try to perform a deep scan from external storage '/storage/152C-3841'...
11:34:35.687 WARN: [fr.geonature.maps.layer.data.LayerLocalDataSourceImpl] no layer 'Demo offline' found from external storage: '/storage/152C-3841', try to perform a deep scan from internal storage '/storage/emulated/0'...
11:34:36.182 INFO: [fr.geonature.occtax.ui.input.InputPagerFragmentActivity] loading observation record: null
11:34:36.183 INFO: [fr.geonature.occtax.features.record.presentation.ObservationRecordViewModel] loading default nomenclature values from record '286716876'...
11:34:36.185 INFO: [fr.geonature.occtax.features.record.usecase.EditObservationRecordUseCase] loading default nomenclature values from record '286716876'...
11:34:36.442 INFO: [fr.geonature.maps.layer.presentation.LayerSettingsViewModel] preparing all layers:
    'OpenStreetMap': [https://a.tile.openstreetmap.org, https://b.tile.openstreetmap.org, https://c.tile.openstreetmap.org]' (active: true)
    'OpenTopoMap': [https://a.tile.opentopomap.org, https://b.tile.opentopomap.org, https://c.tile.opentopomap.org]' (active: true)
    'IGN plan v2': [https://data.geopf.fr/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2&STYLE=normal&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}]' (active: true)
    'IGN ortho': [https://data.geopf.fr/wmts?layer=ORTHOIMAGERY.ORTHOPHOTOS&style=normal&tilematrixset=PM&Service=WMTS&Request=GetTile&Version=1.0.0&Format=image%2Fjpeg&TileMatrix={$z}&TileCol={$x}&TileRow={$y}]' (active: true)
    'IGN cadastre': [https://wxs.ign.fr/parcellaire/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=CADASTRALPARCELS.PARCELS]' (active: true)
    'Demo offline': [demo_scan.mbtiles]' (active: true)
    'Mailles 10km': [mailles10.geojson]' (active: true),
  using online layers: true...
11:34:36.484 INFO: [fr.geonature.maps.util.CheckPermissionLifecycleObserver] permission 'android.permission.READ_EXTERNAL_STORAGE' already granted
11:34:36.608 ERROR: [fr.geonature.occtax.features.record.usecase.EditObservationRecordUseCase] failed to load default nomenclature values from record '286716876
11:34:36.609 ERROR: [fr.geonature.occtax.ui.input.InputPagerFragmentActivity] no default nomenclature values found for observation record with ID '286716876': fr.geonature.occtax.features.record.error.ObservationRecordException$NoDefaultNomenclatureValuesFoundException: no default nomenclature values found for observation record with ID '286716876'
    at fr.geonature.occtax.features.record.usecase.SetDefaultNomenclatureValuesUseCase.run-gIAlu-s(SetDefaultNomenclatureValuesUseCase.kt:42)
    at fr.geonature.occtax.features.record.usecase.SetDefaultNomenclatureValuesUseCase$run$1.invokeSuspend(Unknown Source:15)
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
    at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
    at android.os.Handler.handleCallback(Handler.java:883)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7402)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935)
11:34:38.059 DEBUG: [fr.geonature.commons.data.helper.SQLiteSelectQueryBuilder] sql:
  SELECT observers."_id" AS observers__id, observers."lastname" AS observers_lastname, observers."firstname" AS observers_firstname
  FROM observers observers
  ORDER BY observers_lastname COLLATE NOCASE ASC, observers_firstname COLLATE NOCASE ASC
  args: []
11:34:38.468 WARN: [fr.geonature.maps.layer.data.LayerLocalDataSourceImpl] no layer 'Demo offline' found from root path: '/storage/152C-3841', try to perform a deep scan from external storage '/storage/152C-3841'...
11:34:38.728 WARN: [fr.geonature.maps.layer.data.LayerLocalDataSourceImpl] no layer 'Mailles 10km' found from root path: '/storage/152C-3841', try to perform a deep scan from external storage '/storage/152C-3841'...
11:34:40.364 WARN: [fr.geonature.maps.layer.data.LayerLocalDataSourceImpl] no layer 'Demo offline' found from external storage: '/storage/152C-3841', try to perform a deep scan from internal storage '/storage/emulated/0'...
11:34:40.654 WARN: [fr.geonature.maps.layer.data.LayerLocalDataSourceImpl] no layer 'Mailles 10km' found from external storage: '/storage/152C-3841', try to perform a deep scan from internal storage '/storage/emulated/0'...
11:34:43.147 WARN: [fr.geonature.maps.layer.data.LayerLocalDataSourceImpl] no layer 'Mailles 10km' found from root path: '/storage/152C-3841', try to perform a deep scan from external storage '/storage/152C-3841'...
11:34:44.900 WARN: [fr.geonature.maps.layer.data.LayerLocalDataSourceImpl] no layer 'Mailles 10km' found from external storage: '/storage/152C-3841', try to perform a deep scan from internal storage '/storage/emulated/0'...

@camillemonchicourt
Copy link
Member

Ouais OK OK, toi aussi ça indique des nomenclatures par défaut qu'il trouve pas.
Et des zonages de taxons.
Je capte pas.

Ma seule piste là est qu'il te reste des données liés à ton instance GeoNature et qu'en basculant sur le GeoNature de DEMO, ça coince car il mélange des données de ton instance et de celle de DEMO.

Mais je n'en suis pas certain, je ne sais pas si @sgrimault aurait une autre piste ?

@sgrimault
Copy link
Collaborator

Bonjour,
Le champ de la nomenclature de type TYP_GRP est obligatoire coté relevé et est uniquement alimenté par les valeurs par défaut lors de l'appel à l'API GET -> /api/occtax/defaultNomenclatures. Et actuellement on n'a pas la possibilité de le saisir directement depuis l'interface.
L'erreur vient lors du chargement du relevé où il ne peut pas charger les correspondances entre les IDs et les valeurs issues de la nomenclature.
A ce stade (qui ne devrait jamais arriver), on ne peut pas saisir un relevé (existant ou non).
Il manquerait encore des contrôles, pour mieux tracer et notifier l'utilisateur du problème : Ici un problème lors de la synchronisation des données.

@camillemonchicourt
Copy link
Member

@sgrimault, le soucis que tu indiques correspond au second test d'@aferchal en se connectant au serveur de DEMO ?
Ou à son soucis initial sur son serveur de recette du Parc national de Guadeloupe ?

Je pense que tu parles sur le serveur de DEMO, et j'ai moi aussi désormais le même soucis (Erreur de chargement des valeurs par défaut, listes des observateurs et des JDD vides), alors que je ne l'avais pas précédemment en testant sur ce même serveur.

Et je ne comprends pas le soucis que tu indiques avec la nomenclature TYP_GRP ?
Pour cette nomenclature, l'API indique que la 129 est celle par défaut (https://demo.geonature.fr/geonature/api/occtax/defaultNomenclatures). Et la 129 existe et est bien un ID de nomenclature de TYP_GRP (https://demo.geonature.fr/geonature/api/nomenclatures/nomenclatures?orderby=label_default&code_type=TYP_GRP), donc je ne comprends pas le soucis que tu indiques ?

J'ai aussi le message d'erreur remonté par @aferchal sur le serveur DEMO : failed to update taxa with areas (page: 1). Là aussi je ne comprends pas pourquoi.

@sgrimault
Copy link
Collaborator

Bonjour @camillemonchicourt,

Le souci coté relevé est que le champ TYP_GRP est obligatoire et est alimenté via l'appel à l'API GET -> /api/occtax/defaultNomenclatures. Si pour x raisons, on n'a pas de valeur par défaut de défini, la synchronisation du relevé sera en échec (sur le serveur de démo, c'est OK).
Autre souci : On créé un relevé à partir des données d'une instance de GeoNature A, puis on change d'instance (GeoNature B), avec la synchronisation des données qui va avec. Si on continue le relevé préalablement créé (donc qui s'appuie sur les données de GeoNature A), il est fort possible qu'il se termine en erreur lors de la synchronisation (donc vers l'instance B).

Concernant la dernière erreur (failed to update taxa with areas (page: 1)), je l'ai eu aussi et le problème vient du fait qu'on a plusieurs IDs de taxon qui ne correspondent à rien lors de l'appel à l'API GET -> /api/synthese/color_taxon (cf. message précédent sur ce sujet).

@camillemonchicourt
Copy link
Member

OK oui, mais là je suis connecté au serveur de démo, je n'ai aucune donnée en attente de synchro, et je ne peux pas créer de nouveaux relevé.
Cela me renvoie les erreurs mentionnées qu'il n'a pas pu charger les valeurs par défaut quand je tente de créer un nouveau relevé.

@aferchal
Copy link
Author

aferchal commented Feb 3, 2025

Sur un portable vierge de toute install de GN mobile j'ai installé GN mobile en 2.7.0 connecté au serveur DEMO. Il va bien au bout de la synchro (avec qd meme une erreur sur areas) :

07:23:38.782 WARN: [fr.geonature.datasync.sync.repository.SynchronizeTaxaRepositoryImpl] failed to update taxa with areas (page: 1): android.database.sqlite.SQLiteConstraintException: FOREIGN KEY constraint failed (code 787 SQLITE_CONSTRAINT_FOREIGNKEY)

J'ai bien la liste des observateurs et des jdd, je peux pointer l'obs mais j'ai la liste des taxons vides alors que j'ai choisi un jdd sur lequel il y a des taxons associés (test sur AGIR). Ci dessous le log correspondant. En cherchant par nom de taxon, pas mieux.

07:55:00.519 DEBUG: [fr.geonature.commons.data.helper.SQLiteSelectQueryBuilder] sql:
  SELECT dataset."_id" AS dataset__id, dataset."name" AS dataset_name, dataset."description" AS dataset_description, dataset."active" AS dataset_active, dataset."created_at" AS dataset_created_at, dataset."updated_at" AS dataset_updated_at, dataset."taxa_list_id" AS dataset_taxa_list_id
  FROM dataset dataset
  WHERE (dataset__id = ?)
  ORDER BY dataset_name COLLATE NOCASE ASC
  args: [30]
07:55:00.522 DEBUG: [fr.geonature.commons.data.helper.SQLiteSelectQueryBuilder] sql:
  SELECT observers."_id" AS observers__id, observers."lastname" AS observers_lastname, observers."firstname" AS observers_firstname
  FROM observers observers
  WHERE observers__id = ?
  ORDER BY observers_lastname COLLATE NOCASE ASC, observers_firstname COLLATE NOCASE ASC
  args: [4]
07:55:00.570 INFO: [fr.geonature.occtax.ui.input.observers.ObserversAndDateInputFragment] selected dataset: 30, taxa list ID: null
07:55:16.585 INFO: [fr.geonature.datasync.features.settings.usecase.UpdateSettingsFromRemoteUseCase] loading app configuration...
07:55:16.586 INFO: [fr.geonature.datasync.settings.DataSyncSettingsFileDataSourceImpl] loading data sync settings from '/storage/emulated/0/Android/data/fr.geonature.occtax2/settings_occtax.json'...
07:55:16.600 INFO: [fr.geonature.datasync.api.GeoNatureAPIClientImpl] set server base URLs (GeoNature: 'https://demo.geonature.fr/geonature', TaxHub: 'https://demo.geonature.fr/geonature/api/taxhub')...
07:55:16.612 INFO: [fr.geonature.datasync.features.settings.usecase.UpdateSettingsFromRemoteUseCase] updating app configuration from 'https://demo.geonature.fr/geonature'...
07:55:16.701 INFO: [fr.geonature.datasync.api.ClientKt] --> GET https://demo.geonature.fr/geonature/api/gn_commons/t_mobile_apps
07:55:17.141 INFO: [fr.geonature.datasync.api.ClientKt] <-- 200 OK https://demo.geonature.fr/geonature/api/gn_commons/t_mobile_apps (438ms, 2119-byte body)
07:55:17.150 INFO: [fr.geonature.datasync.packageinfo.PackageInfoRepositoryImpl] updating settings for 'fr.geonature.occtax2'...
07:55:17.167 INFO: [fr.geonature.datasync.packageinfo.io.AppSettingsJsonWriter] updating app settings '/storage/emulated/0/Android/data/fr.geonature.occtax2/settings_occtax.json'
07:55:17.168 INFO: [fr.geonature.datasync.settings.DataSyncSettingsFileDataSourceImpl] loading data sync settings from '/storage/emulated/0/Android/data/fr.geonature.occtax2/settings_occtax.json'...
07:55:17.171 INFO: [fr.geonature.datasync.api.GeoNatureAPIClientImpl] set server base URLs (GeoNature: 'https://demo.geonature.fr/geonature', TaxHub: 'https://demo.geonature.fr/geonature/api/taxhub')...
07:55:17.176 INFO: [fr.geonature.datasync.features.settings.usecase.UpdateSettingsFromRemoteUseCase] app configuration successfully updated from 'https://demo.geonature.fr/geonature'
07:55:17.177 INFO: [fr.geonature.occtax.ui.home.HomeActivity] reloading settings after update...
07:55:17.179 INFO: [fr.geonature.occtax.features.settings.data.AppSettingsFileLocalDataSourceImpl] loading settings from '/storage/emulated/0/Android/data/fr.geonature.occtax2/settings_occtax.json'...
07:55:17.183 INFO: [fr.geonature.occtax.features.settings.data.AppSettingsFileLocalDataSourceImpl] loading additional settings from '/storage/emulated/0/Android/data/fr.geonature.occtax2/settings_occtax.local.json'...
07:55:17.184 INFO: [fr.geonature.occtax.features.settings.repository.AppSettingsRepositoryImpl] no app settings found locally at '/storage/emulated/0/Android/data/fr.geonature.occtax2/settings_occtax.local.json'
07:55:17.185 INFO: [fr.geonature.occtax.features.settings.repository.AppSettingsRepositoryImpl] default app settings successfully loaded
07:55:17.226 INFO: [fr.geonature.maps.layer.presentation.LayerSettingsViewModel] preparing all layers:
    'OpenStreetMap': [https://a.tile.openstreetmap.org, https://b.tile.openstreetmap.org, https://c.tile.openstreetmap.org]' (active: true)
    'OpenTopoMap': [https://a.tile.opentopomap.org, https://b.tile.opentopomap.org, https://c.tile.opentopomap.org]' (active: true)
    'IGN plan v2': [https://data.geopf.fr/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2&STYLE=normal&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}]' (active: true)
    'IGN ortho': [https://data.geopf.fr/wmts?layer=ORTHOIMAGERY.ORTHOPHOTOS&style=normal&tilematrixset=PM&Service=WMTS&Request=GetTile&Version=1.0.0&Format=image%2Fjpeg&TileMatrix={$z}&TileCol={$x}&TileRow={$y}]' (active: true)
    'IGN cadastre': [https://wxs.ign.fr/parcellaire/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=CADASTRALPARCELS.PARCELS]' (active: true)
    'Demo offline': [demo_scan.mbtiles]' (active: true)
    'Mailles 10km': [mailles10.geojson]' (active: true),
  using online layers: true...
07:55:17.265 WARN: [fr.geonature.maps.layer.data.LayerLocalDataSourceImpl] no layer 'Demo offline' found from root path: '/storage/emulated/0', try to perform a deep scan from internal storage '/storage/emulated/0'...
07:55:17.296 WARN: [fr.geonature.maps.layer.data.LayerLocalDataSourceImpl] no layer 'Demo offline' found from storage
07:55:17.299 INFO: [fr.geonature.maps.util.CheckPermissionLifecycleObserver] permission 'android.permission.READ_EXTERNAL_STORAGE' already granted
07:55:17.380 DEBUG: [fr.geonature.datasync.sync.DataSyncViewModel] has local data: true
07:55:17.384 INFO: [fr.geonature.occtax.ui.home.HomeActivity] the last data synchronization seems to be old (done on Mon Feb 03 07:23:39 AST 2025), restarting data synchronization...
07:55:17.388 INFO: [fr.geonature.datasync.sync.DataSyncViewModel] starting local data synchronization...
07:55:17.420 WARN: [fr.geonature.maps.layer.data.LayerLocalDataSourceImpl] no layer 'Mailles 10km' found from root path: '/storage/emulated/0', try to perform a deep scan from internal storage '/storage/emulated/0'...
07:55:17.446 WARN: [fr.geonature.maps.layer.data.LayerLocalDataSourceImpl] no layer 'Mailles 10km' found from storage
07:55:17.481 INFO: [fr.geonature.datasync.sync.DataSyncViewModel] configure data sync periodic worker (repeat interval: 15m, with additional data: true)...
07:55:17.604 INFO: [fr.geonature.datasync.sync.usecase.DataSyncUseCase] starting local data synchronization from 'https://demo.geonature.fr/geonature' (with additional data: true)...
07:55:17.607 INFO: [fr.geonature.datasync.sync.usecase.DataSyncUseCase] synchronize dataset...
07:55:17.624 INFO: [fr.geonature.datasync.api.ClientKt] --> POST https://demo.geonature.fr/geonature/api/meta/datasets (19-byte body)
07:55:19.132 INFO: [fr.geonature.datasync.api.ClientKt] <-- 200 OK https://demo.geonature.fr/geonature/api/meta/datasets (1506ms, 642550-byte body)
07:55:21.578 INFO: [fr.geonature.occtax.ui.input.InputPagerFragmentActivity] loading observation record: null
07:55:21.579 INFO: [fr.geonature.occtax.features.record.presentation.ObservationRecordViewModel] loading default nomenclature values from record '286962921'...
07:55:21.580 INFO: [fr.geonature.occtax.features.record.usecase.EditObservationRecordUseCase] loading default nomenclature values from record '286962921'...
07:55:21.730 INFO: [fr.geonature.maps.layer.presentation.LayerSettingsViewModel] preparing all layers:
    'OpenStreetMap': [https://a.tile.openstreetmap.org, https://b.tile.openstreetmap.org, https://c.tile.openstreetmap.org]' (active: true)
    'OpenTopoMap': [https://a.tile.opentopomap.org, https://b.tile.opentopomap.org, https://c.tile.opentopomap.org]' (active: true)
    'IGN plan v2': [https://data.geopf.fr/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2&STYLE=normal&FORMAT=image/png&TILEMATRIXSET=PM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}]' (active: true)
    'IGN ortho': [https://data.geopf.fr/wmts?layer=ORTHOIMAGERY.ORTHOPHOTOS&style=normal&tilematrixset=PM&Service=WMTS&Request=GetTile&Version=1.0.0&Format=image%2Fjpeg&TileMatrix={$z}&TileCol={$x}&TileRow={$y}]' (active: true)
    'IGN cadastre': [https://wxs.ign.fr/parcellaire/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE=normal&TILEMATRIXSET=PM&FORMAT=image/png&LAYER=CADASTRALPARCELS.PARCELS]' (active: true)
    'Demo offline': [demo_scan.mbtiles]' (active: true)
    'Mailles 10km': [mailles10.geojson]' (active: true),
  using online layers: true...
07:55:21.755 WARN: [fr.geonature.maps.layer.data.LayerLocalDataSourceImpl] no layer 'Demo offline' found from root path: '/storage/emulated/0', try to perform a deep scan from internal storage '/storage/emulated/0'...
07:55:21.768 INFO: [fr.geonature.maps.util.CheckPermissionLifecycleObserver] permission 'android.permission.READ_EXTERNAL_STORAGE' already granted
07:55:21.776 WARN: [fr.geonature.maps.layer.data.LayerLocalDataSourceImpl] no layer 'Demo offline' found from storage
07:55:21.913 WARN: [fr.geonature.maps.layer.data.LayerLocalDataSourceImpl] no layer 'Mailles 10km' found from root path: '/storage/emulated/0', try to perform a deep scan from internal storage '/storage/emulated/0'...
07:55:21.931 INFO: [fr.geonature.occtax.features.record.usecase.EditObservationRecordUseCase] default nomenclature values successfully loaded for record '286962921'
07:55:21.932 INFO: [fr.geonature.occtax.features.record.usecase.EditObservationRecordUseCase] loading all local medias from record '286962921'...
07:55:21.933 INFO: [fr.geonature.occtax.features.record.usecase.EditObservationRecordUseCase] all medias successfully loaded for record '286962921'
07:55:21.934 WARN: [fr.geonature.maps.layer.data.LayerLocalDataSourceImpl] no layer 'Mailles 10km' found from storage
07:55:22.958 DEBUG: [fr.geonature.commons.data.helper.SQLiteSelectQueryBuilder] sql:
  SELECT observers."_id" AS observers__id, observers."lastname" AS observers_lastname, observers."firstname" AS observers_firstname
  FROM observers observers
  ORDER BY observers_lastname COLLATE NOCASE ASC, observers_firstname COLLATE NOCASE ASC
  args: []
07:55:24.246 DEBUG: [fr.geonature.commons.data.helper.SQLiteSelectQueryBuilder] sql:
  SELECT observers."_id" AS observers__id, observers."lastname" AS observers_lastname, observers."firstname" AS observers_firstname
  FROM observers observers
  ORDER BY observers_lastname COLLATE NOCASE ASC, observers_firstname COLLATE NOCASE ASC
  args: []
07:55:25.095 INFO: [fr.geonature.datasync.sync.usecase.DataSyncUseCase] dataset to update: 240
07:55:25.121 INFO: [fr.geonature.datasync.sync.usecase.DataSyncUseCase] synchronize users...
07:55:25.131 INFO: [fr.geonature.datasync.api.ClientKt] --> GET https://demo.geonature.fr/geonature/api/users/menu/1
07:55:25.358 INFO: [fr.geonature.datasync.api.ClientKt] <-- 200 OK https://demo.geonature.fr/geonature/api/users/menu/1 (224ms, 26059-byte body)
07:55:25.452 DEBUG: [fr.geonature.commons.data.helper.SQLiteSelectQueryBuilder] sql:
  SELECT observers."_id" AS observers__id, observers."lastname" AS observers_lastname, observers."firstname" AS observers_firstname
  FROM observers observers
  WHERE observers__id = ?
  ORDER BY observers_lastname COLLATE NOCASE ASC, observers_firstname COLLATE NOCASE ASC
  args: [4]
07:55:25.827 INFO: [fr.geonature.datasync.sync.usecase.DataSyncUseCase] users to update: 230
07:55:25.838 INFO: [fr.geonature.datasync.sync.usecase.DataSyncUseCase] synchronize taxonomy ranks...
07:55:25.843 INFO: [fr.geonature.datasync.api.ClientKt] --> GET https://demo.geonature.fr/geonature/api/taxhub/api/taxref/regnewithgroupe2
07:55:26.327 DEBUG: [fr.geonature.commons.data.helper.SQLiteSelectQueryBuilder] sql:
  SELECT dataset."_id" AS dataset__id, dataset."name" AS dataset_name, dataset."description" AS dataset_description, dataset."active" AS dataset_active, dataset."created_at" AS dataset_created_at, dataset."updated_at" AS dataset_updated_at, dataset."taxa_list_id" AS dataset_taxa_list_id
  FROM dataset dataset
  WHERE (dataset_active = 1)
  ORDER BY dataset_name COLLATE NOCASE ASC
  args: []
07:55:26.762 INFO: [fr.geonature.datasync.api.ClientKt] <-- 200 OK https://demo.geonature.fr/geonature/api/taxhub/api/taxref/regnewithgroupe2 (917ms, 724-byte body)
07:55:26.773 INFO: [fr.geonature.datasync.sync.usecase.DataSyncUseCase] taxonomy ranks to update: 41
07:55:26.856 INFO: [fr.geonature.datasync.sync.usecase.DataSyncUseCase] synchronize nomenclature types...
07:55:26.867 INFO: [fr.geonature.datasync.api.ClientKt] --> GET https://demo.geonature.fr/geonature/api/nomenclatures/nomenclatures/taxonomy
07:55:27.091 INFO: [fr.geonature.datasync.api.ClientKt] <-- 200 OK https://demo.geonature.fr/geonature/api/nomenclatures/nomenclatures/taxonomy (222ms, 584527-byte body)
07:55:28.249 INFO: [fr.geonature.occtax.ui.input.observers.ObserversAndDateInputFragment] selected dataset: 296, taxa list ID: null
07:55:28.259 DEBUG: [fr.geonature.commons.data.helper.SQLiteSelectQueryBuilder] sql:
  SELECT observers."_id" AS observers__id, observers."lastname" AS observers_lastname, observers."firstname" AS observers_firstname
  FROM observers observers
  WHERE observers__id = ?
  ORDER BY observers_lastname COLLATE NOCASE ASC, observers_firstname COLLATE NOCASE ASC
  args: [4]
07:55:28.259 DEBUG: [fr.geonature.commons.data.helper.SQLiteSelectQueryBuilder] sql:
  SELECT dataset."_id" AS dataset__id, dataset."name" AS dataset_name, dataset."description" AS dataset_description, dataset."active" AS dataset_active, dataset."created_at" AS dataset_created_at, dataset."updated_at" AS dataset_updated_at, dataset."taxa_list_id" AS dataset_taxa_list_id
  FROM dataset dataset
  WHERE (dataset__id = ?)
  ORDER BY dataset_name COLLATE NOCASE ASC
  args: [296]
07:55:28.309 INFO: [fr.geonature.occtax.ui.input.observers.ObserversAndDateInputFragment] selected dataset: 296, taxa list ID: null
07:55:31.156 INFO: [fr.geonature.datasync.sync.usecase.DataSyncUseCase] nomenclature types to update: 165
07:55:31.330 INFO: [fr.geonature.datasync.sync.usecase.DataSyncUseCase] nomenclature to update: 1681
07:55:31.337 INFO: [fr.geonature.datasync.sync.usecase.DataSyncUseCase] synchronize nomenclature default values...
07:55:31.342 INFO: [fr.geonature.datasync.api.ClientKt] --> GET https://demo.geonature.fr/geonature/api/occtax/defaultNomenclatures
07:55:31.368 INFO: [fr.geonature.maps.layer.presentation.LayerSettingsViewModel] loading selected layers:
    'OpenStreetMap': [https://a.tile.openstreetmap.org, https://b.tile.openstreetmap.org, https://c.tile.openstreetmap.org] (active: true)
07:55:31.373 INFO: [fr.geonature.maps.layer.presentation.LayerSettingsViewModel] loading online layer 'OpenStreetMap'...
07:55:31.481 INFO: [fr.geonature.datasync.api.ClientKt] <-- 200 OK https://demo.geonature.fr/geonature/api/occtax/defaultNomenclatures (138ms, 282-byte body)
07:55:31.505 INFO: [fr.geonature.datasync.sync.usecase.DataSyncUseCase] nomenclature default values to update: 17
07:55:31.855 INFO: [fr.geonature.datasync.sync.repository.SynchronizeTaxaRepositoryImpl] taxa last synchronization date: 2025-01-28T07:41:38Z
07:55:31.860 INFO: [fr.geonature.datasync.api.ClientKt] --> GET https://demo.geonature.fr/geonature/api/taxhub/api/taxref/version
07:55:32.347 INFO: [fr.geonature.datasync.api.ClientKt] <-- 200 OK https://demo.geonature.fr/geonature/api/taxhub/api/taxref/version (485ms, 90-byte body)
07:55:32.356 INFO: [fr.geonature.datasync.sync.repository.SynchronizeTaxaRepositoryImpl] taxa last synchronization date from remote: 2024-07-08T11:27:35Z
07:55:32.461 INFO: [fr.geonature.datasync.api.ClientKt] --> GET https://demo.geonature.fr/geonature/api/taxhub/api/biblistes
07:55:32.744 INFO: [fr.geonature.datasync.api.ClientKt] <-- 200 OK https://demo.geonature.fr/geonature/api/taxhub/api/biblistes/ (281ms, 2061-byte body)
07:55:32.749 INFO: [fr.geonature.datasync.sync.repository.SynchronizeTaxaRepositoryImpl] synchronize taxa list...
07:55:32.761 INFO: [fr.geonature.datasync.api.ClientKt] --> GET https://demo.geonature.fr/geonature/api/taxhub/api/taxref?orderby=cd_nom&limit=10000&page=1&id_liste=101%2C102%2C104%2C100%2C105%2C106%2C103%2C107%2C108%2C109%2C112%2C113
07:55:33.160 INFO: [fr.geonature.datasync.api.ClientKt] <-- 200 OK https://demo.geonature.fr/geonature/api/taxhub/api/taxref/?orderby=cd_nom&limit=10000&page=1&id_liste=101%2C102%2C104%2C100%2C105%2C106%2C103%2C107%2C108%2C109%2C112%2C113 (397ms, 273845-byte body)
07:55:34.044 INFO: [fr.geonature.datasync.sync.repository.SynchronizeTaxaRepositoryImpl] taxa to update: 413
07:55:34.046 INFO: [fr.geonature.datasync.sync.repository.SynchronizeTaxaRepositoryImpl] synchronize taxa additional data...
07:55:34.053 INFO: [fr.geonature.datasync.api.ClientKt] --> GET https://demo.geonature.fr/geonature/api/synthese/color_taxon?orderby=cd_nom&code_area_type=M10&limit=10000&page=1
07:55:34.257 INFO: [fr.geonature.datasync.api.ClientKt] <-- 200 OK https://demo.geonature.fr/geonature/api/synthese/color_taxon?orderby=cd_nom&code_area_type=M10&limit=10000&page=1 (202ms, 174040-byte body)
07:55:35.148 INFO: [fr.geonature.datasync.sync.repository.SynchronizeTaxaRepositoryImpl] found 1865 taxa with areas from page 1
07:55:35.167 WARN: [fr.geonature.datasync.sync.repository.SynchronizeTaxaRepositoryImpl] failed to update taxa with areas (page: 1): android.database.sqlite.SQLiteConstraintException: FOREIGN KEY constraint failed (code 787 SQLITE_CONSTRAINT_FOREIGNKEY)
    at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
    at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:879)
    at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:790)
    at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:88)
    at androidx.sqlite.db.framework.FrameworkSQLiteStatement.executeInsert(FrameworkSQLiteStatement.kt:42)
    at androidx.room.EntityInsertionAdapter.insert(EntityInsertionAdapter.kt:85)
    at fr.geonature.commons.data.dao.TaxonAreaDao_Impl.insertAll(TaxonAreaDao_Impl.java:108)
    at fr.geonature.datasync.sync.repository.SynchronizeTaxaRepositoryImpl$synchronizeTaxaAdditionalDataWithPagination$2.invokeSuspend(SynchronizeTaxaRepositoryImpl.kt:307)
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
    at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
    at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:284)
    at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:85)
    at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:59)
    at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source:1)
    at androidx.room.RoomDatabaseKt$startTransactionCoroutine$2$1.run(RoomDatabaseExt.kt:93)
    at androidx.room.TransactionExecutor.execute$lambda$1$lambda$0(TransactionExecutor.kt:36)
    at androidx.room.TransactionExecutor.$r8$lambda$AympDHYBb78s7_N_9gRsXF0sHiw(Unknown Source:0)
    at androidx.room.TransactionExecutor$$ExternalSyntheticLambda0.run(Unknown Source:4)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.lang.Thread.run(Thread.java:919)
07:55:35.175 INFO: [fr.geonature.datasync.sync.repository.SynchronizeTaxaRepositoryImpl] updating 1865 taxa with areas from page 1
07:55:35.177 INFO: [fr.geonature.datasync.sync.repository.SynchronizeAdditionalFieldsRepositoryImpl] synchronize additional fields...
07:55:35.181 INFO: [fr.geonature.datasync.api.ClientKt] --> GET https://demo.geonature.fr/geonature/api/gn_commons/additional_fields?module_code=OCCTAX
07:55:35.463 INFO: [fr.geonature.datasync.api.ClientKt] <-- 200 OK https://demo.geonature.fr/geonature/api/gn_commons/additional_fields?module_code=OCCTAX (281ms, 29500-byte body)
07:55:35.607 WARN: [fr.geonature.datasync.sync.io.AdditionalFieldJsonReader] unknown widget 'java.util.NoSuchElementException: Array contains no element matching the predicate.'
07:55:35.613 INFO: [fr.geonature.datasync.sync.repository.SynchronizeAdditionalFieldsRepositoryImpl] 24 additional field(s) found
07:55:35.649 INFO: [fr.geonature.datasync.sync.worker.DataSyncWorker] local data synchronization successfully finished in 18.129s
07:55:36.786 DEBUG: [fr.geonature.occtax.ui.input.taxa.TaxaFragment$Companion] default taxa list ID: 100
07:55:36.820 DEBUG: [fr.geonature.occtax.ui.input.taxa.TaxaFragment] loading taxa...
07:55:36.826 DEBUG: [fr.geonature.commons.data.helper.SQLiteSelectQueryBuilder] sql:
  SELECT taxa."_id" AS taxa__id, taxa."name" AS taxa_name, taxa."kingdom" AS taxa_kingdom, taxa."group" AS taxa_group, taxa."name_common" AS taxa_name_common, taxa."description" AS taxa_description
  FROM taxa taxa
  ORDER BY taxa_name ASC
  args: []
07:55:36.959 DEBUG: [fr.geonature.occtax.ui.input.taxa.TaxaFragment] loading taxa from taxa list ID 100...
07:55:36.964 DEBUG: [fr.geonature.commons.data.helper.SQLiteSelectQueryBuilder] sql:
  SELECT taxa."_id" AS taxa__id, taxa."name" AS taxa_name, taxa."kingdom" AS taxa_kingdom, taxa."group" AS taxa_group, taxa."name_common" AS taxa_name_common, taxa."description" AS taxa_description, taxa_list."taxon_id" AS taxa_list_taxon_id, taxa_list."taxa_list_id" AS taxa_list_taxa_list_id
  FROM taxa taxa
  JOIN taxa_list AS taxa_list ON taxa_list_taxon_id = taxa__id AND taxa_list_taxa_list_id = ?
  ORDER BY taxa_name ASC
  args: [100]

@camillemonchicourt
Copy link
Member

OK OK. Merci pour ce retour. Cela semble me confirmer que :

  • Quand on n'arrive pas à charger les JDD et liste des observateurs en étant connecté sur le serveur de DEMO, c'est parce qu'on a switché d'une instance GeoNature à une autre, qu'il a gardé en mémoire des infos de la précédente instance et que cela coince logiquement au niveau des ID
  • Que la synchro des taxons ne passe plus sur le serveur DEMO, surement car il rencontre un soucis quand il récupère les couleurs de taxons (failed to update taxa with areas (page: 1)).

Mais je ne comprends pas pourquoi cela fonctionnait et pourquoi y a un soucis désormais. Ni pourquoi il ne récupère pas tous les taxons, quitte à ignorer les couleurs de taxons qui posent soucis, et ainsi ne pas planter la synchro ?

Et par ailleurs, il y a aussi un soucis similaire remonté sur #281, et là je ne sais pas si c'est lié au fait d'avoir switché d'une instance GeoNature à une autre ?

@camillemonchicourt
Copy link
Member

Alors, pour le serveur DEMO, on a identifié et trouvé le soucis.
Il y a eu une régression sur TaxHub version 2, où la route de Taxref n'était pas ordonnée par cd_nom, donc les résultats de chaque page étaient aléatoires, donc on ne récupérait pas tous les taxons de Taxref, donc ensuite la synchro des couleurs de taxons pouvait ne pas fonctionner correctement car ne pas trouver de correspondance avec Taxref et donc le reste de la synchronisation n'aboutissait pas.
Le soucis de la route /taxref de TaxHub est en cours de correction : PnX-SI/TaxHub#599

On va tester vérifier que cela corrige bien le soucis du serveur de DEMO.


Par contre, cela n'explique pas le soucis initial d'@aferchal de synchro des taxons avec un GeoNature 2.14 et un TaxHub 2.14.
A creuser par ailleurs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

3 participants