Giter Club home page Giter Club logo

mdchecker's People

Contributors

bchartier avatar fphg avatar fvanderbiest avatar

Stargazers

 avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

Forkers

maelreboux guts

mdchecker's Issues

ne fonctionne plus derrière un proxy http

La version owslib utilise requests qui dépend d'urllib3. La configuration d'un proxy sortant diffère de urllib2. La configuration proposée dans app.cfg

Workaround, urllib3 est sensible à la variable d'environnement http_proxy

Dépendance inutile - pyshp

pyshp (import shapefile) ne semble pas utile. Il ne sert que dans la méthode mdToShape dans inspirerobot.py.

Mutualiser le code quick test et session

Suggestion de @fphg :

Il faudrait plutôt que le comportement entre session et quicktest soit le même.
Je pense que la fonction js ne le permet pas actuellement.

pour éviter de maintenir 2 templates, peut-être faut-il supprimer quicktest et n'utiliser que session, avec un mode sans enregistrement

export csv non implémenté

html pour une utilisation directe, fonctionne
json pour de futurs échanges avec une autre application, fonctionne
csv serait le format le plus utilisé par les dataadmin dans leur travail de rapportage -> à finir

Echec de la création d'une session avec le déploiement de la branche with_db

@fphg a constaté le problème suivant :

  • déploiement de branche with_db
  • création de la base de données sqlite avec la commande python create_db.py
  • exécution de l'appli :

Les tests rapides fonctionnent
Le formulaire nouvelle session s'affiche
Je lance une session de test avec un filtre Nom d'organisme
Je vois les cnx se faire dans la console
Cependant quand je lance une session :
OperationalError: (sqlite3.OperationalError) no such table: test_session [SQL: u'SELECT test_session.id AS test_session_id, test_session.cat_url AS test_session_cat_url, test_session.filter AS test_session_filter, test_session.date AS test_session_date \nFROM test_session\n LIMIT ? OFFSET ?'] [parameters: (10, 0)]

logs :

py", line 2101, in _flush
    flush_context.execute()
  File "/var/geobretagne/prod/mdchecker/local/lib/python2.7/site-packages/sqlalchemy/orm/unitofwork.py", line 373, in execute
    rec.execute(self)
  File "/var/geobretagne/prod/mdchecker/local/lib/python2.7/site-packages/sqlalchemy/orm/unitofwork.py", line 532, in execute
    uow
  File "/var/geobretagne/prod/mdchecker/local/lib/python2.7/site-packages/sqlalchemy/orm/persistence.py", line 174, in save_obj
    mapper, table, insert)
  File "/var/geobretagne/prod/mdchecker/local/lib/python2.7/site-packages/sqlalchemy/orm/persistence.py", line 800, in _emit_insert_statements
    execute(statement, params)
  File "/var/geobretagne/prod/mdchecker/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 914, in execute
    return meth(self, multiparams, params)
  File "/var/geobretagne/prod/mdchecker/local/lib/python2.7/site-packages/sqlalchemy/sql/elements.py", line 323, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
  File "/var/geobretagne/prod/mdchecker/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1010, in _execute_clauseelement
    compiled_sql, distilled_params
  File "/var/geobretagne/prod/mdchecker/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1146, in _execute_context
    context)
  File "/var/geobretagne/prod/mdchecker/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1341, in _handle_dbapi_exception
    exc_info
  File "/var/geobretagne/prod/mdchecker/local/lib/python2.7/site-packages/sqlalchemy/util/compat.py", line 202, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=cause)
  File "/var/geobretagne/prod/mdchecker/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1139, in _execute_context
    context)
  File "/var/geobretagne/prod/mdchecker/local/lib/python2.7/site-packages/sqlalchemy/engine/default.py", line 450, in do_execute
    cursor.execute(statement, parameters)
OperationalError: (raised as a result of Query-invoked autoflush; consider using a session.no_autoflush block if this flush is occurring prematurely) (sqlite3.OperationalError) no such table: test_session [SQL: u'INSERT INTO test_session (cat_url, filter, date) VALUES (?, ?, ?)'] [parameters: (u'http://geobretagne.fr/geonetwork/srv/fre/csw', u'Type = dataset  && anytext =  && OrganisationName = DREAL Bretagne', '2016-09-14 08:39:24.192032')]

