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.
		
		
		
		
		
			
		
			
				
					
					
						
							75 lines
						
					
					
						
							2.2 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							75 lines
						
					
					
						
							2.2 KiB
						
					
					
				| import random | |
| import re | |
| from collections import defaultdict | |
| from string import digits | |
| 
 | |
| from django.apps import apps | |
| from django.db.models.fields import CharField, TextField | |
| 
 | |
| from sapl.materia.models import Orgao, Origem | |
| from sapl.norma.models import AssuntoNorma | |
| from sapl.parlamentares.models import Municipio, NivelInstrucao, Partido | |
| from sapl.settings import SAPL_APPS | |
| 
 | |
| sapl_appconfs = [apps.get_app_config(n.split('.')[1]) for n in SAPL_APPS] | |
| models = [model for app in sapl_appconfs for model in app.get_models()] | |
| 
 | |
| excluidos = Origem, Orgao, AssuntoNorma, Partido, NivelInstrucao, Municipio, | |
| 
 | |
| models = [m for m in models | |
|           if 'tipo' not in m._meta.model_name and | |
|           'cargo' not in m._meta.model_name and | |
|           'status' not in m._meta.model_name and | |
|           m not in excluidos and | |
|           m._meta.app_label not in ['compilacao', 'base']] | |
| 
 | |
| nomes = [n.strip() for n in open('scripts/anonimizador/nomes.txt').readlines()] | |
| 
 | |
| conteudo = open('scripts/anonimizador/paragrafos.txt').read() | |
| pars_list = [p.replace('"', '') for p in re.split('\n\n+', conteudo.strip())] | |
| pars = defaultdict(list) | |
| for p in pars_list: | |
|     pars[round(len(p) / 10)].append(p) | |
| pars = dict(pars) | |
| 
 | |
| 
 | |
| def change_digits(val): | |
|     return ''.join(random.choice(digits) if a in digits else a for a in val) | |
| 
 | |
| 
 | |
| def random_text(val): | |
|     if not val or not val.strip(): | |
|         return val | |
|     subpars = pars[min(pars.keys(), | |
|                        key=lambda x: abs(x - round(len(val) / 10)))] | |
|     return random.choice(subpars) | |
| 
 | |
| 
 | |
| def stub(f, obj): | |
|     val = getattr(obj, f.name) | |
|     if isinstance(f, CharField): | |
|         if 'mail' in f.name: | |
|             return 'bla@example.com' | |
|         elif 'nome' in f.name: | |
|             limite = f.max_length or 100000000 | |
|             return random.choice(nomes)[:limite] | |
|         elif f.choices: | |
|             return val | |
|         else: | |
|             return change_digits(val) | |
|     if isinstance(f, TextField): | |
|         return random_text(val) | |
|     return val | |
| 
 | |
| 
 | |
| def anon(model): | |
|     print('--------- %s ---------' % model) | |
|     for obj in model.objects.all(): | |
|         for f in model._meta.fields: | |
|             setattr(obj, f.name, stub(f, obj)) | |
|         obj.save() | |
| 
 | |
| 
 | |
| def anon_todos(): | |
|     for m in models: | |
|         anon(m)
 | |
| 
 |