From 310ce4afad8493540486d84635a135feb3c98a95 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Fri, 11 Sep 2020 15:04:15 +0200 Subject: [PATCH] add script for cd13 transfer of reponse type --- cd13/dump-cd13.py | 51 ++++++++++++++++ cd13/load-cd13.py | 151 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 202 insertions(+) create mode 100644 cd13/dump-cd13.py create mode 100644 cd13/load-cd13.py diff --git a/cd13/dump-cd13.py b/cd13/dump-cd13.py new file mode 100644 index 0000000..72c854f --- /dev/null +++ b/cd13/dump-cd13.py @@ -0,0 +1,51 @@ +import json +import sys + +output_filename = sys.argv[1] + +print('output to', output_filename) + +thematique_slug = '13ave-thematiques' +dispositif_slug = '13ave-dispositifs' +reponse_type_slug = '13ave-dga-p-reponses-types' + +from wcs.carddef import CardDef + +data = {} + +Thematique = CardDef.get_by_urlname(thematique_slug).data_class() +Dispositif = CardDef.get_by_urlname(dispositif_slug).data_class() +ReponseType = CardDef.get_by_urlname(reponse_type_slug).data_class() + +data['thematique'] = [{ + 'digest': thematique.digest, + 'name': thematique.data[thematique.formdef.fields[0].id] +} for thematique in Thematique.select()] +dispositifs = Dispositif.select() +for dispositif in dispositifs: + # reconstruct 2_display + field_id = str(dispositif.formdef.fields[1].id) + dispositif.data[field_id + '_display'] = dispositif.formdef.fields[1].store_display_value(dispositif.data, field_id) + dispositif.set_auto_fields() + +data['dispositif'] = [{ + 'digest': dispositif.digest, + 'name': dispositif.data[dispositif.formdef.fields[0].id], + 'thematique': dispositif.data[dispositif.formdef.fields[1].id + '_display'], + } for dispositif in dispositifs] + +data['reponse_type'] = [] + +for reponse_type in ReponseType.select(): + # reconstruct 2_display + field_id = str(reponse_type.formdef.fields[1].id) + reponse_type.data[field_id + '_display'] = reponse_type.formdef.fields[1].store_display_value(reponse_type.data, field_id) + data['reponse_type'].append({ + 'digest': reponse_type.digest + str(reponse_type.data[reponse_type.formdef.fields[1].id + '_display']), + 'title': reponse_type.data[reponse_type.formdef.fields[0].id], + 'dispositif': reponse_type.data[reponse_type.formdef.fields[1].id + '_display'], + 'message': reponse_type.data[reponse_type.formdef.fields[2].id], + }) + +with open(output_filename, 'w') as fd: + json.dump(data, fd, indent=2) diff --git a/cd13/load-cd13.py b/cd13/load-cd13.py new file mode 100644 index 0000000..5442e27 --- /dev/null +++ b/cd13/load-cd13.py @@ -0,0 +1,151 @@ + +import json +import sys + +input_filename = sys.argv[1] + +print('load from', input_filename) +with open(input_filename) as fd: + data = json.load(fd) + +thematique_slug = '13ave-thematiques' +dispositif_slug = '13ave-dispositifs' +reponse_type_slug = '13ave-dga-p-reponses-types' + +from wcs.carddef import CardDef + +ThematiqueDef = CardDef.get_by_urlname(thematique_slug) +Thematique = ThematiqueDef.data_class() +DispositifDef = CardDef.get_by_urlname(dispositif_slug) +Dispositif = DispositifDef.data_class() +ReponseTypeDef = CardDef.get_by_urlname(reponse_type_slug) +ReponseType = ReponseTypeDef.data_class() + +indexes = {} + +indexes['thematique'] = {thematique.digest: thematique for thematique in Thematique.select()} + +for thematique in data['thematique']: + digest = thematique['digest'] + if digest in indexes['thematique']: + # print('Thematique %s already exists.' % digest) + pass + else: + new_thematique = Thematique() + new_thematique.data = {ThematiqueDef.fields[0].id: thematique['name']} + new_thematique.just_created() + new_thematique.store() + assert new_thematique.digest == digest + new_thematique.perform_workflow() + print('Thematique %s created.' % digest) + indexes['thematique'][digest] = new_thematique + + +indexes['dispositif'] = {dispositif.digest: dispositif for dispositif in Dispositif.select()} + +for dispositif in data['dispositif']: + digest = dispositif['digest'] + name = dispositif['name'] + store = False + if digest in indexes['dispositif']: + new_dispositif = indexes['dispositif'][digest] + new = False + else: + store = True + new = True + new_dispositif = Dispositif() + new_dispositif.data = {DispositifDef.fields[0].id: name} + print('Dispositif %s created.' % digest) + thematique = dispositif['thematique'] and indexes['thematique'][dispositif['thematique']] + field = DispositifDef.fields[1] + field_id = str(field.id) + if thematique: + if new_dispositif.data.get(field_id) != str(thematique.id): + if not store: + print('Thematique of dispositif %s changed, updating.' % name) + store = True + new_dispositif.data[field_id] = str(thematique.id) + new_dispositif.data[field_id + '_display'] = field.store_display_value(new_dispositif.data, field_id) + new_dispositif.data[field_id + '_structured'] = field.store_structured_value(new_dispositif.data, field_id) + else: + if new_dispositif.data.get(field_id): + if not store: + print('Thematique of dispositif %s changed, updating.' % name) + store = True + new_dispositif.data[field_id] = None + new_dispositif.data.pop(field_id + '_display') + new_dispositif.data.pop(field_id + '_structured') + + indexes['dispositif'][digest] = new_dispositif + if store: + if new: + new_dispositif.just_created() + new_dispositif.store() + assert new_dispositif.digest == digest + if new: + new_dispositif.perform_workflow() + else: + pass + # print('Dispositif %s already exists.' % digest) + + +indexes['reponse_type'] = {reponse_type.digest + str(reponse_type.data[reponse_type.formdef.fields[1].id + '_display']): reponse_type for reponse_type in ReponseType.select()} + +for reponse_type in data['reponse_type']: + digest = reponse_type['digest'] + title = reponse_type['title'] + dispositif_name = reponse_type['dispositif'] + message = reponse_type['message'] + if dispositif_name and dispositif_name not in indexes['dispositif']: + print('Error: dispositif "%s" is unknown in reponse type "%s".' % (dispositif_name, title)) + continue + dispositif = indexes['dispositif'].get(dispositif_name) + if digest in indexes['reponse_type']: + store = False + new_reponse_type = indexes['reponse_type'][digest] + else: + store = True + new = True + new_reponse_type = ReponseType() + new_reponse_type.data = { + ReponseTypeDef.fields[0].id: title, + ReponseTypeDef.fields[1].id: dispositif and str(dispositif.id), + ReponseTypeDef.fields[2].id: message, + } + + if not store: + if new_reponse_type.data[ReponseTypeDef.fields[2].id] != message: + store = True + new_reponse_type.data[ReponseTypeDef.fields[2].id] = message + print('Reponse type "%s" message differs, updating.' % digest) + + if new_reponse_type.data[ReponseTypeDef.fields[1].id] and not dispositif: + store = True + new_reponse_type.data[ReponseTypeDef.fields[1].id] = None + new_reponse_type.data.pop(ReponseTypeDef.fields[1].id + '_display') + new_reponse_type.data.pop(ReponseTypeDef.fields[1].id + '_structured') + print('Reponse type "%s" dispositif differs, updating.' % digest) + + if dispositif and new_reponse_type.data[ReponseTypeDef.fields[1].id] != str(dispositif.id): + store = True + print('Reponse type "%s" dispositif differs, updating. %r %r' % (digest, new_reponse_type.data[ReponseTypeDef.fields[1].id], dispositif.id)) + new_reponse_type.data[ReponseTypeDef.fields[1].id] = str(dispositif.id) + + + if store and dispositif: + new_reponse_type.data[ReponseTypeDef.fields[1].id + '_display'] = ReponseTypeDef.fields[1].store_display_value( + new_reponse_type.data, ReponseTypeDef.fields[1].id) + new_reponse_type.data[ReponseTypeDef.fields[1].id + '_structured'] = ReponseTypeDef.fields[1].store_structured_value( + new_reponse_type.data, ReponseTypeDef.fields[1].id) + + if store: + if new: + new_reponse_type.just_created() + new_reponse_type.store() + if new: + new_reponse_type.perform_workflow() + else: + # pass + pass + # print('Reponse type %s already exists.' % digest) + indexes['reponse_type'][digest] = new_reponse_type