geobretagne / mdchecker Goto Github PK
View Code? Open in Web Editor NEWThis is a simple quality assurance tool performing unit tests on a CSW-enabled catalog.
License: GNU General Public License v3.0
This is a simple quality assurance tool performing unit tests on a CSW-enabled catalog.
License: GNU General Public License v3.0
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.
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)
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 ?
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.
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
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
Définir une valeur par défaut pour la variable d'environnement MDCHECKER_DB_PATH pour l'environnement Windows.
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.
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 ?
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.
Après 4093a2a (ou était-ce le cas avant ?)
dans les md les dates seules (cad ddmmaaaa) sont interprétées en null.
Les dates ddmmaaahhmmss sont OK
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 ?
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...
tout est dans le titre du ticket
La fin du plugin consacré au thème INSPIRE parait plutôt étonnant :
https://github.com/geobretagne/mdchecker/blob/master/mdchecker/plugins/testInspireKeyword.py#L73
Le test sur la licence ressemble à un copier/coller d'un autre plugin (testLicence.py) et le test MdUnitTestSpatial ne semble rien faire (instruction pass).
S'agit-il d'une erreur ?
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 ?
Dockeriser mdchecker pour :
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
@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
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 ?
@fphg a constaté le problème suivant :
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')]
pyshp (import shapefile) ne semble pas utile. Il ne sert que dans la méthode mdToShape dans inspirerobot.py.
Quelques pistes d'amélioration de l'image docker :
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 :
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
La note globale n'est plus affichée dans pour la page "Test rapide".
La remettre.
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) :
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.
J'ai l'impression que cela provient d'un conflit avec mon image nginx, pourtant l'officielle.
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
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.