diff --git a/sapl/legacy/migracao_dados.py b/sapl/legacy/migracao_dados.py index 6aa051e62..db288561f 100644 --- a/sapl/legacy/migracao_dados.py +++ b/sapl/legacy/migracao_dados.py @@ -796,6 +796,7 @@ class DataMigrator: # convert old records to new ones with transaction.atomic(): + novos = [] sql_delete_legado = '' for old in old_records: new = model() @@ -812,12 +813,9 @@ class DataMigrator: else: if get_id_do_legado: new.id = get_id_do_legado(old) - # validação do model - new.clean() - # salva novo registro - with reversion.create_revision(): - new.save() - reversion.set_comment('Objeto criado pela migração') + + new.clean() # valida model + novos.append(new) # guarda para salvar # acumula deleção do registro no legado sql_delete_legado += 'delete from {} where {};\n'.format( @@ -827,8 +825,11 @@ class DataMigrator: getattr(old, campo)) for campo in campos_pk)) - if ajuste_depois_salvar: - ajuste_depois_salvar(new, old) + # salva novos registros + model.objects.bulk_create(novos) + + if ajuste_depois_salvar: + ajuste_depois_salvar() # se configuramos ids explicitamente devemos reiniciar a sequence if get_id_do_legado: @@ -1067,20 +1068,26 @@ def adjust_normajuridica_antes_salvar(new, old): new.esfera_federacao = '' -def adjust_normajuridica_depois_salvar(new, old): +def adjust_normajuridica_depois_salvar(): # Ajusta relação M2M + ligacao = NormaJuridica.assuntos.through - if not old.cod_assunto: # it can be null or empty - return + def gen_ligacoes(): + from sapl.legacy.models import NormaJuridica as OldNormaJuridica - # lista de pks separadas por vírgulas (ignorando strings vazias) - lista_pks_assunto = [int(pk) for pk in old.cod_assunto.split(',') if pk] + assuntos_migrados, normas_migradas = [ + set(model.objects.values_list('id', flat=True)) + for model in [AssuntoNorma, NormaJuridica]] - for pk_assunto in lista_pks_assunto: - try: - new.assuntos.add(AssuntoNorma.objects.get(pk=pk_assunto)) - except ObjectDoesNotExist: - pass # ignora assuntos inexistentes + for norma, cod_assunto in OldNormaJuridica.objects.filter( + pk__in=normas_migradas).values_list('pk', 'cod_assunto'): + + assuntos = [a for a in map(int, cod_assunto.split(',')) + if a in assuntos_migrados] + for assunto in assuntos: + yield ligacao(normajuridica_id=norma, assuntonorma_id=assunto) + + ligacao.objects.bulk_create(gen_ligacoes()) def vincula_autor(new, old, model_relacionado, campo_relacionado, campo_nome):