MTES-MCT / metadata-postgresql

Plume : gestion des métadonnées du patrimoine PostgreSQL
https://mtes-mct.github.io/metadata-postgresql/
GNU Affero General Public License v3.0
0 stars 1 forks source link

Avertir l'utilisateur lorsque le serveur CSW renvoie une erreur #146

Closed alhyss closed 8 months ago

alhyss commented 1 year ago

Actuellement, la méthode Ui_Dialog_ImportCSW.returnXml() du module plume.importcsw n'avertit pas l'utilisateur lorsque le CSW a renvoyé une erreur. Dans ce cas, la méthode contentAsString() de l'objet QgsNetworkContentFetcher ne renvoie rien et, selon l'option d'import choisie par l'utilisateur, la fiche de métadonnées sera soit laissée intacte, soit entièrement vidée, sans que l'utilisateur ne sache pourquoi.

https://github.com/MTES-MCT/metadata-postgresql/blob/7f7818eb8c1b7884c8c495d6d49488c1c7eb7502/plume/importcsw.py#L365

Il n'y a aucune dysfonctionnement de Plume, mais l'utilisateur n'a aucune information pour l'aider à diagnostiquer le problème (si tant est qu'il remarque qu'il y en a un), qui peut aller du proxy mal configuré empêchant la connexion à internet à une coquille dans l'identifiant de la fiche de métadonnées.

La méthode QgsNetworkContentFetcher.reply() fournit un objet QNetworkReply, sur lequel il est possible d'appliquer les méthodes error() et errorString() pour accéder aux informations sur les erreurs rencontrées. Il serait utile de les utiliser pour détecter les erreurs et afficher alors un message à l'utilisateur avec la description de l'erreur.

WREATCHED commented 11 months ago

Analyse Dans le cas où la méthode contentAsString() de l'objet QgsNetworkContentFetcher ne renvoie rien, [QgsNetworkContentFetcher.reply()| retourne None. On ne peut donc pas retourner les méthodes error() et errorString()

On en parle ?

WREATCHED commented 11 months ago

Je reviens sur ma position, [QgsNetworkContentFetcher.reply()| ne retourne pas None et donc, on peut capturer les erreurs Résultat ci-dessous image

alhyss commented 8 months ago

Pour mémoire, la solution mise en oeuvre ne fonctionne que sur les erreurs HTTP (page introuvable, délai de réponse du serveur dépassé, etc.). Si les paramètres de la requête ne sont pas bons, notamment l'identifiant de la fiche de métadonnées, le CSW renvoie un XML certes sans métadonnées, mais qui contient tout de même un élément csw:GetRecordByIdResponse. Vérifier si la méthode QgsNetworkContentFetcher.contentAsString renvoie une chaîne de caractères vides n'est donc pas suffisant.

À noter que la version 3 du protocole CSW prévoit de renvoyer une erreur HTTP 400 dans ce cas (Bad request), mais ce n'était pas le cas avec la version 2.0.2 prise en charge par Plume.

WREATCHED commented 8 months ago

Correction

    #===============================              
    def returnXml(self, url_csw, file_identifier) :
        resultQueryId = csw.getrecordbyid_request(url_csw, file_identifier)
        url = QUrl(resultQueryId)
        fetcher = QgsNetworkContentFetcher()
        fetcher.fetchContent(url)
        #-
        evloop = QEventLoop()
        fetcher.finished.connect(evloop.quit)
        evloop.exec_(QEventLoop.ExcludeUserInputEvents)
        fetcher.finished.disconnect(evloop.quit)
        #-
        raw_xml = [ fetcher.contentAsString() ]

        #- Cas ou le serveur CSW ne renvoie rien https://github.com/MTES-MCT/metadata-postgresql/issues/146 
        if raw_xml[0] == "" :
           ret = fetcher.reply()
           raw_xml = [ None, str(ret.error()), str(ret.errorString()) ]
        #- Cas ou le serveur CSW renvoie <csw:GetRecordByIdResponse sans balises à l'intérieur https://github.com/MTES-MCT/metadata-postgresql/issues/146 
        elif not self.return_children_xml( raw_xml[0] ) :
           raw_xml = [ None, "99", str("Problème d'identifiant.") ]

        #-
        return raw_xml

    #===============================              
    def return_children_xml(self, reponse_xml) :
        _return_children_xml = False
        # Analyser la réponse XML
        root = ET.fromstring(reponse_xml)
        children = list(root)
        if children:
           for child in children:
               _return_children_xml = True
               break

        return _return_children_xml

Avec en retour le message suivant image