diff --git a/qiita_db/metadata_template/base_metadata_template.py b/qiita_db/metadata_template/base_metadata_template.py index 9cabfacc4..26c24c6b7 100644 --- a/qiita_db/metadata_template/base_metadata_template.py +++ b/qiita_db/metadata_template/base_metadata_template.py @@ -1083,3 +1083,30 @@ def categories(self): cols[idx] = self.translate_cols_dict[c] return cols + + def update_category(self, category, samples_and_values): + """Update an existing column + + Parameters + ---------- + category : str + The category to update + samples_and_values : dict + A mapping of {sample_id: value} + + Raises + ------ + QiitaDBUnknownIDError + If a sample_id is included in values that is not in the template + QiitaDBColumnError + If the column does not exist in the table. This is implicit, and + can be thrown by the contained Samples. + """ + if not set(self.keys()).issuperset(samples_and_values): + missing = set(self.keys()) - set(samples_and_values) + table_name = self._table_name(self.study_id) + raise QiitaDBUnknownIDError(missing, table_name) + + for k, v in viewitems(samples_and_values): + sample = self[k] + sample[category] = v diff --git a/qiita_db/metadata_template/sample_template.py b/qiita_db/metadata_template/sample_template.py index e4d6d29d0..4a5574a96 100644 --- a/qiita_db/metadata_template/sample_template.py +++ b/qiita_db/metadata_template/sample_template.py @@ -8,7 +8,6 @@ from __future__ import division from future.builtins import zip -from future.utils import viewitems from copy import deepcopy from os.path import join from time import strftime @@ -20,7 +19,6 @@ from qiita_core.exceptions import IncompetentQiitaDeveloperError from qiita_db.exceptions import (QiitaDBDuplicateError, QiitaDBColumnError, - QiitaDBUnknownIDError, QiitaDBDuplicateHeaderError, QiitaDBError, QiitaDBWarning) from qiita_db.sql_connection import SQLConnectionHandler @@ -407,33 +405,6 @@ def update(self, md_template): if '_qiime_' not in basename(fp): pt.create_qiime_mapping_file(fp) - def update_category(self, category, samples_and_values): - """Update an existing column - - Parameters - ---------- - category : str - The category to update - samples_and_values : dict - A mapping of {sample_id: value} - - Raises - ------ - QiitaDBUnknownIDError - If a sample_id is included in values that is not in the template - QiitaDBColumnError - If the column does not exist in the table. This is implicit, and - can be thrown by the contained Samples. - """ - if not set(self.keys()).issuperset(samples_and_values): - missing = set(self.keys()) - set(samples_and_values) - table_name = self._table_name(self.study_id) - raise QiitaDBUnknownIDError(missing, table_name) - - for k, v in viewitems(samples_and_values): - sample = self[k] - sample[category] = v - def add_category(self, category, samples_and_values, dtype, default): """Add a metadata category diff --git a/qiita_db/metadata_template/test/test_prep_template.py b/qiita_db/metadata_template/test/test_prep_template.py index c82533be2..2e51e92a4 100644 --- a/qiita_db/metadata_template/test/test_prep_template.py +++ b/qiita_db/metadata_template/test/test_prep_template.py @@ -1167,6 +1167,37 @@ def test_status(self): self.test_study, self.data_type_id) self.assertEqual(pt.status, 'sandbox') + def test_update_category(self): + with self.assertRaises(QiitaDBUnknownIDError): + self.tester.update_category('barcodesequence', {"foo": "bar"}) + + with self.assertRaises(QiitaDBColumnError): + self.tester.update_category('missing column', + {'1.SKB7.640196': 'bar'}) + + neg_test = self.tester['1.SKB7.640196']['barcodesequence'] + mapping = {'1.SKB8.640193': 'AAAAAAAAAAAA', + '1.SKD8.640184': 'CCCCCCCCCCCC'} + + self.tester.update_category('barcodesequence', mapping) + + self.assertEqual(self.tester['1.SKB7.640196']['barcodesequence'], + neg_test) + self.assertEqual(self.tester['1.SKB8.640193']['barcodesequence'], + 'AAAAAAAAAAAA') + self.assertEqual(self.tester['1.SKD8.640184']['barcodesequence'], + 'CCCCCCCCCCCC') + + neg_test = self.tester['1.SKB7.640196']['center_name'] + mapping = {'1.SKB8.640193': 'FOO', + '1.SKD8.640184': 'BAR'} + + self.tester.update_category('center_name', mapping) + + self.assertEqual(self.tester['1.SKB7.640196']['center_name'], neg_test) + self.assertEqual(self.tester['1.SKB8.640193']['center_name'], 'FOO') + self.assertEqual(self.tester['1.SKD8.640184']['center_name'], 'BAR') + EXP_PREP_TEMPLATE = ( 'sample_name\tbarcodesequence\tcenter_name\tcenter_project_name\t'