Skip to content

Commit

Permalink
Merge pull request #120 from wasade/get_create_project
Browse files Browse the repository at this point in the history
Allow an admin to create a new project
  • Loading branch information
wasade committed Apr 28, 2020
2 parents b934e5a + 3c877b2 commit f876e6d
Show file tree
Hide file tree
Showing 5 changed files with 113 additions and 11 deletions.
17 changes: 17 additions & 0 deletions microsetta_private_api/admin/admin_impl.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,23 @@ def validate_admin_access(token_info):
raise Unauthorized()


def create_project(body, token_info):
validate_admin_access(token_info)

project_name = body['project_name']
is_microsetta = body['is_microsetta']

if len(project_name) == 0:
return jsonify(code=400, message="No project name provided"), 400

with Transaction() as t:
admin_repo = AdminRepo(t)
admin_repo.create_project(project_name, is_microsetta)
t.commit()

return {}, 201


def create_kits(body, token_info):
validate_admin_access(token_info)

Expand Down
23 changes: 23 additions & 0 deletions microsetta_private_api/admin/tests/test_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,29 @@ def test_search_barcode(self):
diag = admin_repo.retrieve_diagnostics_by_barcode('NotABarcode :D')
self.assertIsNone(diag)

def test_create_project(self):
with Transaction() as t:
admin_repo = AdminRepo(t)
with t.cursor() as cur:
cur.execute("SELECT project "
"FROM barcodes.project "
"WHERE project = 'doesnotexist'")
self.assertEqual(len(cur.fetchall()), 0)

admin_repo.create_project('doesnotexist', True)
cur.execute("SELECT project, is_microsetta "
"FROM barcodes.project "
"WHERE project = 'doesnotexist'")
obs = cur.fetchall()
self.assertEqual(obs, [('doesnotexist', True), ])

admin_repo.create_project('doesnotexist2', False)
cur.execute("SELECT project, is_microsetta "
"FROM barcodes.project "
"WHERE project = 'doesnotexist2'")
obs = cur.fetchall()
self.assertEqual(obs, [('doesnotexist2', False), ])

def test_create_kits(self):
with Transaction() as t:
admin_repo = AdminRepo(t)
Expand Down
30 changes: 30 additions & 0 deletions microsetta_private_api/api/microsetta_private_api.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1068,6 +1068,36 @@ paths:
'404':
$ref: '#/components/responses/404NotFound'

'/admin/create/project':
post:
operationId: microsetta_private_api.admin.admin_impl.create_project
tags:
- Admin
summary: Create a project which kits can be associated too
description: Create a project which kits can be associated too
requestBody:
content:
application/json:
schema:
type: "object"
properties:
project_name:
type: string
is_microsetta:
type: boolean

required:
- project_name
- is_microsetta

responses:
'201':
description: Project successfully created
'401':
$ref: '#/components/responses/401Unauthorized'
'422':
$ref: '#/components/responses/422UnprocessableEntity'

'/admin/create/kits':
post:
operationId: microsetta_private_api.admin.admin_impl.create_kits
Expand Down
10 changes: 10 additions & 0 deletions microsetta_private_api/db/patches/0056.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
ALTER TABLE barcodes.project ADD COLUMN is_microsetta BOOLEAN;
UPDATE barcodes.project SET is_microsetta='no' WHERE is_microsetta IS NULL;
UPDATE barcodes.project SET is_microsetta='yes' WHERE project in ('American Gut Project',
'British Gut Project',
'Daklapak W1',
'canadian gut',
'TMI - Daklapack W1',
'TMI - Daklapack W2');
ALTER TABLE barcodes.project ALTER COLUMN is_microsetta SET NOT NULL;
ALTER TABLE barcodes.project ADD CONSTRAINT project_unique UNIQUE (project);
44 changes: 33 additions & 11 deletions microsetta_private_api/repo/admin_repo.py
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,31 @@ def retrieve_diagnostics_by_barcode(self, sample_barcode, grab_kit=True):

return diagnostic

def create_project(self, project_name, is_microsetta):
"""Create a project entry in the database
Parameters
----------
project_name : str
The name of the project to create
is_microsetta : bool
If the project is part of The Microsetta Initiative
"""
if is_microsetta:
tmi = 'yes'
else:
tmi = 'no'

with self._transaction.cursor() as cur:
cur.execute("SELECT MAX(project_id) + 1 "
"FROM barcodes.project")
id_ = cur.fetchone()[0]

cur.execute("INSERT INTO barcodes.project "
"(project_id, project, is_microsetta) "
"VALUES (%s, %s, %s)", [id_, project_name, tmi])
return True

def _generate_random_kit_name(self, name_length, prefix):
if prefix is None:
prefix = 'tmi'
Expand All @@ -153,21 +178,18 @@ def create_kits(self, number_of_kits, number_of_samples, kit_prefix,
projects : list of str
Project names the samples are to be associated with
"""
TMI_PROJECTS = {'The Microsetta Initiative', 'American Gut Project',
'British Gut Project'}
if len(TMI_PROJECTS & set(projects)) > 0:
is_tmi = True
else:
is_tmi = False

with self._transaction.cursor() as cur:
# get existing projects
cur.execute("SELECT project, project_id "
cur.execute("SELECT project, project_id, is_microsetta "
"FROM barcodes.project")
known_projects = {prj.lower(): id_ for prj, id_ in cur.fetchall()}
known_projects = {prj: (id_, tmi)
for prj, id_, tmi in cur.fetchall()}
is_tmi = False
for name in projects:
if name.lower() not in known_projects:
if name not in known_projects:
raise KeyError("%s does not exist" % name)
if known_projects[name][1]:
is_tmi = True

# get existing kits to test for conflicts
cur.execute("""SELECT kit_id FROM barcodes.kit""")
Expand Down Expand Up @@ -209,7 +231,7 @@ def create_kits(self, number_of_kits, number_of_samples, kit_prefix,
barcode_projects = []
for barcode in new_barcodes:
for project in projects:
prj_id = known_projects[project.lower()]
prj_id = known_projects[project][0]
barcode_projects.append((barcode, prj_id))

# create shipping IDs
Expand Down

0 comments on commit f876e6d

Please sign in to comment.