diff --git a/sapl/parlamentares/forms.py b/sapl/parlamentares/forms.py index c9d5d828d..4cb3e9c75 100755 --- a/sapl/parlamentares/forms.py +++ b/sapl/parlamentares/forms.py @@ -255,6 +255,21 @@ class ParlamentarCreateForm(ParlamentarForm): attrs={'id': 'texto-rico'}) } + def clean(self): + super().clean() + + if not self.is_valid(): + return self.cleaned_data + + cleaned_data = self.cleaned_data + parlamentar = Parlamentar.objects.filter(nome_parlamentar=cleaned_data['nome_parlamentar']) + + if parlamentar: + self.logger.error('Parlamentar já cadastrado.') + raise ValidationError('Parlamentar já cadastrado.') + + return cleaned_data + @transaction.atomic def save(self, commit=True): parlamentar = super(ParlamentarCreateForm, self).save(commit) diff --git a/scripts/remove_multiplos_parlamentares.py b/scripts/remove_multiplos_parlamentares.py new file mode 100644 index 000000000..7daee275b --- /dev/null +++ b/scripts/remove_multiplos_parlamentares.py @@ -0,0 +1,108 @@ +import re + +from sapl.base.models import Autor +from sapl.comissoes.models import Participacao +from sapl.materia.models import Relatoria, UnidadeTramitacao +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_multiple(top_models): + pks_objs = {} + + for model in top_models: + model_name = re.findall(r'\w+', str(model))[-1] + pks_objs.update({model_name: []}) + + objs = model.objects.all() + + for obj in objs: + + if model_name == 'Autor': + kwargs = {'nome': obj.nome} + elif model_name == 'Parlamentar': + kwargs = {'nome_parlamentar': obj.nome_parlamentar} + else: + print('Model não reconhecida.') + return + + pesquisa_obj = model.objects.filter(**kwargs) + if pesquisa_obj.count() > 1: + multiplos_objs = [p.pk for p in pesquisa_obj] + multiplos_objs.sort() + + if multiplos_objs not in pks_objs.get(model_name): + pks_objs.get(model_name).append(multiplos_objs) + + return pks_objs + + +def transfer_author(pks_list): + for pks in pks_list: + for pk in pks[1:]: + autor_clonado = Autor.objects.get(pk=pk) + + for autoria in autor_clonado.autoria_set.all(): + autoria.autor_id = pks[0] + autoria.save() + + for proposicao in autor_clonado.proposicao_set.all(): + proposicao.autor_id = pks[0] + proposicao.save() + + for autorianorma in autor_clonado.autorianorma_set.all(): + autorianorma.autor_id = pks[0] + autorianorma.save() + + for documentoadministrativo in autor_clonado.documentoadministrativo_set.all(): + documentoadministrativo.autor_id = pks[0] + documentoadministrativo.save() + + for protocolo in autor_clonado.protocolo_set.all(): + protocolo.autor_id = pks[0] + protocolo.save() + + +def transfer_congressman(models, pks_list): + for pks in pks_list: + for pk in pks[1:]: + for model in models: + for obj in model.objects.filter(parlamentar_id=pk): + obj.parlamentar_id = pks[0] + obj.save() + + +def purge(top_models, pks_dict): + for model in top_models: + model_name = re.findall(r'\w+', str(model))[-1] + + lista = pks_dict.get(model_name) + if lista: + for pks in lista: + for pk in pks[1:]: + for obj in model.objects.filter(pk=pk): + obj.delete() + + +def main(): + top_models = [Autor, Parlamentar] + models = [ComposicaoMesa, Dependente, Filiacao, IntegranteMesa, JustificativaAusencia, Mandato, Orador, + OradorExpediente, Participacao, PresencaOrdemDia, Relatoria, RetiradaPauta, SessaoPlenariaPresenca, + UnidadeTramitacao, VotoParlamentar] + + pks_dict = get_multiple(top_models) + + author_list = pks_dict.get('Autor') + if author_list: + transfer_author(author_list) + + congressman_list = pks_dict.get('Parlamentar') + if congressman_list: + transfer_congressman(models, congressman_list) + + purge(top_models, pks_dict) + + +if __name__ == '__main__': + main()