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
|
@ -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.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…
Reference in a new issue