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:
Lance Edgar 2024-08-10 12:00:48 -05:00
parent 9cc137d29a
commit c3441f700d
2 changed files with 54 additions and 33 deletions

View file

@ -37,8 +37,13 @@ class Anonymizer(GenericHandler):
""" """
def anonymize_all(self, dbkey=None, dry_run=False, progress=None): 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 names
import us import us
import zipcodes
self.all_zipcodes = zipcodes.list_all()
core_handler = self.app.get_corepos_handler() core_handler = self.app.get_corepos_handler()
op_session = core_handler.make_session_office_op(dbkey=dbkey) 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] 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 # 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) blueline_template = get_blueline_template(self.config)
customers_by_card_number = {}
def anon_custdata(customer, i): 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.first_name = names.get_first_name()
customer.last_name = names.get_last_name() customer.last_name = names.get_last_name()
customer.blue_line = make_blueline(self.config, customer, customer.blue_line = make_blueline(self.config, customer,
template=blueline_template) template=blueline_template)
customers_by_card_number.setdefault(customer.card_number, []).append(customer)
self.app.progress_loop(anon_custdata, customers, progress, self.app.progress_loop(anon_custdata, customers, progress,
message="Anonymizing custdata") 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
customers = op_session.query(op_model.Customer).all() customers = op_session.query(op_model.Customer).all()
@ -133,9 +149,7 @@ class Anonymizer(GenericHandler):
import names import names
name = names.get_full_name() name = names.get_full_name()
name = name.replace(' ', '_') name = name.replace(' ', '_')
return f'{name}@mailinator.com' return f'{name}@mailinator.com'.lower()
def random_zipcode(self): def random_zipcode(self):
digits = [random.choice('0123456789') return random.choice(self.all_zipcodes)['zip_code']
for i in range(5)]
return ''.join(digits)

View file

@ -95,6 +95,13 @@ def anonymize(
"\tpip install us\n") "\tpip install us\n")
sys.exit(2) 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 = Anonymizer(config)
anonymizer.anonymize_all(dbkey=dbkey, dry_run=dry_run, anonymizer.anonymize_all(dbkey=dbkey, dry_run=dry_run,
progress=progress) progress=progress)