Skip to content

Commit f605fd4

Browse files
committed
Merge pull request #1042 from antgonza/delete-preprocess-data
Delete preprocess data
2 parents 12f48f9 + a74fd0f commit f605fd4

File tree

5 files changed

+160
-2
lines changed

5 files changed

+160
-2
lines changed

qiita_db/data.py

Lines changed: 69 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ class BaseData(QiitaObject):
103103
--------
104104
RawData
105105
PreprocessedData
106-
PreprocessedData
106+
ProcessedData
107107
"""
108108
_filepath_table = "filepath"
109109

@@ -807,6 +807,73 @@ def create(cls, study, preprocessed_params_table, preprocessed_params_id,
807807
ppd.add_filepaths(filepaths, conn_handler)
808808
return ppd
809809

810+
@classmethod
811+
def delete(cls, ppd_id):
812+
"""Removes the preprocessed data with id ppd_id
813+
814+
Parameters
815+
----------
816+
ppd_id : int
817+
The preprocessed data id
818+
819+
Raises
820+
------
821+
QiitaDBStatusError
822+
If the preprocessed data status is not sandbox or if the
823+
preprocessed data EBI and VAMPS submission is not in a valid state
824+
['not submitted', 'failed']
825+
QiitaDBError
826+
If the preprocessed data has been processed
827+
"""
828+
valid_submission_states = ['not submitted', 'failed']
829+
ppd = cls(ppd_id)
830+
if ppd.status != 'sandbox':
831+
raise QiitaDBStatusError(
832+
"Illegal operation on non sandboxed preprocessed data")
833+
elif ppd.submitted_to_vamps_status() not in valid_submission_states:
834+
raise QiitaDBStatusError(
835+
"Illegal operation. This preprocessed data has or is being "
836+
"added to VAMPS.")
837+
elif ppd.submitted_to_insdc_status() not in valid_submission_states:
838+
raise QiitaDBStatusError(
839+
"Illegal operation. This preprocessed data has or is being "
840+
"added to EBI.")
841+
842+
conn_handler = SQLConnectionHandler()
843+
844+
processed_data = [str(n[0]) for n in conn_handler.execute_fetchall(
845+
"SELECT processed_data_id FROM qiita.preprocessed_processed_data "
846+
"WHERE preprocessed_data_id = {0} ORDER BY "
847+
"processed_data_id".format(ppd_id))]
848+
849+
if processed_data:
850+
raise QiitaDBError(
851+
"Preprocessed data %d cannot be removed because it was used "
852+
"to generate the following processed data: %s" % (
853+
ppd_id, ', '.join(processed_data)))
854+
855+
# delete
856+
queue = "delete_preprocessed_data_%d" % ppd_id
857+
conn_handler.create_queue(queue)
858+
859+
sql = ("DELETE FROM qiita.prep_template_preprocessed_data WHERE "
860+
"preprocessed_data_id = {0}".format(ppd_id))
861+
conn_handler.add_to_queue(queue, sql)
862+
863+
sql = ("DELETE FROM qiita.preprocessed_filepath WHERE "
864+
"preprocessed_data_id = {0}".format(ppd_id))
865+
conn_handler.add_to_queue(queue, sql)
866+
867+
sql = ("DELETE FROM qiita.study_preprocessed_data WHERE "
868+
"preprocessed_data_id = {0}".format(ppd_id))
869+
conn_handler.add_to_queue(queue, sql)
870+
871+
sql = ("DELETE FROM qiita.preprocessed_data WHERE "
872+
"preprocessed_data_id = {0}".format(ppd_id))
873+
conn_handler.add_to_queue(queue, sql)
874+
875+
conn_handler.execute_queue(queue)
876+
810877
@property
811878
def processed_data(self):
812879
r"""The processed data list generated from this preprocessed data"""
@@ -1275,7 +1342,7 @@ def delete(cls, processed_data_id):
12751342
"""
12761343
if cls(processed_data_id).status != 'sandbox':
12771344
raise QiitaDBStatusError(
1278-
"Illegal operation on non sandbox processed data")
1345+
"Illegal operation on non sandboxed processed data")
12791346

12801347
conn_handler = SQLConnectionHandler()
12811348

qiita_db/test/test_data.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -478,6 +478,48 @@ def test_create_data_type_only(self):
478478
# preprocessed_data_id, filepath_id
479479
self.assertEqual(obs, [[3, obs_id - 1], [3, obs_id]])
480480

