diff --git a/qiita_db/metadata_template/base_metadata_template.py b/qiita_db/metadata_template/base_metadata_template.py index 97cbb82c3..c8dc3a887 100644 --- a/qiita_db/metadata_template/base_metadata_template.py +++ b/qiita_db/metadata_template/base_metadata_template.py @@ -772,43 +772,6 @@ def _add_common_creation_steps_to_queue(cls, md_template, obj_id, ', '.join(["%s"] * len(headers))), values, many=True) - @classmethod - def delete(cls, id_): - r"""Deletes the table from the database - - Parameters - ---------- - id_ : obj - The object identifier - - Raises - ------ - QiitaDBUnknownIDError - If no metadata_template with id id_ exists - """ - cls._check_subclass() - if not cls.exists(id_): - raise QiitaDBUnknownIDError(id_, cls.__name__) - - table_name = cls._table_name(id_) - conn_handler = SQLConnectionHandler() - - # Delete the sample template filepaths - conn_handler.execute( - "DELETE FROM qiita.sample_template_filepath WHERE " - "study_id = %s", (id_, )) - - conn_handler.execute( - "DROP TABLE qiita.{0}".format(table_name)) - conn_handler.execute( - "DELETE FROM qiita.{0} where {1} = %s".format(cls._table, - cls._id_column), - (id_,)) - conn_handler.execute( - "DELETE FROM qiita.{0} where {1} = %s".format(cls._column_table, - cls._id_column), - (id_,)) - @classmethod def exists(cls, obj_id): r"""Checks if already exists a MetadataTemplate for the provided object diff --git a/qiita_db/metadata_template/sample_template.py b/qiita_db/metadata_template/sample_template.py index 6976b52bb..4b0fe3bb7 100644 --- a/qiita_db/metadata_template/sample_template.py +++ b/qiita_db/metadata_template/sample_template.py @@ -17,7 +17,7 @@ from qiita_core.exceptions import IncompetentQiitaDeveloperError from qiita_db.exceptions import (QiitaDBDuplicateError, QiitaDBError, - QiitaDBWarning) + QiitaDBWarning, QiitaDBUnknownIDError) from qiita_db.sql_connection import SQLConnectionHandler from qiita_db.util import (get_table_cols, get_required_sample_info_status, get_mountpoint, scrub_data) @@ -152,6 +152,63 @@ def create(cls, md_template, study): return st + @classmethod + def delete(cls, id_): + r"""Deletes the table from the database + + Parameters + ---------- + id_ : integer + The object identifier + + Raises + ------ + QiitaDBUnknownIDError + If no sample template with id id_ exists + QiitaDBError + If the study that owns this sample template has raw datas + """ + cls._check_subclass() + + if not cls.exists(id_): + raise QiitaDBUnknownIDError(id_, cls.__name__) + + raw_datas = [str(rd) for rd in Study(cls(id_).study_id).raw_data()] + if raw_datas: + raise QiitaDBError("Sample template can not be erased because " + "there are raw datas (%s) associated." % + ', '.join(raw_datas)) + + table_name = cls._table_name(id_) + conn_handler = SQLConnectionHandler() + + # Delete the sample template filepaths + queue = "delete_sample_template_%d" % id_ + conn_handler.create_queue(queue) + + conn_handler.add_to_queue( + queue, + "DELETE FROM qiita.sample_template_filepath WHERE study_id = %s", + (id_, )) + + conn_handler.add_to_queue( + queue, + "DROP TABLE qiita.{0}".format(table_name)) + + conn_handler.add_to_queue( + queue, + "DELETE FROM qiita.{0} where {1} = %s".format(cls._table, + cls._id_column), + (id_,)) + + conn_handler.add_to_queue( + queue, + "DELETE FROM qiita.{0} where {1} = %s".format(cls._column_table, + cls._id_column), + (id_,)) + + conn_handler.execute_queue(queue) + @property def study_id(self): """Gets the study id with which this sample template is associated diff --git a/qiita_db/metadata_template/test/test_base_metadata_template.py b/qiita_db/metadata_template/test/test_base_metadata_template.py index 4d7cfa184..743031edb 100644 --- a/qiita_db/metadata_template/test/test_base_metadata_template.py +++ b/qiita_db/metadata_template/test/test_base_metadata_template.py @@ -8,7 +8,6 @@ from unittest import TestCase, main -from qiita_core.util import qiita_test_checker from qiita_core.exceptions import IncompetentQiitaDeveloperError from qiita_db.study import Study from qiita_db.metadata_template.base_metadata_template import ( @@ -64,12 +63,5 @@ def test_clean_validate_template(self): MetadataTemplate._clean_validate_template(None, 1, None, None) -@qiita_test_checker() -class TestMetadataTemplateReadWrite(TestCase): - def test_delete(self): - """delete raises an error because it's not called from a subclass""" - with self.assertRaises(IncompetentQiitaDeveloperError): - MetadataTemplate.delete(1) - if __name__ == '__main__': main() diff --git a/qiita_db/metadata_template/test/test_sample_template.py b/qiita_db/metadata_template/test/test_sample_template.py index 33e4e15fa..50d41295d 100644 --- a/qiita_db/metadata_template/test/test_sample_template.py +++ b/qiita_db/metadata_template/test/test_sample_template.py @@ -1229,20 +1229,26 @@ def test_create_already_prefixed_samples(self): def test_delete(self): """Deletes Sample template 1""" - SampleTemplate.create(self.metadata, self.new_study) - SampleTemplate.delete(2) + st = SampleTemplate.create(self.metadata, self.new_study) + SampleTemplate.delete(st.id) + obs = self.conn_handler.execute_fetchall( "SELECT * FROM qiita.required_sample_info WHERE study_id=2") exp = [] self.assertEqual(obs, exp) + obs = self.conn_handler.execute_fetchall( "SELECT * FROM qiita.study_sample_columns WHERE study_id=2") exp = [] self.assertEqual(obs, exp) + with self.assertRaises(QiitaDBExecutionError): self.conn_handler.execute_fetchall( "SELECT * FROM qiita.sample_2") + with self.assertRaises(QiitaDBError): + SampleTemplate.delete(1) + def test_delete_unkonwn_id_error(self): """Try to delete a non existent prep template""" with self.assertRaises(QiitaDBUnknownIDError): diff --git a/qiita_pet/handlers/study_handlers/description_handlers.py b/qiita_pet/handlers/study_handlers/description_handlers.py index 7ff8bc182..00e2c8716 100644 --- a/qiita_pet/handlers/study_handlers/description_handlers.py +++ b/qiita_pet/handlers/study_handlers/description_handlers.py @@ -640,6 +640,33 @@ def display_template(self, study, user, msg, msg_level, full_access, sub_tab=sub_tab, prep_tab=prep_tab) + def delete_sample_template(self, study, user, callback): + """Delete sample template + + Parameters + ---------- + study : Study + The current study object + user : User + The current user object + callback : function + The callback function to call with the results once the processing + is done + """ + sample_template_id = int(self.get_argument('sample_template_id')) + + try: + SampleTemplate.delete(sample_template_id) + msg = ("Sample template %d has been deleted from study: " + "%s" % (sample_template_id, study.title)) + msg_level = "success" + except Exception as e: + msg = "Couldn't remove %d sample template: %s" % ( + sample_template_id, str(e)) + msg_level = "danger" + + callback((msg, msg_level, 'study_information_tab', None, None)) + def delete_raw_data(self, study, user, callback): """Delete the selected raw data @@ -781,6 +808,7 @@ def post(self, study_id): request_approval=self.request_approval, make_sandbox=self.make_sandbox, update_investigation_type=self.update_investigation_type, + delete_sample_template=self.delete_sample_template, delete_raw_data=self.delete_raw_data, delete_prep_template=self.delete_prep_template, delete_preprocessed_data=self.delete_preprocessed_data, diff --git a/qiita_pet/templates/study_description.html b/qiita_pet/templates/study_description.html index d1a88d773..cbd5ce8a0 100644 --- a/qiita_pet/templates/study_description.html +++ b/qiita_pet/templates/study_description.html @@ -184,6 +184,25 @@ form.submit(); } +function delete_sample_template() { + sample_template_id = {{study.sample_template}}; + if (confirm('Are you sure you want to delete sample template ID: ' + sample_template_id + '?')) { + var form = $("