Add very first parser.

This commit is contained in:
Mikaël Ates 2014-12-19 16:55:56 +01:00
parent 4437226fb2
commit 1374d3aa12
2 changed files with 271 additions and 0 deletions

0
cv2parser/__init__.py Normal file
View File

271
cv2parser/cv2parser.py Normal file
View File

@ -0,0 +1,271 @@
# -*- coding: utf-8 -*-
'''
cv2parser - Carte Vitale 2 XML file parser
Copyright (C) 2014 Entr'ouvert
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
'''
import re
import os
from lxml import etree
from datetime import datetime
def get_xml_child_element_text(element, child_name):
try:
return element.find(child_name).text
except:
return None
def camel_to_pep8(name):
s_tmp = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name)
return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s_tmp).lower()
def parse_date(str_date):
fmt = '%d%m%Y'
return datetime.strptime(str_date, fmt)
def parse_file_date(str_date):
fmt = '%Y-%d-%m-%H-%M-%S'
return datetime.strptime(str_date, fmt)
ELEMENT_NAMES = {
'ident':
[
'nomUsuel',
'nomPatronymique',
'prenomUsuel',
'naissance',
'nir',
'adresse',
'rangDeNaissance',
'nirCertifie',
'dateCertification'
],
'amo':
[
'qualBenef',
'codeRegime',
'caisse',
'centreGestion',
'codeGestion',
'libelleExo',
'infoCompl',
'centreCarte',
'medecinTraitant'
],
'mutuelle':
[
'numIdent',
'indicTraitement',
'codeSTS',
'donneesCompl'
],
'amc':
[
'numComplB2',
'numComplEDI',
'numAdherent',
'indicTraitement',
'codeRoutageFlux',
'identHote',
'nomDomaine',
'codeSTS',
'donneesCompl'
],
'cmu':
[
'typeCMU'
],
'listeAt':
[],
'e112':
[
'fomulaire',
'typeExp',
'article',
'activite',
'date'
],
}
class Beneficiaire():
def __init__(self, element):
for root_name, names in ELEMENT_NAMES.items():
root_element = element.find(root_name)
for name in names:
setattr(self, root_name + '_' + camel_to_pep8(name),
get_xml_child_element_text(root_element, name))
self.assure = False
if self.amo_qual_benef == '0':
self.assure = True
self.ident_naissance = None
try:
self.ident_naissance = element.find('ident').find('naissance').\
find('date').text
except:
pass
self.ident_adresse = ""
for i in range(1, 6):
try:
self.ident_adresse += element.find('ident').find('adresse').\
find('ligne' + str(i)).text + '\n'
except:
pass
try:
i = 1
for periode_element in element.find('amo').\
find('listePeriodesDroits').findall('element'):
try:
setattr(self, 'amo_liste_periodes_droits_' + str(i) +
'_debut', periode_element.find('debut').text)
setattr(self, 'amo_liste_periodes_droits_' + str(i) +
'_fin', periode_element.find('fin').text)
i += 1
except:
pass
except:
pass
try:
self.amo_service_code_service = element.find('amo').\
find('service').find('codeService').text
self.amo_service_periode_service_debut = element.find('amo').\
find('service').find('periodeService').find('debut').text
self.amo_service_periode_service_fin = element.find('amo').\
find('service').find('periodeService').find('fin').text
except:
pass
self.caisse = ''.join(['0' for i in range(0,
3-len(self.amo_caisse))]) + self.amo_caisse
self.code_regime = ''.join(['0' for i in range(0,
2-len(self.amo_code_regime))]) + self.amo_code_regime
self.centre_carte = ''.join(['0' for i in range(0,
4-len(self.amo_centre_carte))]) + self.amo_centre_carte
self.naissance = None
if self.ident_naissance:
self.naissance = parse_date(self.ident_naissance)
self.date_certification = None
if self.ident_date_certification:
self.date_certification = \
parse_date(self.ident_date_certification)
self.nir = self.ident_nir[0:13]
self.rang_de_naissance = int(self.ident_rang_de_naissance)
self.nom = self.ident_nom_usuel[0] + \
self.ident_nom_usuel[1:].lower()
self.prenom = self.ident_prenom_usuel[0] + \
self.ident_prenom_usuel[1:].lower()
self.gender = None
if self.nir[0] in ('1', '2'):
self.gender = int(self.nir[0])
def __unicode__(self):
values = ""
if self.assure:
values += 'Assure\n'
else:
values += 'Non assure\n'
for root_name, names in ELEMENT_NAMES.items():
for name in names:
value = getattr(self, root_name + '_' + camel_to_pep8(name))
if value:
values += root_name + '_' + camel_to_pep8(name) + \
': ' + value + '\n'
if root_name == 'amo':
for i in range(1, 4):
try:
value = getattr(self, 'amo_liste_periodes_droits_' + \
str(i) + '_debut')
if value:
values += 'amo_liste_periodes_droits_' + \
str(i) + '_debut' + ': ' + value + '\n'
value = getattr(self, 'amo_liste_periodes_droits_' + \
str(i) + '_fin')
if value:
values += 'amo_liste_periodes_droits_' + \
str(i) + '_fin' + ': ' + value + '\n'
except:
pass
try:
values += 'amo_service_code_service' + \
': ' + self.amo_service_code_service + '\n'
values += 'amo_service_periode_service_debut' + \
': ' + self.amo_service_periode_service_debut + '\n'
values += 'amo_service_periode_service_fin' + \
': ' + self.amo_service_periode_service_fin + '\n'
except:
pass
return values
class CarteVitale():
def __init__(self, filename):
self.doc = etree.parse(filename)#t_AsnDonneesVitale
self.beneficiaires = self._read_beneficiaires()
tech_element = self.doc.find('tech')
self.fin_validite = None
try:
self.fin_validite = tech_element.find('finValidite').text
except:
pass
self.num_serie = tech_element.find('numSerie').text
self.acces_compl = None
try:
self.acces_compl = tech_element.find('accesCompl').text
except:
pass
def _read_beneficiaires(self):
liste_benef_element = self.doc.find('listeBenef')
beneficiaire_elements = liste_benef_element.findall('element')
beneficiaires = list()
i = 0
for beneficiaire_element in beneficiaire_elements:
beneficiaire = Beneficiaire(beneficiaire_element)
beneficiaire.id = i
beneficiaires.append(beneficiaire)
i += 1
return beneficiaires
def get_beneficiaire(self, identifier):
for beneficiaire in self.beneficiaires:
if beneficiaire.id == identifier:
return beneficiaire
return None
def pretty_print_xml(self):
print(etree.tostring(self.doc, pretty_print=True).decode('utf-8'))
def print_carte(self):
values = "Numéro de série : %s\n" % self.num_serie
if self.fin_validite:
values += 'Fin validité : %s\n' % self.fin_validite
if self.acces_compl:
values += 'Accès complémentaire : %s\n' % self.acces_compl
print(values)
for beneficiaire in self.beneficiaires:
print(beneficiaire.__unicode__())
if __name__ == '__main__':
import glob
for fn in glob.glob('../xml_test_files/*'):
if not os.path.isdir(fn):
cv = CarteVitale(fn)
cv.pretty_print_xml()
cv.print_carte()