Skip to content

Commit 28ad6d8

Browse files
committed
Merge pull request #102 from teravest/makecommands
add command to load study
2 parents 4491e7c + b945487 commit 28ad6d8

File tree

5 files changed

+160
-16
lines changed

5 files changed

+160
-16
lines changed

qiita_db/commands.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
from functools import partial
2+
try:
3+
# Python 2
4+
from ConfigParser import ConfigParser
5+
except ImportError:
6+
# Python 3
7+
from configparser import ConfigParser
8+
9+
from qiita_db.study import Study, StudyPerson
10+
from qiita_db.user import User
11+
12+
13+
def make_study_from_cmd(owner, title, info):
14+
15+
# Parse the configuration file
16+
config = ConfigParser()
17+
config.readfp(info)
18+
19+
optional = dict(config.items('optional'))
20+
get_optional = lambda name: optional.get(name, None)
21+
get_required = partial(config.get, 'required')
22+
required_fields = ['timeseries_type_id', 'mixs_compliant',
23+
'number_samples_collected', 'number_samples_promised',
24+
'portal_type_id', 'reprocess', 'study_alias',
25+
'study_description', 'study_abstract',
26+
'metadata_complete']
27+
optional_fields = ['funding', 'most_recent_contact', 'spatial_series',
28+
'vamps_id']
29+
infodict = {}
30+
for value in required_fields:
31+
infodict[value] = get_required(value)
32+
33+
for value in optional_fields:
34+
optvalue = get_optional(value)
35+
if optvalue is not None:
36+
infodict[value] = optvalue
37+
38+
emp_person_name_email = get_optional('emp_person_name')
39+
if emp_person_name_email is not None:
40+
emp_name, emp_email = emp_person_name_email.split(',')
41+
infodict['emp_person_id'] = StudyPerson.create(emp_name.strip(),
42+
emp_email.strip())
43+
lab_name_email = get_optional('lab_person')
44+
if lab_name_email is not None:
45+
lab_name, lab_email = lab_name_email.split(',')
46+
infodict['lab_person_id'] = StudyPerson.create(lab_name.strip(),
47+
lab_email.strip())
48+
pi_name_email = get_required('principal_investigator')
49+
pi_name, pi_email = pi_name_email.split(',')
50+
infodict['principal_investigator_id'] = StudyPerson.create(
51+
pi_name.strip(), pi_email.strip())
52+
# this will eventually change to using the Experimental Factory Ontolgoy
53+
# names
54+
efo_ids = get_required('efo_ids')
55+
efo_ids = [x.strip() for x in efo_ids.split(',')]
56+
57+
Study.create(User(owner), title, efo_ids, infodict)

