Skip to content

Some general cleaning and getting things in place to fix #3091 #3165

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Feb 1, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 3 additions & 6 deletions qiita_db/metadata_template/base_metadata_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -453,13 +453,10 @@ class MetadataTemplate(qdb.base.QiitaObject):
# sub-classes.
_forbidden_words = {}

def _check_id(self, id_):
@classmethod
def _check_id(cls, id_):
r"""Checks that the MetadataTemplate id_ exists on the database"""
with qdb.sql_connection.TRN:
sql = "SELECT EXISTS(SELECT * FROM qiita.{0} WHERE {1}=%s)".format(
self._table, self._id_column)
qdb.sql_connection.TRN.add(sql, [id_])
return qdb.sql_connection.TRN.execute_fetchlast()
return qdb.util.exists_table(f'{cls._table_prefix}{id_}')

@classmethod
def _table_name(cls, obj_id):
Expand Down
154 changes: 94 additions & 60 deletions qiita_db/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -369,7 +369,7 @@ def exists_table(table):
"""
with qdb.sql_connection.TRN:
sql = """SELECT exists(
SELECT * FROM information_schema.tables
SELECT table_name FROM information_schema.tables
WHERE table_name=%s)"""
qdb.sql_connection.TRN.add(sql, [table])
return qdb.sql_connection.TRN.execute_fetchlast()
Expand Down Expand Up @@ -1464,6 +1464,10 @@ def generate_study_list(user, visibility):
(SELECT COUNT(sample_id) FROM qiita.study_sample
WHERE study_id=qiita.study.study_id)
AS number_samples_collected,
(SELECT EXISTS(
SELECT 1 FROM qiita.study_sample
WHERE study_id = qiita.study.study_id LIMIT 1))
AS has_sample_info,
(SELECT array_agg(row_to_json((prep_template_id, data_type,
artifact_id, artifact_type, deprecated,
qiita.bioms_from_preparation_artifacts(prep_template_id)),
Expand Down Expand Up @@ -1500,65 +1504,95 @@ def generate_study_list(user, visibility):
if sids:
with qdb.sql_connection.TRN:
qdb.sql_connection.TRN.add(sql, [tuple(sids)])
for info in qdb.sql_connection.TRN.execute_fetchindex():
info = dict(info)

# cleaning owners name
if info['owner'] in (None, ''):
info['owner'] = info['owner_email']
del info['owner_email']

preparation_data_types = []
artifact_biom_ids = []
if info['preparation_information'] is not None:
for pinfo in info['preparation_information']:
# 'f1': prep_template_id, 'f2': data_type,
# 'f3': artifact_id, 'f4': artifact_type,
# 'f5':deprecated, 'f6': biom artifacts
if pinfo['f5']:
continue
preparation_data_types.append(pinfo['f2'])
if pinfo['f4'] == 'BIOM':
artifact_biom_ids.append(pinfo['f3'])
if pinfo['f6'] is not None:
artifact_biom_ids.extend(
map(int, pinfo['f6'].split(',')))
del info['preparation_information']
info['artifact_biom_ids'] = list(set(artifact_biom_ids))
info['preparation_data_types'] = list(set(
preparation_data_types))

# publication info
info['publication_doi'] = []
info['publication_pid'] = []
if info['publications'] is not None:
for p in info['publications']:
# f1-2 are the default names given by pgsql
pub = p['f1']
is_doi = p['f2']
if is_doi:
info['publication_doi'].append(pub)
else:
info['publication_pid'].append(pub)
del info['publications']

# pi info
info["pi"] = (info['pi_email'], info['pi_name'])
del info["pi_email"]
del info["pi_name"]

# shared with
info['shared'] = []
if info['shared_with_name'] and info['shared_with_email']:
for name, email in zip(info['shared_with_name'],
info['shared_with_email']):
if not name:
name = email
info['shared'].append((email, name))
del info["shared_with_name"]
del info["shared_with_email"]

infolist.append(info)
results = qdb.sql_connection.TRN.execute_fetchindex()

for info in results:
info = dict(info)

# cleaning owners name
if info['owner'] in (None, ''):
info['owner'] = info['owner_email']
del info['owner_email']

preparation_data_types = []
artifact_biom_ids = []
if info['preparation_information'] is not None:
for pinfo in info['preparation_information']:
# 'f1': prep_template_id, 'f2': data_type,
# 'f3': artifact_id, 'f4': artifact_type,
# 'f5':deprecated, 'f6': biom artifacts
if pinfo['f5']:
continue
preparation_data_types.append(pinfo['f2'])
if pinfo['f4'] == 'BIOM':
artifact_biom_ids.append(pinfo['f3'])
if pinfo['f6'] is not None:
artifact_biom_ids.extend(
map(int, pinfo['f6'].split(',')))
del info['preparation_information']
info['artifact_biom_ids'] = list(set(artifact_biom_ids))
info['preparation_data_types'] = list(set(
preparation_data_types))

# publication info
info['publication_doi'] = []
info['publication_pid'] = []
if info['publications'] is not None:
for p in info['publications']:
# f1-2 are the default names given by pgsql
pub = p['f1']
is_doi = p['f2']
if is_doi:
info['publication_doi'].append(pub)
else:
info['publication_pid'].append(pub)
del info['publications']

# pi info
info["pi"] = (info['pi_email'], info['pi_name'])
del info["pi_email"]
del info["pi_name"]

# shared with
info['shared'] = []
if info['shared_with_name'] and info['shared_with_email']:
for name, email in zip(info['shared_with_name'],
info['shared_with_email']):
if not name:
name = email
info['shared'].append((email, name))
del info["shared_with_name"]
del info["shared_with_email"]

# # add extra info about sample information file
# if info['has_sample_info']:
# # the fix for #3091 should go here; please reference that
# # issue for more information of why it hasn't been closed
# with qdb.sql_connection.TRN:
# # check if host_scientific_name is part of the metadata
# BMT = qdb.metadata_template.base_metadata_template
# QCN = BMT.QIITA_COLUMN_NAME
# sql = """SELECT POSITION('host_scientific_name' IN
# sample_values->>'columns')
# FROM qiita.sample_%d
# WHERE sample_id = '%s'""" % (
# info['study_id'], QCN)
# qdb.sql_connection.TRN.add(sql)
# has_hsn = qdb.sql_connection.TRN.execute_fetchflatten()
# # if it has that column, we can retrieve the information
# if has_hsn[0] != 0:
# sql = """SELECT array_agg(
# DISTINCT
# sample_values->>'host_scientific_name')
# FROM qiita.sample_%d
# WHERE sample_id != '%s'""" % (
# info['study_id'], QCN))
# qdb.sql_connection.TRN.add(sql)
# hsn = qdb.sql_connection.TRN.execute_fetchflatten()
# info['host_scientific_name'] = hsn
del info['has_sample_info']

infolist.append(info)
return infolist


Expand Down