def sample_template_overview_handler_get_request(study_id, user): # Check if the current user has access to the sample template sample_template_checks(study_id, user) # Check if the sample template exists exists = SampleTemplate.exists(study_id) # The following information should always be provided: # The files that have been uploaded to the system and can be a # sample template file files = [ f for _, f in get_files_from_uploads_folders(study_id) if f.endswith(('txt', 'tsv')) ] # If there is a job associated with the sample information, the job id job = None job_info = r_client.get(SAMPLE_TEMPLATE_KEY_FORMAT % study_id) if job_info: job = loads(job_info)['job_id'] # Specific information if it exists or not: data_types = [] st_fp_id = None old_files = [] num_samples = 0 num_cols = 0 if exists: # If it exists we need to provide: # The id of the sample template file so the user can download it and # the list of old filepaths st = SampleTemplate(study_id) all_st_files = st.get_filepaths() # The current sample template file is the first one in the list # (pop(0)) and we are interested only in the id ([0]) st_fp_id = all_st_files.pop(0)[0] # For the old filepaths we are only interested in their basename old_files = [basename(fp) for _, fp in all_st_files] # The number of samples - this is a space efficient way of counting # the number of samples. Doing len(list(st.keys())) creates a list # that we are not using num_samples = sum(1 for _ in st.keys()) # The number of columns num_cols = len(st.categories()) else: # It doesn't exist, we also need to provide the data_types in case # the user uploads a QIIME mapping file data_types = sorted(data_types_get_req()['data_types']) return { 'exists': exists, 'uploaded_files': files, 'data_types': data_types, 'user_can_edit': Study(study_id).can_edit(user), 'job': job, 'download_id': st_fp_id, 'old_files': old_files, 'num_samples': num_samples, 'num_columns': num_cols }
def sample_template_overview_handler_get_request(study_id, user): # Check if the current user has access to the sample template sample_template_checks(study_id, user) # Check if the sample template exists exists = SampleTemplate.exists(study_id) # The following information should always be provided: # The files that have been uploaded to the system and can be a # sample template file files = [f for _, f, _ in get_files_from_uploads_folders(study_id) if f.endswith(('txt', 'tsv', 'xlsx'))] # If there is a job associated with the sample information, the job id job = None job_info = r_client.get(SAMPLE_TEMPLATE_KEY_FORMAT % study_id) if job_info: job = loads(job_info)['job_id'] # Specific information if it exists or not: data_types = [] st_fp_id = None old_files = [] num_samples = 0 num_cols = 0 if exists: # If it exists we need to provide: # The id of the sample template file so the user can download it and # the list of old filepaths st = SampleTemplate(study_id) all_st_files = st.get_filepaths() # The current sample template file is the first one in the list # (pop(0)) and we are interested only in the id ([0]) st_fp_id = all_st_files.pop(0)[0] # For the old filepaths we are only interested in their basename old_files = [basename(fp) for _, fp in all_st_files] # The number of samples - this is a space efficient way of counting # the number of samples. Doing len(list(st.keys())) creates a list # that we are not using num_samples = sum(1 for _ in st.keys()) # The number of columns num_cols = len(st.categories()) else: # It doesn't exist, we also need to provide the data_types in case # the user uploads a QIIME mapping file data_types = sorted(data_types_get_req()['data_types']) return {'exists': exists, 'uploaded_files': files, 'data_types': data_types, 'user_can_edit': Study(study_id).can_edit(user), 'job': job, 'download_id': st_fp_id, 'old_files': old_files, 'num_samples': num_samples, 'num_columns': num_cols}
def test_delete_sample_or_column(self): st = SampleTemplate(1) # Delete a sample template column obs = delete_sample_or_column(SampleTemplate, 1, "columns", "season_environment") exp = {'status': "success", 'message': ""} self.assertEqual(obs, exp) self.assertNotIn('season_environment', st.categories()) # Delete a sample template sample - need to add one sample that we # will remove npt.assert_warns( QiitaDBWarning, st.extend, pd.DataFrame.from_dict({'Sample1': { 'taxon_id': '9606' }}, orient='index', dtype=str)) self.assertIn('1.Sample1', st.keys()) obs = delete_sample_or_column(SampleTemplate, 1, "samples", "1.Sample1") exp = {'status': "success", 'message': ""} self.assertEqual(obs, exp) self.assertNotIn('1.Sample1', st.keys()) # Delete a prep template column pt = PrepTemplate(2) obs = delete_sample_or_column(PrepTemplate, 2, "columns", "target_subfragment") exp = {'status': "success", 'message': ""} self.assertEqual(obs, exp) self.assertNotIn('target_subfragment', pt.categories()) # Delte a prep template sample metadata = pd.DataFrame.from_dict( { '1.SKB8.640193': { 'barcode': 'GTCCGCAAGTTA', 'primer': 'GTGCCAGCMGCCGCGGTAA' }, '1.SKD8.640184': { 'barcode': 'CGTAGAGCTCTC', 'primer': 'GTGCCAGCMGCCGCGGTAA' } }, orient='index', dtype=str) pt = npt.assert_warns(QiitaDBWarning, PrepTemplate.create, metadata, Study(1), "16S") obs = delete_sample_or_column(PrepTemplate, pt.id, "samples", '1.SKD8.640184') exp = {'status': "success", 'message': ""} self.assertEqual(obs, exp) self.assertNotIn('1.SKD8.640184', pt.categories()) # Exception obs = delete_sample_or_column(PrepTemplate, 2, "samples", "1.SKM9.640192") exp = { 'status': "danger", 'message': "Prep info file '2' has files attached, you cannot " "delete samples." } self.assertEqual(obs, exp) # No "samples" or "columns" obs = delete_sample_or_column(PrepTemplate, 2, "not_samples", "NOP") exp = { 'status': 'danger', 'message': 'Unknown value "not_samples". Choose between ' '"samples" and "columns"' } self.assertEqual(obs, exp)
def test_delete_sample_or_column(self): st = SampleTemplate(1) # Delete a sample template column job = self._create_job( 'delete_sample_or_column', { 'obj_class': 'SampleTemplate', 'obj_id': 1, 'sample_or_col': 'columns', 'name': 'season_environment' }) private_task(job.id) self.assertEqual(job.status, 'success') self.assertNotIn('season_environment', st.categories()) # Delete a sample template sample - need to add one # sample that we will remove npt.assert_warns( QiitaDBWarning, st.extend, pd.DataFrame.from_dict({'Sample1': { 'taxon_id': '9606' }}, orient='index', dtype=str)) self.assertIn('1.Sample1', st.keys()) job = self._create_job( 'delete_sample_or_column', { 'obj_class': 'SampleTemplate', 'obj_id': 1, 'sample_or_col': 'samples', 'name': '1.Sample1' }) private_task(job.id) self.assertEqual(job.status, 'success') self.assertNotIn('1.Sample1', st.keys()) # Delete a prep template column pt = PrepTemplate(1) job = self._create_job( 'delete_sample_or_column', { 'obj_class': 'PrepTemplate', 'obj_id': 1, 'sample_or_col': 'columns', 'name': 'target_subfragment' }) private_task(job.id) self.assertEqual(job.status, 'success') self.assertNotIn('target_subfragment', pt.categories()) # Delete a prep template sample metadata = pd.DataFrame.from_dict( { '1.SKB8.640193': { 'barcode': 'GTCCGCAAGTTA', 'primer': 'GTGCCAGCMGCCGCGGTAA' }, '1.SKD8.640184': { 'barcode': 'CGTAGAGCTCTC', 'primer': 'GTGCCAGCMGCCGCGGTAA' } }, orient='index', dtype=str) pt = npt.assert_warns(QiitaDBWarning, PrepTemplate.create, metadata, Study(1), "16S") job = self._create_job( 'delete_sample_or_column', { 'obj_class': 'PrepTemplate', 'obj_id': pt.id, 'sample_or_col': 'samples', 'name': '1.SKD8.640184' }) private_task(job.id) self.assertNotIn('1.SKD8.640184', pt.keys()) # Test exceptions job = self._create_job( 'delete_sample_or_column', { 'obj_class': 'UnknownClass', 'obj_id': 1, 'sample_or_col': 'columns', 'name': 'column' }) private_task(job.id) self.assertEqual(job.status, 'error') self.assertIn( 'Unknown value "UnknownClass". Choose between ' '"SampleTemplate" and "PrepTemplate"', job.log.msg) job = self._create_job( 'delete_sample_or_column', { 'obj_class': 'SampleTemplate', 'obj_id': 1, 'sample_or_col': 'unknown', 'name': 'column' }) private_task(job.id) self.assertEqual(job.status, 'error') self.assertIn( 'Unknown value "unknown". Choose between "samples" ' 'and "columns"', job.log.msg)
def test_delete_sample_or_column(self): st = SampleTemplate(1) # Delete a sample template column job = self._create_job('delete_sample_or_column', {'obj_class': 'SampleTemplate', 'obj_id': 1, 'sample_or_col': 'columns', 'name': 'season_environment'}) private_task(job.id) self.assertEqual(job.status, 'success') self.assertNotIn('season_environment', st.categories()) # Delete a sample template sample - need to add one # sample that we will remove npt.assert_warns( QiitaDBWarning, st.extend, pd.DataFrame.from_dict({'Sample1': {'taxon_id': '9606'}}, orient='index', dtype=str)) self.assertIn('1.Sample1', st.keys()) job = self._create_job('delete_sample_or_column', {'obj_class': 'SampleTemplate', 'obj_id': 1, 'sample_or_col': 'samples', 'name': '1.Sample1'}) private_task(job.id) self.assertEqual(job.status, 'success') self.assertNotIn('1.Sample1', st.keys()) # Delete a prep template column pt = PrepTemplate(1) job = self._create_job('delete_sample_or_column', {'obj_class': 'PrepTemplate', 'obj_id': 1, 'sample_or_col': 'columns', 'name': 'target_subfragment'}) private_task(job.id) self.assertEqual(job.status, 'success') self.assertNotIn('target_subfragment', pt.categories()) # Delete a prep template sample metadata = pd.DataFrame.from_dict( {'1.SKB8.640193': {'barcode': 'GTCCGCAAGTTA', 'primer': 'GTGCCAGCMGCCGCGGTAA'}, '1.SKD8.640184': {'barcode': 'CGTAGAGCTCTC', 'primer': 'GTGCCAGCMGCCGCGGTAA'}}, orient='index', dtype=str) pt = npt.assert_warns(QiitaDBWarning, PrepTemplate.create, metadata, Study(1), "16S") job = self._create_job('delete_sample_or_column', {'obj_class': 'PrepTemplate', 'obj_id': pt.id, 'sample_or_col': 'samples', 'name': '1.SKD8.640184'}) private_task(job.id) self.assertNotIn('1.SKD8.640184', pt.keys()) # Test exceptions job = self._create_job('delete_sample_or_column', {'obj_class': 'UnknownClass', 'obj_id': 1, 'sample_or_col': 'columns', 'name': 'column'}) private_task(job.id) self.assertEqual(job.status, 'error') self.assertIn('Unknown value "UnknownClass". Choose between ' '"SampleTemplate" and "PrepTemplate"', job.log.msg) job = self._create_job('delete_sample_or_column', {'obj_class': 'SampleTemplate', 'obj_id': 1, 'sample_or_col': 'unknown', 'name': 'column'}) private_task(job.id) self.assertEqual(job.status, 'error') self.assertIn('Unknown value "unknown". Choose between "samples" ' 'and "columns"', job.log.msg)
def test_delete_sample_or_column(self): st = SampleTemplate(1) # Delete a sample template column obs = delete_sample_or_column(SampleTemplate, 1, "columns", "season_environment") exp = {'status': "success", 'message': ""} self.assertEqual(obs, exp) self.assertNotIn('season_environment', st.categories()) # Delete a sample template sample - need to add one sample that we # will remove npt.assert_warns( QiitaDBWarning, st.extend, pd.DataFrame.from_dict({'Sample1': {'taxon_id': '9606'}}, orient='index', dtype=str)) self.assertIn('1.Sample1', st.keys()) obs = delete_sample_or_column(SampleTemplate, 1, "samples", "1.Sample1") exp = {'status': "success", 'message': ""} self.assertEqual(obs, exp) self.assertNotIn('1.Sample1', st.keys()) # Delete a prep template column pt = PrepTemplate(2) obs = delete_sample_or_column(PrepTemplate, 2, "columns", "target_subfragment") exp = {'status': "success", 'message': ""} self.assertEqual(obs, exp) self.assertNotIn('target_subfragment', pt.categories()) # Delte a prep template sample metadata = pd.DataFrame.from_dict( {'1.SKB8.640193': {'barcode': 'GTCCGCAAGTTA', 'primer': 'GTGCCAGCMGCCGCGGTAA'}, '1.SKD8.640184': {'barcode': 'CGTAGAGCTCTC', 'primer': 'GTGCCAGCMGCCGCGGTAA'}}, orient='index', dtype=str) pt = npt.assert_warns(QiitaDBWarning, PrepTemplate.create, metadata, Study(1), "16S") obs = delete_sample_or_column(PrepTemplate, pt.id, "samples", '1.SKD8.640184') exp = {'status': "success", 'message': ""} self.assertEqual(obs, exp) self.assertNotIn('1.SKD8.640184', pt.categories()) # Exception obs = delete_sample_or_column(PrepTemplate, 2, "samples", "1.SKM9.640192") exp = {'status': "danger", 'message': "Prep info file '2' has files attached, you cannot " "delete samples."} self.assertEqual(obs, exp) # No "samples" or "columns" obs = delete_sample_or_column(PrepTemplate, 2, "not_samples", "NOP") exp = {'status': 'danger', 'message': 'Unknown value "not_samples". Choose between ' '"samples" and "columns"'} self.assertEqual(obs, exp)