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):
|
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)
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue