mirror of https://github.com/interlegis/sapl.git
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							105 lines
						
					
					
						
							4.6 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							105 lines
						
					
					
						
							4.6 KiB
						
					
					
				| from django.db.models import Count | |
| 
 | |
| from sapl.base.models import Autor | |
| from sapl.comissoes.models import Participacao | |
| from sapl.materia.models import Relatoria, UnidadeTramitacao, Autoria, Proposicao | |
| from sapl.norma.models import AutoriaNorma | |
| from sapl.parlamentares.models import Parlamentar, ComposicaoMesa, Dependente, Filiacao, Mandato, Frente, Votante | |
| from sapl.protocoloadm.models import Protocolo, DocumentoAdministrativo | |
| from sapl.sessao.models import IntegranteMesa, JustificativaAusencia, OradorExpediente, PresencaOrdemDia, \ | |
|     RetiradaPauta, SessaoPlenariaPresenca, VotoParlamentar, OradorOrdemDia | |
| 
 | |
| 
 | |
| models = [ComposicaoMesa, Dependente, Filiacao, IntegranteMesa, JustificativaAusencia, Mandato, OradorOrdemDia, | |
|           OradorExpediente, Participacao, PresencaOrdemDia, Relatoria, RetiradaPauta, SessaoPlenariaPresenca, | |
|           UnidadeTramitacao, VotoParlamentar, Votante] | |
| 
 | |
| # Tratar FRENTE pois ela é 1-to-many (campo parlamentares) com Parlamentar | |
| 
 | |
| models_autor = [AutoriaNorma, Autoria, Proposicao, Protocolo, DocumentoAdministrativo] | |
| 
 | |
| ## Verificar se TipoAutor é sempre 1 para parlamentar e ContentType é sempre 26 para parlamentar. | |
| TIPO_PARLAMENTAR = 1 | |
| CONTENT_TYPE_PARLAMENTAR = 26 | |
| 
 | |
| 
 | |
| def recupera_parlamentares(): | |
|     return [[parlamentar for parlamentar in Parlamentar.objects.filter(nome_parlamentar=nome_parlamentar).order_by('id')] | |
|             for nome_parlamentar in Parlamentar.objects.values_list('nome_parlamentar', flat=True) | |
|                 .annotate(qntd=Count('nome_parlamentar')).filter(qntd__gt=1)] | |
| 
 | |
| 
 | |
| def deduplica_parlamentares(parlamentares): | |
|     for parlamentar in parlamentares: | |
|         parlamentar_principal = parlamentar[0] | |
|         print('Corrigindo parlamentar {}'.format(parlamentar_principal)) | |
|         for clone in parlamentar[1:]: | |
|             if parlamentar_principal.biografia and clone.biografia: | |
|                 parlamentar_principal.biografia += f'\n\n------------------------\n\n{clone.biografia}' | |
|                 parlamentar_principal.save() | |
|             elif clone.biografia: | |
|                 parlamentar_principal.biografia = clone.biografia | |
| 
 | |
|             autor_principal = Autor.objects.filter(tipo_id=TIPO_PARLAMENTAR, | |
|                                                    content_type_id=CONTENT_TYPE_PARLAMENTAR, | |
|                                                    object_id=parlamentar_principal.id) | |
| 
 | |
|             for a in Autor.objects.filter(tipo_id=TIPO_PARLAMENTAR, content_type_id=CONTENT_TYPE_PARLAMENTAR, object_id=clone.id): | |
|                 print(a) | |
|                 if not autor_principal: | |
|                     print('Ajustando autor de %s' % parlamentar) | |
|                     a.object_id = parlamentar_principal.id | |
|                     a.save() | |
|                 else: | |
|                     print('Movendo referencias de autor') | |
|                     for ma in models_autor: | |
|                         for ra in ma.objects.filter(autor=a): | |
|                             ra.autor = autor_principal[0] | |
|                             ra.save() | |
|                     a.delete() | |
| 
 | |
|             # Muda apontamento de models que referenciam parlamentar | |
|             for model in models: | |
|                 for obj in model.objects.filter(parlamentar_id=clone.id): | |
|                     obj.parlamentar = parlamentar_principal | |
|                     obj.save() | |
| 
 | |
|             frentes = Frente.objects.filter(parlamentares=parlamentar_principal) | |
|             for frente in Frente.objects.select_related.filter(parlamentares=clone): | |
|                 if frente not in frentes: | |
|                     frente.parlamentares.add(parlamentar_principal) | |
| 
 | |
|                 frente.parlamentares.remove(clone) | |
| 
 | |
|             clone.delete() | |
| 
 | |
| 
 | |
| def estatisticas(parlamentares): | |
|     stats = [] | |
|     for ps in parlamentares: | |
|         for p in ps: | |
|             d = { | |
|                 'id': p.id, | |
|                 'nome': p.nome_parlamentar, | |
|                 'stats': {m.__name__: m.objects.filter(parlamentar=p).count() for m in models} | |
|             } | |
|             for m in models_autor: | |
|                 d['stats'].update({m.__name__:m.objects.filter(autor__object_id=p.id, | |
|                                                                autor__content_type=CONTENT_TYPE_PARLAMENTAR, | |
|                                                                autor__tipo_id=TIPO_PARLAMENTAR).count()}) | |
|             stats.append(d) | |
|     for s in stats: | |
|         print('---------------------------------------------------') | |
|         print(s['id'], s['nome']) | |
|         print(s['stats']) | |
| 
 | |
| 
 | |
| def main(): | |
|     parlamentares = recupera_parlamentares() | |
|     estatisticas(parlamentares) | |
|     deduplica_parlamentares(parlamentares) | |
|     estatisticas(parlamentares) | |
| 
 | |
| 
 | |
| if __name__ == '__main__': | |
|     main()
 | |
| 
 |