mirror of
https://github.com/GSA/notifications-api.git
synced 2025-12-21 07:51:13 -05:00
optimize how we look up phone numbers
This commit is contained in:
@@ -11,7 +11,8 @@ from app.clients import AWS_CLIENT_CONFIG
|
|||||||
FILE_LOCATION_STRUCTURE = "service-{}-notify/{}.csv"
|
FILE_LOCATION_STRUCTURE = "service-{}-notify/{}.csv"
|
||||||
|
|
||||||
|
|
||||||
JOBS = ExpiringDict(max_len=100, max_age_seconds=3600 * 4)
|
JOBS = ExpiringDict(max_len=1000, max_age_seconds=3600 * 4)
|
||||||
|
|
||||||
|
|
||||||
JOBS_CACHE_HITS = "JOBS_CACHE_HITS"
|
JOBS_CACHE_HITS = "JOBS_CACHE_HITS"
|
||||||
JOBS_CACHE_MISSES = "JOBS_CACHE_MISSES"
|
JOBS_CACHE_MISSES = "JOBS_CACHE_MISSES"
|
||||||
@@ -96,6 +97,32 @@ def incr_jobs_cache_hits():
|
|||||||
current_app.logger.info(f"JOBS CACHE MISS hits {hits} misses {misses}")
|
current_app.logger.info(f"JOBS CACHE MISS hits {hits} misses {misses}")
|
||||||
|
|
||||||
|
|
||||||
|
def extract_phones(job):
|
||||||
|
job = job.split("\r\n")
|
||||||
|
first_row = job[0]
|
||||||
|
job.pop(0)
|
||||||
|
first_row = first_row.split(",")
|
||||||
|
phone_index = 0
|
||||||
|
for item in first_row:
|
||||||
|
if item.lower() == "phone number":
|
||||||
|
break
|
||||||
|
phone_index = phone_index + 1
|
||||||
|
phones = {}
|
||||||
|
job_row = 0
|
||||||
|
for row in job:
|
||||||
|
row = row.split(",")
|
||||||
|
phone_index = 0
|
||||||
|
for item in first_row:
|
||||||
|
if item.lower() == "phone number":
|
||||||
|
break
|
||||||
|
phone_index = phone_index + 1
|
||||||
|
my_phone = row[phone_index]
|
||||||
|
my_phone = re.sub(r"[\+\s\(\)\-\.]*", "", my_phone)
|
||||||
|
phones[job_row] = my_phone
|
||||||
|
job_row = job_row + 1
|
||||||
|
return phones
|
||||||
|
|
||||||
|
|
||||||
def get_phone_number_from_s3(service_id, job_id, job_row_number):
|
def get_phone_number_from_s3(service_id, job_id, job_row_number):
|
||||||
# We don't want to constantly pull down a job from s3 every time we need a phone number.
|
# We don't want to constantly pull down a job from s3 every time we need a phone number.
|
||||||
# At the same time we don't want to store it in redis or the db
|
# At the same time we don't want to store it in redis or the db
|
||||||
@@ -108,6 +135,21 @@ def get_phone_number_from_s3(service_id, job_id, job_row_number):
|
|||||||
else:
|
else:
|
||||||
incr_jobs_cache_hits()
|
incr_jobs_cache_hits()
|
||||||
|
|
||||||
|
if job is None:
|
||||||
|
current_app.logger.warning(
|
||||||
|
"Couldnt find phone for job_id {job_id} row number {job_row_number} because job is missing"
|
||||||
|
)
|
||||||
|
return "Unknown Phone"
|
||||||
|
|
||||||
|
if JOBS.get(f"{job_id}_phones") is None:
|
||||||
|
JOBS[f"{job_id}_phones"] = extract_phones(job)
|
||||||
|
|
||||||
|
if JOBS.get(f"{job_id}_phones") is not None:
|
||||||
|
phone_to_return = JOBS.get(f"{job_id}_phones").get(job_row_number)
|
||||||
|
if phone_to_return:
|
||||||
|
print(f"USING SHORT CUT! {phone_to_return}")
|
||||||
|
return phone_to_return
|
||||||
|
|
||||||
job = job.split("\r\n")
|
job = job.split("\r\n")
|
||||||
first_row = job[0]
|
first_row = job[0]
|
||||||
job.pop(0)
|
job.pop(0)
|
||||||
@@ -121,11 +163,10 @@ def get_phone_number_from_s3(service_id, job_id, job_row_number):
|
|||||||
correct_row = job[job_row_number]
|
correct_row = job[job_row_number]
|
||||||
correct_row = correct_row.split(",")
|
correct_row = correct_row.split(",")
|
||||||
|
|
||||||
# This could happen if an old job cannot be retrieved from s3
|
|
||||||
if len(correct_row) <= phone_index:
|
|
||||||
return "Unknown Phone"
|
|
||||||
my_phone = correct_row[phone_index]
|
my_phone = correct_row[phone_index]
|
||||||
my_phone = re.sub(r"[\+\s\(\)\-\.]*", "", my_phone)
|
my_phone = re.sub(r"[\+\s\(\)\-\.]*", "", my_phone)
|
||||||
|
if not my_phone:
|
||||||
|
return "Unknown Phone"
|
||||||
return my_phone
|
return my_phone
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -433,8 +433,12 @@ def get_all_notifications_for_service(service_id):
|
|||||||
notification.job_id,
|
notification.job_id,
|
||||||
notification.job_row_number,
|
notification.job_row_number,
|
||||||
)
|
)
|
||||||
|
print(f"RECIPIENTE IN service/rest {recipient}")
|
||||||
notification.to = recipient
|
notification.to = recipient
|
||||||
notification.normalised_to = recipient
|
notification.normalised_to = recipient
|
||||||
|
else:
|
||||||
|
notification.to = "1"
|
||||||
|
notification.normalised_to = "1"
|
||||||
|
|
||||||
kwargs = request.args.to_dict()
|
kwargs = request.args.to_dict()
|
||||||
kwargs["service_id"] = service_id
|
kwargs["service_id"] = service_id
|
||||||
@@ -474,7 +478,7 @@ def get_all_notifications_for_service(service_id):
|
|||||||
page,
|
page,
|
||||||
len(next_page_of_pagination.items),
|
len(next_page_of_pagination.items),
|
||||||
".get_all_notifications_for_service",
|
".get_all_notifications_for_service",
|
||||||
**kwargs
|
**kwargs,
|
||||||
)
|
)
|
||||||
if count_pages
|
if count_pages
|
||||||
else {},
|
else {},
|
||||||
|
|||||||
Reference in New Issue
Block a user