qiita_db/study.py

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -551,22 +551,21 @@ def create(cls, name, email, address=None, phone=None):
551551
-------
552552
New StudyPerson object
553553
554-
Raises
555-
------
556-
QiitaDBDuplicateError
557-
Person already exists
558554
"""
559555
if cls.exists(name, email):
560-
raise QiitaDBDuplicateError(
561-
"StudyPerson", "name: %s, email: %s" % (name, email))
556+
sql = ("SELECT study_person_id from qiita.{0} WHERE name = %s and"
557+
" email = %s".format(cls._table))
558+
conn_handler = SQLConnectionHandler()
559+
spid = conn_handler.execute_fetchone(sql, (name, email))
562560

563561
# Doesn't exist so insert new person
564-
sql = ("INSERT INTO qiita.{0} (name, email, address, phone) VALUES"
565-
" (%s, %s, %s, %s) RETURNING "
566-
"study_person_id".format(cls._table))
567-
conn_handler = SQLConnectionHandler()
568-
spid = conn_handler.execute_fetchone(sql, (name, email, address,
569-
phone))
562+
else:
563+
sql = ("INSERT INTO qiita.{0} (name, email, address, phone) VALUES"
564+
" (%s, %s, %s, %s) RETURNING "
565+
"study_person_id".format(cls._table))
566+
conn_handler = SQLConnectionHandler()
567+
spid = conn_handler.execute_fetchone(sql, (name, email, address,
568+
phone))
570569
return cls(spid[0])
571570

572571
# Properties

qiita_db/test/test_commands.py

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
from unittest import TestCase, main
2+
from future.utils.six import StringIO
3+
try:
4+
# Python 2
5+
from ConfigParser import NoOptionError
6+
except ImportError:
7+
# Python 3
8+
from configparser import NoOptionError
9+
10+
from qiita_db.commands import make_study_from_cmd
11+
from qiita_db.study import StudyPerson
12+
from qiita_db.user import User
13+
from qiita_core.util import qiita_test_checker
14+
15+
16+
@qiita_test_checker()
17+
class TestMakeStudyFromCmd(TestCase):
18+
def setUp(self):
19+
StudyPerson.create('SomeDude', 'somedude@foo.bar',
20+
'111 fake street', '111-121-1313')
21+
User.create('test@test.com', 'password')
22+
self.config1 = CONFIG_1
23+
self.config2 = CONFIG_2
24+
25+
def test_make_study_from_cmd(self):
26+
fh = StringIO(self.config1)
27+
make_study_from_cmd('test@test.com', 'newstudy', fh)
28+
sql = ("select study_id from qiita.study where email = %s and "
29+
"study_title = %s")
30+
study_id = self.conn_handler.execute_fetchone(sql, ('test@test.com',
31+
'newstudy'))
32+
self.assertTrue(study_id is not None)
33+
34+
fh2 = StringIO(self.config2)
35+
with self.assertRaises(NoOptionError):
36+
make_study_from_cmd('test@test.com', 'newstudy2', fh2)
37+
38+
CONFIG_1 = """[required]
39+
timeseries_type_id = 1
40+
metadata_complete = True
41+
mixs_compliant = True
42+
number_samples_collected = 50
43+
number_samples_promised = 25
44+
portal_type_id = 3
45+
principal_investigator = SomeDude, somedude@foo.bar
46+
reprocess = False
47+
study_alias = 'test study'
48+
study_description = 'test study description'
49+
study_abstract = 'study abstract'
50+
efo_ids = 1,2,3,4
51+
[optional]
52+
lab_person = SomeDude, somedude@foo.bar
53+
funding = 'funding source'
54+
vamps_id = vamps_id
55+
"""
56+
57+
CONFIG_2 = """[required]
58+
timeseries_type_id = 1
59+
metadata_complete = True
60+
number_samples_collected = 50
61+
number_samples_promised = 25
62+
portal_type_id = 3
63+
principal_investigator = SomeDude, somedude@foo.bar
64+
reprocess = False
65+
study_alias = 'test study'
66+
study_description = 'test study description'
67+
study_abstract = 'study abstract'
68+
efo_ids = 1,2,3,4
69+
[optional]
70+
lab_person = SomeDude, somedude@foo.bar
71+
funding = 'funding source'
72+
vamps_id = vamps_id
73+
"""
74+
75+
if __name__ == "__main__":
76+
main()

qiita_db/test/test_study.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@
99
from qiita_db.study import Study, StudyPerson
1010
from qiita_db.investigation import Investigation
1111
from qiita_db.user import User
12-
from qiita_db.exceptions import (QiitaDBDuplicateError, QiitaDBColumnError,
13-
QiitaDBStatusError)
12+
from qiita_db.exceptions import QiitaDBColumnError, QiitaDBStatusError
1413

1514
# -----------------------------------------------------------------------------
1615
# Copyright (c) 2014--, The Qiita Development Team.
@@ -36,8 +35,9 @@ def test_create_studyperson(self):
3635
'111 fake street', '111-121-1313']])
3736

3837
def test_create_studyperson_already_exists(self):
39-
with self.assertRaises(QiitaDBDuplicateError):
40-
StudyPerson.create('LabDude', 'lab_dude@foo.bar')
38+
obs = StudyPerson.create('LabDude', 'lab_dude@foo.bar')
39+
self.assertEqual(obs.name, 'LabDude')
40+
self.assertEqual(obs.email, 'lab_dude@foo.bar')
4141

4242
def test_retrieve_name(self):
4343
self.assertEqual(self.studyperson.name, 'LabDude')

scripts/qiita_db

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ from qiita_db.environment_manager import (make_test_environment,
1818
drop_demo_environment,
1919
DFLT_BASE_DATA_FOLDER,
2020
DFLT_BASE_WORK_FOLDER)
21+
from qiita_db.commands import make_study_from_cmd
2122

2223

2324
@click.group()
@@ -85,6 +86,16 @@ def make_production_env():
8586
make_production_environment()
8687

8788

89+
@click.command()
90+
@click.option('--owner', help="The email address of the owner of the study")
91+
@click.option('--title', help="The title of the study")
92+
@click.option('--info', type=click.File(mode='r'),
93+
help="filepath of file with study information in python"
94+
"config file format")
95+
def insert_study_to_db(owner, title, info):
96+
make_study_from_cmd(owner, title, info)
97+
98+
8899
@click.command()
89100
@click.option('--base_data_folder', default=DFLT_BASE_DATA_FOLDER,
90101
help="The folder where the test data files are stored")
@@ -114,6 +125,7 @@ qiita_db.add_command(drop_test_env)
114125
qiita_db.add_command(make_production_env)
115126
qiita_db.add_command(make_demo_env)
116127
qiita_db.add_command(drop_demo_env)
128+
qiita_db.add_command(insert_study_to_db)
117129

118130
if __name__ == '__main__':
119131
qiita_db()

0 commit comments

Comments
 (0)