481+
def test_delete_basic(self):
482+
"""Correctly deletes a preprocessed data"""
483+
# testing regular delete
484+
ppd = PreprocessedData.create(
485+
self.study, self.params_table,
486+
self.params_id, self.filepaths, prep_template=self.prep_template,
487+
ebi_submission_accession=self.ebi_submission_accession,
488+
ebi_study_accession=self.ebi_study_accession)
489+
PreprocessedData.delete(ppd.id)
490+
491+
# testing that the deleted preprocessed data can't be instantiated
492+
with self.assertRaises(QiitaDBUnknownIDError):
493+
PreprocessedData(ppd.id)
494+
# and for completeness testing that it raises an error if ID
495+
# doesn't exist
496+
with self.assertRaises(QiitaDBUnknownIDError):
497+
PreprocessedData.delete(ppd.id)
498+
499+
# testing that we can not remove cause the preprocessed data != sandbox
500+
with self.assertRaises(QiitaDBStatusError):
501+
PreprocessedData.delete(1)
502+
503+
def test_delete_advanced(self):
504+
# testing that we can not remove cause preprocessed data has been
505+
# submitted to EBI or VAMPS
506+
ppd = PreprocessedData.create(
507+
self.study, self.params_table,
508+
self.params_id, self.filepaths, prep_template=self.prep_template,
509+
ebi_submission_accession=self.ebi_submission_accession,
510+
ebi_study_accession=self.ebi_study_accession)
511+
512+
# fails due to VAMPS submission
513+
ppd.update_vamps_status('success')
514+
with self.assertRaises(QiitaDBStatusError):
515+
PreprocessedData.delete(ppd.id)
516+
ppd.update_vamps_status('failed')
517+
518+
# fails due to EBI submission
519+
ppd.update_insdc_status('success', 'AAAA', 'AAAA')
520+
with self.assertRaises(QiitaDBStatusError):
521+
PreprocessedData.delete(ppd.id)
522+
481523
def test_create_error_dynamic_table(self):
482524
"""Raises an error if the preprocessed_params_table does not exist"""
483525
with self.assertRaises(IncompetentQiitaDeveloperError):

qiita_pet/handlers/study_handlers/description_handlers.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -697,6 +697,33 @@ def delete_prep_template(self, study, user, callback):
697697

698698
callback((msg, msg_level, 'raw_data_tab', prep_id, None))
699699

700+
def delete_preprocessed_data(self, study, user, callback):
701+
"""Delete the selected preprocessed data
702+
703+
Parameters
704+
----------
705+
study : Study
706+
The current study object
707+
user : User
708+
The current user object
709+
callback : function
710+
The callback function to call with the results once the processing
711+
is done
712+
"""
713+
ppd_id = int(self.get_argument('preprocessed_data_id'))
714+
715+
try:
716+
PreprocessedData.delete(ppd_id)
717+
msg = ("Preprocessed data %d has been deleted" % ppd_id)
718+
msg_level = "success"
719+
ppd_id = None
720+
except Exception as e:
721+
msg = ("Couldn't remove preprocessed data %d: %s" %
722+
(ppd_id, str(e)))
723+
msg_level = "danger"
724+
725+
callback((msg, msg_level, 'preprocessed_data_tab', ppd_id, None))
726+
700727
def delete_processed_data(self, study, user, callback):
701728
"""Delete the selected processed data
702729
@@ -756,6 +783,7 @@ def post(self, study_id):
756783
update_investigation_type=self.update_investigation_type,
757784
delete_raw_data=self.delete_raw_data,
758785
delete_prep_template=self.delete_prep_template,
786+
delete_preprocessed_data=self.delete_preprocessed_data,
759787
delete_processed_data=self.delete_processed_data)
760788

761789
# Get the action that we need to perform

qiita_pet/templates/study_description.html

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,26 @@
222222
}
223223
}
224224

225+
function delete_preprocessed_data(preprocessed_data_id) {
226+
if (confirm('Are you sure you want to delete preprocessed data ID: ' + preprocessed_data_id + '?')) {
227+
var form = $("<form>")
228+
.attr("action", window.location.href)
229+
.attr("method", "post")
230+
.append($("<input>")
231+
.attr("type", "hidden")
232+
.attr("name", "preprocessed_data_id")
233+
.attr("value", preprocessed_data_id))
234+
.append($("<input>")
235+
.attr("type", "hidden")
236+
.attr("name", "action")
237+
.attr("value", "delete_preprocessed_data"));
238+
$("body").append(form);
239+
form.submit();
240+
} else {
241+
return false;
242+
}
243+
}
244+
225245
function delete_processed_data(processed_data_id) {
226246
if (confirm('Are you sure you want to delete processed data ID: ' + processed_data_id + '?')) {
227247
var form = $("<form>")

qiita_pet/templates/study_description_templates/preprocessed_data_tab.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
<li><a href="#preprocessed_data_info_{{ppd_id}}" role="tab" data-toggle="tab">ID: {{ppd_id}}&nbsp;
1010
<div class="{{class_icon1}}" style="color: {{color}};"></div>
1111
<div class="{{class_icon2}}" style="color: {{color}};"></div>
12+
<button class="close" title="Remove this preprocessed data" type="button" onclick="delete_preprocessed_data({{ppd_id}})">&nbsp; ×</button>
1213
</a></li>
1314
{% end %}
1415
</ul>

0 commit comments

Comments
 (0)