import re from django.core.exceptions import ObjectDoesNotExist from sapl.base.models import Autor from sapl.comissoes.models import Participacao from sapl.materia.models import Relatoria, UnidadeTramitacao, Autoria from sapl.parlamentares.models import Parlamentar, ComposicaoMesa, Dependente, Filiacao, Mandato from sapl.sessao.models import IntegranteMesa, JustificativaAusencia, Orador, OradorExpediente, PresencaOrdemDia, \ RetiradaPauta, SessaoPlenariaPresenca, VotoParlamentar def get_multiples(): models = [Autor, Parlamentar] multiples = {} for model in models: model_name = re.findall(r'\w+', str(model))[-1] multiples[model_name] = { 'kwargs': {}, 'pks': [] } objs = model.objects.all() for obj in objs: if model_name == 'Autor': multiples[model_name]['kwargs']['nome'] = obj.nome elif model_name == 'Parlamentar': multiples[model_name]['kwargs']['nome_parlamentar'] = obj.nome_parlamentar pesquisa_obj = model.objects.filter(**multiples[model_name]['kwargs']) if pesquisa_obj.count() > 1: multiplos_objs = [o.pk for o in pesquisa_obj] multiplos_objs.sort() if multiplos_objs not in multiples[model_name]['pks']: multiples[model_name]['pks'].append(multiplos_objs) if not multiples[model_name]['pks']: multiples.pop(model_name) else: multiples[model_name].pop('kwargs') return multiples def transfer_purge_author(author_lists): for author_list in author_lists: for pk in author_list[1:]: autor_clonado = Autor.objects.get(pk=pk) for autoria in autor_clonado.autoria_set.all(): autoria.autor_id = author_list[0] autoria.save() for proposicao in autor_clonado.proposicao_set.all(): proposicao.autor_id = author_list[0] proposicao.save() for autorianorma in autor_clonado.autorianorma_set.all(): autorianorma.autor_id = author_list[0] autorianorma.save() for documentoadministrativo in autor_clonado.documentoadministrativo_set.all(): documentoadministrativo.autor_id = author_list[0] documentoadministrativo.save() for protocolo in autor_clonado.protocolo_set.all(): protocolo.autor_id = author_list[0] protocolo.save() autor_clonado.delete() def transfer_purge_congressman(congressman_lists): models = [ComposicaoMesa, Dependente, Filiacao, IntegranteMesa, JustificativaAusencia, Mandato, Orador, OradorExpediente, Participacao, PresencaOrdemDia, Relatoria, RetiradaPauta, SessaoPlenariaPresenca, UnidadeTramitacao, VotoParlamentar] for congressman_list in congressman_lists: parlamentar_principal = Parlamentar.objects.get(pk=congressman_list[0]) for pk in congressman_list[1:]: parlamentar_clonado = Parlamentar.objects.get(pk=pk) if parlamentar_principal.biografia and parlamentar_clonado.biografia: # TODO: copia de biografia não está acontecendo parlamentar_principal.biografia = \ f'{parlamentar_principal.biografia}\n\n------------------------\n\n{parlamentar_clonado.biografia}' parlamentar_principal.save() elif parlamentar_clonado.biografia: parlamentar_principal.biografia = parlamentar_clonado.biografia for model in models: for obj in model.objects.filter(parlamentar_id=pk): obj.parlamentar_id = congressman_list[0] obj.save() try: autor_principal = Autor.objects.get(parlamentar_set=parlamentar_principal) except ObjectDoesNotExist: try: autor_clonado = Autor.objects.get(parlamentar_set=parlamentar_clonado) except ObjectDoesNotExist: pass else: autor_clonado.object_id = parlamentar_principal.id autor_clonado.save() else: try: autor_clonado = Autor.objects.get(parlamentar_set=parlamentar_clonado) except ObjectDoesNotExist: pass else: transfer_purge_author([[autor_principal.id, autor_clonado.id]]) parlamentar_clonado.delete() def main(): # TODO: verificar porque há matérias que não estão sendo copiadas multiples = get_multiples() if multiples.get('Autor'): transfer_purge_author(multiples['Autor']['pks']) if multiples.get('Parlamentar'): transfer_purge_congressman(multiples['Parlamentar']['pks']) if __name__ == '__main__': main()