Skip to content

Commit

Permalink
Merge 327fa98 into 082701a
Browse files Browse the repository at this point in the history
  • Loading branch information
dhakim87 committed Apr 18, 2020
2 parents 082701a + 327fa98 commit cfba166
Show file tree
Hide file tree
Showing 6 changed files with 192 additions and 2 deletions.
22 changes: 22 additions & 0 deletions microsetta_private_api/admin/admin_impl.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,28 @@ def search_barcode(token_info, sample_barcode):
return jsonify(diag), 200


def search_kit_id(token_info, kit_id):
validate_admin_access(token_info)

with Transaction() as t:
admin_repo = AdminRepo(t)
diag = admin_repo.retrieve_diagnostics_by_kit_id(kit_id)
if diag is None:
return jsonify(code=404, message="Kit ID not found"), 404
return jsonify(diag), 200


def search_email(token_info, email):
validate_admin_access(token_info)

with Transaction() as t:
admin_repo = AdminRepo(t)
diag = admin_repo.retrieve_diagnostics_by_email(email)
if diag is None:
return jsonify(code=404, message="Email not found"), 404
return jsonify(diag), 200


def validate_admin_access(token_info):
with Transaction() as t:
account_repo = AccountRepo(t)
Expand Down
24 changes: 24 additions & 0 deletions microsetta_private_api/admin/tests/test_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -121,3 +121,27 @@ def test_search_barcode(self):
self.assertIsNone(diag['source'])
self.assertIsNone(diag['sample'])
self.assertEqual(len(diag['barcode_info']), 0)

def test_search_kit_id(self):
with Transaction() as t:
admin_repo = AdminRepo(t)
diag = admin_repo.retrieve_diagnostics_by_kit_id('test')
self.assertIsNotNone(diag)
self.assertIsNotNone(diag['kit'])

diag = admin_repo.retrieve_diagnostics_by_kit_id('NotAKitId!!!!')
self.assertIsNone(diag)

def test_search_email(self):
with Transaction() as t:
admin_repo = AdminRepo(t)
diag = admin_repo.retrieve_diagnostics_by_email(
'yqrc&3x9_9@h7yx5.com')
self.assertIsNotNone(diag)
self.assertEqual(len(diag['accounts']), 1)

diag = admin_repo.retrieve_diagnostics_by_email(
'.com'
)
self.assertIsNotNone(diag)
self.assertGreater(len(diag['accounts']), 1)
51 changes: 51 additions & 0 deletions microsetta_private_api/api/microsetta_private_api.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -835,6 +835,57 @@ paths:
$ref: '#/components/responses/401Unauthorized'
'404':
$ref: '#/components/responses/404NotFound'
'/admin/search/kit/{kit_id}':
get:
operationId: microsetta_private_api.admin.admin_impl.search_kit_id
tags:
- Admin
summary: Retrieve diagnostic information about a kit by kit_id
description: Retrieve diagnostic information about a kit by kit_id
parameters:
- in: path
name: kit_id
description: User-facing id of kit
schema:
$ref: '#/components/schemas/kit_name'
required: true
responses:
'200':
description: Object containing linked account (if any), source (if any), sample (if any) and information about the barcode
content:
application/json:
schema:
type: object
'401':
$ref: '#/components/responses/401Unauthorized'
'404':
$ref: '#/components/responses/404NotFound'
'/admin/search/account/{email}':
get:
operationId: microsetta_private_api.admin.admin_impl.search_email
tags:
- Admin
summary: Retrieve diagnostic information about an account by email
description: Retrieve diagnostic information about an account by email
parameters:
- in: path
name: email
description: user email address
schema:
type: string
example: "test@test.com"
required: true
responses:
'200':
description: Object containing accounts with similar emails (if any)
content:
application/json:
schema:
type: object
'401':
$ref: '#/components/responses/401Unauthorized'
'404':
$ref: '#/components/responses/404NotFound'


components:
Expand Down
8 changes: 8 additions & 0 deletions microsetta_private_api/repo/account_repo.py
Original file line number Diff line number Diff line change
Expand Up @@ -151,3 +151,11 @@ def delete_account_by_email(self, email):
cur.execute("DELETE FROM account WHERE account.email = %s",
(email,))
return cur.rowcount == 1

def get_account_ids_by_email(self, email):
email = "%"+email+"%"
with self._transaction.cursor() as cur:
cur.execute("SELECT id FROM account WHERE email LIKE %s "
"ORDER BY email",
(email,))
return [x[0] for x in cur.fetchall()]
69 changes: 67 additions & 2 deletions microsetta_private_api/repo/admin_repo.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from microsetta_private_api.repo.account_repo import AccountRepo
from microsetta_private_api.repo.base_repo import BaseRepo
from microsetta_private_api.repo.kit_repo import KitRepo
from microsetta_private_api.repo.sample_repo import SampleRepo
from microsetta_private_api.repo.source_repo import SourceRepo

