wcs script to import data from technocarte

This commit is contained in:
Emmanuel Cazenave 2021-05-27 15:37:06 +02:00
parent 9fa5dd0be6
commit 3afe7267e9
1 changed files with 164 additions and 0 deletions

View File

@ -0,0 +1,164 @@
import collections
import csv
import sys
import time
from wcs.carddef import CardDef
FILEPATH = None
ACTION = sys.argv[1]
assert ACTION in ('import', 'reset')
if ACTION == 'import':
FILEPATH = sys.argv[2]
AdulteCardDef = CardDef.select(clause=lambda x: x.url_name == 'adultes')[0]
EnfantCardDef = CardDef.select(clause=lambda x: x.url_name == 'enfants')[0]
FamilleCardDef = CardDef.select(clause=lambda x: x.url_name == 'familles')[0]
def set_field(carddata, varname, value):
field = None
for field in carddata.formdef.get_all_fields():
if field.varname == varname:
break
assert field is not None
carddata.data[field.id] = value
def get_field_value(carddata, varname):
field = None
for field in carddata.formdef.get_all_fields():
if field.varname == varname:
break
assert field is not None
return carddata.data.get(field.id)
def get_rows():
with open(FILEPATH) as csvfile:
reader = csv.DictReader(csvfile, delimiter=';', quotechar='"')
for i, row in enumerate(reader):
if i > 100:
break
yield row
def create_adultes():
adultes = {}
for row in get_rows():
if row['ADULTE'] != '1':
continue
adulte = AdulteCardDef.data_class()()
set_field(adulte, 'nom', row['NOMENF'])
set_field(adulte, 'prenom', row['PREENF'])
codsex = row['CODSEX']
genre = ''
if codsex == 'M':
genre = 'Homme'
elif codsex == 'F':
genre = 'Femme'
set_field(adulte, 'genre', genre)
if row['DATNAI']:
set_field(adulte, 'date_naissance', time.strptime(row['DATNAI'][:10], '%d/%m/%Y'))
set_field(adulte, 'telephone', row['NUMTEL'])
set_field(adulte, 'courriel', row['MAIL'])
set_field(adulte, 'numero_voie', "%s %s" % (row['NUMVOI'], row['ADRENF1']))
set_field(adulte, 'code_postal', row['CODPOSENF'])
set_field(adulte, 'commune', row['COMMUNE'])
adulte.store()
adulte.just_created()
adulte.store()
adulte.perform_workflow()
adulte.store()
adultes[row['CODENF']] = {
'technocarte_id': row['CODENF'],
'publik_id': adulte.id,
'technocarte_famille_id': row['CODFAM']
}
return adultes
def create_enfants():
enfants = {}
for row in get_rows():
if row['ADULTE'] == '1':
continue
enfant = EnfantCardDef.data_class()()
set_field(enfant, 'nom', row['NOMENF'])
set_field(enfant, 'prenom', row['PREENF'])
codsex = row['PREENF']
genre = ''
if codsex == 'M':
genre = 'Homme'
elif codsex == 'F':
genre = 'Femme'
set_field(enfant, 'genre', genre)
if row['DATNAI']:
set_field(enfant, 'date_naissance', time.strptime(row['DATNAI'][:10], '%d/%m/%Y'))
enfant.store()
enfant.just_created()
enfant.store()
enfant.perform_workflow()
enfant.store()
enfant = {
'technocarte_id': row['CODENF'],
'publik_id': enfant.id,
'technocarte_famille': row['CODFAM']
}
if row['CODPEREBIO']:
enfant['pere_technocarte_id'] = row['CODPEREBIO']
if row['CODMEREBIO']:
enfant['mere_technocarte_id'] = row['CODMEREBIO']
enfants[row['CODENF']] = enfant
return enfants
def create_familles(adultes, enfants):
for adulte_technocarte_id, adulte in adultes.items():
if 'publik_famille_id' in adulte:
# ajouter comme deuxième adulte
pass
else:
publik_adulte = AdulteCardDef.data_class().select(
clause=lambda x: x.id == adulte['publik_id']
)[0]
famille = FamilleCardDef.data_class()()
set_field(famille, 'famille', get_field_value(publik_adulte, 'nom'))
famille.store()
adulte['publik_famille_id'] = famille.id
def import_data():
adultes = create_adultes()
enfants = create_enfants()
create_familles(adultes, enfants)
def reset():
AdulteCardDef.data_class().wipe()
EnfantCardDef.data_class().wipe()
FamilleCardDef.data_class().wipe()
if ACTION == 'import':
import_data()
elif ACTION == 'reset':
reset()