Add core-office patch-customer-gaps
command
hopefully this is not often needed, but definitely might be sometimes..
This commit is contained in:
parent
cc517702e1
commit
a6541a2c32
|
@ -24,6 +24,7 @@
|
||||||
CORE Office commands
|
CORE Office commands
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import logging
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
|
@ -33,9 +34,14 @@ from rattail import commands
|
||||||
from rattail_corepos import __version__
|
from rattail_corepos import __version__
|
||||||
from rattail.util import load_object
|
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
|
||||||
|
from rattail_corepos.corepos.api import make_corepos_api
|
||||||
|
from rattail_corepos.corepos.util import get_core_members
|
||||||
from rattail_corepos.config import core_office_url
|
from rattail_corepos.config import core_office_url
|
||||||
|
|
||||||
|
|
||||||
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def main(*args):
|
def main(*args):
|
||||||
"""
|
"""
|
||||||
Entry point for 'core-office' commands
|
Entry point for 'core-office' commands
|
||||||
|
@ -144,6 +150,74 @@ class ImportSelf(commands.ImportSubcommand):
|
||||||
handler_key = 'to_self.from_corepos_db_office_op.import'
|
handler_key = 'to_self.from_corepos_db_office_op.import'
|
||||||
|
|
||||||
|
|
||||||
|
class PatchCustomerGaps(commands.Subcommand):
|
||||||
|
"""
|
||||||
|
POST to the CORE API as needed, to patch gaps for customerID
|
||||||
|
"""
|
||||||
|
name = 'patch-customer-gaps'
|
||||||
|
description = __doc__.strip()
|
||||||
|
|
||||||
|
def add_parser_args(self, parser):
|
||||||
|
parser.add_argument('--dry-run', action='store_true',
|
||||||
|
help="Do not POST anything, but log members needing it.")
|
||||||
|
|
||||||
|
def run(self, args):
|
||||||
|
from corepos.db.office_op import model as corepos
|
||||||
|
|
||||||
|
corepos_api = make_corepos_api(self.config)
|
||||||
|
members = get_core_members(self.config, corepos_api, progress=self.progress)
|
||||||
|
tally = self.app.make_object(updated=0)
|
||||||
|
|
||||||
|
self.maxlen_phone = self.app.maxlen(corepos.Customer.phone)
|
||||||
|
# nb. just in case the smallest one changes in future..
|
||||||
|
other = self.app.maxlen(corepos.MemberInfo.phone)
|
||||||
|
if other < self.maxlen_phone:
|
||||||
|
self.maxlen_phone = other
|
||||||
|
|
||||||
|
def inspect(member, i):
|
||||||
|
for customer in member['customers']:
|
||||||
|
customer_id = int(customer['customerID'])
|
||||||
|
if not customer_id:
|
||||||
|
data = dict(member)
|
||||||
|
self.trim_phones(data)
|
||||||
|
cardno = data.pop('cardNo')
|
||||||
|
log.debug("%s call set_member() for card no %s: %s",
|
||||||
|
'should' if args.dry_run else 'will',
|
||||||
|
cardno, data)
|
||||||
|
if not args.dry_run:
|
||||||
|
corepos_api.set_member(cardno, **data)
|
||||||
|
tally.updated += 1
|
||||||
|
return
|
||||||
|
|
||||||
|
action = "Finding"
|
||||||
|
if not args.dry_run:
|
||||||
|
action += " and fixing"
|
||||||
|
self.progress_loop(inspect, members,
|
||||||
|
message=f"{action} customerID gaps")
|
||||||
|
|
||||||
|
self.stdout.write("\n")
|
||||||
|
if args.dry_run:
|
||||||
|
self.stdout.write("would have ")
|
||||||
|
self.stdout.write(f"updated {tally.updated} members\n")
|
||||||
|
|
||||||
|
def trim_phones(self, data):
|
||||||
|
# the `meminfo` table allows 30 chars for phone, but
|
||||||
|
# `Customers` table only allows 20 chars. so we must trim to
|
||||||
|
# 20 chars or else the CORE API will silently fail to update
|
||||||
|
# tables correctly when we POST to it
|
||||||
|
for customer in data['customers']:
|
||||||
|
for field in ['phone', 'altPhone']:
|
||||||
|
value = customer[field]
|
||||||
|
if len(value) > self.maxlen_phone:
|
||||||
|
log.warning("phone value for cardno %s is too long (%s chars) "
|
||||||
|
"and will be trimmed to %s chars: %s",
|
||||||
|
data['cardNo'],
|
||||||
|
len(value),
|
||||||
|
self.maxlen_phone,
|
||||||
|
value)
|
||||||
|
customer[field] = value[:self.maxlen_phone]
|
||||||
|
|
||||||
|
|
||||||
class PingInstall(commands.Subcommand):
|
class PingInstall(commands.Subcommand):
|
||||||
"""
|
"""
|
||||||
Ping the /install URL in CORE Office (for DB setup)
|
Ping the /install URL in CORE Office (for DB setup)
|
||||||
|
|
|
@ -46,6 +46,7 @@ core_office.commands =
|
||||||
import-csv = rattail_corepos.corepos.office.commands:ImportCSV
|
import-csv = rattail_corepos.corepos.office.commands:ImportCSV
|
||||||
import-self = rattail_corepos.corepos.office.commands:ImportSelf
|
import-self = rattail_corepos.corepos.office.commands:ImportSelf
|
||||||
get-config-value = rattail_corepos.corepos.office.commands:GetConfigValue
|
get-config-value = rattail_corepos.corepos.office.commands:GetConfigValue
|
||||||
|
patch-customer-gaps = rattail_corepos.corepos.office.commands:PatchCustomerGaps
|
||||||
ping-install = rattail_corepos.corepos.office.commands:PingInstall
|
ping-install = rattail_corepos.corepos.office.commands:PingInstall
|
||||||
|
|
||||||
crepes.commands =
|
crepes.commands =
|
||||||
|
|
Loading…
Reference in a new issue