Improve the anonymization logic some more
hopefully this scrubs all personal data from a `core_op` DB
This commit is contained in:
parent
478126f1e3
commit
aa1b53d96c
|
@ -34,7 +34,7 @@ from requests.auth import HTTPDigestAuth
|
|||
from rattail import commands
|
||||
from rattail_corepos import __version__
|
||||
from rattail.util import load_object
|
||||
from rattail_corepos.corepos.office.util import get_fannie_config_value
|
||||
from rattail_corepos.corepos.office.util import get_fannie_config_value, get_blueline_template, make_blueline
|
||||
from rattail_corepos.corepos.util import get_core_members
|
||||
from rattail_corepos.config import core_office_url
|
||||
|
||||
|
@ -110,47 +110,97 @@ class Anonymize(commands.Subcommand):
|
|||
self.anonymize_all(args)
|
||||
|
||||
def anonymize_all(self, args):
|
||||
import names
|
||||
import us
|
||||
|
||||
core_handler = self.app.get_corepos_handler()
|
||||
op_session = core_handler.make_session_office_op(dbkey=args.dbkey)
|
||||
op_model = core_handler.get_model_office_op()
|
||||
|
||||
states = [state.abbr for state in us.states.STATES]
|
||||
|
||||
members = op_session.query(op_model.MemberInfo)\
|
||||
.all()
|
||||
# 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.city = self.random_city()
|
||||
member.street = '123 Main St.'
|
||||
member.city = 'Anytown'
|
||||
member.state = random.choice(states)
|
||||
# member.zipcode = self.random_zipcode()
|
||||
member.zipcode = '12345' # TODO
|
||||
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.progress_loop(anon_meminfo, members,
|
||||
message="Anonymizing meminfo")
|
||||
|
||||
customers = op_session.query(op_model.CustomerClassic)\
|
||||
.all()
|
||||
# custdata
|
||||
customers = op_session.query(op_model.CustomerClassic).all()
|
||||
blueline_template = get_blueline_template(self.config)
|
||||
|
||||
def anon_custdata(customer, i):
|
||||
customer.first_name = names.get_first_name()
|
||||
customer.last_name = names.get_last_name()
|
||||
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)
|
||||
|
||||
self.progress_loop(anon_custdata, customers,
|
||||
message="Anonymizing custdata")
|
||||
|
||||
# Customers
|
||||
customers = op_session.query(op_model.Customer).all()
|
||||
|
||||
def del_customer(customer, i):
|
||||
op_session.delete(customer)
|
||||
|
||||
self.progress_loop(del_customer, customers,
|
||||
message="Deleting from Customers")
|
||||
|
||||
# CustomerAccounts
|
||||
accounts = op_session.query(op_model.CustomerAccount).all()
|
||||
|
||||
def del_account(account, i):
|
||||
op_session.delete(account)
|
||||
|
||||
self.progress_loop(del_account, accounts,
|
||||
message="Deleting from CustomerAccounts")
|
||||
|
||||
# employees
|
||||
employees = op_session.query(op_model.Employee).all()
|
||||
|
||||
def anon_employee(employee, i):
|
||||
employee.first_name = names.get_first_name()
|
||||
employee.last_name = names.get_last_name()
|
||||
|
||||
self.progress_loop(anon_employee, employees,
|
||||
message="Anonymizing employees")
|
||||
|
||||
# Users
|
||||
users = op_session.query(op_model.User).all()
|
||||
|
||||
def anon_user(user, i):
|
||||
user.real_name = names.get_full_name()
|
||||
|
||||
self.progress_loop(anon_user, users,
|
||||
message="Anonymizing users")
|
||||
|
||||
self.finalize_session(op_session, dry_run=args.dry_run)
|
||||
|
||||
def random_phone(self):
|
||||
digits = [random.choice('0123456789')
|
||||
for i in range(10)]
|
||||
return self.app.normalize_phone_number(''.join(digits))
|
||||
return self.app.format_phone_number(''.join(digits))
|
||||
|
||||
def random_email(self):
|
||||
import names
|
||||
|
@ -158,6 +208,11 @@ class Anonymize(commands.Subcommand):
|
|||
name = name.replace(' ', '_')
|
||||
return f'{name}@mailinator.com'
|
||||
|
||||
def random_zipcode(self):
|
||||
digits = [random.choice('0123456789')
|
||||
for i in range(5)]
|
||||
return ''.join(digits)
|
||||
|
||||
|
||||
class CoreDBImportSubcommand(commands.ImportSubcommand):
|
||||
"""
|
||||
|
|
|
@ -32,7 +32,7 @@ from corepos.db.office_op import model as corepos
|
|||
from rattail import importing
|
||||
from rattail_corepos.corepos.office.importing import db as corepos_importing
|
||||
from rattail_corepos.corepos.office.importing.db.corepos import FromCoreHandler
|
||||
from rattail_corepos.corepos.office.util import get_fannie_config_value
|
||||
from rattail_corepos.corepos.office.util import get_blueline_template, make_blueline
|
||||
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
@ -85,8 +85,7 @@ class CustomerClassicImporter(FromCoreOffice, corepos_importing.model.CustomerCl
|
|||
|
||||
def setup(self):
|
||||
super().setup()
|
||||
self.blueline_template = get_fannie_config_value(self.config,
|
||||
'BLUELINE_TEMPLATE')
|
||||
self.blueline_template = get_blueline_template(self.config)
|
||||
|
||||
def normalize_host_object(self, customer):
|
||||
|
||||
|
@ -95,14 +94,7 @@ class CustomerClassicImporter(FromCoreOffice, corepos_importing.model.CustomerCl
|
|||
customer.card_number, customer)
|
||||
return
|
||||
|
||||
blueline = self.blueline_template
|
||||
blueline = blueline.replace('{{ACCOUNTNO}}', str(customer.card_number))
|
||||
blueline = blueline.replace('{{ACCOUNTTYPE}}', customer.member_type.description)
|
||||
blueline = blueline.replace('{{FIRSTNAME}}', customer.first_name or '')
|
||||
blueline = blueline.replace('{{FIRSTINITIAL}}', customer.first_name[0] if customer.first_name else '')
|
||||
blueline = blueline.replace('{{LASTNAME}}', customer.last_name or '')
|
||||
blueline = blueline.replace('{{LASTINITIAL}}', customer.last_name[0] if customer.last_name else '')
|
||||
|
||||
blueline = make_blueline(self.config, customer, template=self.blueline_template)
|
||||
return {
|
||||
'id': customer.id,
|
||||
'blue_line': blueline,
|
||||
|
|
|
@ -60,3 +60,21 @@ def get_fannie_config_value(config, name):
|
|||
raise ValueError(f"failed to read value: {error.output.decode('utf_8')}")
|
||||
|
||||
return json.loads(output.decode('utf_8'))
|
||||
|
||||
|
||||
def get_blueline_template(config):
|
||||
return get_fannie_config_value(config, 'BLUELINE_TEMPLATE')
|
||||
|
||||
|
||||
def make_blueline(config, customer, template=None):
|
||||
if not template:
|
||||
template = get_blueline_template(config)
|
||||
|
||||
blueline = template
|
||||
blueline = blueline.replace('{{ACCOUNTNO}}', str(customer.card_number))
|
||||
blueline = blueline.replace('{{ACCOUNTTYPE}}', customer.member_type.description if customer.member_type else '??')
|
||||
blueline = blueline.replace('{{FIRSTNAME}}', customer.first_name or '')
|
||||
blueline = blueline.replace('{{FIRSTINITIAL}}', customer.first_name[0] if customer.first_name else '')
|
||||
blueline = blueline.replace('{{LASTNAME}}', customer.last_name or '')
|
||||
blueline = blueline.replace('{{LASTINITIAL}}', customer.last_name[0] if customer.last_name else '')
|
||||
return blueline
|
||||
|
|
Loading…
Reference in a new issue