Skip to content

Commit ea6cd51

Browse files
authored
sample summary report expansion (#585)
* init commit * added queries for sample summary table * change email query for sample summary * remove value errors for get barcodes * update sample summaries queries * change email query for sample summaries * changes based on feedback, added tests * resolve ffq conflict * fix vs_repo * forgot t for transaction * fixed wrong import * fix in/outbound search
1 parent fdf2a7f commit ea6cd51

File tree

5 files changed

+338
-8
lines changed

5 files changed

+338
-8
lines changed

microsetta_private_api/admin/admin_impl.py

+21-3
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,11 @@
2929
post_daklapack_orders
3030
from microsetta_private_api import localization
3131
from microsetta_private_api.admin.sample_summary import per_sample
32-
from microsetta_private_api.admin.sample_summary import get_barcodes_for
32+
from microsetta_private_api.admin.sample_summary import \
33+
get_barcodes_by_project_id,\
34+
get_barcodes_by_kit_ids, get_barcodes_by_emails,\
35+
get_barcodes_by_outbound_tracking_numbers,\
36+
get_barcodes_by_inbound_tracking_numbers
3337
from microsetta_private_api.util.melissa import verify_address
3438
from microsetta_private_api.util.query_builder_to_sql import build_condition
3539
from werkzeug.exceptions import Unauthorized
@@ -500,12 +504,26 @@ def query_project_barcode_stats(body, token_info, strip_sampleid):
500504

501505
def query_barcode_stats(body, token_info, strip_sampleid):
502506
validate_admin_access(token_info)
507+
508+
project_id = None
509+
503510
if 'sample_barcodes' in body:
504-
project_id = None
505511
barcodes = body["sample_barcodes"]
512+
elif 'kit_ids' in body:
513+
barcodes = get_barcodes_by_kit_ids(body["kit_ids"])
514+
elif 'emails' in body:
515+
barcodes = get_barcodes_by_emails(body["emails"])
516+
elif 'outbound_tracking_numbers' in body:
517+
barcodes = get_barcodes_by_outbound_tracking_numbers(
518+
body["outbound_tracking_numbers"]
519+
)
520+
elif 'inbound_tracking_numbers' in body:
521+
barcodes = get_barcodes_by_inbound_tracking_numbers(
522+
body["inbound_tracking_numbers"]
523+
)
506524
elif 'project_id' in body:
507525
project_id = body["project_id"]
508-
barcodes = get_barcodes_for(project_id)
526+
barcodes = get_barcodes_by_project_id(project_id)
509527

510528
unprocessed_barcodes = None
511529

microsetta_private_api/admin/sample_summary.py

+58-5
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,33 @@
77
from werkzeug.exceptions import NotFound
88

99

10-
def get_barcodes_for(project_id):
11-
if project_id is None:
12-
raise ValueError("project_id must be defined.")
13-
10+
def get_barcodes_by_project_id(project_id):
1411
with Transaction() as t:
1512
return AdminRepo(t).get_project_barcodes(project_id)
1613

1714

15+
def get_barcodes_by_kit_ids(kit_ids):
16+
with Transaction() as t:
17+
return AdminRepo(t).get_barcodes_filter(kit_ids=kit_ids)
18+
19+
20+
def get_barcodes_by_emails(emails):
21+
with Transaction() as t:
22+
return AdminRepo(t).get_barcodes_filter(emails=emails)
23+
24+
25+
def get_barcodes_by_outbound_tracking_numbers(outbound_tracking_numbers):
26+
with Transaction() as t:
27+
return AdminRepo(t).get_barcodes_filter(
28+
outbound_tracking_numbers=outbound_tracking_numbers)
29+
30+
31+
def get_barcodes_by_inbound_tracking_numbers(inbound_tracking_numbers):
32+
with Transaction() as t:
33+
return AdminRepo(t).get_barcodes_filter(
34+
inbound_tracking_numbers=inbound_tracking_numbers)
35+
36+
1837
def per_sample(project, barcodes, strip_sampleid):
1938
summaries = []
2039
with Transaction() as t:
@@ -38,6 +57,20 @@ def per_sample(project, barcodes, strip_sampleid):
3857
sample = diag['sample']
3958
account = diag['account']
4059
source = diag['source']
60+
first_scans_info = diag['scans_info']
61+
last_scans_info = diag['latest_scan']
62+
if first_scans_info:
63+
first_scan_timestamp = first_scans_info[0]['scan_timestamp']
64+
first_scan_status = first_scans_info[0]['sample_status']
65+
else:
66+
first_scan_timestamp = None
67+
first_scan_status = None
68+
if last_scans_info:
69+
latest_scan_timestamp = last_scans_info['scan_timestamp']
70+
latest_scan_status = last_scans_info['sample_status']
71+
else:
72+
latest_scan_timestamp = None
73+
latest_scan_status = None
4174

4275
account_email = None if account is None else account.email
4376
source_type = None if source is None else source.source_type
@@ -94,6 +127,19 @@ def per_sample(project, barcodes, strip_sampleid):
94127
sample_date = None
95128
sample_time = None
96129

130+
kit_by_barcode = admin_repo.get_kit_by_barcode([barcode])
131+
132+
if kit_by_barcode and len(kit_by_barcode) > 0:
133+
info = kit_by_barcode[0]
134+
135+
kit_id_name = info['kit_id']
136+
outbound_fedex_tracking = info['outbound_tracking']
137+
inbound_fedex_tracking = info['inbound_tracking']
138+
else:
139+
kit_id_name = None
140+
outbound_fedex_tracking = None
141+
inbound_fedex_tracking = None
142+
97143
summary = {
98144
"sampleid": None if strip_sampleid else barcode,
99145
"project": barcode_project,
@@ -106,7 +152,14 @@ def per_sample(project, barcodes, strip_sampleid):
106152
"ffq-taken": ffq_taken,
107153
"ffq-complete": ffq_complete,
108154
"sample-status": sample_status,
109-
"sample-received": sample_status is not None
155+
"sample-received": sample_status is not None,
156+
"first-scan-timestamp": first_scan_timestamp,
157+
"first-scan-status": first_scan_status,
158+
"latest-scan-timestamp": latest_scan_timestamp,
159+
"latest-scan-status": latest_scan_status,
160+
"kit-id": kit_id_name,
161+
"outbound-tracking": outbound_fedex_tracking,
162+
"inbound-tracking": inbound_fedex_tracking,
110163
}
111164

112165
for status in ["sample-is-valid",

microsetta_private_api/admin/tests/test_admin_repo.py

+134
Original file line numberDiff line numberDiff line change
@@ -1487,3 +1487,137 @@ def test_update_perk_fulfillment_state(self):
14871487
)
14881488
obs = cur.fetchone()
14891489
self.assertFalse(obs[0])
1490+
1491+
def test_get_barcodes_filter_kit_ids_success(self):
1492+
with Transaction() as t:
1493+
setup_sql = """
1494+
INSERT INTO barcodes.kit (kit_id, box_id)
1495+
VALUES ('test1', '0001e15f-4170-4b28-b111-191cd567c347');
1496+
1497+
INSERT INTO barcodes.barcode (barcode, kit_id)
1498+
VALUES ('00001234', 'test1');
1499+
"""
1500+
with t.cursor() as cur:
1501+
cur.execute(setup_sql)
1502+
1503+
admin_repo = AdminRepo(t)
1504+
1505+
barcodes = admin_repo.get_barcodes_filter(kit_ids=['test1'])
1506+
self.assertEqual(barcodes, ['00001234'])
1507+
1508+
def test_get_barcodes_filter_kit_ids_failure(self):
1509+
with Transaction() as t:
1510+
admin_repo = AdminRepo(t)
1511+
barcodes = admin_repo.get_barcodes_filter(kit_ids=['notarealkit'])
1512+
self.assertEqual(barcodes, [])
1513+
1514+
def test_get_barcodes_filter_emails_success(self):
1515+
with Transaction() as t:
1516+
setup_sql = """
1517+
INSERT INTO ag.source (id, account_id,
1518+
source_type, source_name)
1519+
VALUES ('0003ddfd-4949-4105-90a9-1b1530af5352', %s,
1520+
'Human', 'Test Source');
1521+
INSERT INTO barcodes.kit (kit_id, box_id)
1522+
VALUES ('test1', '0001e15f-4170-4b28-b111-191cd567c347');
1523+
INSERT INTO barcodes.barcode (barcode, kit_id)
1524+
VALUES ('00001234', 'test1');
1525+
INSERT INTO ag.ag_kit_barcodes (barcode, source_id)
1526+
VALUES ('00001234', '0003ddfd-4949-4105-90a9-1b1530af5352');
1527+
"""
1528+
with t.cursor() as cur:
1529+
cur.execute(setup_sql, (STANDARD_ACCT_ID,))
1530+
1531+
admin_repo = AdminRepo(t)
1532+
1533+
barcodes = admin_repo.get_barcodes_filter(emails=['[email protected]'])
1534+
self.assertEqual(barcodes, ['00001234'])
1535+
1536+
def test_get_barcodes_filter_emails_failure(self):
1537+
with Transaction() as t:
1538+
admin_repo = AdminRepo(t)
1539+
barcodes = admin_repo.get_barcodes_filter(
1540+
emails=['[email protected]'])
1541+
self.assertEqual(barcodes, [])
1542+
1543+
def test_get_barcodes_filter_outbound_tracking_success(self):
1544+
with Transaction() as t:
1545+
setup_sql = """
1546+
INSERT INTO barcodes.kit (kit_id, box_id,
1547+
outbound_fedex_tracking)
1548+
VALUES ('test1', '0001e15f-4170-4b28-b111-191cd567c347',
1549+
'12345');
1550+
INSERT INTO barcodes.barcode (barcode, kit_id)
1551+
VALUES ('00001234', 'test1');
1552+
"""
1553+
with t.cursor() as cur:
1554+
cur.execute(setup_sql)
1555+
1556+
admin_repo = AdminRepo(t)
1557+
1558+
barcodes = \
1559+
admin_repo.get_barcodes_filter(
1560+
outbound_tracking_numbers=['12345'])
1561+
self.assertEqual(barcodes, ['00001234'])
1562+
1563+
def test_get_barcodes_filter_outbound_tracking_failure(self):
1564+
with Transaction() as t:
1565+
admin_repo = AdminRepo(t)
1566+
barcodes = admin_repo.get_barcodes_filter(
1567+
outbound_tracking_numbers=['99999'])
1568+
self.assertEqual(barcodes, [])
1569+
1570+
def test_get_barcodes_filter_inbound_tracking_success(self):
1571+
with Transaction() as t:
1572+
setup_sql = """
1573+
INSERT INTO barcodes.kit (kit_id, box_id,
1574+
inbound_fedex_tracking)
1575+
VALUES ('test1', '0001e15f-4170-4b28-b111-191cd567c347',
1576+
'67890');
1577+
INSERT INTO barcodes.barcode (barcode, kit_id)
1578+
VALUES ('00001234', 'test1');
1579+
"""
1580+
with t.cursor() as cur:
1581+
cur.execute(setup_sql)
1582+
1583+
admin_repo = AdminRepo(t)
1584+
1585+
barcodes = admin_repo.get_barcodes_filter(
1586+
inbound_tracking_numbers=['67890'])
1587+
self.assertEqual(barcodes, ['00001234'])
1588+
1589+
def test_get_barcodes_filter_inbound_tracking_failure(self):
1590+
with Transaction() as t:
1591+
admin_repo = AdminRepo(t)
1592+
barcodes = admin_repo.get_barcodes_filter(
1593+
inbound_tracking_numbers=['99999'])
1594+
self.assertEqual(barcodes, [])
1595+
1596+
def test_get_kit_by_barcode_success(self):
1597+
with Transaction() as t:
1598+
setup_sql = """
1599+
INSERT INTO barcodes.kit (kit_id, box_id)
1600+
VALUES ('test1', '0001e15f-4170-4b28-b111-191cd567c348');
1601+
1602+
INSERT INTO barcodes.barcode (barcode, kit_id)
1603+
VALUES ('00001234', 'test1');
1604+
"""
1605+
with t.cursor() as cur:
1606+
cur.execute(setup_sql)
1607+
1608+
admin_repo = AdminRepo(t)
1609+
1610+
kit_info = admin_repo.get_kit_by_barcode(['00001234'])
1611+
expected = [{
1612+
'barcode': '00001234',
1613+
'outbound_tracking': None,
1614+
'inbound_tracking': None,
1615+
'kit_id': 'test1'
1616+
}]
1617+
self.assertEqual(kit_info, expected)
1618+
1619+
def test_get_kit_by_barcode_failure(self):
1620+
with Transaction() as t:
1621+
admin_repo = AdminRepo(t)
1622+
kit_info = admin_repo.get_kit_by_barcode(['nonexistent_barcode'])
1623+
self.assertIsNone(kit_info)

microsetta_private_api/api/microsetta_private_api.yaml

+16
Original file line numberDiff line numberDiff line change
@@ -2998,6 +2998,22 @@ paths:
29982998
# not using the defined schema for sample_barcode as it is
29992999
# readOnly
30003000
type: string
3001+
'kit_ids':
3002+
type: array
3003+
items:
3004+
type: string
3005+
'emails':
3006+
type: array
3007+
items:
3008+
type: string
3009+
'outbound_tracking_numbers':
3010+
type: array
3011+
items:
3012+
type: string
3013+
'inbound_tracking_numbers':
3014+
type: array
3015+
items:
3016+
type: string
30013017
responses:
30023018
'200':
30033019
description: Return an object containing a list of dictionaries of sample status for requested accounts

0 commit comments

Comments
 (0)