Utilisation de esn='brief' avec getrecords2 de owslib/csw

Je fais des tests du catalogue de GéoPicardie avec mdchecker (http://www.geopicardie.fr/geonetwork/srv/fre/csw).
Je rencontre une erreur sur certaines fiches de métadonnées qui fait planter mdchecker :

Traceback (most recent call last):
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker_geopic/venv/lib/python2.7/site-packages/flask/app.py", line 1988, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker_geopic/venv/lib/python2.7/site-packages/flask/app.py", line 1641, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker_geopic/venv/lib/python2.7/site-packages/flask/app.py", line 1544, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker_geopic/venv/lib/python2.7/site-packages/flask/app.py", line 1639, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker_geopic/venv/lib/python2.7/site-packages/flask/app.py", line 1625, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker_geopic/mdchecker/main.py", line 243, in index
    metadatas, count, score = runTests(args, mdUnitTests)
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker_geopic/mdchecker/main.py", line 151, in runTests
    count = inspirobot.mdcount(cfg['cswurl'], constraints=constraints, startrecord=args['nextrecord'], maxharvest=args['maxharvest'])
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker_geopic/mdchecker/inspirobot/Inspirobot.py", line 208, in mdcount
    csw.getrecords2(esn='brief', constraints=constraints, startposition=startrecord, maxrecords=maxharvest)
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker_geopic/venv/lib/python2.7/site-packages/owslib/csw.py", line 391, in getrecords2
    self._parserecords(outputschema, esn)
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker_geopic/venv/lib/python2.7/site-packages/owslib/csw.py", line 561, in _parserecords
    self.records[identifier] = CswRecord(i)
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker_geopic/venv/lib/python2.7/site-packages/owslib/csw.py", line 817, in __init__
    self.bbox = ows.BoundingBox(val, namespaces['ows'])
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker_geopic/venv/lib/python2.7/site-packages/owslib/ows.py", line 202, in __init__
    self.crs = crs.Crs(val)
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker_geopic/venv/lib/python2.7/site-packages/owslib/crs.py", line 1754, in __init__
    self.code = int(vals[-1])
ValueError: invalid literal for int() with base 10: '2154::'

Les exceptions renvoyées par owslib n'identifient pas la fiche de métadonnées impliquée.
Avant de pouvoir corriger l'anomalie du côté des fiches de métadonnées, je cherche à rendre plus robuste mdchecker à ce genre d'anomalies.

En regardant le code impliqué de mdchecker (cf. https://github.com/geobretagne/mdchecker/blob/master/mdchecker/inspirobot/Inspirobot.py#L205-L209), je me dis que l'utilisation de esn='brief' est peut-être inutile. J'ai réalisé un test sans ce paramètre et cela semble fonctionner parfaitement avec le catalogue de GéoPicardie. Quand des métadonnées correctes sont parsées les résultats des tests semblent identiques. J'ai l'impression que l'appel à getrecords2 n'est utilisé que pour dénombrer les fiches. Le fait de supprimer ce paramètre ou de le remplacer par esn="summary" me parait donc plus judicieux.

genre :
csw.getrecords2(constraints=constraints, startposition=startrecord, maxrecords=maxharvest)

Est-ce que mon analyse est correcte ?
Est-ce qu'il est raisonnable que j'intègre cette modification dans l'évolution que je prépare ?

Dockeriser mdchecker

Dockeriser mdchecker pour :

  • simplifier le déploiement
  • faciliter l'intégration dans l'architecture dockerisée de georchestra

Lister les organisations pour alimenter le filtre ?

@bchartier : serait-il opportun d'effectuer un getDomain pour récupérer la liste des organisations et présenter le filtre sous la forme d'une liste déroulante et non d'un champ libre.

En pour : difficile de saisir l'intitulé exact, case sensitive
En contre : gros catalogue, beaucoup d'organisations, champ compliqué

PS la fonction est cablée dans la lib inspirobot

Amélioration image docker

Quelques pistes d'amélioration de l'image docker :

  1. Pouvoir sauvegarder la base de données. Est-ce qu'il faut déclarer un volume pour cela ou est-ce qu'une autre stratégie est plus pertinente ?
  2. @fphg voulait pouvoir stocker les données dans la base PostgreSQL de geOrchestra. Pour que de faire un volume il vaudrait sans doute mieux rendre paramétrable la connexion à la base de données -> paramètres du dockerfile. Il faudrait alors changer la manière de lancer create_db.py.
  3. Il faudrait sans doute pouvoir définir le contenu de app.json au lancement du container.
  4. Réduire le nombre de layers de l'image docker en fusionnant les dernières commandes RUN
  5. Optimiser la taille de l'image docker en utilisant une image de base plus adaptée (je suis parti d'une image python pour une question de simplicité/facilité.

Compatibilité Windows

uwsgi n'est pas disponible sur Windows ou du moins très difficilement dans le cadre d'une utilisation en virtualenv (Testé sur Windows 8.1 pour info).

Cela n'empêche pas de fonctionner via un simple python runserver.py, comme indiqué dans INSTALL.MD d'ailleurs.

Je suggère de l'indiquer dans la documentation, voir le README.

Autant pour moi, c'est indiqué dans INSTALL.md. Mais du coup, je trouve dommage de ne pas être compatible Windows à cause d'une seule dépendance.

Migration vers OWSLib 0.16.0

J'ai récemment imposé les versions des modules Python utilisés par mdchecker.
cf. 4a988d3
En effet, la dernière version d'OWSLib s'avère incompatible avec mdchecker.
OWSLib 0.13.0 fonctionne.
OWSLib 0.16.0 ne fonctionne plus.

Certaines métadonnées lèvent des exceptions au niveau d'OWSLib :

[2018-07-23 09:37:05,694] ERROR in app: Exception on /quick_test/ [GET]
Traceback (most recent call last):
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker/venv/lib/python2.7/site-packages/flask/app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker/venv/lib/python2.7/site-packages/flask/app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker/venv/lib/python2.7/site-packages/flask/app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker/venv/lib/python2.7/site-packages/flask/app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker/venv/lib/python2.7/site-packages/flask/app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker/app/mdchecker/main.py", line 510, in quick_test
    metadatas, count, score = ins_wrapper.run_unrecorded_tests()
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker/app/mdchecker/main.py", line 290, in run_unrecorded_tests
    maxharvest=self.test_params["maxharvest"]
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker/app/mdchecker/inspirobot/Inspirobot.py", line 243, in mdsearch
    maxrecords=maxrecords, outputschema=self.OUTPUTSCHEMA)
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker/venv/lib/python2.7/site-packages/owslib/csw.py", line 399, in getrecords2
    self._parserecords(outputschema, esn)
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker/venv/lib/python2.7/site-packages/owslib/csw.py", line 549, in _parserecords
    self.records[identifier] = MD_Metadata(i)
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker/venv/lib/python2.7/site-packages/owslib/iso.py", line 146, in __init__
    self.contentinfo.append(MD_FeatureCatalogueDescription(contentinfo))
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker/venv/lib/python2.7/site-packages/owslib/iso.py", line 961, in __init__
    val = i.attrib['uuidref']
  File "src/lxml/lxml.etree.pyx", line 2452, in lxml.etree._Attrib.__getitem__ (src/lxml/lxml.etree.c:70073)
KeyError: 'uuidref'

Exemple de requête produisant cela :
quick_test/?nextrecord=118&anytext=&cat=GéoBretagne&maxharvest=1

Migration vers OWSLib 0.16.0 à étudier...

Consultation d'une session - passage cartes/liste mal géré

Quand on consulte le résultat d'une session, quand on passe du mode d'affichage "liste" à "cartes" et inversement on se retrouve systématiquement à la première page.

Quand on change de page on retombe systématiquement sur le mode d'affichage "cartes".

On devrait conserver le même mode d'affichage et rester sur la même page.
A corriger.

le service de notation md par md est défectueux

http://127.0.0.1:5000/md/id-de-metadonnee/html
File "/var/www/DEV/github/geobretagne/mdchecker/mdchecker/app/mdchecker/main.py", line 453, in byId metadatas, count, score = ins_wrapper.run_unrecorded_tests() File "/var/www/DEV/github/geobretagne/mdchecker/mdchecker/app/mdchecker/main.py", line 276, in un_unrecorded_tests self.test_params["cswurl"], constraints=self.constraints_fes, KeyError: 'cswurl'
le refresh d'une fiche en cliquant sur son score retourne une erreur, ce qui efface la fiche au lieu de l'actualiser

Fonctions utiles manquantes

Une petite liste de fonctions auxquelles j'ai pensées mais que je n'ai pas eu le temps d'implémenter (en rapport avec le stockage des infos en base de données) :

  • Relancer en un clic une session de tests
  • Supprimer une session de tests enregistrée en base
  • Supprimer toutes les sessions de tests enregistrées ayant les mêmes paramètres que la session en cours de consultation
  • Passer à la session précédente ou suivante de tests ayant les mêmes paramètres que la session en cours de consultation
  • Pouvoir sélectionner les tests à exécuter dans une session (on pourrait imaginer que certains tests ne soient pas utiles pour certaines plates-formes)
  • Administrer une liste de catalogues pour pouvoir simplement le sélectionner dans une liste quand on veut lancer des tests. Avoir plusieurs catalogues configurés peut être utile si l'on une seule plate-forme à gérer mais avec plusieurs catalogues virtuels ou si l'on fait de l'assistance pour plusieurs plates-formes (et puis on peut avoir les deux cas en simultané)
  • Afficher des indicateurs exploitant l'historique des tests (peut-être compliqué si on a pas de possibilité de lancer des tests de manière périodique)
  • rétablir la fonction de correction rapide (dans quick test: le workflow habituel est je fais le test sur mon orga; je clique sur les fiches avec score bas pour aller sur le catalogue; je corrige; je clique sur le score pour relancer sur la fiche en question, qui s'actualise directement sur la page)
  • ajouter un sortkey sur la date des données, souvent en rapport avec la qualité des md
  • afficher un graphe temporel du score des sessions ayant les mêmes paramètres que la session en cours de consultation
  • afficher des stats qui comptent aussi pour la qualité: pyramide des âges des données, camembert sur les keywords

Gérer plusieurs catalogues

Je viens de publier une branche multiple_cats pour pouvoir suivre plusieurs catalogues depuis une instance de mdchecker.
J'ai remplacé les entrées de cfg suivantes :

    'cswurl':        'http://geobretagne.fr/geonetwork/srv/fre/csw',
    'xmlurlprefix':  'http://geobretagne.fr/geonetwork/srv/fre/xml_iso19139?uuid=',
    'viewurlprefix': 'http://geobretagne.fr/geonetwork/apps/georchestra/?uuid=',

par une liste (exemple chez moi) :

 "cats": [
   {
     "name": "GéoBretagne",
     "cswurl": "http://geobretagne.fr/geonetwork/srv/fre/csw",
     "xmlurlprefix": "http://geobretagne.fr/geonetwork/srv/fre/xml_iso19139?uuid=",
     "viewurlprefix": "http://geobretagne.fr/geonetwork/apps/georchestra/?uuid="
   },
   {
     "name": "GéoPicardie",
     "cswurl": "http://www.geopicardie.fr/geonetwork/srv/fre/csw",
     "xmlurlprefix": "http://www.geopicardie.fr/geonetwork/srv/fre/xml_iso19139?uuid=",
     "viewurlprefix": "http://www.geopicardie.fr/geonetwork/apps/georchestra/?uuid="
   },
   {
     "name": "GéoPicardie - pour moissonneurs",
     "cswurl": "http://www.geopicardie.fr/geonetwork/srv/fre/csw-for-harvesters",
     "xmlurlprefix": "http://www.geopicardie.fr/geonetwork/srv/fre/xml_iso19139?uuid=",
     "viewurlprefix": "http://www.geopicardie.fr/geonetwork/apps/georchestra/?uuid="
   },
   {
     "name": "Catalogue local",
     "cswurl": "http://localhost:8082/geonetwork/srv/fre/csw",
     "xmlurlprefix": "http://localhost:8082/geonetwork/srv/fre/xml.metadata.get?uuid=",
     "viewurlprefix": "http://localhost:8082/geonetwork/srv/fre/catalog.search#/metadata/"
   }
 ],

Cela m'a également permis d'ajouter les liens vers la fiche en html et xml dans le template session_id.html.

Est-ce que cela vous parait bien à intégrer dans master ?

pagination pour export json/csv ?

La pagination pour le quick test html est pratique.
Les sorties csv et json empruntent la même route, mais pas de pagination -> limité au max records per page. Comment permettre un export pour tout le catalogue ?

Coupler une base de données

Je me pose la question de faire évoluer mdchecker pour y coupler une base de données. L'idée serait d'y stocker les résultats des tests afin de pouvoir faire des statistiques et de les présenter. Bonne ou mauvaise idée ?

pagination quick_test à simplifier

quick_test affiche les pages façon 1-49, 50-99... alors que session utilise simplement 1, 2, 3. Utiliser l'affichage de session pour quick_test.

cant read or write mdchecker/conf/app.json, using defaults

Message d'erreur lors de l'utilisation de flask_sqlalchemy :

Step 9 : RUN python /var/www/app/create_db.py
 ---> Running in 8276c5a9d65a
/usr/local/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py:800: UserWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True to suppress this warning.
  warnings.warn('SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True to suppress this warning.')
[2016-09-16 09:08:54,708] ERROR in main: cant read or write mdchecker/conf/app.json, using defaults
ERROR:mdchecker:cant read or write mdchecker/conf/app.json, using defaults

Il faudrait essayer de corriger cela.

Pourquoi utiliser les URL des requêtes GetCapabilities ?

Les tests du plugin testDigitalTransferOptions.py recherchent la présence des URL de requêtes GetCapabilities dans les fiches de métadonnées :
https://github.com/geobretagne/mdchecker/blob/master/mdchecker/plugins/testDigitalTransferOptions.py#L25

Au niveau de GéoPicardie, l'URL renseignée est celle du service et non celle de la requête GetCapabilities. Pour choisir l'URL de la requête GetCapabilities ? Est-ce que cela vient d'une contrainte de geOrchestra ou d'une contrainte liée au rapportage INSPIRE ? ou d'autre chose ?

sort sur date échoue car certaines dates nulles

si la date n'est pas trouvée on considérera que la md est défectueuse (test à rajouter)
pour le tri on considérera que la md est trop ancienne
je propose donc

        obsolete_date = datetime.datetime(1970,1,1)
...
        elif self.test_params['sortby'] == 'date':
            #self.metadatas.sort(operator.attrgetter('date'))
            self.metadatas.sort(key=lambda x: x.date or obsolete_date)

Impossible de démarrer le conteneur Docker : "cannot start service nginx"

J'ai suivi la doc d'installation mais le compose up plante :

PS C:\Users\$USER\Documents\GitHub\Pro\mdchecker> docker-compose up -d
Starting mdchecker_mdchecker_1 ... done
Starting mdchecker_nginx_1 ... error

ERROR: for mdchecker_nginx_1  Cannot start service nginx: Cannot link to a non running container: /mdchecker_mdchecker_1 AS /mdchecker_nginx_1/mdchecker

ERROR: for nginx  Cannot start service nginx: Cannot link to a non running container: /mdchecker_mdchecker_1 AS /mdchecker_nginx_1/mdchecker
ERROR: Encountered errors while bringing up the project.

Env: W10 Pro
docker images:
image

J'ai l'impression que cela provient d'un conflit avec mon image nginx, pourtant l'officielle.

Validateur de métadonnées

Est-ce que cela vous semblerait jouable de brancher d'une manière ou d'une autre des validateurs de métadonnées dans mdchecker :

  • les tests réalisés par Geonetwork
  • le futur validateur européen ? (cf. message envoyé par Marc Leobet le 14/09/2016 à propos d'un validateur européen qui serait disponible en début d'année prochaine sous forme d'une API)

J'ai glissé la description envoyé par Marc Leobet ci-dessous (ne décrit pas les aspects techniques mais le contexte et les objectifs) :
Point sur MIWP-5 020916_RMO.pdf

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.