Expand All @@ -8,13 +9,14 @@ class AdminRepo(BaseRepo):
def __init__(self, transaction):
super().__init__(transaction)

def retrieve_diagnostics_by_barcode(self, sample_barcode):
def retrieve_diagnostics_by_barcode(self, sample_barcode, grab_kit=True):
with self._transaction.dict_cursor() as cur:
cur.execute(
"SELECT "
"ag_kit_barcodes.ag_kit_barcode_id as sample_id, "
"source.id as source_id, "
"account.id as account_id "
"account.id as account_id, "
"ag_kit_barcodes.ag_kit_id as kit_id "
"FROM "
"ag.ag_kit_barcodes "
"LEFT OUTER JOIN "
Expand All @@ -35,14 +37,17 @@ def retrieve_diagnostics_by_barcode(self, sample_barcode):
sample_id = None
source_id = None
account_id = None
kit_id = None
else:
sample_id = row["sample_id"]
source_id = row["source_id"]
account_id = row["account_id"]
kit_id = row["kit_id"]

account = None
source = None
sample = None
kit = None

if sample_id is not None:
sample_repo = SampleRepo(self._transaction)
Expand All @@ -54,6 +59,10 @@ def retrieve_diagnostics_by_barcode(self, sample_barcode):
account = account_repo.get_account(account_id)
source = source_repo.get_source(account_id, source_id)

if kit_id is not None and grab_kit:
kit_repo = KitRepo(self._transaction)
kit = kit_repo.get_kit_all_samples_by_kit_id(kit_id)

cur.execute("SELECT * from barcodes.barcode "
"LEFT OUTER JOIN barcodes.project_barcode "
"USING (barcode) "
Expand All @@ -74,4 +83,60 @@ def retrieve_diagnostics_by_barcode(self, sample_barcode):
"barcode_info": barcode_info
}

if grab_kit:
diagnostic["kit"] = kit

return diagnostic

def retrieve_diagnostics_by_kit_id(self, supplied_kit_id):
kit_repo = KitRepo(self._transaction)
kit = kit_repo.get_kit_all_samples(supplied_kit_id)

if kit is None:
return None

sample_assoc = []
for sample in kit.samples:
sample_assoc.append(
self.retrieve_diagnostics_by_barcode(sample.barcode,
grab_kit=False))

with self._transaction.dict_cursor() as cur:
cur.execute(
"SELECT "
"ag_login_id as account_id "
"FROM "
"ag_kit "
"WHERE "
"supplied_kit_id = %s",
(supplied_kit_id,))
row = cur.fetchone()

pre_microsetta_acct = None
if row['account_id'] is not None:
acct_repo = AccountRepo(self._transaction)
# This kit predated the microsetta migration, let's pull in the
# account info associated with it
pre_microsetta_acct = acct_repo.get_account(row['account_id'])

diagnostic = {
'kit_id': kit.id,
'supplied_kit_id': supplied_kit_id,
'kit': kit,
'pre_microsetta_acct': pre_microsetta_acct,
'sample_diagnostic_info': sample_assoc
}

return diagnostic

def retrieve_diagnostics_by_email(self, email):

acct_repo = AccountRepo(self._transaction)
ids = acct_repo.get_account_ids_by_email(email)

accts = [acct_repo.get_account(acct_id) for acct_id in ids]
diagnostic = {
"accounts": accts
}

return diagnostic
20 changes: 20 additions & 0 deletions microsetta_private_api/repo/kit_repo.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,26 @@ class KitRepo(BaseRepo):
def __init__(self, transaction):
super().__init__(transaction)

# Kit ID is the uuid primary key of ag_kit, as opposed to supplied_kit_id,
# the more easily typed string we put on pieces of paper inside the kit
def get_kit_all_samples_by_kit_id(self, kit_id):
sample_repo = SampleRepo(self._transaction)
with self._transaction.cursor() as cur:
cur.execute("SELECT "
"ag_kit.ag_kit_id, "
"ag_kit_barcodes.ag_kit_barcode_id "
"FROM ag_kit LEFT JOIN ag_kit_barcodes ON "
"ag_kit.ag_kit_id = ag_kit_barcodes.ag_kit_id "
"WHERE "
"ag_kit.ag_kit_id = %s",
(kit_id,))
rows = cur.fetchall()
if len(rows) == 0:
return None
else:
samples = [sample_repo._get_sample_by_id(r[1]) for r in rows]
return Kit(rows[0][0], samples)

def get_kit_all_samples(self, supplied_kit_id):
sample_repo = SampleRepo(self._transaction)

Expand Down

0 comments on commit cfba166

Please sign in to comment.