fix: improve core-office anonymize command logic
				
					
				
			- prefer setting `custdata` names over `meminfo` - use custdata name for basis of `meminfo.email` - use "real" random zipcode - fix attr assignment for `meminfo.zip`
This commit is contained in:
		
							parent
							
								
									9cc137d29a
								
							
						
					
					
						commit
						c3441f700d
					
				
					 2 changed files with 54 additions and 33 deletions
				
			
		|  | @ -37,8 +37,13 @@ class Anonymizer(GenericHandler): | |||
|     """ | ||||
| 
 | ||||
|     def anonymize_all(self, dbkey=None, dry_run=False, progress=None): | ||||
|         # nb. these must be installed with: | ||||
|         #   pip install names us zipcodes | ||||
|         import names | ||||
|         import us | ||||
|         import zipcodes | ||||
| 
 | ||||
|         self.all_zipcodes = zipcodes.list_all() | ||||
| 
 | ||||
|         core_handler = self.app.get_corepos_handler() | ||||
|         op_session = core_handler.make_session_office_op(dbkey=dbkey) | ||||
|  | @ -46,45 +51,56 @@ class Anonymizer(GenericHandler): | |||
| 
 | ||||
|         states = [state.abbr for state in us.states.STATES] | ||||
| 
 | ||||
|         # meminfo | ||||
|         members = op_session.query(op_model.MemberInfo).all() | ||||
|         members_by_card_number = {} | ||||
| 
 | ||||
|         def anon_meminfo(member, i): | ||||
|             member.first_name = names.get_first_name() | ||||
|             member.last_name = names.get_last_name() | ||||
|             member.other_first_name = names.get_first_name() | ||||
|             member.other_last_name = names.get_last_name() | ||||
|             member.street = '123 Main St.' | ||||
|             member.city = 'Anytown' | ||||
|             member.state = random.choice(states) | ||||
|             member.zipcode = self.random_zipcode() | ||||
|             member.phone = self.random_phone() | ||||
|             member.email = self.random_email() | ||||
|             member.notes.clear() | ||||
|             members_by_card_number[member.card_number] = member | ||||
| 
 | ||||
|         self.app.progress_loop(anon_meminfo, members, progress, | ||||
|                                message="Anonymizing meminfo") | ||||
| 
 | ||||
|         # custdata | ||||
|         customers = op_session.query(op_model.CustomerClassic).all() | ||||
|         customers = op_session.query(op_model.CustomerClassic)\ | ||||
|                               .order_by(op_model.CustomerClassic.card_number, | ||||
|                                         op_model.CustomerClassic.person_number)\ | ||||
|                               .all() | ||||
|         blueline_template = get_blueline_template(self.config) | ||||
|         customers_by_card_number = {} | ||||
| 
 | ||||
|         def anon_custdata(customer, i): | ||||
|             member = members_by_card_number.get(customer.card_number) | ||||
|             if member: | ||||
|                 customer.first_name = member.first_name | ||||
|                 customer.last_name = member.last_name | ||||
|             else: | ||||
|                 customer.first_name = names.get_first_name() | ||||
|                 customer.last_name = names.get_last_name() | ||||
|             customer.first_name = names.get_first_name() | ||||
|             customer.last_name = names.get_last_name() | ||||
|             customer.blue_line = make_blueline(self.config, customer, | ||||
|                                                template=blueline_template) | ||||
|             customers_by_card_number.setdefault(customer.card_number, []).append(customer) | ||||
| 
 | ||||
|         self.app.progress_loop(anon_custdata, customers, progress, | ||||
|                                message="Anonymizing custdata") | ||||
| 
 | ||||
|         # meminfo | ||||
|         members = op_session.query(op_model.MemberInfo).all() | ||||
| 
 | ||||
|         def anon_meminfo(member, i): | ||||
|             if member.first_name: | ||||
|                 member.first_name = names.get_first_name() | ||||
|             if member.last_name: | ||||
|                 member.last_name = names.get_last_name() | ||||
|             if member.other_first_name: | ||||
|                 member.other_first_name = names.get_first_name() | ||||
|             if member.other_last_name: | ||||
|                 member.other_last_name = names.get_last_name() | ||||
| 
 | ||||
|             member.street = '123 Main St.' | ||||
|             member.city = 'Anytown' | ||||
|             member.state = random.choice(states) | ||||
|             member.zip = self.random_zipcode() | ||||
|             member.phone = self.random_phone() | ||||
| 
 | ||||
|             customers = customers_by_card_number.get(member.card_number) | ||||
|             if customers: | ||||
|                 customer = customers[0] | ||||
|                 member.email = f'{customer.first_name}_{customer.last_name}@mailinator.com'\ | ||||
|                       .lower() | ||||
|             else: | ||||
|                 member.email = self.random_email() | ||||
| 
 | ||||
|             member.notes.clear() | ||||
| 
 | ||||
|         self.app.progress_loop(anon_meminfo, members, progress, | ||||
|                                message="Anonymizing meminfo") | ||||
| 
 | ||||
|         # Customers | ||||
|         customers = op_session.query(op_model.Customer).all() | ||||
| 
 | ||||
|  | @ -133,9 +149,7 @@ class Anonymizer(GenericHandler): | |||
|         import names | ||||
|         name = names.get_full_name() | ||||
|         name = name.replace(' ', '_') | ||||
|         return f'{name}@mailinator.com' | ||||
|         return f'{name}@mailinator.com'.lower() | ||||
| 
 | ||||
|     def random_zipcode(self): | ||||
|         digits = [random.choice('0123456789') | ||||
|                   for i in range(5)] | ||||
|         return ''.join(digits) | ||||
|         return random.choice(self.all_zipcodes)['zip_code'] | ||||
|  |  | |||
|  | @ -95,6 +95,13 @@ def anonymize( | |||
|                          "\tpip install us\n") | ||||
|         sys.exit(2) | ||||
| 
 | ||||
|     try: | ||||
|         import zipcodes | ||||
|     except ImportError: | ||||
|         sys.stderr.write("must install the `zipcodes` package first!\n\n" | ||||
|                          "\tpip install zipcodes\n") | ||||
|         sys.exit(2) | ||||
| 
 | ||||
|     anonymizer = Anonymizer(config) | ||||
|     anonymizer.anonymize_all(dbkey=dbkey, dry_run=dry_run, | ||||
|                              progress=progress) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Lance Edgar
						Lance Edgar